Merge pull request #1397 from JakeStanger/feat/image-module
Resolves https://github.com/Alexays/Waybar/issues/1191pull/1836/head
commit
80b2b29a77
|
@ -77,6 +77,7 @@
|
||||||
#endif
|
#endif
|
||||||
#include "bar.hpp"
|
#include "bar.hpp"
|
||||||
#include "modules/custom.hpp"
|
#include "modules/custom.hpp"
|
||||||
|
#include "modules/image.hpp"
|
||||||
#include "modules/temperature.hpp"
|
#include "modules/temperature.hpp"
|
||||||
#include "modules/user.hpp"
|
#include "modules/user.hpp"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <fmt/format.h>
|
||||||
|
#include <gtkmm/image.h>
|
||||||
|
|
||||||
|
#include <csignal>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
|
#include "ALabel.hpp"
|
||||||
|
#include "util/command.hpp"
|
||||||
|
#include "util/json.hpp"
|
||||||
|
#include "util/sleeper_thread.hpp"
|
||||||
|
|
||||||
|
namespace waybar::modules {
|
||||||
|
|
||||||
|
class Image : public AModule {
|
||||||
|
public:
|
||||||
|
Image(const std::string&, const std::string&, const Json::Value&);
|
||||||
|
auto update() -> void;
|
||||||
|
void refresh(int /*signal*/);
|
||||||
|
|
||||||
|
private:
|
||||||
|
void delayWorker();
|
||||||
|
void handleEvent();
|
||||||
|
|
||||||
|
Gtk::Image image_;
|
||||||
|
std::string path_;
|
||||||
|
int size_;
|
||||||
|
int interval_;
|
||||||
|
|
||||||
|
util::SleeperThread thread_;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace waybar::modules
|
|
@ -0,0 +1,72 @@
|
||||||
|
waybar-custom(5)
|
||||||
|
|
||||||
|
# NAME
|
||||||
|
|
||||||
|
waybar - image module
|
||||||
|
|
||||||
|
# DESCRIPTION
|
||||||
|
|
||||||
|
The *image* module displays an image from a path.
|
||||||
|
|
||||||
|
# CONFIGURATION
|
||||||
|
|
||||||
|
Addressed by *custom/<name>*
|
||||||
|
|
||||||
|
*path*: ++
|
||||||
|
typeof: string ++
|
||||||
|
The path to the image.
|
||||||
|
|
||||||
|
*size*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The width/height to render the image.
|
||||||
|
|
||||||
|
*interval*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The interval (in seconds) to re-render the image.
|
||||||
|
This is useful if the contents of *path* changes.
|
||||||
|
If no *interval* is defined, the image will only be rendered once.
|
||||||
|
|
||||||
|
*signal*: ++
|
||||||
|
typeof: integer ++
|
||||||
|
The signal number used to update the module.
|
||||||
|
This can be used instead of *interval* if the file changes irregularly.
|
||||||
|
The number is valid between 1 and N, where *SIGRTMIN+N* = *SIGRTMAX*.
|
||||||
|
|
||||||
|
*on-click*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when clicked on the module.
|
||||||
|
|
||||||
|
*on-click-middle*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when middle-clicked on the module using mousewheel.
|
||||||
|
|
||||||
|
*on-update*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when the module is updated.
|
||||||
|
|
||||||
|
*on-scroll-up*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling up on the module.
|
||||||
|
|
||||||
|
*on-scroll-down*: ++
|
||||||
|
typeof: string ++
|
||||||
|
Command to execute when scrolling down on the module.
|
||||||
|
|
||||||
|
*smooth-scrolling-threshold*: ++
|
||||||
|
typeof: double ++
|
||||||
|
Threshold to be used when scrolling.
|
||||||
|
|
||||||
|
# EXAMPLES
|
||||||
|
|
||||||
|
## Spotify:
|
||||||
|
|
||||||
|
## mpd:
|
||||||
|
|
||||||
|
```
|
||||||
|
"image/album-art": {
|
||||||
|
"path": "/tmp/mpd_art",
|
||||||
|
"size": 32,
|
||||||
|
"interval": 5,
|
||||||
|
"on-click": "mpc toggle"
|
||||||
|
}
|
||||||
|
```
|
|
@ -151,6 +151,7 @@ src_files = files(
|
||||||
'src/modules/custom.cpp',
|
'src/modules/custom.cpp',
|
||||||
'src/modules/disk.cpp',
|
'src/modules/disk.cpp',
|
||||||
'src/modules/idle_inhibitor.cpp',
|
'src/modules/idle_inhibitor.cpp',
|
||||||
|
'src/modules/image.cpp',
|
||||||
'src/modules/temperature.cpp',
|
'src/modules/temperature.cpp',
|
||||||
'src/modules/user.cpp',
|
'src/modules/user.cpp',
|
||||||
'src/main.cpp',
|
'src/main.cpp',
|
||||||
|
|
|
@ -148,6 +148,8 @@ waybar::AModule* waybar::Factory::makeModule(const std::string& name) const {
|
||||||
}
|
}
|
||||||
if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) {
|
if (ref.compare(0, 7, "custom/") == 0 && ref.size() > 7) {
|
||||||
return new waybar::modules::Custom(ref.substr(7), id, config_[name]);
|
return new waybar::modules::Custom(ref.substr(7), id, config_[name]);
|
||||||
|
} else if (ref.compare(0, 6, "image/") == 0 && ref.size() > 6) {
|
||||||
|
return new waybar::modules::Image(ref.substr(6), id, config_[name]);
|
||||||
}
|
}
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
auto err = fmt::format("Disabling module \"{}\", {}", name, e.what());
|
auto err = fmt::format("Disabling module \"{}\", {}", name, e.what());
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
#include "modules/image.hpp"
|
||||||
|
|
||||||
|
#include <spdlog/spdlog.h>
|
||||||
|
|
||||||
|
waybar::modules::Image::Image(const std::string& name, const std::string& id,
|
||||||
|
const Json::Value& config)
|
||||||
|
: AModule(config, "image-" + name, id, "{}") {
|
||||||
|
event_box_.add(image_);
|
||||||
|
|
||||||
|
dp.emit();
|
||||||
|
|
||||||
|
path_ = config["path"].asString();
|
||||||
|
size_ = config["size"].asInt();
|
||||||
|
|
||||||
|
interval_ = config_["interval"].asInt();
|
||||||
|
|
||||||
|
if (size_ == 0) {
|
||||||
|
size_ = 16;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (interval_ == 0) {
|
||||||
|
interval_ = INT_MAX;
|
||||||
|
}
|
||||||
|
|
||||||
|
delayWorker();
|
||||||
|
}
|
||||||
|
|
||||||
|
void waybar::modules::Image::delayWorker() {
|
||||||
|
thread_ = [this] {
|
||||||
|
dp.emit();
|
||||||
|
auto interval = std::chrono::seconds(interval_);
|
||||||
|
thread_.sleep_for(interval);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
void waybar::modules::Image::refresh(int sig) {
|
||||||
|
if (sig == SIGRTMIN + config_["signal"].asInt()) {
|
||||||
|
thread_.wake_up();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
auto waybar::modules::Image::update() -> void {
|
||||||
|
Glib::RefPtr<Gdk::Pixbuf> pixbuf;
|
||||||
|
|
||||||
|
if (Glib::file_test(path_, Glib::FILE_TEST_EXISTS))
|
||||||
|
pixbuf = Gdk::Pixbuf::create_from_file(path_, size_, size_);
|
||||||
|
else
|
||||||
|
pixbuf = {};
|
||||||
|
|
||||||
|
if (pixbuf) {
|
||||||
|
image_.set(pixbuf);
|
||||||
|
image_.show();
|
||||||
|
} else {
|
||||||
|
image_.clear();
|
||||||
|
image_.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
AModule::update();
|
||||||
|
}
|
Loading…
Reference in New Issue