From e2f29ace20f74e1e62e80ba13d8d6bbe36d65212 Mon Sep 17 00:00:00 2001 From: Denis Gorodnichev Date: Mon, 27 Oct 2014 13:26:39 +0100 Subject: [PATCH] Fixup Gtk3 Gdk device handling --- src/core/display.c | 15 +++++++++------ src/ui/frames.c | 10 ++++++++++ src/ui/ui.c | 15 +++++++++++++-- 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/src/core/display.c b/src/core/display.c index 76408930f..68569f3a1 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -82,9 +82,10 @@ #include #include #include - #include #endif +#include + #include #define GRAB_OP_IS_WINDOW_SWITCH(g) \ @@ -1469,15 +1470,17 @@ static gboolean maybe_send_event_to_gtk(MetaDisplay* display, XEvent* xevent) * (client-side) subwindow for individual menu items. */ - if (gdk_display_pointer_is_grabbed(gdk_display)) - { - return FALSE; - } - #if GTK_CHECK_VERSION (3, 0, 0) GdkDeviceManager *device_manager = gdk_display_get_device_manager (gdk_display); GdkDevice *device = gdk_device_manager_get_client_pointer (device_manager); + + if (gdk_display_device_is_grabbed(gdk_display, device)) +#else + if (gdk_display_pointer_is_grabbed(gdk_display)) #endif + { + return FALSE; + } switch (xevent->type) { diff --git a/src/ui/frames.c b/src/ui/frames.c index d9c7ea1c8..e4db182dc 100644 --- a/src/ui/frames.c +++ b/src/ui/frames.c @@ -2027,7 +2027,12 @@ meta_frames_motion_notify_event (GtkWidget *widget, MetaFrameControl control; int x, y; +#if GTK_CHECK_VERSION (3, 0, 0) + gdk_window_get_device_position (frame->window, event->device, + &x, &y, NULL); +#else gdk_window_get_pointer (frame->window, &x, &y, NULL); +#endif /* Control is set to none unless it matches * the current grab @@ -2072,7 +2077,12 @@ meta_frames_motion_notify_event (GtkWidget *widget, MetaFrameControl control; int x, y; +#if GTK_CHECK_VERSION (3, 0, 0) + gdk_window_get_device_position (frame->window, event->device, + &x, &y, NULL); +#else gdk_window_get_pointer (frame->window, &x, &y, NULL); +#endif control = get_control (frames, frame, x, y); diff --git a/src/ui/ui.c b/src/ui/ui.c index 3c015f0cd..b187f8cb8 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -95,6 +95,7 @@ maybe_redirect_mouse_event (XEvent *xevent) MetaUI *ui; #if GTK_CHECK_VERSION (3, 0, 0) GdkDeviceManager *gmanager; + GdkDevice *gdevice; GdkEvent *gevent; #else GdkEvent gevent; @@ -132,11 +133,20 @@ maybe_redirect_mouse_event (XEvent *xevent) if (gdk_window == NULL) return FALSE; +#if GTK_CHECK_VERSION (3, 0, 0) + gmanager = gdk_display_get_device_manager (gdisplay); + gdevice = gdk_device_manager_get_client_pointer (gmanager); +#endif + /* If GDK already thinks it has a grab, we better let it see events; this * is the menu-navigation case and events need to get sent to the appropriate * (client-side) subwindow for individual menu items. */ +#if GTK_CHECK_VERSION (3, 0, 0) + if (gdk_display_device_is_grabbed (gdisplay, gdevice)) +#else if (gdk_display_pointer_is_grabbed (gdisplay)) +#endif return FALSE; #if !GTK_CHECK_VERSION (3, 0, 0) @@ -245,8 +255,7 @@ maybe_redirect_mouse_event (XEvent *xevent) /* If we've gotten here, we've filled in the gdk_event and should send it on */ #if GTK_CHECK_VERSION (3, 0, 0) - gmanager = gdk_display_get_device_manager (gdisplay); - gdk_event_set_device (gevent, gdk_device_manager_get_client_pointer (gmanager)); gtk_main_do_event (gevent); + gdk_event_set_device (gevent, gdevice); gdk_event_free (gevent); #else gtk_main_do_event (&gevent); @@ -464,6 +473,7 @@ meta_ui_map_frame (MetaUI *ui, GdkWindow *window; GdkDisplay *display; + display = gdk_x11_lookup_xdisplay (ui->xdisplay); window = gdk_x11_window_lookup_for_display (display, xwindow); @@ -478,6 +488,7 @@ meta_ui_unmap_frame (MetaUI *ui, GdkWindow *window; GdkDisplay *display; + display = gdk_x11_lookup_xdisplay (ui->xdisplay); window = gdk_x11_window_lookup_for_display (display, xwindow);