[gnome-shell/wip/smooth-scrolling: 2/5] scroll-bar: Add smooth scrolling support
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell/wip/smooth-scrolling: 2/5] scroll-bar: Add smooth scrolling support
- Date: Thu, 13 Dec 2012 23:22:07 +0000 (UTC)
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]