diff options
author | Florian Müllner <fmuellner@gnome.org> | 2014-05-07 23:22:41 +0200 |
---|---|---|
committer | Florian Müllner <fmuellner@gnome.org> | 2014-05-21 22:56:14 +0200 |
commit | f38c1f6ab4a45d409077962b0324cade8582f0ce (patch) | |
tree | e0431c44c40ea25598ef1ca8c8a4910e26baa856 | |
parent | f159611fabc6205c691d33b4fd035750e3dc836e (diff) | |
download | mutter-f38c1f6ab4a45d409077962b0324cade8582f0ce.tar.gz |
window: Fix delayed mouse mode on X
On X, basing the check whether the pointer is on the window on
Clutter events does not work, as the relevant events are handled
by GDK instead.
So add an X-specific window_has_pointer() implementation to also
fix mouse mode when running as X compositor.
https://bugzilla.gnome.org/show_bug.cgi?id=730541
-rw-r--r-- | src/core/window.c | 35 |
1 files changed, 34 insertions, 1 deletions
diff --git a/src/core/window.c b/src/core/window.c index 9bbfbced6..53880e406 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -7699,7 +7699,7 @@ mouse_mode_focus (MetaWindow *window, } static gboolean -window_has_pointer (MetaWindow *window) +window_has_pointer_wayland (MetaWindow *window) { ClutterDeviceManager *dm; ClutterInputDevice *dev; @@ -7714,6 +7714,39 @@ window_has_pointer (MetaWindow *window) } static gboolean +window_has_pointer_x11 (MetaWindow *window) +{ + MetaDisplay *display = window->display; + MetaScreen *screen = window->screen; + Window root, child; + double root_x, root_y, x, y; + XIButtonState buttons; + XIModifierState mods; + XIGroupState group; + + meta_error_trap_push (display); + XIQueryPointer (display->xdisplay, + META_VIRTUAL_CORE_POINTER_ID, + screen->xroot, + &root, &child, + &root_x, &root_y, &x, &y, + &buttons, &mods, &group); + meta_error_trap_pop (display); + free (buttons.mask); + + return meta_display_lookup_x_window (display, child) == window; +} + +static gboolean +window_has_pointer (MetaWindow *window) +{ + if (meta_is_wayland_compositor ()) + return window_has_pointer_wayland (window); + else + return window_has_pointer_x11 (window); +} + +static gboolean window_focus_on_pointer_rest_callback (gpointer data) { MetaFocusData *focus_data = data; |