[mutter] clutter: Add smooth scroll and touch API to virtual devices
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] clutter: Add smooth scroll and touch API to virtual devices
- Date: Fri, 23 Feb 2018 12:51:18 +0000 (UTC)
commit 203a0b37ede9d52c6a940c916338f3dd10d2df2b
Author: Jonas Ådahl <jadahl gmail com>
Date: Mon Jan 29 14:21:11 2018 +0800
clutter: Add smooth scroll and touch API to virtual devices
So far only implemented on the evdev backend,as X11 doesn't support touch
devices nor smooth scrolling via XTEST.
clutter/clutter/clutter-virtual-input-device.c | 55 ++++++++++
clutter/clutter/clutter-virtual-input-device.h | 49 +++++++++
clutter/clutter/evdev/clutter-input-device-evdev.c | 3 +
.../evdev/clutter-virtual-input-device-evdev.c | 122 +++++++++++++++++++++
.../clutter/x11/clutter-virtual-input-device-x11.c | 75 +++++++++++++
5 files changed, 304 insertions(+)
---
diff --git a/clutter/clutter/clutter-virtual-input-device.c b/clutter/clutter/clutter-virtual-input-device.c
index 8cab4bce8..d86433361 100644
--- a/clutter/clutter/clutter-virtual-input-device.c
+++ b/clutter/clutter/clutter-virtual-input-device.c
@@ -128,6 +128,61 @@ clutter_virtual_input_device_notify_discrete_scroll (ClutterVirtualInputDevice *
direction, scroll_source);
}
+void
+clutter_virtual_input_device_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ double dx,
+ double dy,
+ ClutterScrollSource scroll_source,
+ ClutterScrollFinishFlags finish_flags)
+{
+ ClutterVirtualInputDeviceClass *klass =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
+
+ klass->notify_scroll_continuous (virtual_device, time_us,
+ dx, dy, scroll_source, finish_flags);
+}
+
+void
+clutter_virtual_input_device_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot,
+ double x,
+ double y)
+{
+ ClutterVirtualInputDeviceClass *klass =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
+
+ klass->notify_touch_down (virtual_device, time_us,
+ slot, x, y);
+}
+
+void
+clutter_virtual_input_device_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot,
+ double x,
+ double y)
+{
+ ClutterVirtualInputDeviceClass *klass =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
+
+ klass->notify_touch_motion (virtual_device, time_us,
+ slot, x, y);
+}
+
+void
+clutter_virtual_input_device_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot)
+{
+ ClutterVirtualInputDeviceClass *klass =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device);
+
+ klass->notify_touch_up (virtual_device, time_us,
+ slot);
+}
+
/**
* clutter_virtual_input_device_get_manager:
* @virtual_device: a virtual device
diff --git a/clutter/clutter/clutter-virtual-input-device.h b/clutter/clutter/clutter-virtual-input-device.h
index a2a0b30ba..11b747a7f 100644
--- a/clutter/clutter/clutter-virtual-input-device.h
+++ b/clutter/clutter/clutter-virtual-input-device.h
@@ -81,6 +81,29 @@ struct _ClutterVirtualInputDeviceClass
uint64_t time_us,
ClutterScrollDirection direction,
ClutterScrollSource scroll_source);
+
+ void (*notify_scroll_continuous) (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ double dx,
+ double dy,
+ ClutterScrollSource scroll_source,
+ ClutterScrollFinishFlags finish_flags);
+
+ void (*notify_touch_down) (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot,
+ double x,
+ double y);
+
+ void (*notify_touch_motion) (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot,
+ double x,
+ double y);
+
+ void (*notify_touch_up) (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot);
};
CLUTTER_AVAILABLE_IN_ALL
@@ -119,6 +142,32 @@ void clutter_virtual_input_device_notify_discrete_scroll (ClutterVirtualInputDev
ClutterScrollDirection direction,
ClutterScrollSource scroll_source);
+CLUTTER_AVAILABLE_IN_ALL
+void clutter_virtual_input_device_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ double dx,
+ double dy,
+ ClutterScrollSource scroll_source,
+ ClutterScrollFinishFlags finish_flags);
+
+CLUTTER_AVAILABLE_IN_ALL
+void clutter_virtual_input_device_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot,
+ double x,
+ double y);
+
+CLUTTER_AVAILABLE_IN_ALL
+void clutter_virtual_input_device_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot,
+ double x,
+ double y);
+
+CLUTTER_AVAILABLE_IN_ALL
+void clutter_virtual_input_device_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int slot);
CLUTTER_AVAILABLE_IN_ALL
ClutterDeviceManager * clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device);
diff --git a/clutter/clutter/evdev/clutter-input-device-evdev.c
b/clutter/clutter/evdev/clutter-input-device-evdev.c
index 322f5224e..6c52361ee 100644
--- a/clutter/clutter/evdev/clutter-input-device-evdev.c
+++ b/clutter/clutter/evdev/clutter-input-device-evdev.c
@@ -1393,6 +1393,9 @@ _clutter_input_device_evdev_new_virtual (ClutterDeviceManager *manager,
case CLUTTER_POINTER_DEVICE:
name = "Virtual pointer device for seat";
break;
+ case CLUTTER_TOUCHSCREEN_DEVICE:
+ name = "Virtual touchscreen device for seat";
+ break;
default:
name = "Virtual device for seat";
break;
diff --git a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
index e487708d9..fe628da85 100644
--- a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
+++ b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
@@ -448,6 +448,124 @@ clutter_virtual_input_device_evdev_notify_discrete_scroll (ClutterVirtualInputDe
scroll_source);
}
+static void
+clutter_virtual_input_device_evdev_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ double dx,
+ double dy,
+ ClutterScrollSource scroll_source,
+ ClutterScrollFinishFlags finish_flags)
+{
+ ClutterVirtualInputDeviceEvdev *virtual_evdev =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
+
+ if (time_us == CLUTTER_CURRENT_TIME)
+ time_us = g_get_monotonic_time ();
+
+ clutter_seat_evdev_notify_scroll_continuous (virtual_evdev->seat,
+ virtual_evdev->device,
+ time_us,
+ dx, dy,
+ scroll_source,
+ CLUTTER_SCROLL_FINISHED_NONE);
+}
+
+static void
+clutter_virtual_input_device_evdev_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int device_slot,
+ double x,
+ double y)
+{
+ ClutterVirtualInputDeviceEvdev *virtual_evdev =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
+ ClutterInputDeviceEvdev *device_evdev =
+ CLUTTER_INPUT_DEVICE_EVDEV (virtual_evdev->device);
+ ClutterTouchState *touch_state;
+
+ if (time_us == CLUTTER_CURRENT_TIME)
+ time_us = g_get_monotonic_time ();
+
+ touch_state = clutter_input_device_evdev_acquire_touch_state (device_evdev,
+ device_slot);
+ if (!touch_state)
+ return;
+
+ touch_state->coords.x = x;
+ touch_state->coords.y = y;
+
+ clutter_seat_evdev_notify_touch_event (virtual_evdev->seat,
+ virtual_evdev->device,
+ CLUTTER_TOUCH_BEGIN,
+ time_us,
+ touch_state->seat_slot,
+ touch_state->coords.x,
+ touch_state->coords.y);
+}
+
+static void
+clutter_virtual_input_device_evdev_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int device_slot,
+ double x,
+ double y)
+{
+ ClutterVirtualInputDeviceEvdev *virtual_evdev =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
+ ClutterInputDeviceEvdev *device_evdev =
+ CLUTTER_INPUT_DEVICE_EVDEV (virtual_evdev->device);
+ ClutterTouchState *touch_state;
+
+ if (time_us == CLUTTER_CURRENT_TIME)
+ time_us = g_get_monotonic_time ();
+
+ touch_state = clutter_input_device_evdev_lookup_touch_state (device_evdev,
+ device_slot);
+ if (!touch_state)
+ return;
+
+ touch_state->coords.x = x;
+ touch_state->coords.y = y;
+
+ clutter_seat_evdev_notify_touch_event (virtual_evdev->seat,
+ virtual_evdev->device,
+ CLUTTER_TOUCH_BEGIN,
+ time_us,
+ touch_state->seat_slot,
+ touch_state->coords.x,
+ touch_state->coords.y);
+}
+
+static void
+clutter_virtual_input_device_evdev_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int device_slot)
+{
+ ClutterVirtualInputDeviceEvdev *virtual_evdev =
+ CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device);
+ ClutterInputDeviceEvdev *device_evdev =
+ CLUTTER_INPUT_DEVICE_EVDEV (virtual_evdev->device);
+ ClutterTouchState *touch_state;
+
+ if (time_us == CLUTTER_CURRENT_TIME)
+ time_us = g_get_monotonic_time ();
+
+ touch_state = clutter_input_device_evdev_lookup_touch_state (device_evdev,
+ device_slot);
+ if (!touch_state)
+ return;
+
+ clutter_seat_evdev_notify_touch_event (virtual_evdev->seat,
+ virtual_evdev->device,
+ CLUTTER_TOUCH_BEGIN,
+ time_us,
+ touch_state->seat_slot,
+ touch_state->coords.x,
+ touch_state->coords.y);
+
+ clutter_input_device_evdev_release_touch_state (device_evdev, touch_state);
+}
+
static void
clutter_virtual_input_device_evdev_get_property (GObject *object,
guint prop_id,
@@ -552,6 +670,10 @@ clutter_virtual_input_device_evdev_class_init (ClutterVirtualInputDeviceEvdevCla
virtual_input_device_class->notify_key = clutter_virtual_input_device_evdev_notify_key;
virtual_input_device_class->notify_keyval = clutter_virtual_input_device_evdev_notify_keyval;
virtual_input_device_class->notify_discrete_scroll =
clutter_virtual_input_device_evdev_notify_discrete_scroll;
+ virtual_input_device_class->notify_scroll_continuous =
clutter_virtual_input_device_evdev_notify_scroll_continuous;
+ virtual_input_device_class->notify_touch_down = clutter_virtual_input_device_evdev_notify_touch_down;
+ virtual_input_device_class->notify_touch_motion = clutter_virtual_input_device_evdev_notify_touch_motion;
+ virtual_input_device_class->notify_touch_up = clutter_virtual_input_device_evdev_notify_touch_up;
obj_props[PROP_SEAT] = g_param_spec_pointer ("seat",
P_("ClutterSeatEvdev"),
diff --git a/clutter/clutter/x11/clutter-virtual-input-device-x11.c
b/clutter/clutter/x11/clutter-virtual-input-device-x11.c
index 704de5d59..17a1b99c4 100644
--- a/clutter/clutter/x11/clutter-virtual-input-device-x11.c
+++ b/clutter/clutter/x11/clutter-virtual-input-device-x11.c
@@ -68,6 +68,48 @@ clutter_virtual_input_device_x11_notify_button (ClutterVirtualInputDevice *virtu
button, button_state == CLUTTER_BUTTON_STATE_PRESSED, 0);
}
+static void
+clutter_virtual_input_device_x11_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ ClutterScrollDirection direction,
+ ClutterScrollSource scroll_source)
+{
+ Display *xdisplay = clutter_x11_get_default_display ();
+ int button;
+
+ switch (direction)
+ {
+ case CLUTTER_SCROLL_UP:
+ button = 4;
+ break;
+ case CLUTTER_SCROLL_DOWN:
+ button = 5;
+ break;
+ case CLUTTER_SCROLL_LEFT:
+ button = 6;
+ break;
+ case CLUTTER_SCROLL_RIGHT:
+ button = 7;
+ break;
+ default:
+ g_warn_if_reached ();
+ return;
+ }
+
+ XTestFakeButtonEvent (xdisplay, button, True, 0);
+ XTestFakeButtonEvent (xdisplay, button, False, 0);
+}
+
+static void
+clutter_virtual_input_device_x11_notify_scroll_continuous (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ double dx,
+ double dy,
+ ClutterScrollSource scroll_source,
+ ClutterScrollFinishFlags finish_flags)
+{
+}
+
static void
clutter_virtual_input_device_x11_notify_key (ClutterVirtualInputDevice *virtual_device,
uint64_t time_us,
@@ -91,6 +133,34 @@ clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtu
keycode, key_state == CLUTTER_KEY_STATE_PRESSED, 0);
}
+static void
+clutter_virtual_input_device_x11_notify_touch_down (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int device_slot,
+ double x,
+ double y)
+{
+ g_warning ("Virtual touch motion not implemented under X11");
+}
+
+static void
+clutter_virtual_input_device_x11_notify_touch_motion (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int device_slot,
+ double x,
+ double y)
+{
+ g_warning ("Virtual touch motion not implemented under X11");
+}
+
+static void
+clutter_virtual_input_device_x11_notify_touch_up (ClutterVirtualInputDevice *virtual_device,
+ uint64_t time_us,
+ int device_slot)
+{
+ g_warning ("Virtual touch motion not implemented under X11");
+}
+
static void
clutter_virtual_input_device_x11_init (ClutterVirtualInputDeviceX11 *virtual_device_x11)
{
@@ -105,6 +175,11 @@ clutter_virtual_input_device_x11_class_init (ClutterVirtualInputDeviceX11Class *
virtual_input_device_class->notify_relative_motion =
clutter_virtual_input_device_x11_notify_relative_motion;
virtual_input_device_class->notify_absolute_motion =
clutter_virtual_input_device_x11_notify_absolute_motion;
virtual_input_device_class->notify_button = clutter_virtual_input_device_x11_notify_button;
+ virtual_input_device_class->notify_discrete_scroll =
clutter_virtual_input_device_x11_notify_discrete_scroll;
+ virtual_input_device_class->notify_scroll_continuous =
clutter_virtual_input_device_x11_notify_scroll_continuous;
virtual_input_device_class->notify_key = clutter_virtual_input_device_x11_notify_key;
virtual_input_device_class->notify_keyval = clutter_virtual_input_device_x11_notify_keyval;
+ virtual_input_device_class->notify_touch_down = clutter_virtual_input_device_x11_notify_touch_down;
+ virtual_input_device_class->notify_touch_motion = clutter_virtual_input_device_x11_notify_touch_motion;
+ virtual_input_device_class->notify_touch_up = clutter_virtual_input_device_x11_notify_touch_up;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]