[gnome-shell/wip/smooth-scrolling: 2/5] scroll-bar: Add smooth scrolling support



commit 5725d0a1c1c5d9bf1cf4d6743144750a54458d79
Author: Jasper St. Pierre <jstpierre mecheye net>
Date:   Wed Nov 28 17:27:41 2012 -0500

    scroll-bar: Add smooth scrolling support
    
    Do the same for StScrollBar.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=687573

 src/st/st-scroll-bar.c |   78 ++++++++++++++++++++++++++++++++++-------------
 1 files changed, 56 insertions(+), 22 deletions(-)
---
diff --git a/src/st/st-scroll-bar.c b/src/st/st-scroll-bar.c
index 2e1f125..7f46903 100644
--- a/src/st/st-scroll-bar.c
+++ b/src/st/st-scroll-bar.c
@@ -433,42 +433,76 @@ st_scroll_bar_constructor (GType                  type,
   return obj;
 }
 
+static void
+adjust_with_delta (StAdjustment *adj,
+                   gdouble       delta)
+{
+  gdouble new_value, page_size, scroll_unit;
+
+  g_object_get (adj,
+                "page-size", &page_size,
+                NULL);
+  scroll_unit = pow (page_size, 2.0 / 3.0);
+
+  new_value = st_adjustment_get_value (adj) + delta * scroll_unit;
+  st_adjustment_set_value (adj, new_value);
+}
+
+static void
+adjust_with_direction (StAdjustment           *adj,
+                       ClutterScrollDirection  direction)
+{
+  gdouble delta;
+
+  switch (direction)
+    {
+    case CLUTTER_SCROLL_UP:
+    case CLUTTER_SCROLL_LEFT:
+      delta = -1.0;
+      break;
+    case CLUTTER_SCROLL_RIGHT:
+    case CLUTTER_SCROLL_DOWN:
+      delta = 1.0;
+      break;
+    case CLUTTER_SCROLL_SMOOTH:
+      g_assert_not_reached ();
+      break;
+    }
+
+  adjust_with_delta (adj, delta);
+}
+
 static gboolean
 st_scroll_bar_scroll_event (ClutterActor       *actor,
                             ClutterScrollEvent *event)
 {
   StScrollBarPrivate *priv = ST_SCROLL_BAR (actor)->priv;
-  gdouble step, value, delta_x, delta_y;
 
-  if (priv->adjustment)
-    {
-      g_object_get (priv->adjustment,
-                    "step-increment", &step,
-                    "value", &value,
-                    NULL);
-    }
-  else
-    {
-      return FALSE;
-    }
+  if (clutter_event_is_pointer_emulated ((ClutterEvent *) event))
+    return TRUE;
 
   switch (event->direction)
     {
     case CLUTTER_SCROLL_SMOOTH:
-      clutter_event_get_scroll_delta ((ClutterEvent *)event,
-                                      &delta_x, &delta_y);
-      if (fabs (delta_x) > fabs (delta_y))
-        st_adjustment_set_value (priv->adjustment, value + delta_x);
-      else
-        st_adjustment_set_value (priv->adjustment, value + delta_y);
+      {
+        gdouble delta_x, delta_y;
+        clutter_event_get_scroll_delta ((ClutterEvent *)event, &delta_x, &delta_y);
+
+        if (priv->vertical)
+          adjust_with_delta (priv->adjustment, delta_y);
+        else
+          adjust_with_delta (priv->adjustment, delta_x);
+      }
       break;
     case CLUTTER_SCROLL_UP:
-    case CLUTTER_SCROLL_LEFT:
-      st_adjustment_set_value (priv->adjustment, value - step);
-      break;
     case CLUTTER_SCROLL_DOWN:
+      if (priv->vertical)
+        adjust_with_direction (priv->adjustment, event->direction);
+      break;
+    case CLUTTER_SCROLL_LEFT:
     case CLUTTER_SCROLL_RIGHT:
-      st_adjustment_set_value (priv->adjustment, value + step);
+      if (!priv->vertical)
+        adjust_with_direction (priv->adjustment, event->direction);
       break;
     }
 



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