Universal Visibility Action (#2320 cont'd) (#2426)

* Add toggle_visible action

* Add set_visible and set_invisible actions

* Rename toggle_visible method to match

`action_toggle_visible` -> `action_toggle_visibility`

Matches with `EVENT_TOGGLE_VISIBILITY`

* Update CHANGELOG

* Revert #2320 IPC commands

IPC commands are no longer necessary now that the actions are
implemented. Changed some method permissions as well to reflect this.

* Add logging and change action names

- `module_toggle`
- `module_show`
- `module_hide`

Delineate common actions to all modules with a `module_` prefix (for
future actions too)

* Update documentation
This commit is contained in:
Nolan Prochnau 2021-07-07 15:43:49 -04:00 committed by GitHub
parent dcd33057fd
commit 06932007a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 53 additions and 46 deletions

View File

@ -76,12 +76,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
([`#316`](https://github.com/polybar/polybar/issues/316)) ([`#316`](https://github.com/polybar/polybar/issues/316))
- Added .ini extension check to the default config search. - Added .ini extension check to the default config search.
([`#2323`](https://github.com/polybar/polybar/issues/2323)) ([`#2323`](https://github.com/polybar/polybar/issues/2323))
- IPC commands to change visibility of modules
(`hide.<name>`, `show.<name>`, and `toggle.<name>`)
([`#2108`](https://github.com/polybar/polybar/issues/2108))
- Config option to hide a certain module - Config option to hide a certain module
(`hidden = false`) (`hidden = false`)
([`#2108`](https://github.com/polybar/polybar/issues/2108)) ([`#2108`](https://github.com/polybar/polybar/issues/2108))
- Actions to control visibility of modules
(`module_toggle`, `module_show`, and `module_hide`)
([`#2108`](https://github.com/polybar/polybar/issues/2108))
- `internal/xworkspaces`: Make the urgent hint persistent - `internal/xworkspaces`: Make the urgent hint persistent
([`#1081`](https://github.com/polybar/polybar/issues/1081)) ([`#1081`](https://github.com/polybar/polybar/issues/1081))
- `internal/network`: `interface-type` may be used in place of `interface` to - `internal/network`: `interface-type` may be used in place of `interface` to

View File

@ -121,6 +121,19 @@ Available Actions
The following modules have actions available. Most of them are already used by The following modules have actions available. Most of them are already used by
the module by default for click and scroll events. the module by default for click and scroll events.
All Modules
^^^^^^^^^^^
These actions are available to all modules and are prefixed with ``module_``.
:``module_show``, ``module_hide``:
Shows/Hides a module. The module is still running in the background when
hidden, it is just not drawn. The starting state can be configured with the
`hidden` configuration option.
:``module_toggle``:
Toggles the visibility of a module.
internal/date internal/date
^^^^^^^^^^^^^ ^^^^^^^^^^^^^

View File

@ -76,8 +76,6 @@ class controller
bool forward_action(const actions_util::action& cmd); bool forward_action(const actions_util::action& cmd);
bool try_forward_legacy_action(const string& cmd); bool try_forward_legacy_action(const string& cmd);
void switch_module_visibility(string module_name_raw, int visible);
connection& m_connection; connection& m_connection;
signal_emitter& m_sig; signal_emitter& m_sig;
const logger& m_log; const logger& m_log;

View File

@ -118,7 +118,6 @@ namespace modules {
virtual string name() const = 0; virtual string name() const = 0;
virtual bool running() const = 0; virtual bool running() const = 0;
virtual bool visible() const = 0; virtual bool visible() const = 0;
virtual void set_visible(bool value) = 0;
/** /**
* Handle action, possibly with data attached * Handle action, possibly with data attached
@ -145,6 +144,10 @@ namespace modules {
module(const bar_settings bar, string name); module(const bar_settings bar, string name);
~module() noexcept; ~module() noexcept;
static constexpr auto EVENT_MODULE_TOGGLE = "module_toggle";
static constexpr auto EVENT_MODULE_SHOW = "module_show";
static constexpr auto EVENT_MODULE_HIDE = "module_hide";
string type() const override; string type() const override;
string name_raw() const override; string name_raw() const override;
@ -152,7 +155,6 @@ namespace modules {
bool running() const override; bool running() const override;
bool visible() const override; bool visible() const override;
void set_visible(bool value) override;
void stop() override; void stop() override;
void halt(string error_message) override; void halt(string error_message) override;
@ -171,6 +173,12 @@ namespace modules {
string get_format() const; string get_format() const;
string get_output(); string get_output();
void set_visible(bool value);
void action_module_toggle();
void action_module_show();
void action_module_hide();
protected: protected:
signal_emitter& m_sig; signal_emitter& m_sig;
const bar_settings m_bar; const bar_settings m_bar;

View File

@ -26,7 +26,11 @@ namespace modules {
, m_builder(make_unique<builder>(bar)) , m_builder(make_unique<builder>(bar))
, m_formatter(make_unique<module_formatter>(m_conf, m_name)) , m_formatter(make_unique<module_formatter>(m_conf, m_name))
, m_handle_events(m_conf.get(m_name, "handle-events", true)) , m_handle_events(m_conf.get(m_name, "handle-events", true))
, m_visible(!m_conf.get(m_name, "hidden", false)) {} , m_visible(!m_conf.get(m_name, "hidden", false)) {
m_router->register_action(EVENT_MODULE_TOGGLE, &module<Impl>::action_module_toggle);
m_router->register_action(EVENT_MODULE_SHOW, &module<Impl>::action_module_show);
m_router->register_action(EVENT_MODULE_HIDE, &module<Impl>::action_module_hide);
}
template <typename Impl> template <typename Impl>
module<Impl>::~module() noexcept { module<Impl>::~module() noexcept {
@ -67,13 +71,6 @@ namespace modules {
return static_cast<bool>(m_visible); return static_cast<bool>(m_visible);
} }
template <typename Impl>
void module<Impl>::set_visible(bool value) {
m_log.info("%s: Visibility changed (state=%s)", m_name, value ? "shown" : "hidden");
m_visible = value;
broadcast();
}
template <typename Impl> template <typename Impl>
void module<Impl>::stop() { void module<Impl>::stop() {
if (!static_cast<bool>(m_enabled)) { if (!static_cast<bool>(m_enabled)) {
@ -231,6 +228,28 @@ namespace modules {
return format->decorate(&*m_builder, m_builder->flush()); return format->decorate(&*m_builder, m_builder->flush());
} }
template <typename Impl>
void module<Impl>::set_visible(bool value) {
m_log.notice("%s: Visibility changed (state=%s)", m_name, value ? "shown" : "hidden");
m_visible = value;
broadcast();
}
template <typename Impl>
void module<Impl>::action_module_toggle() {
set_visible(!m_visible);
}
template <typename Impl>
void module<Impl>::action_module_show() {
set_visible(true);
}
template <typename Impl>
void module<Impl>::action_module_hide() {
set_visible(false);
}
// }}} // }}}
} // namespace modules } // namespace modules

View File

@ -30,7 +30,6 @@ namespace modules {
bool visible() const override { \ bool visible() const override { \
return false; \ return false; \
} \ } \
void set_visible(bool) override {} \
void start() override {} \ void start() override {} \
void stop() override {} \ void stop() override {} \
void halt(string) override {} \ void halt(string) override {} \

View File

@ -528,26 +528,6 @@ bool controller::forward_action(const actions_util::action& action_triple) {
return true; return true;
} }
void controller::switch_module_visibility(string module_name_raw, int visible) {
for (auto&& mod : m_modules) {
if (mod->name_raw() != module_name_raw)
continue;
if (visible == 0) {
mod->set_visible(false);
} else if (visible == 1) {
mod->set_visible(true);
} else if (visible == 2) {
mod->set_visible(!mod->visible());
}
return;
}
m_log.err("controller: Module '%s' not found for visibility change (state=%s)", module_name_raw,
visible ? "shown" : "hidden");
}
/** /**
* Process stored input data * Process stored input data
*/ */
@ -839,10 +819,6 @@ bool controller::on(const signals::ipc::command& evt) {
return false; return false;
} }
string hide_module{"hide."};
string show_module{"show."};
string toggle_module{"toggle."};
if (command == "quit") { if (command == "quit") {
enqueue(make_quit_evt(false)); enqueue(make_quit_evt(false));
} else if (command == "restart") { } else if (command == "restart") {
@ -853,12 +829,6 @@ bool controller::on(const signals::ipc::command& evt) {
m_bar->show(); m_bar->show();
} else if (command == "toggle") { } else if (command == "toggle") {
m_bar->toggle(); m_bar->toggle();
} else if (command.find(hide_module) == 0) {
switch_module_visibility(command.substr(hide_module.length()), 0);
} else if (command.find(show_module) == 0) {
switch_module_visibility(command.substr(show_module.length()), 1);
} else if (command.find(toggle_module) == 0) {
switch_module_visibility(command.substr(toggle_module.length()), 2);
} else { } else {
m_log.warn("\"%s\" is not a valid ipc command", command); m_log.warn("\"%s\" is not a valid ipc command", command);
} }