From e6f0af9abc9c2a3c3608370175dd04cc9cb42d63 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 a17ffbd1b..676b0416d 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -660,6 +660,10 @@ void meta_window_propagate_focus_appearance (MetaWindow *window, MetaDevice *keyboard, gboolean focused); +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 7a2a757a1..27adffdd0 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -6754,6 +6754,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) @@ -10523,6 +10525,32 @@ meta_window_get_frame_bounds (MetaWindow *window) return window->frame_bounds; } +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.