mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-10 19:00:08 +00:00
Drop x11-specific code from the GTK+ dnd code
We were using passive grabs to listen for some individual keys. Nowadays, the managed dnd code in the x11 backend does the same.
This commit is contained in:
parent
2ba64e0b62
commit
c9ce0bd4ba
228
gtk/gtkdnd.c
228
gtk/gtkdnd.c
@ -319,232 +319,6 @@ gtk_drag_get_ipc_widget (GtkWidget *widget)
|
||||
return result;
|
||||
}
|
||||
|
||||
#if defined (GDK_WINDOWING_X11)
|
||||
|
||||
/*
|
||||
* We want to handle a handful of keys during DND, e.g. Escape to abort.
|
||||
* Grabbing the keyboard has the unfortunate side-effect of preventing
|
||||
* useful things such as using Alt-Tab to cycle between windows or
|
||||
* switching workspaces. Therefore, we just grab the few keys we are
|
||||
* interested in. Note that we need to put the grabs on the root window
|
||||
* in order for them to still work when the focus is moved to another
|
||||
* app/workspace.
|
||||
*
|
||||
* GDK needs a little help to successfully deliver root key events...
|
||||
*/
|
||||
|
||||
static GdkFilterReturn
|
||||
root_key_filter (GdkXEvent *xevent,
|
||||
GdkEvent *event,
|
||||
gpointer data)
|
||||
{
|
||||
XEvent *ev = (XEvent *) xevent;
|
||||
|
||||
if ((ev->type == KeyPress || ev->type == KeyRelease) &&
|
||||
ev->xkey.root == ev->xkey.window)
|
||||
ev->xkey.window = (Window)data;
|
||||
else if (ev->type == GenericEvent)
|
||||
{
|
||||
XGenericEventCookie *cookie;
|
||||
XIDeviceEvent *dev;
|
||||
|
||||
cookie = &ev->xcookie;
|
||||
dev = (XIDeviceEvent *) cookie->data;
|
||||
|
||||
if (dev->evtype == XI_KeyPress ||
|
||||
dev->evtype == XI_KeyRelease)
|
||||
dev->event = (Window)data;
|
||||
}
|
||||
|
||||
return GDK_FILTER_CONTINUE;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
gint keysym;
|
||||
gint 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 }
|
||||
};
|
||||
|
||||
static void
|
||||
grab_dnd_keys (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
guint32 time)
|
||||
{
|
||||
guint i;
|
||||
GdkWindow *window, *root;
|
||||
gint keycode;
|
||||
#ifdef XINPUT_2
|
||||
gint deviceid;
|
||||
XIGrabModifiers mods;
|
||||
gint num_mods;
|
||||
XIEventMask evmask;
|
||||
unsigned char mask[(XI_LASTEVENT + 7)/8];
|
||||
gboolean using_xi2;
|
||||
|
||||
window = gtk_widget_get_window (widget);
|
||||
if (!GDK_IS_X11_WINDOW (window))
|
||||
{
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
||||
gdk_device_grab (device,
|
||||
gtk_widget_get_window (widget),
|
||||
GDK_OWNERSHIP_APPLICATION, FALSE,
|
||||
GDK_KEY_PRESS_MASK | GDK_KEY_RELEASE_MASK,
|
||||
NULL, time);
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||
return;
|
||||
}
|
||||
|
||||
deviceid = gdk_x11_device_get_id (device);
|
||||
|
||||
if (GDK_IS_X11_DEVICE_XI2 (device))
|
||||
using_xi2 = TRUE;
|
||||
else
|
||||
using_xi2 = FALSE;
|
||||
#endif
|
||||
|
||||
root = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
|
||||
|
||||
gdk_error_trap_push ();
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i)
|
||||
{
|
||||
keycode = XKeysymToKeycode (GDK_WINDOW_XDISPLAY (window), grab_keys[i].keysym);
|
||||
if (keycode == NoSymbol)
|
||||
continue;
|
||||
|
||||
#ifdef XINPUT_2
|
||||
if (using_xi2)
|
||||
{
|
||||
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_WINDOW_XDISPLAY (window),
|
||||
deviceid,
|
||||
keycode,
|
||||
GDK_WINDOW_XID (root),
|
||||
GrabModeAsync,
|
||||
GrabModeAsync,
|
||||
False,
|
||||
&evmask,
|
||||
num_mods,
|
||||
&mods);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
XGrabKey (GDK_WINDOW_XDISPLAY (window),
|
||||
keycode, grab_keys[i].modifiers,
|
||||
GDK_WINDOW_XID (root),
|
||||
FALSE,
|
||||
GrabModeAsync,
|
||||
GrabModeAsync);
|
||||
}
|
||||
|
||||
gdk_flush ();
|
||||
gdk_error_trap_pop_ignored ();
|
||||
|
||||
gdk_window_add_filter (NULL, root_key_filter, (gpointer) GDK_WINDOW_XID (window));
|
||||
}
|
||||
|
||||
static void
|
||||
ungrab_dnd_keys (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
guint32 time)
|
||||
{
|
||||
guint i;
|
||||
GdkWindow *window, *root;
|
||||
gint keycode;
|
||||
#ifdef XINPUT_2
|
||||
XIGrabModifiers mods;
|
||||
gint num_mods;
|
||||
gint deviceid;
|
||||
gboolean using_xi2;
|
||||
|
||||
window = gtk_widget_get_window (widget);
|
||||
if (!GDK_IS_X11_WINDOW (window))
|
||||
{
|
||||
G_GNUC_BEGIN_IGNORE_DEPRECATIONS;
|
||||
gdk_device_ungrab (device, time);
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||
return;
|
||||
}
|
||||
|
||||
deviceid = gdk_x11_device_get_id (device);
|
||||
|
||||
if (GDK_IS_X11_DEVICE_XI2 (device))
|
||||
using_xi2 = TRUE;
|
||||
else
|
||||
using_xi2 = FALSE;
|
||||
#endif
|
||||
|
||||
root = gdk_screen_get_root_window (gtk_widget_get_screen (widget));
|
||||
|
||||
gdk_window_remove_filter (NULL, root_key_filter, (gpointer) GDK_WINDOW_XID (window));
|
||||
|
||||
gdk_error_trap_push ();
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (grab_keys); ++i)
|
||||
{
|
||||
keycode = XKeysymToKeycode (GDK_WINDOW_XDISPLAY (window), grab_keys[i].keysym);
|
||||
if (keycode == NoSymbol)
|
||||
continue;
|
||||
|
||||
#ifdef XINPUT_2
|
||||
if (using_xi2)
|
||||
{
|
||||
num_mods = 1;
|
||||
mods.modifiers = grab_keys[i].modifiers;
|
||||
|
||||
XIUngrabKeycode (GDK_WINDOW_XDISPLAY (window),
|
||||
deviceid,
|
||||
keycode,
|
||||
GDK_WINDOW_XID (root),
|
||||
num_mods,
|
||||
&mods);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
XUngrabKey (GDK_WINDOW_XDISPLAY (window),
|
||||
keycode, grab_keys[i].modifiers,
|
||||
GDK_WINDOW_XID (root));
|
||||
}
|
||||
|
||||
gdk_flush ();
|
||||
gdk_error_trap_pop_ignored ();
|
||||
}
|
||||
|
||||
#else /* !GDK_WINDOWING_X11 */
|
||||
|
||||
static void
|
||||
grab_dnd_keys (GtkWidget *widget,
|
||||
GdkDevice *device,
|
||||
@ -569,8 +343,6 @@ ungrab_dnd_keys (GtkWidget *widget,
|
||||
G_GNUC_END_IGNORE_DEPRECATIONS;
|
||||
}
|
||||
|
||||
#endif /* GDK_WINDOWING_X11 */
|
||||
|
||||
/*
|
||||
* gtk_drag_release_ipc_widget:
|
||||
* @widget: the widget to release
|
||||
|
Loading…
Reference in New Issue
Block a user