From c09a0d9ea321132e300819d660529f4c399560a5 Mon Sep 17 00:00:00 2001 From: "Carsten Haitzler (Rasterman)" Date: Fri, 25 Oct 2013 04:36:28 +0100 Subject: [PATCH] elm scroller - try a simpler approach - animator queues idle enterer this allows the idle enterer to pick up all prior stored events like move coords etc. just before going idle (and rendering). --- .../src/lib/elm_interface_scrollable.c | 33 ++++++++++++++++++- .../src/lib/elm_interface_scrollable.h | 1 + 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/legacy/elementary/src/lib/elm_interface_scrollable.c b/legacy/elementary/src/lib/elm_interface_scrollable.c index 5441bdbce4..8ed1e714ec 100644 --- a/legacy/elementary/src/lib/elm_interface_scrollable.c +++ b/legacy/elementary/src/lib/elm_interface_scrollable.c @@ -1452,6 +1452,11 @@ _elm_scroll_bounce_eval(Elm_Scrollable_Smart_Interface_Data *sid) if (sid->content_info.resized) _elm_scroll_wanted_region_set(sid->obj); } + if (sid->down.hold_enterer) + { + ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del); + } + eo_do(sid->pan_obj, elm_obj_pan_pos_max_get(&mx, &my)); eo_do(sid->pan_obj, elm_obj_pan_pos_min_get(&minx, &miny)); eo_do(sid->pan_obj, elm_obj_pan_pos_get(&px, &py)); @@ -1775,6 +1780,10 @@ _elm_scroll_content_region_show_internal(Evas_Object *obj, if (sid->content_info.resized) _elm_scroll_wanted_region_set(sid->obj); } + if (sid->down.hold_enterer) + { + ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del); + } if (sid->down.momentum_animator) { ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del); @@ -2588,6 +2597,10 @@ _elm_scroll_mouse_up_event_cb(void *data, if (sid->content_info.resized) _elm_scroll_wanted_region_set(sid->obj); } + if (sid->down.hold_enterer) + { + ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del); + } if (sid->down.scroll) { ev->event_flags |= EVAS_EVENT_FLAG_ON_SCROLL; @@ -2674,6 +2687,10 @@ _elm_scroll_mouse_down_event_cb(void *data, if (sid->content_info.resized) _elm_scroll_wanted_region_set(sid->obj); } + if (sid->down.hold_enterer) + { + ELM_SAFE_FREE(sid->down.hold_enterer, ecore_idle_enterer_del); + } if (sid->down.momentum_animator) { ELM_SAFE_FREE(sid->down.momentum_animator, ecore_animator_del); @@ -2866,11 +2883,13 @@ _elm_scroll_down_coord_eval(Elm_Scrollable_Smart_Interface_Data *sid, } static Eina_Bool -_elm_scroll_hold_animator(void *data) +_elm_scroll_hold_enterer(void *data) { Elm_Scrollable_Smart_Interface_Data *sid = data; Evas_Coord ox = 0, oy = 0, fx = 0, fy = 0; + sid->down.hold_enterer = NULL; + fx = sid->down.hold_x; fy = sid->down.hold_y; @@ -2978,6 +2997,17 @@ _elm_scroll_hold_animator(void *data) eo_do(sid->obj, elm_scrollable_interface_content_pos_set(ox, oy, EINA_TRUE)); + return EINA_FALSE; +} + +static Eina_Bool +_elm_scroll_hold_animator(void *data) +{ + Elm_Scrollable_Smart_Interface_Data *sid = data; + + if (sid->down.hold_enterer) ecore_idle_enterer_del(sid->down.hold_enterer); + sid->down.hold_enterer = + ecore_idle_enterer_before_add(_elm_scroll_hold_enterer, sid); return ECORE_CALLBACK_RENEW; } @@ -4573,6 +4603,7 @@ _elm_scroll_interface_del(Eo *obj, void *_pd, va_list *list EINA_UNUSED) eo_do(obj, elm_scrollable_interface_content_set(NULL)); if (!sid->extern_pan) evas_object_del(sid->pan_obj); + if (sid->down.hold_enterer) ecore_idle_enterer_del(sid->down.hold_enterer); if (sid->down.hold_animator) ecore_animator_del(sid->down.hold_animator); if (sid->down.onhold_animator) ecore_animator_del(sid->down.onhold_animator); if (sid->down.momentum_animator) ecore_animator_del(sid->down.momentum_animator); diff --git a/legacy/elementary/src/lib/elm_interface_scrollable.h b/legacy/elementary/src/lib/elm_interface_scrollable.h index 98fa9b5652..da1b21a80e 100644 --- a/legacy/elementary/src/lib/elm_interface_scrollable.h +++ b/legacy/elementary/src/lib/elm_interface_scrollable.h @@ -1119,6 +1119,7 @@ struct _Elm_Scrollable_Smart_Interface_Data Evas_Coord locked_x, locked_y; int hdir, vdir; + Ecore_Idle_Enterer *hold_enterer; Ecore_Animator *hold_animator; Ecore_Animator *onhold_animator; Ecore_Animator *momentum_animator;