From 93f9b3d213578e92fbb3f409eff4f97d65d6f6e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tobias=20W=C3=B6lfel?= Date: Sat, 9 Apr 2022 13:18:03 +0200 Subject: [PATCH] Clear urgency hint with modifier press If the modifier is pressed and release without another event, the intended behaviour is to clear an urgency hint and hide the bar again. Note that if multiple workspaces have the urgency hint set, the bar is hidden again and an urgent workspace is focused, the bar does not stay hidden anymore. --- include/modules/sway/bar.hpp | 2 ++ src/modules/sway/bar.cpp | 19 ++++++++++++++++++- 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/include/modules/sway/bar.hpp b/include/modules/sway/bar.hpp index 84f74d6..7642c32 100644 --- a/include/modules/sway/bar.hpp +++ b/include/modules/sway/bar.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include "modules/sway/ipc/client.hpp" @@ -43,6 +44,7 @@ class BarIpcClient { swaybar_config bar_config_; bool visible_by_modifier_ = false; bool visible_by_urgency_ = false; + std::atomic modifier_no_action_ = false; SafeSignal signal_visible_; SafeSignal signal_urgency_; diff --git a/src/modules/sway/bar.cpp b/src/modules/sway/bar.cpp index 0e20797..5b50100 100644 --- a/src/modules/sway/bar.cpp +++ b/src/modules/sway/bar.cpp @@ -23,7 +23,9 @@ BarIpcClient::BarIpcClient(waybar::Bar& bar) : bar_{bar} { signal_visible_.connect(sigc::mem_fun(*this, &BarIpcClient::onVisibilityUpdate)); signal_urgency_.connect(sigc::mem_fun(*this, &BarIpcClient::onUrgencyUpdate)); - ipc_.subscribe(R"(["bar_state_update", "barconfig_update", "workspace"])"); + // Subscribe to non bar events to determine if the modifier key press is followed by another + // action. + ipc_.subscribe(R"(["bar_state_update", "barconfig_update", "workspace", "mode", "binding"])"); ipc_.signal_event.connect(sigc::mem_fun(*this, &BarIpcClient::onIpcEvent)); ipc_.signal_cmd.connect(sigc::mem_fun(*this, &BarIpcClient::onCmd)); // Launch worker @@ -79,8 +81,13 @@ void BarIpcClient::onIpcEvent(const struct Ipc::ipc_response& res) { ipc_.sendCmd(IPC_GET_WORKSPACES); } } + modifier_no_action_ = false; } break; + case IPC_EVENT_MODE: + case IPC_EVENT_BINDING: + modifier_no_action_ = false; + break; case IPC_EVENT_BAR_STATE_UPDATE: case IPC_EVENT_BARCONFIG_UPDATE: if (auto id = payload["id"]; id.isString() && id.asString() != bar_.bar_id) { @@ -133,6 +140,16 @@ void BarIpcClient::onConfigUpdate(const swaybar_config& config) { void BarIpcClient::onVisibilityUpdate(bool visible_by_modifier) { spdlog::debug("visibility update for {}: {}", bar_.bar_id, visible_by_modifier); visible_by_modifier_ = visible_by_modifier; + if (visible_by_modifier) { + modifier_no_action_ = true; + } + if (!visible_by_modifier_ && modifier_no_action_) { + // Modifier key was pressed and released without a different action. + // This signals an acknowledgment and should hide the bar again. + // Hide the bar and clear the urgency flag. + visible_by_urgency_ = false; + } + update(); }