mirror of
				https://github.com/rad4day/Waybar.git
				synced 2025-10-31 16:02:43 +01:00 
			
		
		
		
	Merge pull request #1397 from JakeStanger/feat/image-module
Resolves https://github.com/Alexays/Waybar/issues/1191
This commit is contained in:
		| @@ -77,6 +77,7 @@ | ||||
| #endif | ||||
| #include "bar.hpp" | ||||
| #include "modules/custom.hpp" | ||||
| #include "modules/image.hpp" | ||||
| #include "modules/temperature.hpp" | ||||
| #include "modules/user.hpp" | ||||
|  | ||||
|   | ||||
							
								
								
									
										34
									
								
								include/modules/image.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								include/modules/image.hpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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 | ||||
							
								
								
									
										72
									
								
								man/waybar-image.5.scd
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								man/waybar-image.5.scd
									
									
									
									
									
										Normal file
									
								
							| @@ -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/disk.cpp', | ||||
|     'src/modules/idle_inhibitor.cpp', | ||||
|     'src/modules/image.cpp', | ||||
|     'src/modules/temperature.cpp', | ||||
|     'src/modules/user.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) { | ||||
|       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) { | ||||
|     auto err = fmt::format("Disabling module \"{}\", {}", name, e.what()); | ||||
|   | ||||
							
								
								
									
										59
									
								
								src/modules/image.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								src/modules/image.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -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(); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Alex
					Alex