[mutter] ClutterVirtualInputDevice: Add discrete scrolling



commit a10ad577a751a3ecc266b0e48af7d7e94b4d2b75
Author: Jonas Ådahl <jadahl gmail com>
Date:   Tue Aug 23 15:39:02 2016 +0800

    ClutterVirtualInputDevice: Add discrete scrolling
    
    Add emitting of discrete scrolling events (such as mouse scroll
    wheel-like events).
    
    https://bugzilla.gnome.org/show_bug.cgi?id=784199

 clutter/clutter/clutter-virtual-input-device.c     |   13 +++++
 clutter/clutter/clutter-virtual-input-device.h     |   12 +++++
 .../evdev/clutter-virtual-input-device-evdev.c     |   52 ++++++++++++++++++++
 3 files changed, 77 insertions(+), 0 deletions(-)
---
diff --git a/clutter/clutter/clutter-virtual-input-device.c b/clutter/clutter/clutter-virtual-input-device.c
index 9ffd013..8cab4bc 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 c6c6deb..a2a0b30 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
@@ -109,6 +114,13 @@ void clutter_virtual_input_device_notify_keyval (ClutterVirtualInputDevice *virt
                                                  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);
 
 int clutter_virtual_input_device_get_device_type (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 c719d9a..e487708 100644
--- a/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
+++ b/clutter/clutter/evdev/clutter-virtual-input-device-evdev.c
@@ -398,6 +398,57 @@ clutter_virtual_input_device_evdev_notify_keyval (ClutterVirtualInputDevice *vir
 }
 
 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,
                                                  GValue     *value,
@@ -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"),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]