discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=cd6fc802e9cfc80150f7dde24f960f152e5607a5

commit cd6fc802e9cfc80150f7dde24f960f152e5607a5
Author: Mike Blumenkrantz <[email protected]>
Date:   Fri Jul 28 13:49:31 2017 -0400

    defer setting recalc on gadget sites
    
    if this is set during a smart_calculate() call then it will potentially
    loop forever
---
 src/bin/e_gadget.c | 24 ++++++++++++++++++++----
 1 file changed, 20 insertions(+), 4 deletions(-)

diff --git a/src/bin/e_gadget.c b/src/bin/e_gadget.c
index 33ad3decb..5cb2fb35d 100644
--- a/src/bin/e_gadget.c
+++ b/src/bin/e_gadget.c
@@ -30,6 +30,7 @@ typedef struct E_Gadget_Site
    Evas_Object *events;
    E_Gadget_Style_Cb style_cb;
    int cur_size;
+   Ecore_Job *calc_job;
 
    E_Gadget_Config *action;
    Ecore_Event_Handler *move_handler;
@@ -129,6 +130,20 @@ static void _editor_pointer_site_init(E_Gadget_Site_Orient 
orient, Evas_Object *
 static void _gadget_drop_handler_moveresize(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj, void *event_info EINA_UNUSED);
 static void _edit_site_del(void *data, Evas *e, Evas_Object *obj, void 
*event_info);
 
+static void
+_site_recalc_job_cb(E_Gadget_Site *zgs)
+{
+   zgs->calc_job = NULL;
+   evas_object_smart_need_recalculate_set(zgs->layout, 1);
+}
+
+static void
+_site_recalc_job(E_Gadget_Site *zgs)
+{
+   if (zgs->calc_job) return;
+   zgs->calc_job = ecore_job_add((Ecore_Cb)_site_recalc_job_cb, zgs);
+}
+
 static Eina_Bool
 _editor_site_visible(void)
 {
@@ -453,7 +468,7 @@ _gadget_object_create(E_Gadget_Config *zgc)
      zgc->site->style_cb(zgc->site->layout, zgc->style.name, g);
 
    if (!zgc->site->orient)
-     evas_object_smart_need_recalculate_set(zgc->site->layout, 1);
+     _site_recalc_job(zgc->site);
    evas_object_event_callback_priority_add(g, EVAS_CALLBACK_DEL, 
EVAS_CALLBACK_PRIORITY_AFTER, _gadget_del, zgc);
    _gadget_reparent(zgc->site, zgc);
    elm_object_tree_focus_allow_set(zgc->gadget, 0);
@@ -564,7 +579,7 @@ _site_gadget_resize(Evas_Object *g, int w, int h, 
Evas_Coord *ww, Evas_Coord *hh
    if (!zgc->site->orient)
      {
         if ((w < (*ow)) || (h < (*oh)))
-          evas_object_smart_need_recalculate_set(zgc->gadget, 1);
+          _site_recalc_job(zgc->site);
      }
    //fprintf(stderr, "%s: %dx%d\n", zgc->type, *ow, *oh);
    evas_object_resize(zgc->display, *ow, *oh);
@@ -580,7 +595,7 @@ _site_move(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj, void *event_info E
    evas_object_geometry_set(zgs->events, x, y, w, h);
    evas_object_raise(zgs->events);
    if (!zgs->orient)
-     evas_object_smart_need_recalculate_set(zgs->layout, 1);
+     _site_recalc_job(zgs);
 }
 
 static void
@@ -1372,6 +1387,7 @@ _site_del(void *data, Evas *e EINA_UNUSED, Evas_Object 
*obj EINA_UNUSED, void *e
    E_FREE_FUNC(zgs->events, evas_object_del);
    E_FREE_FUNC(zgs->move_handler, ecore_event_handler_del);
    E_FREE_FUNC(zgs->mouse_up_handler, ecore_event_handler_del);
+   E_FREE_FUNC(zgs->calc_job, ecore_job_del);
    EINA_LIST_FOREACH_SAFE(zgs->gadgets, l, ll, zgc)
      evas_object_del(zgc->display);
    zgs->layout = NULL;
@@ -1791,7 +1807,7 @@ static void
 _gadget_style_hints(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    E_Gadget_Config *zgc = data;
-   evas_object_smart_need_recalculate_set(zgc->site->layout, 1);
+   _site_recalc_job(zgc->site);
 }
 
 E_API Evas_Object *

-- 


Reply via email to