X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gdk%2Fx11%2Fgdkdevicemanager-x11.c;h=cd77b24bba740b66cdb8a10bca45b74a1bd4108d;hb=9d0febc9a64a5bfb0fcfc3a88de4757f6c1ff090;hp=a19a05e065e87b322ca83d0d535b8c2c93a2d43d;hpb=920e8b434367f9aa8aab306721cc024e66892e2e;p=~andy%2Fgtk diff --git a/gdk/x11/gdkdevicemanager-x11.c b/gdk/x11/gdkdevicemanager-x11.c index a19a05e06..cd77b24bb 100644 --- a/gdk/x11/gdkdevicemanager-x11.c +++ b/gdk/x11/gdkdevicemanager-x11.c @@ -12,14 +12,13 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ #include "config.h" #include "gdkx11devicemanager-core.h" +#include "gdkdevicemanagerprivate-core.h" #ifdef XINPUT_XFREE #include "gdkx11devicemanager-xi.h" #ifdef XINPUT_2 @@ -29,6 +28,12 @@ #include "gdkinternals.h" #include "gdkprivate-x11.h" +/* Defines for VCP/VCK, to be used too + * for the core protocol device manager + */ +#define VIRTUAL_CORE_POINTER_ID 2 +#define VIRTUAL_CORE_KEYBOARD_ID 3 + GdkDeviceManager * _gdk_x11_device_manager_new (GdkDisplay *display) { @@ -83,3 +88,85 @@ _gdk_x11_device_manager_new (GdkDisplay *display) "display", display, NULL); } + +/** + * gdk_x11_device_manager_lookup: + * @device_manager: a #GdkDeviceManager + * @device_id: a device ID, as understood by the XInput2 protocol + * + * Returns the #GdkDevice that wraps the given device ID. + * + * Returns: (transfer none): (allow-none): The #GdkDevice wrapping the device ID, + * or %NULL if the given ID doesn't currently represent a device. + * + * Since: 3.2 + **/ +GdkDevice * +gdk_x11_device_manager_lookup (GdkDeviceManager *device_manager, + gint device_id) +{ + GdkDevice *device = NULL; + + g_return_val_if_fail (GDK_IS_DEVICE_MANAGER (device_manager), NULL); + +#ifdef XINPUT_2 + if (GDK_IS_X11_DEVICE_MANAGER_XI2 (device_manager)) + device = _gdk_x11_device_manager_xi2_lookup (GDK_X11_DEVICE_MANAGER_XI2 (device_manager), + device_id); + else +#endif /* XINPUT_2 */ + if (GDK_IS_X11_DEVICE_MANAGER_CORE (device_manager)) + { + /* It is a core/xi1 device manager, we only map + * IDs 2 and 3, matching XI2's Virtual Core Pointer + * and Keyboard. + */ + if (device_id == VIRTUAL_CORE_POINTER_ID) + device = GDK_X11_DEVICE_MANAGER_CORE (device_manager)->core_pointer; + else if (device_id == VIRTUAL_CORE_KEYBOARD_ID) + device = GDK_X11_DEVICE_MANAGER_CORE (device_manager)->core_keyboard; + } + + return device; +} + +/** + * gdk_x11_device_get_id: + * @device: a #GdkDevice + * + * Returns the device ID as seen by XInput2. + * + * + * If gdk_disable_multidevice() has been called, this function + * will respectively return 2/3 for the core pointer and keyboard, + * (matching the IDs for the Virtual Core Pointer and Keyboard in + * XInput 2), but calling this function on any slave devices (i.e. + * those managed via XInput 1.x), will return 0. + * + * + * Returns: the XInput2 device ID. + * + * Since: 3.2 + **/ +gint +gdk_x11_device_get_id (GdkDevice *device) +{ + gint device_id = 0; + + g_return_val_if_fail (GDK_IS_DEVICE (device), 0); + +#ifdef XINPUT_2 + if (GDK_IS_X11_DEVICE_XI2 (device)) + device_id = _gdk_x11_device_xi2_get_id (GDK_X11_DEVICE_XI2 (device)); + else +#endif /* XINPUT_2 */ + if (GDK_IS_X11_DEVICE_CORE (device)) + { + if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) + device_id = VIRTUAL_CORE_KEYBOARD_ID; + else + device_id = VIRTUAL_CORE_POINTER_ID; + } + + return device_id; +}