Limit visibility updates
Prevent visibility updates to occur for inactive modules. Check active modules and subscribe to only those events.
This commit is contained in:
parent
1dcd36b06c
commit
5a0e42cc76
|
@ -37,6 +37,7 @@ class BarIpcClient {
|
|||
void onModeUpdate(bool visible_by_modifier);
|
||||
void onUrgencyUpdate(bool visible_by_urgency);
|
||||
void update();
|
||||
bool isModuleEnabled(std::string name);
|
||||
|
||||
Bar& bar_;
|
||||
util::JsonParser parser_;
|
||||
|
|
|
@ -3,6 +3,7 @@
|
|||
#include <fmt/ostream.h>
|
||||
#include <spdlog/spdlog.h>
|
||||
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
|
||||
#include "bar.hpp"
|
||||
|
@ -19,6 +20,23 @@ BarIpcClient::BarIpcClient(waybar::Bar& bar) : bar_{bar} {
|
|||
handle.disconnect();
|
||||
}
|
||||
|
||||
Json::Value subscribe_events{Json::arrayValue};
|
||||
subscribe_events.append("bar_state_update");
|
||||
subscribe_events.append("barconfig_update");
|
||||
|
||||
bool has_mode = isModuleEnabled("sway/mode");
|
||||
bool has_workspaces = isModuleEnabled("sway/workspaces");
|
||||
|
||||
if (has_mode) {
|
||||
subscribe_events.append("mode");
|
||||
}
|
||||
if (has_workspaces) {
|
||||
subscribe_events.append("workspace");
|
||||
}
|
||||
if (has_mode || has_workspaces) {
|
||||
subscribe_events.append("binding");
|
||||
}
|
||||
|
||||
signal_config_.connect(sigc::mem_fun(*this, &BarIpcClient::onConfigUpdate));
|
||||
signal_visible_.connect(sigc::mem_fun(*this, &BarIpcClient::onVisibilityUpdate));
|
||||
signal_urgency_.connect(sigc::mem_fun(*this, &BarIpcClient::onUrgencyUpdate));
|
||||
|
@ -26,7 +44,9 @@ BarIpcClient::BarIpcClient(waybar::Bar& bar) : bar_{bar} {
|
|||
|
||||
// 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"])");
|
||||
std::ostringstream oss_events;
|
||||
oss_events << subscribe_events;
|
||||
ipc_.subscribe(oss_events.str());
|
||||
ipc_.signal_event.connect(sigc::mem_fun(*this, &BarIpcClient::onIpcEvent));
|
||||
ipc_.signal_cmd.connect(sigc::mem_fun(*this, &BarIpcClient::onCmd));
|
||||
// Launch worker
|
||||
|
@ -39,6 +59,19 @@ BarIpcClient::BarIpcClient(waybar::Bar& bar) : bar_{bar} {
|
|||
});
|
||||
}
|
||||
|
||||
bool BarIpcClient::isModuleEnabled(std::string name) {
|
||||
for (const auto& section : {"modules-left", "modules-center", "modules-right"}) {
|
||||
if (const auto& modules = bar_.config.get(section, {}); modules.isArray()) {
|
||||
for (const auto& module : modules) {
|
||||
if (module.asString().rfind(name, 0) == 0) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
struct swaybar_config parseConfig(const Json::Value& payload) {
|
||||
swaybar_config conf;
|
||||
if (auto id = payload["id"]; id.isString()) {
|
||||
|
|
Loading…
Reference in New Issue