summaryrefslogtreecommitdiff
path: root/clutter
diff options
context:
space:
mode:
authorJonas Ådahl <jadahl@gmail.com>2018-01-29 14:21:11 +0800
committerJonas Ådahl <jadahl@gmail.com>2018-02-23 19:33:31 +0800
commit203a0b37ede9d52c6a940c916338f3dd10d2df2b (patch)
treefa1c1b21010700aef5dee4f4e1a38d4411997a00 /clutter
parentb6477a826d37cebc96ae41e86a555212ca4411ec (diff)
downloadmutter-203a0b37ede9d52c6a940c916338f3dd10d2df2b.tar.gz
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.
Diffstat (limited to 'clutter')
-rw-r--r--clutter/clutter/clutter-virtual-input-device.c55
-rw-r--r--clutter/clutter/clutter-virtual-input-device.h49
-rw-r--r--clutter/clutter/evdev/clutter-input-device-evdev.c3
-rw-r--r--clutter/clutter/evdev/clutter-virtual-input-device-evdev.c122
-rw-r--r--clutter/clutter/x11/clutter-virtual-input-device-x11.c75
5 files changed, 304 insertions, 0 deletions
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
@@ -449,6 +449,124 @@ clutter_virtual_input_device_evdev_notify_discrete_scroll (ClutterVirtualInputDe
}
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,
GValue *value,
@@ -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
@@ -69,6 +69,48 @@ clutter_virtual_input_device_x11_notify_button (ClutterVirtualInputDevice *virtu
}
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,
uint32_t key,
@@ -92,6 +134,34 @@ clutter_virtual_input_device_x11_notify_keyval (ClutterVirtualInputDevice *virtu
}
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;
}