diff options
-rw-r--r-- | docs/reference/gdk/gdk3-sections.txt | 1 | ||||
-rw-r--r-- | gdk/gdk.symbols | 1 | ||||
-rw-r--r-- | gdk/gdkdevicemanager.c | 24 | ||||
-rw-r--r-- | gdk/gdkdevicemanager.h | 2 | ||||
-rw-r--r-- | gdk/gdkdisplay.c | 4 | ||||
-rw-r--r-- | gdk/quartz/gdkdevicemanager-core.c | 11 | ||||
-rw-r--r-- | gdk/win32/gdkdevicemanager-win32.c | 11 | ||||
-rw-r--r-- | gdk/x11/gdkdevicemanager-core.c | 11 | ||||
-rw-r--r-- | gdk/x11/gdkdevicemanager-xi2.c | 19 | ||||
-rw-r--r-- | gdk/x11/gdkdevicemanager-xi2.h | 2 |
10 files changed, 84 insertions, 2 deletions
diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index 6769743c7b..8814d364e3 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -1020,6 +1020,7 @@ GdkGrabOwnership gdk_enable_multidevice gdk_device_manager_get_display gdk_device_manager_list_devices +gdk_device_manager_get_client_pointer <SUBSECTION> gdk_device_get_name diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index 3a5b9bb8d3..5dc69280f3 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -386,6 +386,7 @@ gdk_cursor_get_image gdk_device_manager_get_display gdk_device_manager_get_type G_GNUC_CONST gdk_device_manager_list_devices +gdk_device_manager_get_client_pointer #endif #endif diff --git a/gdk/gdkdevicemanager.c b/gdk/gdkdevicemanager.c index 5bce0fcf91..b93e8a3cd8 100644 --- a/gdk/gdkdevicemanager.c +++ b/gdk/gdkdevicemanager.c @@ -298,5 +298,29 @@ gdk_device_manager_list_devices (GdkDeviceManager *device_manager, return GDK_DEVICE_MANAGER_GET_CLASS (device_manager)->list_devices (device_manager, type); } +/** + * gdk_device_manager_get_client_pointer: + * @device_manager: a #GdkDeviceManager + * + * Returns the client pointer, that is, the master pointer that acts as the core pointer + * for this application. In X11, window managers may change this depending on the interaction + * pattern under the presence of several pointers. + * + * You should use this function sheldomly, only in code that isn't triggered by a #GdkEvent + * and there aren't other means to get a meaningful #GdkDevice to operate on. + * + * Returns: The client pointer. + * + * Since: 3.0 + **/ +GdkDevice * +gdk_device_manager_get_client_pointer (GdkDeviceManager *device_manager) +{ + g_return_val_if_fail (GDK_IS_DEVICE_MANAGER (device_manager), NULL); + + return GDK_DEVICE_MANAGER_GET_CLASS (device_manager)->get_client_pointer (device_manager); +} + + #define __GDK_DEVICE_MANAGER_C__ #include "gdkaliasdef.c" diff --git a/gdk/gdkdevicemanager.h b/gdk/gdkdevicemanager.h index 32ac376884..bed2bbba86 100644 --- a/gdk/gdkdevicemanager.h +++ b/gdk/gdkdevicemanager.h @@ -63,6 +63,7 @@ struct _GdkDeviceManagerClass /* VMethods */ GList * (* list_devices) (GdkDeviceManager *device_manager, GdkDeviceType type); + GdkDevice * (* get_client_pointer) (GdkDeviceManager *device_manager); }; GType gdk_device_manager_get_type (void) G_GNUC_CONST; @@ -70,6 +71,7 @@ GType gdk_device_manager_get_type (void) G_GNUC_CONST; GdkDisplay * gdk_device_manager_get_display (GdkDeviceManager *device_manager); GList * gdk_device_manager_list_devices (GdkDeviceManager *device_manager, GdkDeviceType type); +GdkDevice * gdk_device_manager_get_client_pointer (GdkDeviceManager *device_manager); G_END_DECLS diff --git a/gdk/gdkdisplay.c b/gdk/gdkdisplay.c index d1f6a47a19..366fcfd326 100644 --- a/gdk/gdkdisplay.c +++ b/gdk/gdkdisplay.c @@ -605,7 +605,7 @@ gdk_event_send_clientmessage_toall (GdkEvent *event) * Return value: the core pointer device; this is owned by the * display and should not be freed. * - * Deprecated: 3.0: Use gdk_display_get_device_manager() instead, or + * Deprecated: 3.0: Use gdk_display_get_client_pointer() instead, or * gdk_event_get_device() if a #GdkEvent with pointer device * information is available. **/ @@ -626,7 +626,7 @@ gdk_device_get_core_pointer (void) * * Since: 2.2 * - * Deprecated: 3.0: Use gdk_display_get_device_manager() instead, or + * Deprecated: 3.0: Use gdk_display_get_client_pointer() instead, or * gdk_event_get_device() if a #GdkEvent with device * information is available. **/ diff --git a/gdk/quartz/gdkdevicemanager-core.c b/gdk/quartz/gdkdevicemanager-core.c index d4765c1335..e96e9a9bf3 100644 --- a/gdk/quartz/gdkdevicemanager-core.c +++ b/gdk/quartz/gdkdevicemanager-core.c @@ -34,6 +34,7 @@ static void gdk_device_manager_core_constructed (GObject *object); static GList * gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager, GdkDeviceType type); +static GdkDevice * gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager); G_DEFINE_TYPE (GdkDeviceManagerCore, gdk_device_manager_core, GDK_TYPE_DEVICE_MANAGER) @@ -47,6 +48,7 @@ gdk_device_manager_core_class_init (GdkDeviceManagerCoreClass *klass) object_class->finalize = gdk_device_manager_core_finalize; object_class->constructed = gdk_device_manager_core_constructed; device_manager_class->list_devices = gdk_device_manager_core_list_devices; + device_manager_class->get_client_pointer = gdk_device_manager_core_get_client_pointer; } static GdkDevice * @@ -128,3 +130,12 @@ gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager, return devices; } + +static GdkDevice * +gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager) +{ + GdkDeviceManagerCore *device_manager_core; + + device_manager_core = (GdkDeviceManagerCore *) device_manager; + return device_manager_core->core_pointer; +} diff --git a/gdk/win32/gdkdevicemanager-win32.c b/gdk/win32/gdkdevicemanager-win32.c index eea814296b..e3696bbf6f 100644 --- a/gdk/win32/gdkdevicemanager-win32.c +++ b/gdk/win32/gdkdevicemanager-win32.c @@ -69,6 +69,7 @@ static void gdk_device_manager_win32_constructed (GObject *object); static GList * gdk_device_manager_win32_list_devices (GdkDeviceManager *device_manager, GdkDeviceType type); +static GdkDevice * gdk_device_manager_win32_get_client_pointer (GdkDeviceManager *device_manager); G_DEFINE_TYPE (GdkDeviceManagerWin32, gdk_device_manager_win32, GDK_TYPE_DEVICE_MANAGER) @@ -82,6 +83,7 @@ gdk_device_manager_win32_class_init (GdkDeviceManagerWin32Class *klass) object_class->finalize = gdk_device_manager_win32_finalize; object_class->constructed = gdk_device_manager_win32_constructed; device_manager_class->list_devices = gdk_device_manager_win32_list_devices; + device_manager_class->get_client_pointer = gdk_device_manager_win32_get_client_pointer; } static GdkDevice * @@ -690,6 +692,15 @@ gdk_device_manager_win32_list_devices (GdkDeviceManager *device_manager, return devices; } +static GdkDevice * +gdk_device_manager_win32_get_client_pointer (GdkDeviceManager *device_manager) +{ + GdkDeviceManagerWin32 *device_manager_win32; + + device_manager_win32 = (GdkDeviceManagerWin32 *) device_manager; + return device_manager_win32->core_pointer; +} + void _gdk_input_set_tablet_active (void) { diff --git a/gdk/x11/gdkdevicemanager-core.c b/gdk/x11/gdkdevicemanager-core.c index 7d2e9e44b3..5fb6f2ee8c 100644 --- a/gdk/x11/gdkdevicemanager-core.c +++ b/gdk/x11/gdkdevicemanager-core.c @@ -42,6 +42,7 @@ static void gdk_device_manager_core_constructed (GObject *object); static GList * gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager, GdkDeviceType type); +static GdkDevice * gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager); static void gdk_device_manager_event_translator_init (GdkEventTranslatorIface *iface); @@ -64,6 +65,7 @@ gdk_device_manager_core_class_init (GdkDeviceManagerCoreClass *klass) object_class->finalize = gdk_device_manager_core_finalize; object_class->constructed = gdk_device_manager_core_constructed; device_manager_class->list_devices = gdk_device_manager_core_list_devices; + device_manager_class->get_client_pointer = gdk_device_manager_core_get_client_pointer; } static void @@ -900,5 +902,14 @@ gdk_device_manager_core_list_devices (GdkDeviceManager *device_manager, return devices; } +static GdkDevice * +gdk_device_manager_core_get_client_pointer (GdkDeviceManager *device_manager) +{ + GdkDeviceManagerCore *device_manager_core; + + device_manager_core = (GdkDeviceManagerCore *) device_manager; + return device_manager_core->core_pointer; +} + #define __GDK_DEVICE_MANAGER_CORE_C__ #include "gdkaliasdef.c" diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index f9a9cd7650..57eb3212b2 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -38,6 +38,7 @@ static void gdk_device_manager_xi2_finalize (GObject *object); static GList * gdk_device_manager_xi2_list_devices (GdkDeviceManager *device_manager, GdkDeviceType type); +static GdkDevice * gdk_device_manager_xi2_get_client_pointer (GdkDeviceManager *device_manager); static void gdk_device_manager_xi2_event_translator_init (GdkEventTranslatorIface *iface); @@ -66,6 +67,7 @@ gdk_device_manager_xi2_class_init (GdkDeviceManagerXI2Class *klass) object_class->finalize = gdk_device_manager_xi2_finalize; device_manager_class->list_devices = gdk_device_manager_xi2_list_devices; + device_manager_class->get_client_pointer = gdk_device_manager_xi2_get_client_pointer; } static void @@ -419,6 +421,23 @@ gdk_device_manager_xi2_list_devices (GdkDeviceManager *device_manager, return g_list_copy (list); } +static GdkDevice * +gdk_device_manager_xi2_get_client_pointer (GdkDeviceManager *device_manager) +{ + GdkDeviceManagerXI2 *device_manager_xi2; + GdkDisplay *display; + int device_id; + + device_manager_xi2 = (GdkDeviceManagerXI2 *) device_manager; + display = gdk_device_manager_get_display (device_manager); + + XIGetClientPointer (GDK_DISPLAY_XDISPLAY (display), + None, &device_id); + + return g_hash_table_lookup (device_manager_xi2->id_table, + GINT_TO_POINTER (device_id)); +} + static void gdk_device_manager_xi2_event_translator_init (GdkEventTranslatorIface *iface) { diff --git a/gdk/x11/gdkdevicemanager-xi2.h b/gdk/x11/gdkdevicemanager-xi2.h index 828aec3f48..20054c160c 100644 --- a/gdk/x11/gdkdevicemanager-xi2.h +++ b/gdk/x11/gdkdevicemanager-xi2.h @@ -45,6 +45,8 @@ struct _GdkDeviceManagerXI2 GList *slave_devices; GList *floating_devices; + GdkDevice *client_pointer; + int opcode; }; |