[clutter/clutter-1.16] evdev: implement horizontal scrolling



commit 5e005b42982d8d80f7175d871ee526043e84a9f7
Author: Giovanni Campagna <gcampagn redhat com>
Date:   Fri Sep 6 17:54:59 2013 +0200

    evdev: implement horizontal scrolling
    
    If the kernel reports REL_HWHELL, convert it to horizontal
    scroll events.
    Also reorganize a bit the recognition for the other event
    enums.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=706494

 clutter/evdev/clutter-device-manager-evdev.c |   65 ++++++++-----------------
 1 files changed, 21 insertions(+), 44 deletions(-)
---
diff --git a/clutter/evdev/clutter-device-manager-evdev.c b/clutter/evdev/clutter-device-manager-evdev.c
index 6b8bf4f..0b39e4f 100644
--- a/clutter/evdev/clutter-device-manager-evdev.c
+++ b/clutter/evdev/clutter-device-manager-evdev.c
@@ -330,9 +330,10 @@ notify_relative_motion (ClutterEventSource *source,
 }
 
 static void
-notify_scroll (ClutterEventSource *source,
-              guint32             time_,
-              gint32              value)
+notify_scroll (ClutterEventSource  *source,
+              guint32              time_,
+              gint32               value,
+              ClutterOrientation   orientation)
 {
   ClutterInputDevice *input_device = (ClutterInputDevice *) source->device;
   ClutterDeviceManagerEvdev *manager_evdev;
@@ -354,7 +355,10 @@ notify_scroll (ClutterEventSource *source,
   event->scroll.stage = CLUTTER_STAGE (stage);
   event->scroll.device = manager_evdev->priv->core_pointer;
   _clutter_xkb_translate_state (event, manager_evdev->priv->xkb, manager_evdev->priv->button_state);
-  event->scroll.direction = value < 0 ? CLUTTER_SCROLL_DOWN : CLUTTER_SCROLL_UP;
+  if (orientation == CLUTTER_ORIENTATION_VERTICAL)
+    event->scroll.direction = value < 0 ? CLUTTER_SCROLL_DOWN : CLUTTER_SCROLL_UP;
+  else
+    event->scroll.direction = value < 0 ? CLUTTER_SCROLL_LEFT : CLUTTER_SCROLL_RIGHT;
   clutter_input_device_get_coords (manager_evdev->priv->core_pointer, NULL, &point);
   event->scroll.x = point.x;
   event->scroll.y = point.y;
@@ -454,47 +458,21 @@ dispatch_one_event (ClutterEventSource *source,
   switch (e->type)
     {
     case EV_KEY:
-      /* don't repeat mouse buttons */
-      if (e->code >= BTN_MOUSE && e->code < KEY_OK)
-       if (e->value == AUTOREPEAT_VALUE)
-         return;
-
-      switch (e->code)
+      if (e->code < BTN_MISC || (e->code >= KEY_OK && e->code < BTN_TRIGGER_HAPPY))
+       notify_key (source, _time, e->code, e->value);
+      else if (e->code >= BTN_MOUSE && e->code < BTN_JOYSTICK)
        {
-       case BTN_TOUCH:
-       case BTN_TOOL_PEN:
-       case BTN_TOOL_RUBBER:
-       case BTN_TOOL_BRUSH:
-       case BTN_TOOL_PENCIL:
-       case BTN_TOOL_AIRBRUSH:
-       case BTN_TOOL_FINGER:
-       case BTN_TOOL_MOUSE:
-       case BTN_TOOL_LENS:
-         break;
-
-       case BTN_LEFT:
-       case BTN_RIGHT:
-       case BTN_MIDDLE:
-       case BTN_SIDE:
-       case BTN_EXTRA:
-       case BTN_FORWARD:
-       case BTN_BACK:
-       case BTN_TASK:
-         notify_button(source, _time, e->code, e->value);
-         break;
-
-       default:
-         notify_key (source, _time, e->code, e->value);
-         break;
+         /* don't repeat mouse buttons */
+         if (e->value != AUTOREPEAT_VALUE)
+           notify_button (source, _time, e->code, e->value);
        }
+      else
+       /* We don't know about this code, ignore */;
       break;
 
     case EV_SYN:
-      /* Nothing to do here */
-      break;
-
     case EV_MSC:
-      /* Nothing to do here */
+      /* Nothing to do here (actually, EV_SYN is handled by libevdev, we shouldn't see it) */
       break;
 
     case EV_REL:
@@ -508,12 +486,11 @@ dispatch_one_event (ClutterEventSource *source,
          *dy += e->value;
          break;
 
-         /* Note: we assume that REL_WHEEL is for *vertical* scroll wheels.
-            To implement horizontal scroll, we'll need a different enum
-            value.
-         */
        case REL_WHEEL:
-         notify_scroll (source, _time, e->value);
+         notify_scroll (source, _time, e->value, CLUTTER_ORIENTATION_VERTICAL);
+         break;
+       case REL_HWHEEL:
+         notify_scroll (source, _time, e->value, CLUTTER_ORIENTATION_HORIZONTAL);
          break;
        }
       break;


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