event: Expose precise scrolling information
authorEmmanuele Bassi <ebassi@linux.intel.com>
Mon, 19 Mar 2012 12:15:41 +0000 (12:15 +0000)
committerEmmanuele Bassi <ebassi@linux.intel.com>
Mon, 19 Mar 2012 12:41:24 +0000 (12:41 +0000)
Some events may contain precise scrolling information coming from
devices like trackpads and touchscreens. ClutterEvent should allow
setting and getting this information.

clutter/clutter-enums.h
clutter/clutter-event.c
clutter/clutter-event.h
clutter/clutter.symbols

index bf3dea5..3942627 100644 (file)
@@ -730,16 +730,21 @@ typedef enum { /*< prefix=CLUTTER >*/
  * @CLUTTER_SCROLL_DOWN: Scroll down
  * @CLUTTER_SCROLL_LEFT: Scroll left
  * @CLUTTER_SCROLL_RIGHT: Scroll right
+ * @CLUTTER_SCROLL_SMOOTH: Precise scrolling delta (available in 1.10)
  *
  * Direction of a pointer scroll event.
  *
+ * The %CLUTTER_SCROLL_SMOOTH value implies that the #ClutterScrollEvent
+ * has precise scrolling delta information.
+ *
  * Since: 0.4
  */
 typedef enum { /*< prefix=CLUTTER_SCROLL >*/
   CLUTTER_SCROLL_UP,
   CLUTTER_SCROLL_DOWN,
   CLUTTER_SCROLL_LEFT,
-  CLUTTER_SCROLL_RIGHT
+  CLUTTER_SCROLL_RIGHT,
+  CLUTTER_SCROLL_SMOOTH
 } ClutterScrollDirection;
 
 /**
index f7437ba..da87ee4 100644 (file)
@@ -49,6 +49,9 @@ typedef struct _ClutterEventPrivate {
   ClutterInputDevice *device;
   ClutterInputDevice *source_device;
 
+  gdouble delta_x;
+  gdouble delta_y;
+
   gpointer platform_data;
 } ClutterEventPrivate;
 
@@ -514,6 +517,72 @@ clutter_event_set_related (ClutterEvent *event,
 }
 
 /**
+ * clutter_event_set_scroll_delta:
+ * @event: a #ClutterEvent of type %CLUTTER_SCROLL
+ * @dx: delta on the horizontal axis
+ * @dy: delta on the vertical axis
+ *
+ * Sets the precise scrolling information of @event.
+ *
+ * Since: 1.10
+ */
+void
+clutter_event_set_scroll_delta (ClutterEvent *event,
+                                gdouble       dx,
+                                gdouble       dy)
+{
+  g_return_if_fail (event != NULL);
+  g_return_if_fail (event->type == CLUTTER_SCROLL);
+
+  if (!is_event_allocated (event))
+    return;
+
+  event->scroll.direction = CLUTTER_SCROLL_SMOOTH;
+
+  ((ClutterEventPrivate *) event)->delta_x = dx;
+  ((ClutterEventPrivate *) event)->delta_y = dy;
+}
+
+/**
+ * clutter_event_get_scroll_delta:
+ * @event: a #ClutterEvent of type %CLUTTER_SCROLL
+ * @dx: (out): return location for the delta on the horizontal axis
+ * @dy: (out): return location for the delta on the vertical axis
+ *
+ * Retrieves the precise scrolling information of @event.
+ *
+ * The @event has to have a #ClutterScrollEvent.direction value
+ * of %CLUTTER_SCROLL_SMOOTH.
+ *
+ * Since: 1.10
+ */
+void
+clutter_event_get_scroll_delta (const ClutterEvent *event,
+                                gdouble            *dx,
+                                gdouble            *dy)
+{
+  gdouble delta_x, delta_y;
+
+  g_return_if_fail (event != NULL);
+  g_return_if_fail (event->type == CLUTTER_SCROLL);
+  g_return_if_fail (event->scroll.direction == CLUTTER_SCROLL_SMOOTH);
+
+  delta_x = delta_y = 0;
+
+  if (is_event_allocated (event))
+    {
+      delta_x = ((ClutterEventPrivate *) event)->delta_x;
+      delta_y = ((ClutterEventPrivate *) event)->delta_y;
+    }
+
+  if (dx != NULL)
+    *dx = delta_x;
+
+  if (dy != NULL)
+    *dy = delta_y;
+}
+
+/**
  * clutter_event_get_scroll_direction:
  * @event: a #ClutterEvent of type %CLUTTER_SCROLL
  *
@@ -970,6 +1039,8 @@ clutter_event_copy (const ClutterEvent *event)
 
       new_real_event->device = real_event->device;
       new_real_event->source_device = real_event->source_device;
+      new_real_event->delta_x = real_event->delta_x;
+      new_real_event->delta_y = real_event->delta_y;
     }
 
   device = clutter_event_get_device (event);
index 487f131..208041f 100644 (file)
@@ -420,6 +420,14 @@ ClutterActor *          clutter_event_get_related               (const ClutterEv
 void                    clutter_event_set_scroll_direction      (ClutterEvent           *event,
                                                                  ClutterScrollDirection  direction);
 ClutterScrollDirection  clutter_event_get_scroll_direction      (const ClutterEvent     *event);
+CLUTTER_AVAILABLE_IN_1_10
+void                    clutter_event_set_scroll_delta          (ClutterEvent           *event,
+                                                                 gdouble                 dx,
+                                                                 gdouble                 dy);
+CLUTTER_AVAILABLE_IN_1_10
+void                    clutter_event_get_scroll_delta          (const ClutterEvent     *event,
+                                                                 gdouble                *dx,
+                                                                 gdouble                *dy);
 
 guint32                 clutter_keysym_to_unicode               (guint                   keyval);
 CLUTTER_AVAILABLE_IN_1_10
index 339d8a0..f6374ea 100644 (file)
@@ -629,6 +629,7 @@ clutter_event_get_key_code
 clutter_event_get_key_symbol
 clutter_event_get_key_unicode
 clutter_event_get_related
+clutter_event_get_scroll_delta
 clutter_event_get_scroll_direction
 clutter_event_get_source
 clutter_event_get_source_device
@@ -647,6 +648,7 @@ clutter_event_set_key_code
 clutter_event_set_key_symbol
 clutter_event_set_key_unicode
 clutter_event_set_related
+clutter_event_set_scroll_delta
 clutter_event_set_scroll_direction
 clutter_event_set_source
 clutter_event_set_source_device