Idempotent bar show/hide via configurable user kill signals

This commit is contained in:
Martynas Maciulevičius
2025-02-09 13:05:36 +02:00
parent c336bc5466
commit aaea814217
5 changed files with 109 additions and 8 deletions

View File

@ -7,8 +7,10 @@
#include <list>
#include <mutex>
#include "bar.hpp"
#include "client.hpp"
#include "util/SafeSignal.hpp"
#include "util/backend_common.hpp"
std::mutex reap_mtx;
std::list<pid_t> reap;
@ -71,6 +73,45 @@ static void catchSignals(waybar::SafeSignal<int>& signal_handler) {
}
}
waybar::util::KillSignalAction getActionForBar(waybar::Bar* bar, int signal) {
switch (signal) {
case SIGUSR1:
return bar->getOnSigusr1Action();
case SIGUSR2:
return bar->getOnSigusr2Action();
default:
return waybar::util::KillSignalAction::NOOP;
}
}
void handleUserSignal(int signal, bool& reload) {
int i = 0;
for (auto& bar : waybar::Client::inst()->bars) {
switch (getActionForBar(bar.get(), signal)) {
case waybar::util::KillSignalAction::HIDE:
spdlog::debug("Visibility 'hide' for bar ", i);
bar->hide();
break;
case waybar::util::KillSignalAction::SHOW:
spdlog::debug("Visibility 'show' for bar ", i);
bar->show();
break;
case waybar::util::KillSignalAction::TOGGLE:
spdlog::debug("Visibility 'toggle' for bar ", i);
bar->toggle();
break;
case waybar::util::KillSignalAction::RELOAD:
spdlog::info("Reloading...");
reload = true;
waybar::Client::inst()->reset();
return;
case waybar::util::KillSignalAction::NOOP:
break;
}
i++;
}
}
// Must be called on the main thread.
//
// If this signal should restart or close the bar, this function will write
@ -80,21 +121,15 @@ static void handleSignalMainThread(int signum, bool& reload) {
for (auto& bar : waybar::Client::inst()->bars) {
bar->handleSignal(signum);
}
return;
}
switch (signum) {
case SIGUSR1:
spdlog::debug("Visibility toggled");
for (auto& bar : waybar::Client::inst()->bars) {
bar->toggle();
}
handleUserSignal(SIGUSR1, reload);
break;
case SIGUSR2:
spdlog::info("Reloading...");
reload = true;
waybar::Client::inst()->reset();
handleUserSignal(SIGUSR2, reload);
break;
case SIGINT:
spdlog::info("Quitting.");