feat(xworkspaces): Add group-by-monitor flag

By default, we group workspaces by monitor with the help of
_NET_DESKTOP_VIEWPORT.  However, some users may experience this as an
unpredictable "shuffling" of workspaces.  While WMs could disable
advertising the property itself, it seems more sensible to handle this
at the level of polybar.  Hence, introduce a new group-by-monitor
flag—defaulting to true—which can be used to disable this behaviour.

Closes: https://github.com/polybar/polybar/issues/2603
Related: https://github.com/xmonad/xmonad-contrib/pull/791
Related: https://github.com/qtile/qtile/issues/3375

Co-authored-by: scaramangado <scaramangado@gmail.com>
This commit is contained in:
Tony Zorman 2023-02-28 21:12:35 +01:00 committed by Patrick Ziegler
parent 0a19c5e3d7
commit f7a755799c
3 changed files with 10 additions and 2 deletions

View File

@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- `wm-restack`: - `wm-restack`:
- `bottom`: lowers polybar to the bottom of the window stack (same as the previous behavior of `generic`) ([`#2961`](https://github.com/polybar/polybar/pull/2961)) - `bottom`: lowers polybar to the bottom of the window stack (same as the previous behavior of `generic`) ([`#2961`](https://github.com/polybar/polybar/pull/2961))
- `ewmh`: Tries to use the `_NET_SUPPORTING_WM_CHECK` hint to position the bar ([`#2961`](https://github.com/polybar/polybar/pull/2961)) - `ewmh`: Tries to use the `_NET_SUPPORTING_WM_CHECK` hint to position the bar ([`#2961`](https://github.com/polybar/polybar/pull/2961))
- `internal/xworkspaces`: `group-by-monitor` setting to decide whether `_NET_DESKTOP_VIEWPORT` should be used to group workspaces by monitor; ([`#2603`](https://github.com/polybar/polybar/issues/2603), [`#2926`](https://github.com/polybar/polybar/pull/2926)) by [@slotThe](https://github.com/slotThe/).
### Changed ### Changed
- `custom/script`: - `custom/script`:

View File

@ -105,6 +105,7 @@ namespace modules {
bool m_click{true}; bool m_click{true};
bool m_scroll{true}; bool m_scroll{true};
bool m_revscroll{false}; bool m_revscroll{false};
bool m_group_by_monitor{true};
size_t m_index{0}; size_t m_index{0};
}; };
} // namespace modules } // namespace modules

View File

@ -40,12 +40,16 @@ namespace modules {
m_click = m_conf.get(name(), "enable-click", m_click); m_click = m_conf.get(name(), "enable-click", m_click);
m_scroll = m_conf.get(name(), "enable-scroll", m_scroll); m_scroll = m_conf.get(name(), "enable-scroll", m_scroll);
m_revscroll = m_conf.get(name(), "reverse-scroll", m_revscroll); m_revscroll = m_conf.get(name(), "reverse-scroll", m_revscroll);
m_group_by_monitor = m_conf.get(name(), "group-by-monitor", m_group_by_monitor);
// Add formats and elements // Add formats and elements
m_formatter->add(DEFAULT_FORMAT, TAG_LABEL_STATE, {TAG_LABEL_STATE, TAG_LABEL_MONITOR}); m_formatter->add(DEFAULT_FORMAT, TAG_LABEL_STATE, {TAG_LABEL_STATE, TAG_LABEL_MONITOR});
if (m_formatter->has(TAG_LABEL_MONITOR)) { if (m_formatter->has(TAG_LABEL_MONITOR)) {
m_monitorlabel = load_optional_label(m_conf, name(), "label-monitor", DEFAULT_LABEL_MONITOR); m_monitorlabel = load_optional_label(m_conf, name(), "label-monitor", DEFAULT_LABEL_MONITOR);
if (m_monitorlabel && !m_group_by_monitor) {
throw module_error("Cannot use label-monitor when not grouping by monitor");
}
} }
if (m_formatter->has(TAG_LABEL_STATE)) { if (m_formatter->has(TAG_LABEL_STATE)) {
@ -188,7 +192,9 @@ namespace modules {
/* /*
* Stores the _NET_DESKTOP_VIEWPORT hint * Stores the _NET_DESKTOP_VIEWPORT hint
* *
* For WMs that don't support that hint, we store an empty vector * For WMs that don't support that hint, or if the user explicitly
* disables support via the configuration file, we store an empty
* vector.
* *
* The vector will be padded/reduced to _NET_NUMBER_OF_DESKTOPS. * The vector will be padded/reduced to _NET_NUMBER_OF_DESKTOPS.
* All desktops which aren't explicitly assigned a postion will be * All desktops which aren't explicitly assigned a postion will be
@ -197,7 +203,7 @@ namespace modules {
* We use this to map workspaces to viewports, desktop i is at position * We use this to map workspaces to viewports, desktop i is at position
* ws_positions[i]. * ws_positions[i].
*/ */
vector<position> ws_positions = ewmh_util::get_desktop_viewports(); vector<position> ws_positions = m_group_by_monitor ? ewmh_util::get_desktop_viewports() : vector<position>();
auto num_desktops = m_desktop_names.size(); auto num_desktops = m_desktop_names.size();