diff --git a/clutter/Makefile.am b/clutter/Makefile.am index a2c0465de..c285f433c 100644 --- a/clutter/Makefile.am +++ b/clutter/Makefile.am @@ -598,6 +598,7 @@ endif # SUPPORT_TSLIB evdev_c_priv = \ evdev/clutter-device-manager-evdev.c \ evdev/clutter-input-device-evdev.c \ + evdev/clutter-event-evdev.c \ $(NULL) evdev_h_priv = \ evdev/clutter-device-manager-evdev.h \ diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c index 50df6f5ce..ccc923e29 100644 --- a/clutter/evdev/clutter-device-manager-evdev.c +++ b/clutter/evdev/clutter-device-manager-evdev.c @@ -188,12 +188,22 @@ clutter_device_manager_evdev_copy_event_data (ClutterEventExtender *event_extend const ClutterEvent *src, ClutterEvent *dest) { + ClutterEventEvdev *event_evdev; + + event_evdev = _clutter_event_get_platform_data (src); + if (event_evdev != NULL) + _clutter_event_set_platform_data (dest, _clutter_event_evdev_copy (event_evdev)); } static void clutter_device_manager_evdev_free_event_data (ClutterEventExtender *event_extender, ClutterEvent *event) { + ClutterEventEvdev *event_evdev; + + event_evdev = _clutter_event_get_platform_data (event); + if (event_evdev != NULL) + _clutter_event_evdev_free (event_evdev); } static void diff --git a/clutter/evdev/clutter-evdev.h b/clutter/evdev/clutter-evdev.h index 27aa33cd3..1e7963080 100644 --- a/clutter/evdev/clutter-evdev.h +++ b/clutter/evdev/clutter-evdev.h @@ -131,6 +131,9 @@ void clutter_evdev_warp_pointer (ClutterInputDevice *pointer_device, int x, int y); +CLUTTER_AVAILABLE_IN_1_26 +guint32 clutter_evdev_event_get_event_code (const ClutterEvent *event); + G_END_DECLS #endif /* __CLUTTER_EVDEV_H__ */ diff --git a/clutter/evdev/clutter-event-evdev.c b/clutter/evdev/clutter-event-evdev.c new file mode 100644 index 000000000..b2f115ec0 --- /dev/null +++ b/clutter/evdev/clutter-event-evdev.c @@ -0,0 +1,101 @@ +/* Clutter. + * An OpenGL based 'interactive canvas' library. + * + * Copyright (C) 2015 Red Hat + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * 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, see . + * + * Authored by: + * Carlos Garnacho + */ + +#include "config.h" + +#include "clutter/clutter-device-manager-private.h" +#include "clutter/clutter-event-private.h" +#include "clutter-input-device-evdev.h" +#include "clutter-evdev.h" + +typedef struct _ClutterEventEvdev ClutterEventEvdev; + +struct _ClutterEventEvdev +{ + guint32 evcode; +}; + +static ClutterEventEvdev * +_clutter_event_evdev_new (void) +{ + return g_slice_new0 (ClutterEventEvdev); +} + +ClutterEventEvdev * +_clutter_event_evdev_copy (ClutterEventEvdev *event_evdev) +{ + if (event_evdev != NULL) + return g_slice_dup (ClutterEventEvdev, event_evdev); + + return NULL; +} + +void +_clutter_event_evdev_free (ClutterEventEvdev *event_evdev) +{ + if (event_evdev != NULL) + g_slice_free (ClutterEventEvdev, event_evdev); +} + +static ClutterEventEvdev * +clutter_evdev_event_ensure_platform_data (ClutterEvent *event) +{ + ClutterEventEvdev *event_evdev = _clutter_event_get_platform_data (event); + + if (!event_evdev) + { + event_evdev = _clutter_event_evdev_new (); + _clutter_event_set_platform_data (event, event_evdev); + } + + return event_evdev; +} + +void +_clutter_evdev_event_set_event_code (ClutterEvent *event, + guint32 evcode) +{ + ClutterEventEvdev *event_evdev; + + event_evdev = clutter_evdev_event_ensure_platform_data (event); + event_evdev->evcode = evcode; +} + +/** + * clutter_evdev_event_get_event_code: + * @event: a #ClutterEvent + * + * Returns the event code of the original event. See linux/input.h for more + * information. + * + * Returns: The event code. + **/ +guint32 +clutter_evdev_event_get_event_code (const ClutterEvent *event) +{ + ClutterEventEvdev *event_evdev = _clutter_event_get_platform_data (event); + + if (event_evdev) + return event_evdev->evcode; + + return 0; +} diff --git a/clutter/evdev/clutter-input-device-evdev.h b/clutter/evdev/clutter-input-device-evdev.h index 06f3d8615..1302a2c1e 100644 --- a/clutter/evdev/clutter-input-device-evdev.h +++ b/clutter/evdev/clutter-input-device-evdev.h @@ -57,6 +57,7 @@ G_BEGIN_DECLS typedef struct _ClutterInputDeviceEvdev ClutterInputDeviceEvdev; typedef struct _ClutterSeatEvdev ClutterSeatEvdev; +typedef struct _ClutterEventEvdev ClutterEventEvdev; struct _ClutterInputDeviceEvdev { @@ -83,6 +84,13 @@ void _clutter_input_device_evdev_update_leds (ClutterIn ClutterInputDeviceType _clutter_input_device_evdev_determine_type (struct libinput_device *libinput_device); + +ClutterEventEvdev * _clutter_event_evdev_copy (ClutterEventEvdev *event_evdev); +void _clutter_event_evdev_free (ClutterEventEvdev *event_evdev); + +void _clutter_evdev_event_set_event_code (ClutterEvent *event, + guint32 evcode); + G_END_DECLS #endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */