fix(xworkspaces): Fix scrolling (#2492)
The scroll handler had two issues: * It did not respect the order the desktops where displayed in * It would not wrap around on the first desktop because of an integer underflow Fixes #2491
This commit is contained in:
parent
ddabe3f0f4
commit
9f828800fb
@ -132,6 +132,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
([`#2371`](https://github.com/polybar/polybar/issues/2371))
|
([`#2371`](https://github.com/polybar/polybar/issues/2371))
|
||||||
- `polybar -m` used to show both physical outputs and randr monitors, even if the outputs were covered by monitors.
|
- `polybar -m` used to show both physical outputs and randr monitors, even if the outputs were covered by monitors.
|
||||||
([`#2481`](https://github.com/polybar/polybar/issues/2481))
|
([`#2481`](https://github.com/polybar/polybar/issues/2481))
|
||||||
|
- `internal/xworkspaces`: Broken scroll-wrapping and order of workspaces when scrolling
|
||||||
|
([`#2491`](https://github.com/polybar/polybar/issues/2491))
|
||||||
|
|
||||||
|
|
||||||
## [3.5.6] - 2021-05-24
|
## [3.5.6] - 2021-05-24
|
||||||
### Build
|
### Build
|
||||||
|
@ -391,27 +391,42 @@ namespace modules {
|
|||||||
focus_direction(false);
|
focus_direction(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Focuses either the next or previous desktop.
|
||||||
|
*
|
||||||
|
* Will wrap around at the ends and go in the order the desktops are displayed.
|
||||||
|
*/
|
||||||
void xworkspaces_module::focus_direction(bool next) {
|
void xworkspaces_module::focus_direction(bool next) {
|
||||||
std::lock_guard<std::mutex> lock(m_workspace_mutex);
|
std::lock_guard<std::mutex> lock(m_workspace_mutex);
|
||||||
vector<unsigned int> indexes;
|
|
||||||
|
unsigned int current_desktop{ewmh_util::get_current_desktop()};
|
||||||
|
int current_index = -1;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Desktop indices in the order they are displayed.
|
||||||
|
*/
|
||||||
|
vector<unsigned int> indices;
|
||||||
|
|
||||||
for (auto&& viewport : m_viewports) {
|
for (auto&& viewport : m_viewports) {
|
||||||
for (auto&& desktop : viewport->desktops) {
|
for (auto&& desktop : viewport->desktops) {
|
||||||
indexes.emplace_back(desktop->index);
|
|
||||||
|
if (current_desktop == desktop->index) {
|
||||||
|
current_index = indices.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
indices.emplace_back(desktop->index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned new_desktop;
|
if (current_index == -1) {
|
||||||
unsigned int current_desktop{ewmh_util::get_current_desktop()};
|
m_log.err("%s: Current desktop (%u) not found in list of desktops", name(), current_desktop);
|
||||||
|
return;
|
||||||
if (next) {
|
|
||||||
new_desktop = math_util::min<unsigned int>(indexes.back(), current_desktop + 1);
|
|
||||||
new_desktop = new_desktop == current_desktop ? indexes.front() : new_desktop;
|
|
||||||
} else {
|
|
||||||
new_desktop = math_util::max<unsigned int>(indexes.front(), current_desktop - 1);
|
|
||||||
new_desktop = new_desktop == current_desktop ? indexes.back() : new_desktop;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
focus_desktop(new_desktop);
|
int offset = next? 1 : -1;
|
||||||
|
|
||||||
|
int new_index = (current_index + offset + indices.size()) % indices.size();
|
||||||
|
focus_desktop(indices.at(new_index));
|
||||||
}
|
}
|
||||||
|
|
||||||
void xworkspaces_module::focus_desktop(unsigned new_desktop) {
|
void xworkspaces_module::focus_desktop(unsigned new_desktop) {
|
||||||
|
Loading…
Reference in New Issue
Block a user