aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/render.c
diff options
context:
space:
mode:
authorLibravatar Joan Bruguera <joanbrugueram@gmail.com>2021-09-18 22:21:22 +0200
committerLibravatar Simon Ser <contact@emersion.fr>2022-11-26 10:29:59 +0100
commit0a9b468540d4be7dbea3b63515b64eaa5c187f0f (patch)
tree0ad85957876211c887654dd2d8a55fc4d7abbaf8 /swaybar/render.c
parentswaybar: Prioritize hotspot events to bar bindings (diff)
downloadsway-0a9b468540d4be7dbea3b63515b64eaa5c187f0f.tar.gz
sway-0a9b468540d4be7dbea3b63515b64eaa5c187f0f.tar.zst
sway-0a9b468540d4be7dbea3b63515b64eaa5c187f0f.zip
swaybar: Make hotspots block bar release bindings
The previous commit prioritized hotspots before bar bindings for press events, which matches i3's behaviour. However, since hotspots don't need to do any processing on release events, those were not handled, and simply fell through to `bindsym --release` bar bindings (if any). This is counter-intuitive, and doesn't match i3's behaviour. Instead in case a hotspot handles the press event, it should also handle the release event, doing nothing, but blocking the event from triggering a --release bar binding. E.g., in Sway, without this commit, this config. shows a text on tray clicks: bar { # ... bindsym --release button1 exec swaynag -m I_got_the_release_event. } But the same configuration in i3 (with i3-nagbar) doesn't show the text. Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com> (cherry picked from commit 94b69acf0d7b26ee5af2172300cb18473508da76)
Diffstat (limited to 'swaybar/render.c')
-rw-r--r--swaybar/render.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/swaybar/render.c b/swaybar/render.c
index a878805e..95f6e5be 100644
--- a/swaybar/render.c
+++ b/swaybar/render.c
@@ -160,7 +160,7 @@ static void render_sharp_line(cairo_t *cairo, uint32_t color,
160 160
161static enum hotspot_event_handling block_hotspot_callback( 161static enum hotspot_event_handling block_hotspot_callback(
162 struct swaybar_output *output, struct swaybar_hotspot *hotspot, 162 struct swaybar_output *output, struct swaybar_hotspot *hotspot,
163 double x, double y, uint32_t button, void *data) { 163 double x, double y, uint32_t button, bool released, void *data) {
164 struct i3bar_block *block = data; 164 struct i3bar_block *block = data;
165 struct status_line *status = output->bar->status; 165 struct status_line *status = output->bar->status;
166 return i3bar_block_send_click(status, block, x, y, 166 return i3bar_block_send_click(status, block, x, y,
@@ -168,7 +168,7 @@ static enum hotspot_event_handling block_hotspot_callback(
168 y - (double)hotspot->y, 168 y - (double)hotspot->y,
169 (double)hotspot->width, 169 (double)hotspot->width,
170 (double)hotspot->height, 170 (double)hotspot->height,
171 output->scale, button); 171 output->scale, button, released);
172} 172}
173 173
174static void i3bar_block_unref_callback(void *data) { 174static void i3bar_block_unref_callback(void *data) {
@@ -599,10 +599,15 @@ static uint32_t render_binding_mode_indicator(struct render_context *ctx,
599 599
600static enum hotspot_event_handling workspace_hotspot_callback( 600static enum hotspot_event_handling workspace_hotspot_callback(
601 struct swaybar_output *output, struct swaybar_hotspot *hotspot, 601 struct swaybar_output *output, struct swaybar_hotspot *hotspot,
602 double x, double y, uint32_t button, void *data) { 602 double x, double y, uint32_t button, bool released, void *data) {
603 if (button != BTN_LEFT) { 603 if (button != BTN_LEFT) {
604 return HOTSPOT_PROCESS; 604 return HOTSPOT_PROCESS;
605 } 605 }
606 if (released) {
607 // Since we handle the pressed event, also handle the released event
608 // to block it from falling through to a binding in the bar
609 return HOTSPOT_IGNORE;
610 }
606 ipc_send_workspace_command(output->bar, (const char *)data); 611 ipc_send_workspace_command(output->bar, (const char *)data);
607 return HOTSPOT_IGNORE; 612 return HOTSPOT_IGNORE;
608} 613}