Use MetaCursorTracker to query the pointer position

Functionally equivalent in the X11 case, but also correct for
Wayland (where the X server doesn't have the updated pointer
position).

https://bugzilla.gnome.org/show_bug.cgi?id=725525
This commit is contained in:
Giovanni Campagna 2014-03-02 23:27:50 +01:00
parent 91384a32b4
commit bee59ec0e1
4 changed files with 35 additions and 93 deletions

View File

@ -1076,10 +1076,12 @@ get_pointer_position_gdk (int *x,
gmanager = gdk_display_get_device_manager (gdk_display_get_default ()); gmanager = gdk_display_get_device_manager (gdk_display_get_default ());
gdevice = gdk_device_manager_get_client_pointer (gmanager); gdevice = gdk_device_manager_get_client_pointer (gmanager);
gdk_device_get_position (gdevice, &gscreen, x, y); if (x || y)
gdk_device_get_state (gdevice, gdk_device_get_position (gdevice, &gscreen, x, y);
gdk_screen_get_root_window (gscreen), if (mods)
NULL, (GdkModifierType*)mods); gdk_device_get_state (gdevice,
gdk_screen_get_root_window (gscreen),
NULL, (GdkModifierType*)mods);
} }
static void static void
@ -1095,9 +1097,12 @@ get_pointer_position_clutter (int *x,
cdevice = clutter_device_manager_get_core_device (cmanager, CLUTTER_POINTER_DEVICE); cdevice = clutter_device_manager_get_core_device (cmanager, CLUTTER_POINTER_DEVICE);
clutter_input_device_get_coords (cdevice, NULL, &point); clutter_input_device_get_coords (cdevice, NULL, &point);
*x = point.x; if (x)
*y = point.y; *x = point.x;
*mods = clutter_input_device_get_modifier_state (cdevice); if (y)
*y = point.y;
if (mods)
*mods = clutter_input_device_get_modifier_state (cdevice);
} }
void void

View File

@ -1514,38 +1514,19 @@ meta_screen_get_mouse_window (MetaScreen *screen,
MetaWindow *not_this_one) MetaWindow *not_this_one)
{ {
MetaWindow *window; MetaWindow *window;
Window root_return, child_return; int x, y;
double root_x_return, root_y_return;
double win_x_return, win_y_return;
XIButtonState buttons;
XIModifierState mods;
XIGroupState group;
if (not_this_one) if (not_this_one)
meta_topic (META_DEBUG_FOCUS, meta_topic (META_DEBUG_FOCUS,
"Focusing mouse window excluding %s\n", not_this_one->desc); "Focusing mouse window excluding %s\n", not_this_one->desc);
meta_error_trap_push (screen->display); meta_cursor_tracker_get_pointer (screen->cursor_tracker,
XIQueryPointer (screen->display->xdisplay, &x, &y, NULL);
META_VIRTUAL_CORE_POINTER_ID,
screen->xroot,
&root_return,
&child_return,
&root_x_return,
&root_y_return,
&win_x_return,
&win_y_return,
&buttons,
&mods,
&group);
meta_error_trap_pop (screen->display);
free (buttons.mask);
window = meta_stack_get_default_focus_window_at_point (screen->stack, window = meta_stack_get_default_focus_window_at_point (screen->stack,
screen->active_workspace, screen->active_workspace,
not_this_one, not_this_one,
root_x_return, x, y);
root_y_return);
return window; return window;
} }
@ -1827,28 +1808,11 @@ meta_screen_get_current_monitor (MetaScreen *screen)
if (screen->display->monitor_cache_invalidated) if (screen->display->monitor_cache_invalidated)
{ {
Window root_return, child_return; int x, y;
double win_x_return, win_y_return;
double root_x_return, root_y_return;
XIButtonState buttons;
XIModifierState mods;
XIGroupState group;
XIQueryPointer (screen->display->xdisplay, meta_cursor_tracker_get_pointer (screen->cursor_tracker,
META_VIRTUAL_CORE_POINTER_ID, &x, &y, NULL);
screen->xroot, meta_screen_get_current_monitor_for_pos (screen, x, y);
&root_return,
&child_return,
&root_x_return,
&root_y_return,
&win_x_return,
&win_y_return,
&buttons,
&mods,
&group);
free (buttons.mask);
meta_screen_get_current_monitor_for_pos (screen, root_x_return, root_y_return);
} }
return screen->last_monitor_index; return screen->last_monitor_index;

View File

@ -38,6 +38,7 @@
#include <meta/common.h> #include <meta/common.h>
#include <meta/errors.h> #include <meta/errors.h>
#include <meta/prefs.h> #include <meta/prefs.h>
#include <meta/meta-cursor-tracker.h>
#include "window-private.h" #include "window-private.h"
#include "window-props.h" #include "window-props.h"
@ -673,35 +674,19 @@ meta_window_x11_property_notify (MetaWindow *window,
static int static int
query_pressed_buttons (MetaWindow *window) query_pressed_buttons (MetaWindow *window)
{ {
double x, y, query_root_x, query_root_y; ClutterModifierType mods;
Window root, child;
XIButtonState buttons;
XIModifierState mods;
XIGroupState group;
int button = 0; int button = 0;
meta_error_trap_push (window->display); meta_cursor_tracker_get_pointer (window->screen->cursor_tracker,
XIQueryPointer (window->display->xdisplay, NULL, NULL, &mods);
META_VIRTUAL_CORE_POINTER_ID,
window->xwindow,
&root, &child,
&query_root_x, &query_root_y,
&x, &y,
&buttons, &mods, &group);
if (meta_error_trap_pop_with_return (window->display) != Success) if (mods & CLUTTER_BUTTON1_MASK)
goto out;
if (XIMaskIsSet (buttons.mask, Button1))
button |= 1 << 1; button |= 1 << 1;
if (XIMaskIsSet (buttons.mask, Button2)) if (mods & CLUTTER_BUTTON2_MASK)
button |= 1 << 2; button |= 1 << 2;
if (XIMaskIsSet (buttons.mask, Button3)) if (mods & CLUTTER_BUTTON3_MASK)
button |= 1 << 3; button |= 1 << 3;
free (buttons.mask);
out:
return button; return button;
} }

View File

@ -10343,25 +10343,15 @@ window_focus_on_pointer_rest_callback (gpointer data)
MetaWindow *window = focus_data->window; MetaWindow *window = focus_data->window;
MetaDisplay *display = window->display; MetaDisplay *display = window->display;
MetaScreen *screen = window->screen; MetaScreen *screen = window->screen;
Window root, child; int root_x, root_y;
double root_x, root_y, x, y;
guint32 timestamp; guint32 timestamp;
XIButtonState buttons; ClutterActor *child;
XIModifierState mods;
XIGroupState group;
if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK) if (meta_prefs_get_focus_mode () == G_DESKTOP_FOCUS_MODE_CLICK)
goto out; goto out;
meta_error_trap_push (display); meta_cursor_tracker_get_pointer (screen->cursor_tracker,
XIQueryPointer (display->xdisplay, &root_x, &root_y, NULL);
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);
if (root_x != focus_data->pointer_x || if (root_x != focus_data->pointer_x ||
root_y != focus_data->pointer_y) root_y != focus_data->pointer_y)
@ -10371,17 +10361,15 @@ window_focus_on_pointer_rest_callback (gpointer data)
return TRUE; return TRUE;
} }
/* Explicitly check for the overlay window, as get_focus_window_at_point() child = clutter_stage_get_actor_at_pos (CLUTTER_STAGE (clutter_stage_get_default ()),
* may return windows that extend underneath the chrome (like CLUTTER_PICK_REACTIVE, root_x, root_y);
* override-redirect or DESKTOP windows) if (!META_IS_SURFACE_ACTOR (child))
*/
if (child == meta_get_overlay_window (screen))
goto out; goto out;
window = window =
meta_stack_get_default_focus_window_at_point (screen->stack, meta_stack_get_default_focus_window_at_point (screen->stack,
screen->active_workspace, screen->active_workspace,
None, root_x, root_y); NULL, root_x, root_y);
if (window == NULL) if (window == NULL)
goto out; goto out;