From 275ab901b0a9e121f50e6233cbbbf1388e94dba3 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Tue, 19 Jul 2011 20:55:05 +0200 Subject: [PATCH] window: set the corresponding client pointer on focused windows. The client window determines the device pair that is used for core protocol calls such as XQueryPointer(), so different clients using the core protocol can be focused by different devices simultaneously. --- src/core/window-private.h | 4 ++++ src/core/window.c | 28 ++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+) diff --git a/src/core/window-private.h b/src/core/window-private.h index f06c6392c..915907906 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -664,6 +664,10 @@ gboolean meta_window_can_tile_side_by_side (MetaWindow *window, void meta_window_compute_tile_match (MetaWindow *window); +void meta_window_set_client_pointer (MetaWindow *window, + MetaDevice *pointer); +MetaDevice * meta_window_get_client_pointer (MetaWindow *window); + MetaDevice * meta_window_guess_grab_pointer (MetaWindow *window); #endif diff --git a/src/core/window.c b/src/core/window.c index 5def815e8..d09258fb7 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -7096,6 +7096,8 @@ meta_window_notify_focus (MetaWindow *window, !meta_prefs_get_raise_on_click()) meta_display_ungrab_focus_window_button (window->display, window); + meta_window_set_client_pointer (window, + meta_device_get_paired_device (keyboard)); g_signal_emit (window, window_signals[FOCUS], 0); if (meta_device_get_id (keyboard) == META_CORE_KEYBOARD_ID) @@ -11067,6 +11069,32 @@ meta_window_compute_tile_match (MetaWindow *window) } } +void +meta_window_set_client_pointer (MetaWindow *window, + MetaDevice *pointer) +{ +#ifdef HAVE_XINPUT2 + XISetClientPointer (window->display->xdisplay, + window->xwindow, + meta_device_get_id (pointer)); +#endif +} + +MetaDevice * +meta_window_get_client_pointer (MetaWindow *window) +{ + int device_id = META_CORE_POINTER_ID; + +#ifdef HAVE_XINPUT2 + if (window->display->have_xinput2) + XIGetClientPointer (window->display->xdisplay, + window->xwindow, &device_id); +#endif + + return meta_device_map_lookup (window->display->device_map, + device_id); +} + /* Guesses the better device to grab on if a grab is to be started, * only should be be used in circumstances where we don't know a * device at all.