diff options
author | 2021-09-04 06:44:56 +0200 | |
---|---|---|
committer | 2022-11-26 10:17:53 +0100 | |
commit | 53f9dbd424dc173a85c9f4cd30802259d38b1ef4 (patch) | |
tree | 0baecedccd66f3721a57f876e625d1ac182cdbda /swaybar/input.c | |
parent | launcher: export X startup ids and use them for workspace matching (diff) | |
download | sway-53f9dbd424dc173a85c9f4cd30802259d38b1ef4.tar.gz sway-53f9dbd424dc173a85c9f4cd30802259d38b1ef4.tar.zst sway-53f9dbd424dc173a85c9f4cd30802259d38b1ef4.zip |
swaybar: Prioritize hotspot events to bar bindings
This is consistent with i3bar's behaviour, and for example, allows binding a
command to button1, while still being able to click on tray icons or other
zones on the bar's status line which may have their own bindings.
E.g., in Sway, without this commit, this config. makes tray icons unclickable:
bar {
# ...
bindsym button1 exec swaynag -m You_clicked_the_tray._Want_some_help?
}
But the same configuration in i3 (with i3-nagbar) keeps tray items clickable.
Signed-off-by: Joan Bruguera <joanbrugueram@gmail.com>
Diffstat (limited to 'swaybar/input.c')
-rw-r--r-- | swaybar/input.c | 20 |
1 files changed, 9 insertions, 11 deletions
diff --git a/swaybar/input.c b/swaybar/input.c index c8c8f0d4..f12eed79 100644 --- a/swaybar/input.c +++ b/swaybar/input.c | |||
@@ -166,14 +166,13 @@ static void wl_pointer_button(void *data, struct wl_pointer *wl_pointer, | |||
166 | return; | 166 | return; |
167 | } | 167 | } |
168 | 168 | ||
169 | if (check_bindings(seat->bar, button, state)) { | 169 | if (state == WL_POINTER_BUTTON_STATE_PRESSED) { |
170 | return; | 170 | if (process_hotspots(output, pointer->x, pointer->y, button)) { |
171 | return; | ||
172 | } | ||
171 | } | 173 | } |
172 | 174 | ||
173 | if (state != WL_POINTER_BUTTON_STATE_PRESSED) { | 175 | check_bindings(seat->bar, button, state); |
174 | return; | ||
175 | } | ||
176 | process_hotspots(output, pointer->x, pointer->y, button); | ||
177 | } | 176 | } |
178 | 177 | ||
179 | static void workspace_next(struct swaybar *bar, struct swaybar_output *output, | 178 | static void workspace_next(struct swaybar *bar, struct swaybar_output *output, |
@@ -222,15 +221,14 @@ static void workspace_next(struct swaybar *bar, struct swaybar_output *output, | |||
222 | static void process_discrete_scroll(struct swaybar_seat *seat, | 221 | static void process_discrete_scroll(struct swaybar_seat *seat, |
223 | struct swaybar_output *output, struct swaybar_pointer *pointer, | 222 | struct swaybar_output *output, struct swaybar_pointer *pointer, |
224 | uint32_t axis, wl_fixed_t value) { | 223 | uint32_t axis, wl_fixed_t value) { |
225 | // If there is a button press binding, execute it, skip default behavior, | ||
226 | // and check button release bindings | ||
227 | uint32_t button = wl_axis_to_button(axis, value); | 224 | uint32_t button = wl_axis_to_button(axis, value); |
228 | if (check_bindings(seat->bar, button, WL_POINTER_BUTTON_STATE_PRESSED)) { | 225 | if (process_hotspots(output, pointer->x, pointer->y, button)) { |
229 | check_bindings(seat->bar, button, WL_POINTER_BUTTON_STATE_RELEASED); | ||
230 | return; | 226 | return; |
231 | } | 227 | } |
232 | 228 | ||
233 | if (process_hotspots(output, pointer->x, pointer->y, button)) { | 229 | // If there is a button press binding, execute it, and check button release bindings |
230 | if (check_bindings(seat->bar, button, WL_POINTER_BUTTON_STATE_PRESSED)) { | ||
231 | check_bindings(seat->bar, button, WL_POINTER_BUTTON_STATE_RELEASED); | ||
234 | return; | 232 | return; |
235 | } | 233 | } |
236 | 234 | ||