From: Matthias Clasen Date: Sat, 3 Jun 2023 14:44:21 +0000 (-0400) Subject: x11: Stop using passive grabs X-Git-Tag: archive/raspbian/4.12.3+ds-1+rpi1~1^2^2^2~22^2~1^2~188^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=686d18dfc23b38d75d5ee336d52b6b54057ab476;p=gtk4.git x11: Stop using passive grabs The keynav that this implements is half-broken under xwayland anyway, and it confused and complicates things on the compositor side. --- diff --git a/gdk/x11/gdkdrag-x11.c b/gdk/x11/gdkdrag-x11.c index 97e0038a89..e2d355f9c2 100644 --- a/gdk/x11/gdkdrag-x11.c +++ b/gdk/x11/gdkdrag-x11.c @@ -134,35 +134,6 @@ struct _GdkX11DragClass GdkDragClass parent_class; }; -typedef struct { - int keysym; - int modifiers; -} GrabKey; - -static GrabKey grab_keys[] = { - { XK_Escape, 0 }, - { XK_space, 0 }, - { XK_KP_Space, 0 }, - { XK_Return, 0 }, - { XK_KP_Enter, 0 }, - { XK_Up, 0 }, - { XK_Up, Mod1Mask }, - { XK_Down, 0 }, - { XK_Down, Mod1Mask }, - { XK_Left, 0 }, - { XK_Left, Mod1Mask }, - { XK_Right, 0 }, - { XK_Right, Mod1Mask }, - { XK_KP_Up, 0 }, - { XK_KP_Up, Mod1Mask }, - { XK_KP_Down, 0 }, - { XK_KP_Down, Mod1Mask }, - { XK_KP_Left, 0 }, - { XK_KP_Left, Mod1Mask }, - { XK_KP_Right, 0 }, - { XK_KP_Right, Mod1Mask } -}; - /* Forward declarations */ static GdkSurfaceCache *gdk_surface_cache_ref (GdkSurfaceCache *cache); @@ -1861,17 +1832,12 @@ drag_grab (GdkDrag *drag) { GdkX11Drag *x11_drag = GDK_X11_DRAG (drag); GdkSeatCapabilities capabilities; - GdkDisplay *display; - Window root; GdkSeat *seat; - int keycode, i; GdkCursor *cursor; if (!x11_drag->ipc_surface) return FALSE; - display = gdk_drag_get_display (drag); - root = GDK_DISPLAY_XROOTWIN (display); seat = gdk_device_get_seat (gdk_drag_get_device (drag)); capabilities = GDK_SEAT_CAPABILITY_ALL_POINTING | GDK_SEAT_CAPABILITY_KEYBOARD; @@ -1886,46 +1852,6 @@ drag_grab (GdkDrag *drag) g_set_object (&x11_drag->grab_seat, seat); - gdk_x11_display_error_trap_push (display); - - for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i) - { - int deviceid = gdk_x11_device_get_id (gdk_seat_get_keyboard (seat)); - unsigned char mask[XIMaskLen(XI_LASTEVENT)]; - XIGrabModifiers mods; - XIEventMask evmask; - int num_mods; - - keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display), - grab_keys[i].keysym); - if (keycode == NoSymbol) - continue; - - memset (mask, 0, sizeof (mask)); - XISetMask (mask, XI_KeyPress); - XISetMask (mask, XI_KeyRelease); - - evmask.deviceid = deviceid; - evmask.mask_len = sizeof (mask); - evmask.mask = mask; - - num_mods = 1; - mods.modifiers = grab_keys[i].modifiers; - - XIGrabKeycode (GDK_DISPLAY_XDISPLAY (display), - deviceid, - keycode, - root, - GrabModeAsync, - GrabModeAsync, - False, - &evmask, - num_mods, - &mods); - } - - gdk_x11_display_error_trap_pop_ignored (display); - return TRUE; } @@ -1933,41 +1859,13 @@ static void drag_ungrab (GdkDrag *drag) { GdkX11Drag *x11_drag = GDK_X11_DRAG (drag); - GdkDisplay *display; - GdkDevice *keyboard; - Window root; - int keycode, i; if (!x11_drag->grab_seat) return; gdk_seat_ungrab (x11_drag->grab_seat); - display = gdk_drag_get_display (drag); - keyboard = gdk_seat_get_keyboard (x11_drag->grab_seat); - root = GDK_DISPLAY_XROOTWIN (display); g_clear_object (&x11_drag->grab_seat); - - for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i) - { - XIGrabModifiers mods; - int num_mods; - - keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display), - grab_keys[i].keysym); - if (keycode == NoSymbol) - continue; - - num_mods = 1; - mods.modifiers = grab_keys[i].modifiers; - - XIUngrabKeycode (GDK_DISPLAY_XDISPLAY (display), - gdk_x11_device_get_id (keyboard), - keycode, - root, - num_mods, - &mods); - } } GdkDrag * @@ -2191,103 +2089,6 @@ gdk_dnd_handle_motion_event (GdkDrag *drag, return TRUE; } -static gboolean -gdk_dnd_handle_key_event (GdkDrag *drag, - GdkEvent *event) -{ - GdkX11Drag *x11_drag = GDK_X11_DRAG (drag); - GdkModifierType state; - GdkDevice *pointer; - GdkSeat *seat; - int dx, dy; - - dx = dy = 0; - state = gdk_event_get_modifier_state (event); - seat = gdk_event_get_seat (event); - pointer = gdk_seat_get_pointer (seat); - - if (event->event_type == GDK_KEY_PRESS) - { - guint keyval = gdk_key_event_get_keyval (event); - - switch (keyval) - { - case GDK_KEY_Escape: - gdk_drag_cancel (drag, GDK_DRAG_CANCEL_USER_CANCELLED); - return TRUE; - - case GDK_KEY_space: - case GDK_KEY_Return: - case GDK_KEY_ISO_Enter: - case GDK_KEY_KP_Enter: - case GDK_KEY_KP_Space: - if ((gdk_drag_get_selected_action (drag) != 0) && - (x11_drag->proxy_xid != None)) - { - g_signal_emit_by_name (drag, "drop-performed"); - } - else - gdk_drag_cancel (drag, GDK_DRAG_CANCEL_NO_TARGET); - - return TRUE; - - case GDK_KEY_Up: - case GDK_KEY_KP_Up: - dy = (state & GDK_ALT_MASK) ? -BIG_STEP : -SMALL_STEP; - break; - - case GDK_KEY_Down: - case GDK_KEY_KP_Down: - dy = (state & GDK_ALT_MASK) ? BIG_STEP : SMALL_STEP; - break; - - case GDK_KEY_Left: - case GDK_KEY_KP_Left: - dx = (state & GDK_ALT_MASK) ? -BIG_STEP : -SMALL_STEP; - break; - - case GDK_KEY_Right: - case GDK_KEY_KP_Right: - dx = (state & GDK_ALT_MASK) ? BIG_STEP : SMALL_STEP; - break; - - default: - break; - } - } - - /* The state is not yet updated in the event, so we need - * to query it here. We could use XGetModifierMapping, but - * that would be overkill. - */ - gdk_x11_device_xi2_query_state (pointer, NULL, NULL, NULL, &state); - - if (dx != 0 || dy != 0) - { - GdkDisplay *display; - Display *xdisplay; - GdkX11Screen *screen; - Window dest; - - x11_drag->last_x += dx; - x11_drag->last_y += dy; - - display = gdk_event_get_display ((GdkEvent *)event); - xdisplay = GDK_DISPLAY_XDISPLAY (display); - screen = GDK_X11_DISPLAY (display)->screen; - dest = GDK_SCREEN_XROOTWIN (screen); - - XWarpPointer (xdisplay, None, dest, 0, 0, 0, 0, - round (x11_drag->last_x * screen->surface_scale), - round (x11_drag->last_y * screen->surface_scale)); - } - - gdk_drag_update (drag, x11_drag->last_x, x11_drag->last_y, state, - gdk_event_get_time (event)); - - return TRUE; -} - static gboolean gdk_dnd_handle_grab_broken_event (GdkDrag *drag, GdkEvent *event) @@ -2354,10 +2155,6 @@ gdk_x11_drag_handle_event (GdkDrag *drag, case GDK_BUTTON_RELEASE: return gdk_dnd_handle_button_event (drag, event); - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - return gdk_dnd_handle_key_event (drag, event); - case GDK_GRAB_BROKEN: return gdk_dnd_handle_grab_broken_event (drag, event);