diff --git a/include/bar.hpp b/include/bar.hpp index 6659c660..6d92080d 100644 --- a/include/bar.hpp +++ b/include/bar.hpp @@ -7,6 +7,7 @@ #include #include "wlr-layer-shell-unstable-v1-client-protocol.h" #include "xdg-output-unstable-v1-client-protocol.h" +#include "idle-inhibit-unstable-v1-client-protocol.h" #include "IModule.hpp" namespace waybar { diff --git a/include/client.hpp b/include/client.hpp index 43947aa8..eb1ef2b4 100644 --- a/include/client.hpp +++ b/include/client.hpp @@ -24,6 +24,7 @@ class Client { struct zwlr_layer_shell_v1 *layer_shell = nullptr; struct zxdg_output_manager_v1 *xdg_output_manager = nullptr; struct wl_seat *seat = nullptr; + struct zwp_idle_inhibit_manager_v1 *idle_inhibit_manager = nullptr; std::vector> bars; private: diff --git a/include/factory.hpp b/include/factory.hpp index f496983d..50b21a6e 100644 --- a/include/factory.hpp +++ b/include/factory.hpp @@ -7,6 +7,7 @@ #include "modules/sway/workspaces.hpp" #include "modules/sway/window.hpp" #endif +#include "modules/idle_inhibitor.hpp" #include "modules/battery.hpp" #include "modules/memory.hpp" #include "modules/cpu.hpp" diff --git a/include/modules/idle_inhibitor.hpp b/include/modules/idle_inhibitor.hpp new file mode 100644 index 00000000..ce6e58d4 --- /dev/null +++ b/include/modules/idle_inhibitor.hpp @@ -0,0 +1,23 @@ +#pragma once + +#include +#include "bar.hpp" +#include "client.hpp" +#include "ALabel.hpp" + +namespace waybar::modules { + +class IdleInhibitor: public ALabel { + public: + IdleInhibitor(const std::string&, const waybar::Bar&, const Json::Value&); + ~IdleInhibitor(); + auto update() -> void; + private: + bool onClick(GdkEventButton* const& ev); + + const Bar& bar_; + std::string status_; + struct zwp_idle_inhibitor_v1 *idle_inhibitor_; +}; + +} diff --git a/meson.build b/meson.build index 6c9eeab6..c72845d2 100644 --- a/meson.build +++ b/meson.build @@ -65,6 +65,7 @@ src_files = files( 'src/modules/clock.cpp', 'src/modules/custom.cpp', 'src/modules/cpu.cpp', + 'src/modules/idle_inhibitor.cpp', 'src/main.cpp', 'src/bar.cpp', 'src/client.cpp' diff --git a/protocol/meson.build b/protocol/meson.build index 4bf99588..0699a9d9 100644 --- a/protocol/meson.build +++ b/protocol/meson.build @@ -24,6 +24,7 @@ wayland_scanner_client = generator( client_protocols = [ [wl_protocol_dir, 'stable/xdg-shell/xdg-shell.xml'], [wl_protocol_dir, 'unstable/xdg-output/xdg-output-unstable-v1.xml'], + [wl_protocol_dir, 'unstable/idle-inhibit/idle-inhibit-unstable-v1.xml'], ['wlr-layer-shell-unstable-v1.xml'], ] diff --git a/resources/config b/resources/config index 071a43de..5fe80ed4 100644 --- a/resources/config +++ b/resources/config @@ -6,7 +6,7 @@ // Choose the order of the modules "modules-left": ["sway/workspaces", "sway/mode", "custom/spotify"], "modules-center": ["sway/window"], - "modules-right": ["pulseaudio", "network", "cpu", "memory", "backlight", "battery", "battery#bat2", "clock", "tray"], + "modules-right": ["idle_inhibitor", "pulseaudio", "network", "cpu", "memory", "backlight", "battery", "battery#bat2", "clock", "tray"], // Modules configuration // "sway/workspaces": { // "disable-scroll": true, @@ -26,6 +26,13 @@ "sway/mode": { "format": "{}" }, + "idle_inhibitor": { + "format": "{icon}", + "format-icons": { + "activated": "", + "deactivated": "" + } + }, "tray": { // "icon-size": 21, "spacing": 10 @@ -85,4 +92,4 @@ "max-length": 40, "exec": "$HOME/.config/waybar/mediaplayer.py 2> /dev/null" // Script in resources folder } -} \ No newline at end of file +} diff --git a/resources/style.css b/resources/style.css index c21db526..a92d1ffa 100644 --- a/resources/style.css +++ b/resources/style.css @@ -30,7 +30,7 @@ window#waybar { border-bottom: 3px solid white; } -#clock, #battery, #cpu, #memory, #backlight, #network, #pulseaudio, #custom-spotify, #tray, #mode { +#clock, #battery, #cpu, #memory, #backlight, #network, #pulseaudio, #custom-spotify, #tray, #mode, #idle_inhibitor { padding: 0 10px; margin: 0 5px; } @@ -105,3 +105,7 @@ window#waybar { #tray { background-color: #2980b9; } + +#idle_inhibitor { + background-color: #000000; +} diff --git a/src/client.cpp b/src/client.cpp index 02837aea..5ea159a9 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -55,6 +55,10 @@ void waybar::Client::handleGlobal(void *data, struct wl_registry *registry, o->xdg_output_manager = static_cast( wl_registry_bind(registry, name, &zxdg_output_manager_v1_interface, ZXDG_OUTPUT_V1_NAME_SINCE_VERSION)); + } else if (strcmp(interface, zwp_idle_inhibit_manager_v1_interface.name) == 0) { + o->idle_inhibit_manager = static_cast( + wl_registry_bind(registry, name, + &zwp_idle_inhibit_manager_v1_interface, 1)); } } @@ -138,6 +142,7 @@ int waybar::Client::main(int argc, char* argv[]) bars.clear(); zxdg_output_manager_v1_destroy(xdg_output_manager); zwlr_layer_shell_v1_destroy(layer_shell); + zwp_idle_inhibit_manager_v1_destroy(idle_inhibit_manager); wl_registry_destroy(registry); wl_seat_destroy(seat); wl_display_disconnect(wl_display); diff --git a/src/factory.cpp b/src/factory.cpp index 1fe0867b..6a9a9de7 100644 --- a/src/factory.cpp +++ b/src/factory.cpp @@ -24,6 +24,9 @@ waybar::IModule* waybar::Factory::makeModule(const std::string &name) const return new waybar::modules::sway::Window(id, bar_, config_[name]); } #endif + if (ref == "idle_inhibitor") { + return new waybar::modules::IdleInhibitor(id, bar_, config_[name]); + } if (ref == "memory") { return new waybar::modules::Memory(id, config_[name]); } diff --git a/src/modules/idle_inhibitor.cpp b/src/modules/idle_inhibitor.cpp new file mode 100644 index 00000000..b00d1932 --- /dev/null +++ b/src/modules/idle_inhibitor.cpp @@ -0,0 +1,50 @@ +#include "modules/idle_inhibitor.hpp" + + +waybar::modules::IdleInhibitor::IdleInhibitor(const std::string& id, const Bar& bar, const Json::Value& config) + : ALabel(config, "{status}"), bar_(bar), status_("deactivated"), idle_inhibitor_(nullptr) +{ + label_.set_name("idle_inhibitor"); + if (!id.empty()) { + label_.get_style_context()->add_class(id); + } + event_box_.add_events(Gdk::BUTTON_PRESS_MASK); + event_box_.signal_button_press_event().connect( + sigc::mem_fun(*this, &IdleInhibitor::onClick)); + dp.emit(); +} + +waybar::modules::IdleInhibitor::~IdleInhibitor() +{ + if(idle_inhibitor_) { + zwp_idle_inhibitor_v1_destroy(idle_inhibitor_); + idle_inhibitor_ = nullptr; + } +} + +auto waybar::modules::IdleInhibitor::update() -> void +{ + label_.set_markup( + fmt::format(format_, fmt::arg("status", status_), + fmt::arg("icon", getIcon(0, status_)))); + if(tooltipEnabled()) { + label_.set_tooltip_text(status_); + } +} + +bool waybar::modules::IdleInhibitor::onClick(GdkEventButton* const& e) +{ + if(e->button == 1) { + if (idle_inhibitor_) { + zwp_idle_inhibitor_v1_destroy(idle_inhibitor_); + idle_inhibitor_ = nullptr; + status_ = "deactivated"; + } else { + idle_inhibitor_ = zwp_idle_inhibit_manager_v1_create_inhibitor( + bar_.client.idle_inhibit_manager, bar_.surface); + status_ = "activated"; + } + } + dp.emit(); + return true; +}