From 9431d0603e8e6b5577ce21198d903eecdd006a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joan=20Bruguera=20Mic=C3=B3?= Date: Thu, 15 Aug 2024 14:41:30 +0000 Subject: [PATCH] swaybar: prioritize workspace scroll over bindsyms MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This adds handling for scroll events (e.g. mouse wheel) to the hotspot callback equivalent to the fallback in `process_discrete_scroll`. While this may seem redundant (and in many cases, it is), it changes the priority when the user has Button4/Button5 bindsyms on the bar. Before this commit: * Scrolling on unused bar space calls the user's bindsyms. * Scrolling over the workspaces *still* calls the user's bindsyms. After this commit: * Scrolling on unused bar space calls the user's bindsyms. * Scrolling over the workspaces moves to the previous/next workspace. If the user has no bindsyms for Button4/Button5, there is no change. This is consistent with the idea that workspaces are hotspots, and hotspot event handlers take priority over the user's bindsyms, see 53f9dbd424dc ("swaybar: Prioritize hotspot events to bar bindings"). However, note that this strays further away from i3's behaviour. On i3, user bindsyms take precedence over workspaces, even for Button1. In fact, it's explicitly documented as such: https://web.archive.org/web/20240725173949/https://i3wm.org/docs/userguide.html#_mouse_button_commands Signed-off-by: Joan Bruguera Micó --- swaybar/input.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/swaybar/input.c b/swaybar/input.c index d58628324..4c79f962f 100644 --- a/swaybar/input.c +++ b/swaybar/input.c @@ -246,6 +246,15 @@ bool handle_workspace_button(struct swaybar_output *output, } ipc_send_workspace_command(output->bar, ws); return true; + } else if (button == SWAY_SCROLL_UP || button == SWAY_SCROLL_DOWN || + button == SWAY_SCROLL_LEFT || button == SWAY_SCROLL_RIGHT) { + if (released) { + return true; + } + + workspace_next(output->bar, output, + button == SWAY_SCROLL_UP || button == SWAY_SCROLL_LEFT); + return true; } return false; @@ -266,6 +275,7 @@ static void process_discrete_scroll(struct swaybar_seat *seat, return; } + // If no hotspot nor binding handles the event, scroll through workspaces struct swaybar_config *config = seat->bar->config; double amt = wl_fixed_to_double(value); if (amt == 0.0 || !config->workspace_buttons) {