diff options
author | Joan Bruguera <joanbrugueram@gmail.com> | 2021-09-18 22:21:22 +0200 |
---|---|---|
committer | Simon Ser <contact@emersion.fr> | 2022-11-26 10:17:53 +0100 |
commit | 94b69acf0d7b26ee5af2172300cb18473508da76 (patch) | |
tree | 1b26242344968929fc2698b49b12478eb9fe4fae /swaybar/tray | |
parent | 53f9dbd424dc173a85c9f4cd30802259d38b1ef4 (diff) | |
download | sway-94b69acf0d7b26ee5af2172300cb18473508da76.tar.xz |
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.c | 7 |
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) { static enum hotspot_event_handling icon_hotspot_callback( struct swaybar_output *output, struct swaybar_hotspot *hotspot, - double x, double y, uint32_t button, void *data) { + double x, double y, uint32_t button, bool released, void *data) { sway_log(SWAY_DEBUG, "Clicked on %s", (char *)data); struct swaybar_tray *tray = output->bar->tray; int idx = list_seq_find(tray->items, cmp_sni_id, data); if (idx != -1) { + if (released) { + // Since we handle the pressed event, also handle the released event + // to block it from falling through to a binding in the bar + return HOTSPOT_IGNORE; + } struct swaybar_sni *sni = tray->items->items[idx]; // guess global position since wayland doesn't expose it struct swaybar_config *config = tray->bar->config; |