raster pushed a commit to branch master.

http://git.enlightenment.org/core/elementary.git/commit/?id=939d8ef4c3c48120046560814db63858175a2d12

commit 939d8ef4c3c48120046560814db63858175a2d12
Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com>
Date:   Fri Sep 11 23:24:51 2015 +0900

    elm - thumbscroll finger scrolling - make it far smoother
    
    smooth out scrolling and simplifyconfig as well as expose config apis
    to configure it all and elm config ui sliders and checkboxes for
    related config values etc. etc. - with this it is much smoother if you
    use the default values, though latency is a bit worse. it looks nicer
    though.
    
    @feature
---
 config/default/base.src.in         |   9 +--
 config/mobile/base.src.in          |   5 +-
 config/standard/base.src.in        |   9 +--
 src/bin/config.c                   | 131 ++++++++++++++++++++++++++++++++++++-
 src/lib/elm_config.c               |  68 +++++++++++++++----
 src/lib/elm_config.h               |  84 ++++++++++++++++++++++++
 src/lib/elm_interface_scrollable.c |  84 +++++++++++-------------
 src/lib/elm_priv.h                 |   6 +-
 8 files changed, 313 insertions(+), 83 deletions(-)

diff --git a/config/default/base.src.in b/config/default/base.src.in
index 83cff05..5b01b5e 100644
--- a/config/default/base.src.in
+++ b/config/default/base.src.in
@@ -20,12 +20,9 @@ group "Elm_Config" struct {
   value "zoom_friction" double: 0.5;
   value "thumbscroll_border_friction" double: 0.5;
   value "thumbscroll_sensitivity_friction" double: 0.25;
-  value "scroll_smooth_start_enable" uchar: 0;
-  value "scroll_smooth_time_interval" double: 0.0;
-  value "scroll_smooth_amount" double: 0.0;
-  value "scroll_smooth_history_weight" double: 0.1;
-  value "scroll_smooth_future_time" double: 0.0;
-  value "scroll_smooth_time_window" double: 0.01;
+  value "scroll_smooth_start_enable" uchar: 1;
+  value "scroll_smooth_amount" double: 1.0;
+  value "scroll_smooth_time_window" double: 0.15;
   value "focus_autoscroll_mode" uchar: 0;
   value "slider_indicator_visible_mode" int: 0;
   value "scale" double: 1.0;
diff --git a/config/mobile/base.src.in b/config/mobile/base.src.in
index 8be5652..6219c11 100644
--- a/config/mobile/base.src.in
+++ b/config/mobile/base.src.in
@@ -21,11 +21,8 @@ group "Elm_Config" struct {
   value "thumbscroll_border_friction" double: 0.5;
   value "thumbscroll_sensitivity_friction" double: 0.7;
   value "scroll_smooth_start_enable" uchar: 1;
-  value "scroll_smooth_time_interval" double: 0;
   value "scroll_smooth_amount" double: 1.0;
-  value "scroll_smooth_history_weight" double: 0.1;
-  value "scroll_smooth_future_time" double: 0.0;
-  value "scroll_smooth_time_window" double: 0.01;
+  value "scroll_smooth_time_window" double: 0.15;
   value "focus_autoscroll_mode" uchar: 0;
   value "slider_indicator_visible_mode" int: 0;
   value "scale" double: 1.0;
diff --git a/config/standard/base.src.in b/config/standard/base.src.in
index 1b1cb84..b5f1b7a 100644
--- a/config/standard/base.src.in
+++ b/config/standard/base.src.in
@@ -20,12 +20,9 @@ group "Elm_Config" struct {
   value "zoom_friction" double: 0.5;
   value "thumbscroll_border_friction" double: 0.5;
   value "thumbscroll_sensitivity_friction" double: 0.25;
-  value "scroll_smooth_start_enable" uchar: 0;
-  value "scroll_smooth_time_interval" double: 0.0;
-  value "scroll_smooth_amount" double: 0.0;
-  value "scroll_smooth_history_weight" double: 0.1;
-  value "scroll_smooth_future_time" double: 0.0;
-  value "scroll_smooth_time_window" double: 0.01;
+  value "scroll_smooth_start_enable" uchar: 1;
+  value "scroll_smooth_amount" double: 1.0;
+  value "scroll_smooth_time_window" double: 0.15;
   value "focus_autoscroll_mode" uchar: 0;
   value "slider_indicator_visible_mode" int: 0;
   value "scale" double: 1.0;
diff --git a/src/bin/config.c b/src/bin/config.c
index d174024..37a7e96 100644
--- a/src/bin/config.c
+++ b/src/bin/config.c
@@ -166,6 +166,19 @@ sb_change(void *data       EINA_UNUSED,
 }
 
 static void
+ss_change(void *data       EINA_UNUSED,
+          Evas_Object     *obj,
+          void *event_info EINA_UNUSED)
+{
+   Eina_Bool val = elm_check_state_get(obj);
+   Eina_Bool ss = elm_config_scroll_thumbscroll_smooth_start_get();
+
+   if (val == ss) return;
+   elm_config_scroll_thumbscroll_smooth_start_set(val);
+   elm_config_all_flush();
+}
+
+static void
 bf_round(void *data       EINA_UNUSED,
          Evas_Object     *obj,
          void *event_info EINA_UNUSED)
@@ -266,6 +279,56 @@ zf_change(void *data       EINA_UNUSED,
 }
 
 static void
+smooth_round(void *data       EINA_UNUSED,
+             Evas_Object     *obj,
+             void *event_info EINA_UNUSED)
+{
+   double val = elm_slider_value_get(obj);
+   double v;
+
+   v = ((double)((int)(val * 100.0))) / 100.0;
+   if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+smooth_change(void *data       EINA_UNUSED,
+              Evas_Object     *obj,
+              void *event_info EINA_UNUSED)
+{
+   double zf = elm_config_scroll_thumbscroll_smooth_amount_get();
+   double val = elm_slider_value_get(obj);
+
+   if (zf == val) return;
+   elm_config_scroll_thumbscroll_smooth_amount_set(val);
+   elm_config_all_flush();
+}
+
+static void
+smooth_win_round(void *data       EINA_UNUSED,
+                 Evas_Object     *obj,
+                 void *event_info EINA_UNUSED)
+{
+   double val = elm_slider_value_get(obj);
+   double v;
+
+   v = ((double)((int)(val * 100.0))) / 100.0;
+   if (v != val) elm_slider_value_set(obj, v);
+}
+
+static void
+smooth_win_change(void *data       EINA_UNUSED,
+                  Evas_Object     *obj,
+                  void *event_info EINA_UNUSED)
+{
+   double zf = elm_config_scroll_thumbscroll_smooth_time_window_get();
+   double val = elm_slider_value_get(obj);
+
+   if (zf == val) return;
+   elm_config_scroll_thumbscroll_smooth_time_window_set(val);
+   elm_config_all_flush();
+}
+
+static void
 ts_change(void *data       EINA_UNUSED,
           Evas_Object     *obj,
           void *event_info EINA_UNUSED)
@@ -1191,9 +1254,10 @@ _config_display_update(Evas_Object *win)
           ts_min_friction, ts_friction_standard, ts_border_friction,
           ts_sensitivity_friction, ts_acceleration_threshold,
           ts_acceleration_time_limit, ts_acceleration_weight, page_friction,
-          bring_in_friction, zoom_friction, transition_duration;
+          bring_in_friction, zoom_friction, transition_duration,
+          smooth_amount, smooth_time_window;
    const char *curr_theme;
-   Eina_Bool s_bounce, ts;
+   Eina_Bool s_bounce, ts, smooth_start;
    Elm_Theme *th;
    int fs;
 
@@ -1224,6 +1288,9 @@ _config_display_update(Evas_Object *win)
    page_friction = elm_config_scroll_page_scroll_friction_get();
    bring_in_friction = elm_config_scroll_bring_in_scroll_friction_get();
    zoom_friction = elm_config_scroll_zoom_friction_get();
+   smooth_start = elm_config_scroll_thumbscroll_smooth_start_get();
+   smooth_amount = elm_config_scroll_thumbscroll_smooth_amount_get();
+   smooth_time_window = elm_config_scroll_thumbscroll_smooth_time_window_get();
 
    /* gotta update root windows' atoms */
    elm_slider_value_set(evas_object_data_get(win, "scale_slider"), scale);
@@ -1288,6 +1355,15 @@ _config_display_update(Evas_Object *win)
                                              "zoom_scroll_friction_slider"),
                         zoom_friction);
 
+   elm_check_state_set(evas_object_data_get(win, "scroll_smooth_start"),
+                       smooth_start);
+   elm_slider_value_set(evas_object_data_get(win,
+                                             "scroll_smooth_amount"),
+                        smooth_amount);
+   elm_slider_value_set(evas_object_data_get(win,
+                                             "scroll_smooth_time_window"),
+                        smooth_time_window);
+
    curr_theme = _elm_theme_current_get(elm_theme_get(NULL));
 
    th = elm_theme_new();
@@ -3355,7 +3431,7 @@ static void
 _status_config_scrolling(Evas_Object *win,
                          Evas_Object *naviframe)
 {
-   Evas_Object *lb, *pd, *bx, *sl, *sc;
+   Evas_Object *lb, *pd, *bx, *sl, *sc, *ck;
 
    bx = elm_box_add(win);
    evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, 0.0);
@@ -3440,6 +3516,55 @@ _status_config_scrolling(Evas_Object *win,
    evas_object_smart_callback_add(sl, "changed", zf_round, NULL);
    evas_object_smart_callback_add(sl, "delay,changed", zf_change, NULL);
 
+   /* Enable Scroll Bounce */
+   CHECK_ADD("Enable smooth start",
+             "Set whether scrollers start smoothly on thumb<br/>"
+             "scroll",
+             ss_change, NULL);
+   evas_object_data_set(win, "scroll_smooth_start", ck);
+   elm_check_state_set(ck, elm_config_scroll_thumbscroll_smooth_start_get());
+
+   /* Scroll Smooth Amount */
+   LABEL_FRAME_ADD("<hilight>Scroll Smooth Amount</>");
+
+   sl = elm_slider_add(win);
+   elm_object_tooltip_text_set(sl, "This is the amount smoothing to apply<br/>"
+                                   "to thumbscroll to avoid jerky input");
+   evas_object_data_set(win, "scroll_smooth_amount", sl);
+   evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+   elm_slider_span_size_set(sl, 120);
+   elm_slider_unit_format_set(sl, "%1.2f");
+   elm_slider_indicator_format_set(sl, "%1.2f");
+   elm_slider_min_max_set(sl, 0.0, 1.0);
+   elm_slider_value_set(sl, elm_config_scroll_thumbscroll_smooth_amount_get());
+   elm_box_pack_end(bx, sl);
+   evas_object_show(sl);
+
+   evas_object_smart_callback_add(sl, "changed", smooth_round, NULL);
+   evas_object_smart_callback_add(sl, "delay,changed", smooth_change, NULL);
+
+   /* Scroll Smooth Time Window */
+   LABEL_FRAME_ADD("<hilight>Scroll Smooth Amount</>");
+
+   sl = elm_slider_add(win);
+   elm_object_tooltip_text_set(sl, "This is the amount smoothing to apply<br/>"
+                                   "to thumbscroll to avoid jerky input");
+   evas_object_data_set(win, "scroll_smooth_time_window", sl);
+   evas_object_size_hint_weight_set(sl, EVAS_HINT_EXPAND, 0.0);
+   evas_object_size_hint_align_set(sl, EVAS_HINT_FILL, 0.5);
+   elm_slider_span_size_set(sl, 120);
+   elm_slider_unit_format_set(sl, "%1.2f");
+   elm_slider_indicator_format_set(sl, "%1.2f");
+   elm_slider_min_max_set(sl, 0.0, 1.0);
+   elm_slider_value_set(sl, 
elm_config_scroll_thumbscroll_smooth_time_window_get());
+   elm_box_pack_end(bx, sl);
+   evas_object_show(sl);
+
+   evas_object_smart_callback_add(sl, "changed", smooth_win_round, NULL);
+   evas_object_smart_callback_add(sl, "delay,changed", smooth_win_change, 
NULL);
+
+
    evas_object_data_set(win, "scrolling", sc);
 
    elm_naviframe_item_simple_push(naviframe, sc);
diff --git a/src/lib/elm_config.c b/src/lib/elm_config.c
index d65c7ab..afb569d 100644
--- a/src/lib/elm_config.c
+++ b/src/lib/elm_config.c
@@ -343,10 +343,10 @@ _desc_init(void)
    ELM_CONFIG_VAL(D, T, zoom_friction, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, thumbscroll_bounce_enable, T_UCHAR);
    ELM_CONFIG_VAL(D, T, scroll_smooth_start_enable, T_UCHAR);
-   ELM_CONFIG_VAL(D, T, scroll_smooth_time_interval, T_DOUBLE);
+//   ELM_CONFIG_VAL(D, T, scroll_smooth_time_interval, T_DOUBLE); // not used 
anymore
    ELM_CONFIG_VAL(D, T, scroll_smooth_amount, T_DOUBLE);
-   ELM_CONFIG_VAL(D, T, scroll_smooth_history_weight, T_DOUBLE);
-   ELM_CONFIG_VAL(D, T, scroll_smooth_future_time, T_DOUBLE);
+//   ELM_CONFIG_VAL(D, T, scroll_smooth_history_weight, T_DOUBLE); // not used 
anymore
+//   ELM_CONFIG_VAL(D, T, scroll_smooth_future_time, T_DOUBLE); // not used 
anymore
    ELM_CONFIG_VAL(D, T, scroll_smooth_time_window, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, scale, T_DOUBLE);
    ELM_CONFIG_VAL(D, T, bgpixmap, T_INT);
@@ -1373,12 +1373,12 @@ _config_load(void)
    _elm_config->zoom_friction = 0.5;
    _elm_config->thumbscroll_border_friction = 0.5;
    _elm_config->thumbscroll_sensitivity_friction = 0.25; // magic number! just 
trial and error shows this makes it behave "nicer" and not run off at high 
speed all the time
-   _elm_config->scroll_smooth_start_enable = EINA_FALSE;
-   _elm_config->scroll_smooth_time_interval = 0.008;
+   _elm_config->scroll_smooth_start_enable = EINA_TRUE;
+//   _elm_config->scroll_smooth_time_interval = 0.008; // not used anymore
    _elm_config->scroll_smooth_amount = 1.0;
-   _elm_config->scroll_smooth_history_weight = 0.3;
-   _elm_config->scroll_smooth_future_time = 0.0;
-   _elm_config->scroll_smooth_time_window = 0.2;
+//   _elm_config->scroll_smooth_history_weight = 0.3; // not used anymore
+//   _elm_config->scroll_smooth_future_time = 0.0; // not used anymore
+   _elm_config->scroll_smooth_time_window = 0.15;
    _elm_config->scale = 1.0;
    _elm_config->bgpixmap = 0;
    _elm_config->compositing = 1;
@@ -1930,14 +1930,14 @@ _env_get(void)
      }
    s = getenv("ELM_SCROLL_SMOOTH_START_ENABLE");
    if (s) _elm_config->scroll_smooth_start_enable = !!atoi(s);
-   s = getenv("ELM_SCROLL_SMOOTH_TIME_INTERVAL");
-   if (s) _elm_config->scroll_smooth_time_interval = atof(s);
+//   s = getenv("ELM_SCROLL_SMOOTH_TIME_INTERVAL"); // not used anymore
+//   if (s) _elm_config->scroll_smooth_time_interval = atof(s); // not used 
anymore
    s = getenv("ELM_SCROLL_SMOOTH_AMOUNT");
    if (s) _elm_config->scroll_smooth_amount = _elm_atof(s);
-   s = getenv("ELM_SCROLL_SMOOTH_HISTORY_WEIGHT");
-   if (s) _elm_config->scroll_smooth_history_weight = _elm_atof(s);
-   s = getenv("ELM_SCROLL_SMOOTH_FUTURE_TIME");
-   if (s) _elm_config->scroll_smooth_future_time = _elm_atof(s);
+//   s = getenv("ELM_SCROLL_SMOOTH_HISTORY_WEIGHT"); // not used anymore
+//   if (s) _elm_config->scroll_smooth_history_weight = _elm_atof(s); // not 
used anymore
+//   s = getenv("ELM_SCROLL_SMOOTH_FUTURE_TIME"); // not used anymore
+//   if (s) _elm_config->scroll_smooth_future_time = _elm_atof(s); // not used 
anymore
    s = getenv("ELM_SCROLL_SMOOTH_TIME_WINDOW");
    if (s) _elm_config->scroll_smooth_time_window = _elm_atof(s);
    s = getenv("ELM_FOCUS_AUTOSCROLL_MODE");
@@ -2886,6 +2886,46 @@ 
elm_config_scroll_thumbscroll_sensitivity_friction_set(double friction)
    _elm_config->thumbscroll_sensitivity_friction = friction;
 }
 
+EAPI Eina_Bool
+elm_config_scroll_thumbscroll_smooth_start_get(void)
+{
+   return _elm_config->scroll_smooth_start_enable;
+}
+
+EAPI void
+elm_config_scroll_thumbscroll_smooth_start_set(Eina_Bool enable)
+{
+   _elm_config->scroll_smooth_start_enable = enable;
+}
+
+EAPI void
+elm_config_scroll_thumbscroll_smooth_amount_set(double amount)
+{
+   if (amount < 0.0) amount = 0.0;
+   if (amount > 1.0) amount = 1.0;
+   _elm_config->scroll_smooth_amount = amount;
+}
+
+EAPI double
+elm_config_scroll_thumbscroll_smooth_amount_get(void)
+{
+   return _elm_config->scroll_smooth_amount;
+}
+
+EAPI void
+elm_config_scroll_thumbscroll_smooth_time_window_set(double amount)
+{
+   if (amount < 0.0) amount = 0.0;
+   if (amount > 1.0) amount = 1.0;
+   _elm_config->scroll_smooth_time_window = amount;
+}
+
+EAPI double
+elm_config_scroll_thumbscroll_smooth_time_window_get(void)
+{
+   return _elm_config->scroll_smooth_time_window;
+}
+
 EAPI double
 elm_config_scroll_thumbscroll_acceleration_threshold_get(void)
 {
diff --git a/src/lib/elm_config.h b/src/lib/elm_config.h
index 9aa1119..8719d65 100644
--- a/src/lib/elm_config.h
+++ b/src/lib/elm_config.h
@@ -490,6 +490,90 @@ EAPI double       
elm_config_scroll_thumbscroll_sensitivity_friction_get(void);
 EAPI void         
elm_config_scroll_thumbscroll_sensitivity_friction_set(double friction);
 
 /**
+ * Get the smooth start mode for scrolling with your finger
+ *
+ * @return smooth scroll flag
+ * 
+ * @see elm_config_scroll_thumbscroll_smooth_start_set()
+ *
+ * @since 1.16
+ * @ingroup Scrolling
+ */
+EAPI Eina_Bool    elm_config_scroll_thumbscroll_smooth_start_get(void);
+
+/**
+ * Set the smooth start mode for scrolling with your finger
+ *
+ * This enabled finger scrolling to scroll from the currunt point rather than
+ * jumping and playing catch-up to make start of scrolling look smoother once
+ * the finger or mouse goes past the threshold.
+ * 
+ * @param enable The enabled state of the smooth scroller
+ * 
+ * @see elm_config_scroll_thumbscroll_smooth_start_get()
+ *
+ * @since 1.16
+ * @ingroup Scrolling
+ */
+EAPI void         elm_config_scroll_thumbscroll_smooth_start_set(Eina_Bool 
enable);
+
+/**
+ * Get the amount of smoothing to apply to scrolling
+ *
+ * @return the amount of smoothing to apply from 0.0 to 1.0
+ *
+ * @see elm_config_scroll_thumbscroll_smooth_amount_set()
+ *
+ * @since 1.16
+ * @ingroup Scrolling
+ */
+EAPI double       elm_config_scroll_thumbscroll_smooth_amount_get(void);
+
+/**
+ * Set the amount of smoothing to apply to scrolling
+ *
+ * Scrolling with your finger can be smoothed out and the amount to smooth
+ * is determined by this parameter. 0.0 means to not smooth at all and
+ * 1.0 is to smoth as much as possible.
+ * 
+ * @param the amount to smooth from 0.0 to 1.0 with 0.0 being none
+ *
+ * @see elm_config_thumbscroll_acceleration_threshold_set()
+ * 
+ * @since 1.16
+ * @ingroup Scrolling
+ */
+EAPI void         elm_config_scroll_thumbscroll_smooth_amount_set(double 
amount);
+
+/**
+ * Get the time window to look back at for events for smoothing
+ *
+ * @return the time window in seconds (between 0.0 and 1.0)
+ *
+ * @see elm_config_scroll_thumbscroll_smooth_time_window_set()
+ *
+ * @since 1.16
+ * @ingroup Scrolling
+ */
+EAPI double       elm_config_scroll_thumbscroll_smooth_time_window_get(void);
+
+/**
+ * Set the time window to look back at for events for smoothing
+ *
+ * Scrolling with your finger can be smoothed out and the window of time
+ * to look at is determined by this config. The value is in seconds and
+ * is from 0.0 to 1.0
+ * 
+ * @param the time window in seconds (between 0.0 and 1.0)
+ *
+ * @see elm_config_scroll_thumbscroll_smooth_time_window_get()
+ * 
+ * @since 1.16
+ * @ingroup Scrolling
+ */
+EAPI void         elm_config_scroll_thumbscroll_smooth_time_window_set(double 
amount);
+
+/**
  * Get the minimum speed of mouse cursor movement which will accelerate
  * scrolling velocity after a mouse up event
  * (pixels/second).
diff --git a/src/lib/elm_interface_scrollable.c 
b/src/lib/elm_interface_scrollable.c
index 77763ab..fa24d67 100644
--- a/src/lib/elm_interface_scrollable.c
+++ b/src/lib/elm_interface_scrollable.c
@@ -2964,12 +2964,17 @@ _elm_scroll_hold_enterer(void *data)
 
    fx = sid->down.hold_x;
    fy = sid->down.hold_y;
+//   printf("%1.5f %i ",
+//          ecore_loop_time_get() - sid->down.dragged_began_timestamp,
+//          fy);
 
-   if (_elm_config->scroll_smooth_amount > 0.0)
+   if ((_elm_config->scroll_smooth_amount > 0.0) &&
+       (_elm_config->scroll_smooth_time_window > 0.0))
      {
         int i, count = 0;
         Evas_Coord basex = 0, basey = 0, x, y;
         double dt, t, tdiff, tnow, twin;
+        double xx, yy, tot;
         struct
           {
              Evas_Coord x, y, dx, dy;
@@ -2977,76 +2982,61 @@ _elm_scroll_hold_enterer(void *data)
           } pos[60];
 
         tdiff = sid->down.hist.est_timestamp_diff;
-        tnow = ecore_time_get() - tdiff;
+        tnow = ecore_loop_time_get();
         t = tnow;
         twin = _elm_config->scroll_smooth_time_window;
         for (i = 0; i < 60; i++)
           {
-             if (sid->down.history[i].timestamp >
-                 sid->down.dragged_began_timestamp)
+             if ((sid->down.history[i].timestamp - tdiff) > tnow)
+               {
+                  continue;
+               }
+             if ((sid->down.history[i].timestamp >
+                 sid->down.dragged_began_timestamp) || (count == 0))
                {
-                  // oldest point is sd->down.history[i]
-                  // newset is sd->down.history[0]
-                  dt = t - sid->down.history[i].timestamp;
-                  if (dt > twin)
-                    {
-                       i--;
-                       count--;
-                       break;
-                    }
                   x = sid->down.history[i].x;
                   y = sid->down.history[i].y;
-                  _elm_scroll_down_coord_eval(sid, &x, &y);
                   if (i == 0)
                     {
                        basex = x;
                        basey = y;
                     }
+                  dt = t - sid->down.history[i].timestamp;
+                  if ((dt > twin) && (count > 0)) break;
+                  _elm_scroll_down_coord_eval(sid, &x, &y);
                   pos[i].x = x - basex;
                   pos[i].y = y - basey;
-                  pos[i].t = sid->down.history[i].timestamp - 
sid->down.history[0].timestamp;
+                  pos[i].t = sid->down.history[0].timestamp - 
sid->down.history[i].timestamp;
                   count++;
                }
           }
-        if (count >= 2)
+        if (count > 0)
           {
-             double dtsum = 0.0, tadd, maxdt;
-             double dxsum = 0.0, dysum = 0.0, xsum = 0.0, ysum = 0.0;
-             for (i = 0; i < (count - 1); i++)
+             xx = 0.0;
+             yy = 0.0;
+             tot = 0.0;
+             for (i = 0; i < count; i++)
                {
-                  pos[i].dx = pos[i].x - pos[i + 1].x;
-                  pos[i].dy = pos[i].y - pos[i + 1].y;
-                  pos[i].dt = pos[i].t - pos[i + 1].t;
-                  dxsum += pos[i].dx;
-                  dysum += pos[i].dy;
-                  dtsum += pos[i].dt;
-                  xsum += pos[i].x;
-                  ysum += pos[i].y;
+                  double wt = (twin - pos[i].t) / twin;
+
+                  xx += ((double)(pos[i].x)) * wt;
+                  yy += ((double)(pos[i].y)) * wt;
+                  tot += wt;
                }
-             maxdt = pos[i].t;
-             dxsum /= (double)i;
-             dysum /= (double)i;
-             dtsum /= (double)i;
-             if (dtsum > 0)
+             if (tot > 0.0)
                {
-                  xsum /= (double)i;
-                  ysum /= (double)i;
-                  tadd = tnow - sid->down.history[0].timestamp + 
_elm_config->scroll_smooth_future_time;
-                  tadd = tadd - (maxdt / 2);
-#define WEIGHT(n, o, v) n = (((double)o * (1.0 - v)) + ((double)n * v))
-                  WEIGHT(tadd, sid->down.hist.tadd, 
_elm_config->scroll_smooth_history_weight);
-                  WEIGHT(dxsum, sid->down.hist.dxsum, 
_elm_config->scroll_smooth_history_weight);
-                  WEIGHT(dysum, sid->down.hist.dysum, 
_elm_config->scroll_smooth_history_weight);
-                  fx = basex + xsum + ((dxsum * tadd) / dtsum);
-                  fy = basey + ysum + ((dysum * tadd) / dtsum);
-                  sid->down.hist.tadd = tadd;
-                  sid->down.hist.dxsum = dxsum;
-                  sid->down.hist.dysum = dysum;
-                  WEIGHT(fx, sid->down.hold_x, 
_elm_config->scroll_smooth_amount);
-                  WEIGHT(fy, sid->down.hold_y, 
_elm_config->scroll_smooth_amount);
+                  xx = basex + (xx / tot);
+                  yy = basey + (yy / tot);
+                  fx =
+                    (_elm_config->scroll_smooth_amount * xx) +
+                    ((1.0 - _elm_config->scroll_smooth_amount) * fx);
+                  fy =
+                    (_elm_config->scroll_smooth_amount * yy) +
+                    ((1.0 - _elm_config->scroll_smooth_amount) * fy);
                }
           }
      }
+//   printf("%i\n", fy);
 
    eo_do(sid->obj, elm_interface_scrollable_content_pos_get(&ox, &oy));
    if (sid->down.dir_x)
diff --git a/src/lib/elm_priv.h b/src/lib/elm_priv.h
index 0b03d54..48f2267 100644
--- a/src/lib/elm_priv.h
+++ b/src/lib/elm_priv.h
@@ -204,10 +204,10 @@ struct _Elm_Config
    double        thumbscroll_border_friction;
    double        thumbscroll_sensitivity_friction;
    unsigned char scroll_smooth_start_enable;
-   double        scroll_smooth_time_interval;
+//   double        scroll_smooth_time_interval;; // not used anymore
    double        scroll_smooth_amount;
-   double        scroll_smooth_history_weight;
-   double        scroll_smooth_future_time;
+//   double        scroll_smooth_history_weight;; // not used anymore
+//   double        scroll_smooth_future_time;; // not used anymore
    double        scroll_smooth_time_window;
    double        scale;
    int           bgpixmap;

-- 


Reply via email to