Enlightenment CVS committal

Author  : jethomas
Project : e17
Module  : libs/ewl

Dir     : e17/libs/ewl/src/lib


Modified Files:
        ewl_enums.h ewl_scrollpane.c ewl_scrollpane.h 


Log Message:
Add another kinetic scrolling style - more like the iphone.

===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_enums.h,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -3 -r1.85 -r1.86
--- ewl_enums.h 20 Jan 2008 05:06:12 -0000      1.85
+++ ewl_enums.h 7 Feb 2008 20:15:30 -0000       1.86
@@ -885,6 +885,7 @@
 {
        EWL_KINETIC_SCROLL_NONE,
        EWL_KINETIC_SCROLL_NORMAL,
+       EWL_KINETIC_SCROLL_EMBEDDED
 };
 
 /*
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_scrollpane.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -3 -r1.33 -r1.34
--- ewl_scrollpane.c    24 Jan 2008 00:51:22 -0000      1.33
+++ ewl_scrollpane.c    7 Feb 2008 20:15:30 -0000       1.34
@@ -8,14 +8,52 @@
 #include "ewl_macros.h"
 #include "ewl_private.h"
 #include "ewl_debug.h"
+#include <math.h>
 
-void ewl_scrollpane_cb_mouse_down(Ewl_Widget *w, void *ev, void *data);
-void ewl_scrollpane_cb_mouse_up(Ewl_Widget *w, void *ev, void *data);
-void ewl_scrollpane_cb_mouse_move(Ewl_Widget *w, void *ev, void *data);
-static int ewl_scrollpane_cb_scroll_timer(void *data);
-void ewl_scrollpane_cb_scroll(Ewl_Scrollpane *s, double x, double y,
+#define HIST_NUM 20
+
+/* Normal scrolling functions */
+static void ewl_scrollpane_cb_mouse_down_normal(Ewl_Widget *w, void *ev, void 
*data);
+static void ewl_scrollpane_cb_mouse_up_normal(Ewl_Widget *w, void *ev, void 
*data);
+static void ewl_scrollpane_cb_mouse_move_normal(Ewl_Widget *w, void *ev, void 
*data);
+static int ewl_scrollpane_cb_scroll_timer_normal(void *data);
+
+typedef struct Ewl_Scrollpane_Scroll_Info_Normal 
Ewl_Scrollpane_Scroll_Info_Normal;
+struct Ewl_Scrollpane_Scroll_Info_Normal
+{
+       int x;
+       int y;
+       int xc;
+       int yc;
+       double vel_x;
+       double vel_y;
+};
+
+typedef struct Ewl_Scrollpane_Scroll_Info_Embedded 
Ewl_Scrollpane_Scroll_Info_Embedded;
+struct Ewl_Scrollpane_Scroll_Info_Embedded
+{
+       int xs;
+       int ys;
+       double vel_x;
+       double vel_y;
+       double at;
+
+       struct
+       {
+               int x;
+               int y;
+               double time;
+       } back[HIST_NUM];
+};
+
+/* Iphonish (embedded) scrolling functions */
+static void ewl_scrollpane_cb_mouse_down_embedded(Ewl_Widget *w, void *ev, 
void *data);
+static void ewl_scrollpane_cb_mouse_up_embedded(Ewl_Widget *w, void *ev, void 
*data);
+static void ewl_scrollpane_cb_mouse_move_embedded(Ewl_Widget *w, void *ev, 
void *data);
+static int ewl_scrollpane_cb_scroll_timer_embedded(void *data);
+static void ewl_scrollpane_cb_scroll(Ewl_Scrollpane *s, double x, double y,
                                                        int *tx, int *ty);
-void ewl_scrollpane_cb_destroy(Ewl_Widget *w, void *ev, void *data);
+static void ewl_scrollpane_cb_destroy(Ewl_Widget *w, void *ev, void *data);
 
 /**
  * @return Returns a new scrollpane on success, NULL on failure.
@@ -135,6 +173,7 @@
        /*
         * Setup kinetic scrolling info here
         */
+       s->kinfo = NULL;
        ewl_scrollpane_kinetic_scrolling_set(s, EWL_KINETIC_SCROLL_NONE);
        ewl_callback_append(w, EWL_CALLBACK_DESTROY,
                                ewl_scrollpane_cb_destroy, NULL);
@@ -159,35 +198,68 @@
        if ((s->type) && (type == s->type))
                DRETURN(DLEVEL_STABLE);
 
-       if (type == EWL_KINETIC_SCROLL_NORMAL)
+       /* Remove all present callbacks and free the kinfo */
+       if ((s->type == EWL_KINETIC_SCROLL_NORMAL) && (s->kinfo))
        {
-               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_DOWN,
-                               ewl_scrollpane_cb_mouse_down, s);
-               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_UP,
-                               ewl_scrollpane_cb_mouse_up, s);
-               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_MOVE,
-                               ewl_scrollpane_cb_mouse_move, s);
+               ewl_callback_del(s->overlay, EWL_CALLBACK_MOUSE_DOWN,
+                               ewl_scrollpane_cb_mouse_down_normal);
+               ewl_callback_del(s->overlay, EWL_CALLBACK_MOUSE_UP,
+                               ewl_scrollpane_cb_mouse_up_normal);
+               ewl_callback_del(s->overlay, EWL_CALLBACK_MOUSE_MOVE,
+                               ewl_scrollpane_cb_mouse_move_normal);
        }
 
-       /* Only delete the callbacks if they were there originally */
-       else if ((s->type != EWL_KINETIC_SCROLL_NONE) && (s->kinfo))
+       else if ((s->type == EWL_KINETIC_SCROLL_EMBEDDED) && (s->kinfo))
        {
                ewl_callback_del(s->overlay, EWL_CALLBACK_MOUSE_DOWN,
-                               ewl_scrollpane_cb_mouse_down);
+                               ewl_scrollpane_cb_mouse_down_embedded);
                ewl_callback_del(s->overlay, EWL_CALLBACK_MOUSE_UP,
-                               ewl_scrollpane_cb_mouse_up);
+                               ewl_scrollpane_cb_mouse_up_embedded);
                ewl_callback_del(s->overlay, EWL_CALLBACK_MOUSE_MOVE,
-                               ewl_scrollpane_cb_mouse_move);
+                               ewl_scrollpane_cb_mouse_move_embedded);
+       }
+       if (s->kinfo)
+               IF_FREE(s->kinfo->extra)
+       IF_FREE(s->kinfo);
+
+       if (type == EWL_KINETIC_SCROLL_NORMAL)
+       {
+               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_DOWN,
+                               ewl_scrollpane_cb_mouse_down_normal, s);
+               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_UP,
+                               ewl_scrollpane_cb_mouse_up_normal, s);
+               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_MOVE,
+                               ewl_scrollpane_cb_mouse_move_normal, s);
+
+               if (!s->kinfo)
+               {
+                       s->kinfo = NEW(Ewl_Scrollpane_Scroll_Info_Base, 1);
+                       s->kinfo->extra = 
NEW(Ewl_Scrollpane_Scroll_Info_Normal, 1);
+                       s->kinfo->fps = 15;
+                       s->kinfo->vmax = 50.0;
+                       s->kinfo->vmin = 0.0;
+                       s->kinfo->dampen = 0.95;
+               }
        }
 
-       /* Set up the scrollpane information */
-       if (!s->kinfo)
+       else if (type == EWL_KINETIC_SCROLL_EMBEDDED)
        {
-               s->kinfo = NEW(Ewl_Scrollpane_Scroll_Info, 1);
-               s->kinfo->fps = 15;
-               s->kinfo->vmax = 50.0;
-               s->kinfo->vmin = 0.0;
-               s->kinfo->dampen = 0.95;
+               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_DOWN,
+                               ewl_scrollpane_cb_mouse_down_embedded, s);
+               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_UP,
+                               ewl_scrollpane_cb_mouse_up_embedded, s);
+               ewl_callback_append(s->overlay, EWL_CALLBACK_MOUSE_MOVE,
+                               ewl_scrollpane_cb_mouse_move_embedded, s);
+
+               if (!s->kinfo)
+               {
+                       s->kinfo = NEW(Ewl_Scrollpane_Scroll_Info_Base, 1);
+                       s->kinfo->extra = 
NEW(Ewl_Scrollpane_Scroll_Info_Embedded, 1);
+                       s->kinfo->fps = 15;
+                       s->kinfo->vmax = 50.0;
+                       s->kinfo->vmin = 0.0;
+                       s->kinfo->dampen = 0.95;
+               }
        }
 
        s->type = type;
@@ -721,15 +793,16 @@
  * @internal
  * @param w: The widget to work with
  * @ev_data: The Ewl_Event_Mouse_Down data
- * @param data: UNUSED
+ * @param data: The scrollpane
  * @return Returns no value
  * @brief The mouse down setting up kinetic scrolling
  */
-void
-ewl_scrollpane_cb_mouse_down(Ewl_Widget *w, void *ev, void *data)
+static void
+ewl_scrollpane_cb_mouse_down_normal(Ewl_Widget *w, void *ev, void *data)
 {
        Ewl_Scrollpane *s;
        Ewl_Event_Mouse *md;
+       Ewl_Scrollpane_Scroll_Info_Normal *info;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
        DCHECK_PARAM_PTR(ev);
@@ -738,10 +811,11 @@
 
        s = EWL_SCROLLPANE(data);
        md = EWL_EVENT_MOUSE(ev);
-       s->kinfo->vel_x = 0.0;
-       s->kinfo->vel_y = 0.0;
-       s->kinfo->x = md->x;
-       s->kinfo->y = md->y;
+       info = s->kinfo->extra;
+       info->vel_x = 0.0;
+       info->vel_y = 0.0;
+       info->x = md->x;
+       info->y = md->y;
        s->kinfo->clicked = !!TRUE;
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
@@ -750,16 +824,53 @@
 /**
  * @internal
  * @param w: The widget to work with
+ * @ev_data: The Ewl_Event_Mouse_Down data
+ * @param data: The scrollpane
+ * @return Returns no value
+ * @brief The mouse down function for kinetic scrolling
+ */
+static void
+ewl_scrollpane_cb_mouse_down_embedded(Ewl_Widget *w, void *ev, void *data)
+{
+       Ewl_Scrollpane *s;
+       Ewl_Event_Mouse *md;
+       Ewl_Scrollpane_Scroll_Info_Embedded *info;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR(ev);
+       DCHECK_PARAM_PTR(data);
+       DCHECK_TYPE(w, EWL_WIDGET_TYPE);
+
+       s = EWL_SCROLLPANE(data);
+       md = EWL_EVENT_MOUSE(ev);
+       info = s->kinfo->extra;
+       s->kinfo->clicked = !!TRUE;
+       s->kinfo->active = !!FALSE;
+
+       memset(&(info->back[0]), 0, sizeof(info->back[0]) * HIST_NUM);
+       info->back[0].x = md->x;
+       info->back[0].y = md->y;
+       info->back[0].time = ecore_time_get();
+       info->xs = md->x;
+       info->ys = md->y;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @internal
+ * @param w: The widget to work with
  * @ev_data: The Ewl_Event_Mouse_Move data
- * @param data: UNUSED
+ * @param data: The scrollpane
  * @return Returns no value
  * @brief The mouse move callback for kinetic scrolling
  */
-void
-ewl_scrollpane_cb_mouse_move(Ewl_Widget *w, void *ev, void *data)
+static void
+ewl_scrollpane_cb_mouse_move_normal(Ewl_Widget *w, void *ev, void *data)
 {
        Ewl_Scrollpane *s;
        Ewl_Event_Mouse *mm;
+       Ewl_Scrollpane_Scroll_Info_Normal *info;
        int cx, cy;
 
        DENTER_FUNCTION(DLEVEL_STABLE);
@@ -768,6 +879,7 @@
 
        s = EWL_SCROLLPANE(data);
        mm = EWL_EVENT_MOUSE(ev);
+       info = s->kinfo->extra;
 
        if (!s->kinfo->clicked)
                DRETURN(DLEVEL_STABLE);
@@ -775,23 +887,23 @@
        if (!s->kinfo->active)
        {
                ecore_timer_add(1.0/s->kinfo->fps,
-                                       ewl_scrollpane_cb_scroll_timer, s);
+                                       ewl_scrollpane_cb_scroll_timer_normal, 
s);
                s->kinfo->active = !!TRUE;
        }
 
-       s->kinfo->xc = mm->x;
-       s->kinfo->yc = mm->y;
-       cx = (s->kinfo->xc - s->kinfo->x);
-       cy = (s->kinfo->yc - s->kinfo->y);
+       info->xc = mm->x;
+       info->yc = mm->y;
+       cx = (info->xc - info->x);
+       cy = (info->yc - info->y);
 
        /* v = (change in position / (width or height of scroll *
         *      (range of velocities) + min))
         */
-       s->kinfo->vel_x = ((cx / 
+       info->vel_x = ((cx / 
                (double)ewl_object_current_w_get(EWL_OBJECT(w))) *
                (s->kinfo->vmax - s->kinfo->vmin)) + s->kinfo->vmin;
 
-       s->kinfo->vel_y = ((cy /
+       info->vel_y = ((cy /
                (double)ewl_object_current_h_get(EWL_OBJECT(w))) *
                (s->kinfo->vmax - s->kinfo->vmin)) + s->kinfo->vmin;
 
@@ -801,13 +913,56 @@
 /**
  * @internal
  * @param w: The widget to work with
+ * @ev_data: The Ewl_Event_Mouse_Move data
+ * @param_data: The scrollpane
+ * @return Returns no value
+ * @brief The mouse move callback for kinetic scrolling
+ */
+static void
+ewl_scrollpane_cb_mouse_move_embedded(Ewl_Widget *w, void *ev, void *data)
+{
+       Ewl_Scrollpane *s;
+       Ewl_Event_Mouse *mm;
+       Ewl_Scrollpane_Scroll_Info_Embedded *info;
+       int x = 0, y = 0;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR(ev);
+       DCHECK_PARAM_PTR(data);
+
+       s = EWL_SCROLLPANE(data);
+       mm = EWL_EVENT_MOUSE(ev);
+       info = s->kinfo->extra;
+
+       if (!s->kinfo->clicked)
+               DRETURN(DLEVEL_STABLE);
+
+       memmove(&(info->back[1]), &(info->back[0]), sizeof(info->back[0]) * 
(HIST_NUM - 1));
+       info->back[0].x = mm->x;
+       info->back[0].y = mm->y;
+       info->back[0].time = ecore_time_get();
+
+       /* Move accordingly here */
+       x = info->xs - mm->x;
+       y = info->ys - mm->y;
+
+       ewl_scrollpane_cb_scroll(s, x, y, NULL, NULL);
+       info->xs = mm->x;
+       info->ys = mm->y;
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
+
+/**
+ * @internal
+ * @param w: The widget to work with
  * @ev_data: The Ewl_Event_Mouse_Up data
- * @param data: UNUSED
+ * @param data: The scrollpane
  * @return Returns no value
  * @brief The mouse up callback for kinetic scrolling
  */
-void
-ewl_scrollpane_cb_mouse_up(Ewl_Widget *w, void *ev, void *data)
+static void
+ewl_scrollpane_cb_mouse_up_normal(Ewl_Widget *w, void *ev, void *data)
 {
        Ewl_Scrollpane *s;
        
@@ -820,6 +975,87 @@
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
 
+/**
+ * @internal
+ * @param w: The widget to work with
+ * @ev_data: The Ewl_Event_Mouse_Up data
+ * @data: The scrollpane
+ * @return Returns no value
+ * @brief The mouse up callback for kinetic scrolling
+ */
+static void
+ewl_scrollpane_cb_mouse_up_embedded(Ewl_Widget *w, void *ev, void *data)
+{
+       Ewl_Scrollpane *s;
+       Ewl_Event_Mouse *mm;
+       Ewl_Scrollpane_Scroll_Info_Embedded *info;
+       int ax, ay, dx, dy, i;
+       double at, dt, t;
+       int rx = 1, ry = 1;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR(data);
+
+       s = EWL_SCROLLPANE(data);
+       mm = EWL_EVENT_MOUSE(ev);
+       s->kinfo->clicked = !!FALSE;
+       s->kinfo->active = !!TRUE;
+       info = s->kinfo->extra;
+
+       t = ecore_time_get();
+       ax = mm->x;
+       ay = mm->y;
+       at = 0.0;
+
+       for (i = 0; i < HIST_NUM; i++)
+       {
+               dt = t - info->back[i].time;
+               if (dt > 0.2) break;
+               at = at + dt;
+               ax = ax + info->back[i].x;
+               ay = ay + info->back[i].y;
+       }
+
+       ax = (ax / (i + 1));
+       ay = (ay / (i + 1));
+       at = (at / (i + 1));
+       at = at * 4.0;
+       dx = mm->x - ax;
+       dy = mm->y - ay;
+
+       info->vel_x = (double)dx / at;
+       info->vel_y = (double)dy / at;
+
+       if (info->vel_y < 0)
+               ry = -1;
+       if (info->vel_x < 0)
+               rx = -1;
+
+       /* This should do something better */
+       info->vel_x = sqrt(info->vel_x * rx);
+       info->vel_y = sqrt(info->vel_y * ry);
+
+       /* Set to minimum velocity if below */
+       if (abs(info->vel_x) < s->kinfo->vmin)
+               info->vel_x = s->kinfo->vmin;
+       else if (abs(info->vel_x) > s->kinfo->vmax)
+               info->vel_x = s->kinfo->vmax;
+
+       /* Check upper velocity */
+       if (abs(info->vel_y) < s->kinfo->vmin)
+               info->vel_y = s->kinfo->vmin;
+       else if (abs(info->vel_y) > s->kinfo->vmax)
+               info->vel_y = s->kinfo->vmax;
+
+       /* Return to proper direction */
+       info->vel_x = info->vel_x * rx;
+       info->vel_y = info->vel_y * ry;
+
+       info->at = at;
+       ecore_timer_add(1/s->kinfo->fps, 
ewl_scrollpane_cb_scroll_timer_embedded, s);
+
+       DLEAVE_FUNCTION(DLEVEL_STABLE);
+}
 
 /**
  * @internal
@@ -827,9 +1063,11 @@
  * @return Returns 1 if the timer is to continue, 0 otherwise
  * @brief Performs some calculations then calls the scroll function
  */
-static int ewl_scrollpane_cb_scroll_timer(void *data)
+static int
+ewl_scrollpane_cb_scroll_timer_normal(void *data)
 {
        Ewl_Scrollpane *s;
+       Ewl_Scrollpane_Scroll_Info_Normal *info;
        double h, w;
        int tx = 0, ty = 0;
 
@@ -837,15 +1075,16 @@
        DCHECK_PARAM_PTR_RET(data, FALSE);
 
        s = EWL_SCROLLPANE(data);
+       info = s->kinfo->extra;
 
        /* If the mouse is down, accelerate and check velocity */
        if (!s->kinfo->clicked)
        {
-               s->kinfo->vel_x *= s->kinfo->dampen;
-               s->kinfo->vel_y *= s->kinfo->dampen;
+               info->vel_x *= s->kinfo->dampen;
+               info->vel_y *= s->kinfo->dampen;
 
-               h = s->kinfo->vel_y * ((s->kinfo->vel_y < 0) ? -1 : 1);
-               w = s->kinfo->vel_x * ((s->kinfo->vel_x < 0) ? -1 : 1);
+               h = info->vel_y * ((info->vel_y < 0) ? -1 : 1);
+               w = info->vel_x * ((info->vel_x < 0) ? -1 : 1);
 
                if ((w < 0.5) && (h < 0.5))
                {
@@ -855,19 +1094,66 @@
        }
 
        /* Actually scroll the pane */
-       ewl_scrollpane_cb_scroll(s, s->kinfo->vel_x, s->kinfo->vel_y, &tx, &ty);
+       ewl_scrollpane_cb_scroll(s, info->vel_x, info->vel_y, &tx, &ty);
 
        /* If at the end of a scrollbar, set x/y to current */
        if (!tx)
-               s->kinfo->x = s->kinfo->xc;
+               info->x = info->xc;
        if (!ty)
-               s->kinfo->y = s->kinfo->yc;
+               info->y = info->yc;
 
        DRETURN_INT(1, DLEVEL_STABLE);
 }
 
 /**
  * @internal
+ * @param data: The scrollpane to work with
+ * @return Returns 1 if the timer is to continue, 0 otherwise
+ * @brief Performs some calculations then calls the scroll functions
+ */
+static int
+ewl_scrollpane_cb_scroll_timer_embedded(void *data)
+{
+       Ewl_Scrollpane *s;
+       Ewl_Scrollpane_Scroll_Info_Embedded *info;
+       double h, w, t;
+       int tx = 0, ty = 0;
+
+       DENTER_FUNCTION(DLEVEL_STABLE);
+       DCHECK_PARAM_PTR_RET(data, FALSE);
+
+       s = EWL_SCROLLPANE(data);
+       info = s->kinfo->extra;
+
+       if ((s->kinfo->clicked) || (!s->kinfo->active))
+               DRETURN_INT(FALSE, DLEVEL_STABLE);
+
+       h = info->vel_y * ((info->vel_y < 0) ? -1 : 1);
+       w = info->vel_x * ((info->vel_x < 0) ? -1 : 1);
+
+       if ((w < 0.5) && (h < 0.5))
+       {
+               s->kinfo->active = !!FALSE;
+               DRETURN_INT(FALSE, DLEVEL_STABLE);
+       }
+
+       t = 1.0 / (info->at * s->kinfo->fps);
+       h = info->vel_y * -t;
+       w = info->vel_x * -t;
+       
+       ewl_scrollpane_cb_scroll(s, w, h, &tx, &ty);
+
+       if (!tx && !ty)
+               DRETURN_INT(FALSE, DLEVEL_STABLE);
+
+       info->vel_x *= s->kinfo->dampen;
+       info->vel_y *= s->kinfo->dampen;
+
+       DRETURN_INT(TRUE, DLEVEL_STABLE);
+}
+
+/**
+ * @internal
  * @param s: The scrollpane to work with
  * @param x: The horizontal velocity
  * @param y: The vertical velocity
@@ -876,7 +1162,7 @@
  * @return Returns no value
  * @brief Scrolls the scrollpane based on the given parameters
  */
-void
+static void
 ewl_scrollpane_cb_scroll(Ewl_Scrollpane *s, double x, double y,
                                                int *tx, int *ty)
 {
@@ -895,8 +1181,8 @@
                        !((ewl_scrollpane_vscrollbar_value_get(s) == 0.0) &&
                                (y < 0)))
        {
-               h = ewl_scrollpane_vscrollbar_value_get(s) + (y *
-                               ewl_scrollpane_vscrollbar_step_get(s) / 100);
+               h = ewl_scrollpane_vscrollbar_value_get(s) +
+                       (y / 
(double)ewl_object_preferred_h_get(EWL_OBJECT(s->box)));
 
                /* If h is greater than possible setting, set to remainder */
                if (h > ewl_range_maximum_value_get(EWL_RANGE(ry->seeker)))
@@ -920,8 +1206,8 @@
                        !((ewl_scrollpane_hscrollbar_value_get(s) == 0.0) &&
                                (x < 0)))
        {
-               w = ewl_scrollpane_hscrollbar_value_get(s) + (x *
-                               ewl_scrollpane_hscrollbar_step_get(s) / 100);
+               w = ewl_scrollpane_hscrollbar_value_get(s) +
+                       (x / 
(double)ewl_object_preferred_w_get(EWL_OBJECT(s->box)));
 
                /* And again for the w */
                if (w > ewl_range_maximum_value_get(EWL_RANGE(rx->seeker)))
@@ -1090,7 +1376,10 @@
        DCHECK_PARAM_PTR(w);
        DCHECK_TYPE(w, EWL_SCROLLPANE_TYPE);
 
+       if (EWL_SCROLLPANE(w)->kinfo)
+               FREE(EWL_SCROLLPANE(w)->kinfo->extra);
        FREE(EWL_SCROLLPANE(w)->kinfo);
+
 
        DLEAVE_FUNCTION(DLEVEL_STABLE);
 }
===================================================================
RCS file: /cvs/e/e17/libs/ewl/src/lib/ewl_scrollpane.h,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -3 -r1.21 -r1.22
--- ewl_scrollpane.h    23 Jan 2008 01:51:31 -0000      1.21
+++ ewl_scrollpane.h    7 Feb 2008 20:15:30 -0000       1.22
@@ -35,31 +35,26 @@
 /**
  * The scrollpane can be scolled with a drag of the mouse
  */
-typedef struct Ewl_Scrollpane_Scroll_Info Ewl_Scrollpane_Scroll_Info;
+typedef struct Ewl_Scrollpane_Scroll_Info_Base Ewl_Scrollpane_Scroll_Info_Base;
 
 /**
- * @def EWL_SCROLLPANE_SCROLL_INFO(scroll_info)
- * Typecasts a pointer to an Ewl_Scrollpane_Scroll_Info pointer.
+ * @def EWL_SCROLLPANE_SCROLL_INFO_Base(scroll_info)
+ * Typecasts a pointer to an Ewl_Scrollpane_Scroll_Info_Base pointer.
  */
-#define EWL_SCROLLPANE_SCROLL_INFO(scroll_info) ((Ewl_Scrollpane_Scroll_Info 
*) scroll_info)
+#define EWL_SCROLLPANE_SCROLL_INFO_BASE(scroll_info) 
((Ewl_Scrollpane_Scroll_Info_Base *) scroll_info)
 
 /**
  * @brief Enables a scrollpane to be scrolled with kinetic behaviour
  */
-struct Ewl_Scrollpane_Scroll_Info
+struct Ewl_Scrollpane_Scroll_Info_Base
 {
        unsigned char clicked:1;        /**< If the mouse is currently clicked 
or not */
        unsigned char active:1;         /**< If the pane is currently moving */
        int fps;                        /**< Number of recalculations per 
second */
-       int x;                          /**< Mouse down location (x) */
-       int y;                          /**< Mouse down location (y) */
-       int xc;                         /**< Mouse up location (x) */
-       int yc;                         /**< Mouse up location (y) */
-       double vel_x;                   /**< Current horizontal velocity */
-       double vel_y;                   /**< Current vertical */
        double vmax;                    /**< Maximum speed in pixels */
        double vmin;                    /**< Minimum speed in pixels */
        double dampen;                  /**< Frictional variable */
+       void *extra;                    /**< Additional information */
 };
 
 /**
@@ -88,7 +83,7 @@
        Ewl_Widget *vscrollbar; /**< Vertical scrollbar */
        Ewl_Scrollpane_Flags hflag;      /**< Flags for horizontal scrollbar */
        Ewl_Scrollpane_Flags vflag;      /**< Flags for vertical scrollbar */
-       Ewl_Scrollpane_Scroll_Info *kinfo;      /**< Kinetic scrolling info */
+       Ewl_Scrollpane_Scroll_Info_Base *kinfo; /**< Kinetic scrolling info */
        Ewl_Kinetic_Scroll type;        /**< If the scrollpane is to use 
kinetic scrolling */
 };
 



-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to