gdk/wayland: Fix button mask calculation on button events
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. Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/5301
This commit is contained in:
@@ -83,6 +83,10 @@
|
||||
#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
|
||||
|
||||
Reference in New Issue
Block a user