Merge pull request #3930 from Invertisment/master
This commit is contained in:
33
src/bar.cpp
33
src/bar.cpp
@ -8,6 +8,8 @@
|
||||
#include "client.hpp"
|
||||
#include "factory.hpp"
|
||||
#include "group.hpp"
|
||||
#include "util/enum.hpp"
|
||||
#include "util/kill_signal.hpp"
|
||||
|
||||
#ifdef HAVE_SWAY
|
||||
#include "modules/sway/bar.hpp"
|
||||
@ -277,6 +279,32 @@ waybar::Bar::Bar(struct waybar_output* w_output, const Json::Value& w_config)
|
||||
}
|
||||
#endif
|
||||
|
||||
waybar::util::EnumParser<util::KillSignalAction> m_signalActionEnumParser;
|
||||
const auto& configSigusr1 = config["on-sigusr1"];
|
||||
if (configSigusr1.isString()) {
|
||||
auto strSigusr1 = configSigusr1.asString();
|
||||
try {
|
||||
onSigusr1 =
|
||||
m_signalActionEnumParser.parseStringToEnum(strSigusr1, util::userKillSignalActions);
|
||||
} catch (const std::invalid_argument& e) {
|
||||
onSigusr1 = util::SIGNALACTION_DEFAULT_SIGUSR1;
|
||||
spdlog::warn(
|
||||
"Invalid string representation for on-sigusr1. Falling back to default mode (toggle).");
|
||||
}
|
||||
}
|
||||
const auto& configSigusr2 = config["on-sigusr2"];
|
||||
if (configSigusr2.isString()) {
|
||||
auto strSigusr2 = configSigusr2.asString();
|
||||
try {
|
||||
onSigusr2 =
|
||||
m_signalActionEnumParser.parseStringToEnum(strSigusr2, util::userKillSignalActions);
|
||||
} catch (const std::invalid_argument& e) {
|
||||
onSigusr2 = util::SIGNALACTION_DEFAULT_SIGUSR2;
|
||||
spdlog::warn(
|
||||
"Invalid string representation for on-sigusr2. Falling back to default mode (reload).");
|
||||
}
|
||||
}
|
||||
|
||||
setupWidgets();
|
||||
window.show_all();
|
||||
|
||||
@ -422,6 +450,8 @@ void waybar::Bar::setVisible(bool value) {
|
||||
}
|
||||
|
||||
void waybar::Bar::toggle() { setVisible(!visible); }
|
||||
void waybar::Bar::show() { setVisible(true); }
|
||||
void waybar::Bar::hide() { setVisible(false); }
|
||||
|
||||
// Converting string to button code rn as to avoid doing it later
|
||||
void waybar::Bar::setupAltFormatKeyForModule(const std::string& module_name) {
|
||||
@ -479,6 +509,9 @@ void waybar::Bar::handleSignal(int signal) {
|
||||
}
|
||||
}
|
||||
|
||||
waybar::util::KillSignalAction waybar::Bar::getOnSigusr1Action() { return this->onSigusr1; }
|
||||
waybar::util::KillSignalAction waybar::Bar::getOnSigusr2Action() { return this->onSigusr2; }
|
||||
|
||||
void waybar::Bar::getModules(const Factory& factory, const std::string& pos,
|
||||
waybar::Group* group = nullptr) {
|
||||
auto module_list = group != nullptr ? config[pos]["modules"] : config[pos];
|
||||
|
50
src/main.cpp
50
src/main.cpp
@ -7,6 +7,7 @@
|
||||
#include <list>
|
||||
#include <mutex>
|
||||
|
||||
#include "bar.hpp"
|
||||
#include "client.hpp"
|
||||
#include "util/SafeSignal.hpp"
|
||||
|
||||
@ -71,6 +72,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 +120,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.");
|
||||
|
@ -41,5 +41,6 @@ EnumType EnumParser<EnumType>::parseStringToEnum(const std::string& str,
|
||||
// Explicit instantiations for specific EnumType types you intend to use
|
||||
// Add explicit instantiations for all relevant EnumType types
|
||||
template struct EnumParser<modules::hyprland::Workspaces::SortMethod>;
|
||||
template struct EnumParser<util::KillSignalAction>;
|
||||
|
||||
} // namespace waybar::util
|
||||
|
Reference in New Issue
Block a user