mirror of
https://github.com/swaywm/sway.git
synced 2025-11-06 13:29:50 -05:00
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 94b69acf0d)
This commit is contained in:
parent
b92af7e3ca
commit
0a9b468540
6 changed files with 31 additions and 15 deletions
|
|
@ -141,14 +141,15 @@ static bool check_bindings(struct swaybar *bar, uint32_t button,
|
|||
}
|
||||
|
||||
static bool process_hotspots(struct swaybar_output *output,
|
||||
double x, double y, uint32_t button) {
|
||||
double x, double y, uint32_t button, uint32_t state) {
|
||||
bool released = state == WL_POINTER_BUTTON_STATE_RELEASED;
|
||||
struct swaybar_hotspot *hotspot;
|
||||
wl_list_for_each(hotspot, &output->hotspots, link) {
|
||||
if (x >= hotspot->x && y >= hotspot->y
|
||||
&& x < hotspot->x + hotspot->width
|
||||
&& y < hotspot->y + hotspot->height) {
|
||||
if (HOTSPOT_IGNORE == hotspot->callback(output, hotspot, x, y,
|
||||
button, hotspot->data)) {
|
||||
button, released, hotspot->data)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
|
@ -166,10 +167,8 @@ static void wl_pointer_button(void *data, struct wl_pointer *wl_pointer,
|
|||
return;
|
||||
}
|
||||
|
||||
if (state == WL_POINTER_BUTTON_STATE_PRESSED) {
|
||||
if (process_hotspots(output, pointer->x, pointer->y, button)) {
|
||||
return;
|
||||
}
|
||||
if (process_hotspots(output, pointer->x, pointer->y, button, state)) {
|
||||
return;
|
||||
}
|
||||
|
||||
check_bindings(seat->bar, button, state);
|
||||
|
|
@ -222,7 +221,8 @@ static void process_discrete_scroll(struct swaybar_seat *seat,
|
|||
struct swaybar_output *output, struct swaybar_pointer *pointer,
|
||||
uint32_t axis, wl_fixed_t value) {
|
||||
uint32_t button = wl_axis_to_button(axis, value);
|
||||
if (process_hotspots(output, pointer->x, pointer->y, button)) {
|
||||
if (process_hotspots(output, pointer->x, pointer->y, button, WL_POINTER_BUTTON_STATE_PRESSED)) {
|
||||
// (Currently hotspots don't do anything on release events, so no need to emit one)
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -401,7 +401,8 @@ static void wl_touch_up(void *data, struct wl_touch *wl_touch,
|
|||
}
|
||||
if (time - slot->time < 500) {
|
||||
// Tap, treat it like a pointer click
|
||||
process_hotspots(slot->output, slot->x, slot->y, BTN_LEFT);
|
||||
process_hotspots(slot->output, slot->x, slot->y, BTN_LEFT, WL_POINTER_BUTTON_STATE_PRESSED);
|
||||
// (Currently hotspots don't do anything on release events, so no need to emit one)
|
||||
}
|
||||
slot->output = NULL;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue