gdk/wayland: Fix button mask calculation on button events
authorCarlos Garnacho <carlosg@gnome.org>
Wed, 2 Nov 2022 16:11:10 +0000 (17:11 +0100)
committerSimon McVittie <smcv@debian.org>
Tue, 6 Dec 2022 11:52:29 +0000 (11:52 +0000)
There's 2 things broken here:
- The mask was calculated on top of the GDK button (i.e. skipping
  4-7 buttons), so GDK_BUTTON4_MASK and GDK_BUTTON5_MASK were not
  assigned. This is now calculated on the (continuous) BTN_ evcodes
  so it is guaranteed that the next 2 physical buttons (i.e.
  back/forward) get these two places in the mask assigned.
- Furthermore, these buttons would be pushed to places in the
  modifier mask that they didn't belong to. It is now checked hard
  that only the first 5 buttons enable a modifier flag.

Overall, this ensures that no event masks with bonkers values are
forwarded, and that no stale implicit grabs are left after additional
buttons are pressed.

Bug: https://gitlab.gnome.org/GNOME/gtk/-/issues/5301
Origin: upstream, 4.8.3, commit:9b74027deaa4995ef582fdaf970ad881c3263cc1

Gbp-Pq: Name gdk-wayland-Fix-button-mask-calculation-on-button-events.patch

gdk/wayland/gdkdevice-wayland.c

index 98e08ecb5feb5e62a4c1aebeb00fc904f4dc9780..f00580fa76c8d16d336d1d29c577b710870d65d5 100644 (file)
 #define BTN_STYLUS3 0x149 /* Linux 4.15 */
 #endif
 
+#define ALL_BUTTONS_MASK (GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | \
+                          GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | \
+                          GDK_BUTTON5_MASK)
+
 #define GDK_SEAT_DEBUG(seat,type,...) GDK_DISPLAY_DEBUG(gdk_seat_get_display (GDK_SEAT (seat)),type,__VA_ARGS__)
 
 typedef struct _GdkWaylandDevicePad GdkWaylandDevicePad;
@@ -1716,7 +1720,8 @@ pointer_handle_button (void              *data,
 
   gdk_wayland_seat_set_frame_event (seat, event);
 
-  modifier = 1 << (8 + gdk_button - 1);
+  modifier = (GDK_BUTTON1_MASK << (button - BUTTON_BASE - 1)) & ALL_BUTTONS_MASK;
+
   if (state)
     seat->pointer_info.button_modifiers |= modifier;
   else