diff --git a/clutter/clutter/clutter-virtual-input-device.c b/clutter/clutter/clutter-virtual-input-device.c index 9ffd0138a..8cab4bce8 100644 --- a/clutter/clutter/clutter-virtual-input-device.c +++ b/clutter/clutter/clutter-virtual-input-device.c @@ -115,6 +115,19 @@ clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virtual_d klass->notify_keyval (virtual_device, time_us, keyval, key_state); } +void +clutter_virtual_input_device_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device, + uint64_t time_us, + ClutterScrollDirection direction, + ClutterScrollSource scroll_source) +{ + ClutterVirtualInputDeviceClass *klass = + CLUTTER_VIRTUAL_INPUT_DEVICE_GET_CLASS (virtual_device); + + klass->notify_discrete_scroll (virtual_device, time_us, + direction, scroll_source); +} + /** * 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 c6c6deb6c..a2a0b30ba 100644 --- a/clutter/clutter/clutter-virtual-input-device.h +++ b/clutter/clutter/clutter-virtual-input-device.h @@ -76,6 +76,11 @@ struct _ClutterVirtualInputDeviceClass uint64_t time_us, uint32_t keyval, ClutterKeyState key_state); + + void (*notify_discrete_scroll) (ClutterVirtualInputDevice *virtual_device, + uint64_t time_us, + ClutterScrollDirection direction, + ClutterScrollSource scroll_source); }; CLUTTER_AVAILABLE_IN_ALL @@ -108,6 +113,13 @@ void clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virt uint32_t keyval, ClutterKeyState key_state); +CLUTTER_AVAILABLE_IN_ALL +void clutter_virtual_input_device_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device, + uint64_t time_us, + ClutterScrollDirection direction, + ClutterScrollSource scroll_source); + + CLUTTER_AVAILABLE_IN_ALL ClutterDeviceManager * clutter_virtual_input_device_get_manager (ClutterVirtualInputDevice *virtual_device); diff --git a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c index c719d9ad8..e487708d9 100644 --- a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c +++ b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c @@ -397,6 +397,57 @@ clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *vir apply_level_modifiers (virtual_device, time_us, level, key_state); } +static void +direction_to_discrete (ClutterScrollDirection direction, + double *discrete_dx, + double *discrete_dy) +{ + switch (direction) + { + case CLUTTER_SCROLL_UP: + *discrete_dx = 0.0; + *discrete_dy = -1.0; + break; + case CLUTTER_SCROLL_DOWN: + *discrete_dx = 0.0; + *discrete_dy = 1.0; + break; + case CLUTTER_SCROLL_LEFT: + *discrete_dx = -1.0; + *discrete_dy = 0.0; + break; + case CLUTTER_SCROLL_RIGHT: + *discrete_dx = 1.0; + *discrete_dy = 0.0; + break; + case CLUTTER_SCROLL_SMOOTH: + g_assert_not_reached (); + break; + } +} + +static void +clutter_virtual_input_device_evdev_notify_discrete_scroll (ClutterVirtualInputDevice *virtual_device, + uint64_t time_us, + ClutterScrollDirection direction, + ClutterScrollSource scroll_source) +{ + ClutterVirtualInputDeviceEvdev *virtual_evdev = + CLUTTER_VIRTUAL_INPUT_DEVICE_EVDEV (virtual_device); + double discrete_dx = 0.0, discrete_dy = 0.0; + + if (time_us == CLUTTER_CURRENT_TIME) + time_us = g_get_monotonic_time (); + + direction_to_discrete (direction, &discrete_dx, &discrete_dy); + + clutter_seat_evdev_notify_discrete_scroll (virtual_evdev->seat, + virtual_evdev->device, + time_us, + discrete_dx, discrete_dy, + scroll_source); +} + static void clutter_virtual_input_device_evdev_get_property (GObject *object, guint prop_id, @@ -500,6 +551,7 @@ clutter_virtual_input_device_evdev_class_init (ClutterVirtualInputDeviceEvdevCla virtual_input_device_class->notify_button = clutter_virtual_input_device_evdev_notify_button; 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; obj_props[PROP_SEAT] = g_param_spec_pointer ("seat", P_("ClutterSeatEvdev"),