summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--clutter/evdev/clutter-device-manager-evdev.c53
-rw-r--r--clutter/evdev/clutter-evdev.h7
-rw-r--r--clutter/evdev/clutter-event-evdev.c59
-rw-r--r--clutter/evdev/clutter-input-device-evdev.h6
4 files changed, 110 insertions, 15 deletions
diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c
index 28ae69949..6153a8853 100644
--- a/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/evdev/clutter-device-manager-evdev.c
@@ -403,11 +403,11 @@ keyboard_repeat (gpointer data)
return G_SOURCE_CONTINUE;
}
-static void
-notify_absolute_motion (ClutterInputDevice *input_device,
- guint32 time_,
- gfloat x,
- gfloat y)
+static ClutterEvent *
+new_absolute_motion_event (ClutterInputDevice *input_device,
+ guint32 time_,
+ gfloat x,
+ gfloat y)
{
gfloat stage_width, stage_height;
ClutterDeviceManagerEvdev *manager_evdev;
@@ -452,18 +452,35 @@ notify_absolute_motion (ClutterInputDevice *input_device,
seat->pointer_x = x;
seat->pointer_y = y;
+ return event;
+}
+
+static void
+notify_absolute_motion (ClutterInputDevice *input_device,
+ guint32 time_,
+ gfloat x,
+ gfloat y)
+{
+ ClutterEvent *event;
+
+ event = new_absolute_motion_event (input_device, time_, x, y);
+
queue_event (event);
}
static void
notify_relative_motion (ClutterInputDevice *input_device,
- guint32 time_,
- double dx,
- double dy)
+ struct libinput_event_pointer *pointer_event)
{
+ guint time;
+ double dx;
+ double dy;
+ double dx_unaccel;
+ double dy_unaccel;
gfloat new_x, new_y;
ClutterInputDeviceEvdev *device_evdev;
ClutterSeatEvdev *seat;
+ ClutterEvent *event;
/* We can drop the event on the floor if no stage has been
* associated with the device yet. */
@@ -473,10 +490,21 @@ notify_relative_motion (ClutterInputDevice *input_device,
device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
seat = _clutter_input_device_evdev_get_seat (device_evdev);
+ dx = libinput_event_pointer_get_dx (pointer_event);
+ dy = libinput_event_pointer_get_dy (pointer_event);
new_x = seat->pointer_x + dx;
new_y = seat->pointer_y + dy;
- notify_absolute_motion (input_device, time_, new_x, new_y);
+ time = libinput_event_pointer_get_time (pointer_event);
+ event = new_absolute_motion_event (input_device, time, new_x, new_y);
+
+ dx_unaccel = libinput_event_pointer_get_dx_unaccelerated (pointer_event);
+ dy_unaccel = libinput_event_pointer_get_dy_unaccelerated (pointer_event);
+ _clutter_evdev_event_set_relative_motion (event,
+ dx, dy,
+ dx_unaccel, dy_unaccel);
+
+ queue_event (event);
}
static ClutterScrollDirection
@@ -1407,16 +1435,11 @@ process_device_event (ClutterDeviceManagerEvdev *manager_evdev,
case LIBINPUT_EVENT_POINTER_MOTION:
{
- guint32 time;
- double dx, dy;
struct libinput_event_pointer *motion_event =
libinput_event_get_pointer_event (event);
device = libinput_device_get_user_data (libinput_device);
- time = libinput_event_pointer_get_time (motion_event);
- dx = libinput_event_pointer_get_dx (motion_event);
- dy = libinput_event_pointer_get_dy (motion_event);
- notify_relative_motion (device, time, dx, dy);
+ notify_relative_motion (device, motion_event);
break;
}
diff --git a/clutter/evdev/clutter-evdev.h b/clutter/evdev/clutter-evdev.h
index 1e7963080..8278df82b 100644
--- a/clutter/evdev/clutter-evdev.h
+++ b/clutter/evdev/clutter-evdev.h
@@ -134,6 +134,13 @@ void clutter_evdev_warp_pointer (ClutterInputDevice *pointer_device,
CLUTTER_AVAILABLE_IN_1_26
guint32 clutter_evdev_event_get_event_code (const ClutterEvent *event);
+CLUTTER_AVAILABLE_IN_1_26
+gboolean clutter_evdev_event_get_relative_motion (const ClutterEvent *event,
+ double *dx,
+ double *dy,
+ double *dx_unaccel,
+ double *dy_unaccel);
+
G_END_DECLS
#endif /* __CLUTTER_EVDEV_H__ */
diff --git a/clutter/evdev/clutter-event-evdev.c b/clutter/evdev/clutter-event-evdev.c
index b2f115ec0..a0d66c928 100644
--- a/clutter/evdev/clutter-event-evdev.c
+++ b/clutter/evdev/clutter-event-evdev.c
@@ -32,6 +32,12 @@ typedef struct _ClutterEventEvdev ClutterEventEvdev;
struct _ClutterEventEvdev
{
guint32 evcode;
+
+ gboolean has_relative_motion;
+ double dx;
+ double dy;
+ double dx_unaccel;
+ double dy_unaccel;
};
static ClutterEventEvdev *
@@ -80,6 +86,23 @@ _clutter_evdev_event_set_event_code (ClutterEvent *event,
event_evdev->evcode = evcode;
}
+void
+_clutter_evdev_event_set_relative_motion (ClutterEvent *event,
+ double dx,
+ double dy,
+ double dx_unaccel,
+ double dy_unaccel)
+{
+ ClutterEventEvdev *event_evdev;
+
+ event_evdev = clutter_evdev_event_ensure_platform_data (event);
+ event_evdev->dx = dx;
+ event_evdev->dy = dy;
+ event_evdev->dx_unaccel = dx_unaccel;
+ event_evdev->dy_unaccel = dy_unaccel;
+ event_evdev->has_relative_motion = TRUE;
+}
+
/**
* clutter_evdev_event_get_event_code:
* @event: a #ClutterEvent
@@ -99,3 +122,39 @@ clutter_evdev_event_get_event_code (const ClutterEvent *event)
return 0;
}
+
+/**
+ * clutter_evdev_event_get_pointer_motion
+ * @event: a #ClutterEvent
+ *
+ * If available, the normal and unaccelerated motion deltas are written
+ * to the dx, dy, dx_unaccel and dy_unaccel and TRUE is returned.
+ *
+ * If unavailable, FALSE is returned.
+ *
+ * Returns: TRUE on success, otherwise FALSE.
+ **/
+gboolean
+clutter_evdev_event_get_relative_motion (const ClutterEvent *event,
+ double *dx,
+ double *dy,
+ double *dx_unaccel,
+ double *dy_unaccel)
+{
+ ClutterEventEvdev *event_evdev = _clutter_event_get_platform_data (event);
+
+ if (event_evdev && event_evdev->has_relative_motion)
+ {
+ if (dx)
+ *dx = event_evdev->dx;
+ if (dy)
+ *dy = event_evdev->dy;
+ if (dx_unaccel)
+ *dx_unaccel = event_evdev->dx_unaccel;
+ if (dy_unaccel)
+ *dy_unaccel = event_evdev->dy_unaccel;
+ return TRUE;
+ }
+ else
+ return FALSE;
+}
diff --git a/clutter/evdev/clutter-input-device-evdev.h b/clutter/evdev/clutter-input-device-evdev.h
index 1302a2c1e..dec373915 100644
--- a/clutter/evdev/clutter-input-device-evdev.h
+++ b/clutter/evdev/clutter-input-device-evdev.h
@@ -91,6 +91,12 @@ void _clutter_event_evdev_free (ClutterEv
void _clutter_evdev_event_set_event_code (ClutterEvent *event,
guint32 evcode);
+void _clutter_evdev_event_set_relative_motion (ClutterEvent *event,
+ double dx,
+ double dy,
+ double dx_unaccel,
+ double dy_unaccel);
+
G_END_DECLS
#endif /* __CLUTTER_INPUT_DEVICE_EVDEV_H__ */