diff options
Diffstat (limited to 'gdk/x11/gdkmain-x11.c')
-rw-r--r-- | gdk/x11/gdkmain-x11.c | 266 |
1 files changed, 82 insertions, 184 deletions
diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index f12c7094b8..bf53d6552c 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -47,11 +47,13 @@ #include "gdkasync.h" #include "gdkdisplay-x11.h" #include "gdkinternals.h" +#include "gdkprivate-x11.h" #include "gdkintl.h" #include "gdkregion-generic.h" -#include "gdkinputprivate.h" #include "gdkalias.h" +#include <gdk/gdkdeviceprivate.h> + typedef struct _GdkPredicate GdkPredicate; typedef struct _GdkErrorTrap GdkErrorTrap; @@ -116,8 +118,8 @@ gdk_get_use_xshm (void) return GDK_DISPLAY_X11 (gdk_display_get_default ())->use_xshm; } -static GdkGrabStatus -gdk_x11_convert_grab_status (gint status) +GdkGrabStatus +_gdk_x11_convert_grab_status (gint status) { switch (status) { @@ -143,171 +145,46 @@ has_pointer_grab_callback (GdkDisplay *display, gpointer data, gulong serial) { - _gdk_display_pointer_grab_update (display, serial); -} - -GdkGrabStatus -_gdk_windowing_pointer_grab (GdkWindow *window, - GdkWindow *native, - gboolean owner_events, - GdkEventMask event_mask, - GdkWindow *confine_to, - GdkCursor *cursor, - guint32 time) -{ - gint return_val; - GdkCursorPrivate *cursor_private; - GdkDisplayX11 *display_x11; - guint xevent_mask; - Window xwindow; - Window xconfine_to; - Cursor xcursor; - int i; - - if (confine_to) - confine_to = _gdk_window_get_impl_window (confine_to); - - display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (native)); - - cursor_private = (GdkCursorPrivate*) cursor; - - xwindow = GDK_WINDOW_XID (native); - - if (!confine_to || GDK_WINDOW_DESTROYED (confine_to)) - xconfine_to = None; - else - xconfine_to = GDK_WINDOW_XID (confine_to); - - if (!cursor) - xcursor = None; - else - { - _gdk_x11_cursor_update_theme (cursor); - xcursor = cursor_private->xcursor; - } - - xevent_mask = 0; - for (i = 0; i < _gdk_nenvent_masks; i++) - { - if (event_mask & (1 << (i + 1))) - xevent_mask |= _gdk_event_mask_table[i]; - } - - /* We don't want to set a native motion hint mask, as we're emulating motion - * hints. If we set a native one we just wouldn't get any events. - */ - xevent_mask &= ~PointerMotionHintMask; - - return_val = _gdk_input_grab_pointer (window, - native, - owner_events, - event_mask, - confine_to, - time); + GdkDevice *device = data; - if (return_val == GrabSuccess || - G_UNLIKELY (!display_x11->trusted_client && return_val == AlreadyGrabbed)) - { - if (!GDK_WINDOW_DESTROYED (native)) - { -#ifdef G_ENABLE_DEBUG - if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) - return_val = GrabSuccess; - else -#endif - return_val = XGrabPointer (GDK_WINDOW_XDISPLAY (native), - xwindow, - owner_events, - xevent_mask, - GrabModeAsync, GrabModeAsync, - xconfine_to, - xcursor, - time); - } - else - return_val = AlreadyGrabbed; - } - - if (return_val == GrabSuccess) - _gdk_x11_roundtrip_async (GDK_DISPLAY_OBJECT (display_x11), - has_pointer_grab_callback, - NULL); - - return gdk_x11_convert_grab_status (return_val); + _gdk_display_device_grab_update (display, device, serial); } -/* - *-------------------------------------------------------------- - * gdk_keyboard_grab - * - * Grabs the keyboard to a specific window - * - * Arguments: - * "window" is the window which will receive the grab - * "owner_events" specifies whether events will be reported as is, - * or relative to "window" - * "time" specifies the time - * - * Results: - * - * Side effects: - * requires a corresponding call to gdk_keyboard_ungrab - * - *-------------------------------------------------------------- - */ - GdkGrabStatus -gdk_keyboard_grab (GdkWindow * window, - gboolean owner_events, - guint32 time) +_gdk_windowing_device_grab (GdkDevice *device, + GdkWindow *window, + GdkWindow *native, + gboolean owner_events, + GdkEventMask event_mask, + GdkWindow *confine_to, + GdkCursor *cursor, + guint32 time) { - gint return_val; - unsigned long serial; GdkDisplay *display; - GdkDisplayX11 *display_x11; - GdkWindow *native; - - g_return_val_if_fail (window != NULL, 0); - g_return_val_if_fail (GDK_IS_WINDOW (window), 0); - - native = gdk_window_get_toplevel (window); - - /* TODO: What do we do for offscreens and children? We need to proxy the grab somehow */ - if (!GDK_IS_WINDOW_IMPL_X11 (GDK_WINDOW_OBJECT (native)->impl)) - return GDK_GRAB_SUCCESS; + GdkGrabStatus status = GDK_GRAB_SUCCESS; - display = GDK_WINDOW_DISPLAY (native); - display_x11 = GDK_DISPLAY_X11 (display); + if (!window || GDK_WINDOW_DESTROYED (window)) + return GDK_GRAB_NOT_VIEWABLE; - serial = NextRequest (GDK_WINDOW_XDISPLAY (native)); + display = gdk_device_get_display (device); - if (!GDK_WINDOW_DESTROYED (native)) - { #ifdef G_ENABLE_DEBUG - if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) - return_val = GrabSuccess; - else -#endif - return_val = XGrabKeyboard (GDK_WINDOW_XDISPLAY (native), - GDK_WINDOW_XID (native), - owner_events, - GrabModeAsync, GrabModeAsync, - time); - if (G_UNLIKELY (!display_x11->trusted_client && - return_val == AlreadyGrabbed)) - /* we can't grab the keyboard, but we can do a GTK-local grab */ - return_val = GrabSuccess; - } + if (_gdk_debug_flags & GDK_DEBUG_NOGRABS) + status = GrabSuccess; else - return_val = AlreadyGrabbed; - - if (return_val == GrabSuccess) - _gdk_display_set_has_keyboard_grab (display, - window, native, - owner_events, - serial, time); - - return gdk_x11_convert_grab_status (return_val); +#endif + status = GDK_DEVICE_GET_CLASS (device)->grab (device, + native, + owner_events, + event_mask, + confine_to, + cursor, + time); + if (status == GDK_GRAB_SUCCESS) + _gdk_x11_roundtrip_async (display, + has_pointer_grab_callback, + device); + return status; } /** @@ -325,21 +202,21 @@ _gdk_xgrab_check_unmap (GdkWindow *window, gulong serial) { GdkDisplay *display = gdk_drawable_get_display (window); + GdkDeviceManager *device_manager; + GList *devices, *d; - _gdk_display_end_pointer_grab (display, serial, window, TRUE); + device_manager = gdk_display_get_device_manager (display); - if (display->keyboard_grab.window && - serial >= display->keyboard_grab.serial) - { - GdkWindowObject *private = GDK_WINDOW_OBJECT (window); - GdkWindowObject *tmp = GDK_WINDOW_OBJECT (display->keyboard_grab.window); + /* Get all devices */ + devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); + devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE)); + devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING)); - while (tmp && tmp != private) - tmp = tmp->parent; + /* End all grabs on the newly hidden window */ + for (d = devices; d; d = d->next) + _gdk_display_end_device_grab (display, d->data, serial, window, TRUE); - if (tmp) - _gdk_display_unset_has_keyboard_grab (display, TRUE); - } + g_list_free (devices); } /** @@ -353,25 +230,35 @@ void _gdk_xgrab_check_destroy (GdkWindow *window) { GdkDisplay *display = gdk_drawable_get_display (window); - GdkPointerGrabInfo *grab; + GdkDeviceManager *device_manager; + GdkDeviceGrabInfo *grab; + GList *devices, *d; - /* Make sure there is no lasting grab in this native - window */ - grab = _gdk_display_get_last_pointer_grab (display); - if (grab && grab->native_window == window) + device_manager = gdk_display_get_device_manager (display); + + /* Get all devices */ + devices = gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_MASTER); + devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_SLAVE)); + devices = g_list_concat (devices, gdk_device_manager_list_devices (device_manager, GDK_DEVICE_TYPE_FLOATING)); + + for (d = devices; d; d = d->next) { - /* We don't know the actual serial to end, but it - doesn't really matter as this only happens - after we get told of the destroy from the - server so we know its ended in the server, - just make sure its ended. */ - grab->serial_end = grab->serial_start; - grab->implicit_ungrab = TRUE; + /* Make sure there is no lasting grab in this native window */ + grab = _gdk_display_get_last_device_grab (display, d->data); + + if (grab && grab->native_window == window) + { + /* We don't know the actual serial to end, but it + doesn't really matter as this only happens + after we get told of the destroy from the + server so we know its ended in the server, + just make sure its ended. */ + grab->serial_end = grab->serial_start; + grab->implicit_ungrab = TRUE; + } } - - if (window == display->keyboard_grab.native_window && - display->keyboard_grab.window != NULL) - _gdk_display_unset_has_keyboard_grab (display, TRUE); + + g_list_free (devices); } void @@ -734,5 +621,16 @@ gdk_x11_get_default_xdisplay (void) return GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()); } +void +_gdk_windowing_event_data_copy (const GdkEvent *src, + GdkEvent *dst) +{ +} + +void +_gdk_windowing_event_data_free (GdkEvent *event) +{ +} + #define __GDK_MAIN_X11_C__ #include "gdkaliasdef.c" |