aboutsummaryrefslogtreecommitdiffstats
path: root/swaybar/tray
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:17:53 +0100
commit94b69acf0d7b26ee5af2172300cb18473508da76 (patch)
tree1b26242344968929fc2698b49b12478eb9fe4fae /swaybar/tray
parentswaybar: Prioritize hotspot events to bar bindings (diff)
downloadsway-94b69acf0d7b26ee5af2172300cb18473508da76.tar.gz
sway-94b69acf0d7b26ee5af2172300cb18473508da76.tar.zst
sway-94b69acf0d7b26ee5af2172300cb18473508da76.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>
Diffstat (limited to 'swaybar/tray')
-rw-r--r--swaybar/tray/item.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/swaybar/tray/item.c b/swaybar/tray/item.c
index 0cb5ee9d..1f18b8bb 100644
--- a/swaybar/tray/item.c
+++ b/swaybar/tray/item.c
@@ -385,13 +385,18 @@ static int cmp_sni_id(const void *item, const void *cmp_to) {
385 385
386static enum hotspot_event_handling icon_hotspot_callback( 386static enum hotspot_event_handling icon_hotspot_callback(
387 struct swaybar_output *output, struct swaybar_hotspot *hotspot, 387 struct swaybar_output *output, struct swaybar_hotspot *hotspot,
388 double x, double y, uint32_t button, void *data) { 388 double x, double y, uint32_t button, bool released, void *data) {
389 sway_log(SWAY_DEBUG, "Clicked on %s", (char *)data); 389 sway_log(SWAY_DEBUG, "Clicked on %s", (char *)data);
390 390
391 struct swaybar_tray *tray = output->bar->tray; 391 struct swaybar_tray *tray = output->bar->tray;
392 int idx = list_seq_find(tray->items, cmp_sni_id, data); 392 int idx = list_seq_find(tray->items, cmp_sni_id, data);
393 393
394 if (idx != -1) { 394 if (idx != -1) {
395 if (released) {
396 // Since we handle the pressed event, also handle the released event
397 // to block it from falling through to a binding in the bar
398 return HOTSPOT_IGNORE;
399 }
395 struct swaybar_sni *sni = tray->items->items[idx]; 400 struct swaybar_sni *sni = tray->items->items[idx];
396 // guess global position since wayland doesn't expose it 401 // guess global position since wayland doesn't expose it
397 struct swaybar_config *config = tray->bar->config; 402 struct swaybar_config *config = tray->bar->config;