diff options
author | Carlos Garnacho <carlosg@gnome.org> | 2014-11-18 14:25:51 +0100 |
---|---|---|
committer | Carlos Garnacho <carlosg@gnome.org> | 2015-01-19 15:09:19 +0100 |
commit | 121fddc4d25934e14a731175ab356f73be4c26c2 (patch) | |
tree | 259ea99bfa5f5cc6a0be5d84ec06d992ffff3f00 /gdk | |
parent | 5e53676b469d747b40763770828681c6970863ce (diff) | |
download | gtk+-121fddc4d25934e14a731175ab356f73be4c26c2.tar.gz |
x11: Fetch vendor/product identifiers for input devices
These are retrieved from XInput device properties.
https://bugzilla.gnome.org/show_bug.cgi?id=740758
Diffstat (limited to 'gdk')
-rw-r--r-- | gdk/x11/gdkdevicemanager-xi2.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index 49d698719e..b0f3138037 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -32,6 +32,7 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/extensions/XInput2.h> +#include <X11/Xatom.h> #include <string.h> @@ -300,6 +301,39 @@ is_touch_device (XIAnyClassInfo **classes, return FALSE; } +static gboolean +get_device_ids (GdkDisplay *display, + XIDeviceInfo *info, + gchar **vendor_id, + gchar **product_id) +{ + gulong nitems, bytes_after; + guint32 *data; + int rc, format; + Atom type; + + gdk_x11_display_error_trap_push (display); + + rc = XIGetProperty (GDK_DISPLAY_XDISPLAY (display), + info->deviceid, + gdk_x11_get_xatom_by_name_for_display (display, "Device Product ID"), + 0, 2, False, XA_INTEGER, &type, &format, &nitems, &bytes_after, + (guchar **) &data); + gdk_x11_display_error_trap_pop_ignored (display); + + if (rc != Success || type != XA_INTEGER || format != 32 || nitems != 2) + return FALSE; + + if (vendor_id) + *vendor_id = g_strdup_printf ("%.4x", data[0]); + if (product_id) + *product_id = g_strdup_printf ("%.4x", data[1]); + + XFree (data); + + return TRUE; +} + static GdkDevice * create_device (GdkDeviceManager *device_manager, GdkDisplay *display, @@ -311,6 +345,7 @@ create_device (GdkDeviceManager *device_manager, GdkDevice *device; GdkInputMode mode; gint num_touches = 0; + gchar *vendor_id = NULL, *product_id = NULL; if (dev->use == XIMasterKeyboard || dev->use == XISlaveKeyboard) input_source = GDK_SOURCE_KEYBOARD; @@ -369,6 +404,10 @@ create_device (GdkDeviceManager *device_manager, num_touches); })); + if (dev->use != XIMasterKeyboard && + dev->use != XIMasterPointer) + get_device_ids (display, dev, &vendor_id, &product_id); + device = g_object_new (GDK_TYPE_X11_DEVICE_XI2, "name", dev->name, "type", type, @@ -378,9 +417,13 @@ create_device (GdkDeviceManager *device_manager, "display", display, "device-manager", device_manager, "device-id", dev->deviceid, + "vendor-id", vendor_id, + "product-id", product_id, NULL); translate_device_classes (display, device, dev->classes, dev->num_classes); + g_free (vendor_id); + g_free (product_id); return device; } |