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.
This commit is contained in:
Carlos Garnacho 2011-07-19 20:55:05 +02:00 committed by Jasper St. Pierre
parent b3a9d1b39a
commit 275ab901b0
2 changed files with 32 additions and 0 deletions

View File

@ -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

View File

@ -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.