raster pushed a commit to branch master.

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

commit 97977f9f4166d2fc3c2b781ef5a1cbb93106ffcd
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Fri Nov 27 09:22:25 2020 +0000

    efm - call e fwin key cb's after e_fm cb's and delay fwin del
    
    this mens fwin's key handling should always be called after efm's own
    internal handling and dispatching. also the final deletion will also
    now be deferred in a job to "after all of this".
    
    fix segv on ctrl+w
---
 src/modules/fileman/e_fwin.c | 29 +++++++++++++++++++++--------
 1 file changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/modules/fileman/e_fwin.c b/src/modules/fileman/e_fwin.c
index 1bdd3e4b3..c991879b5 100644
--- a/src/modules/fileman/e_fwin.c
+++ b/src/modules/fileman/e_fwin.c
@@ -45,6 +45,7 @@ struct _E_Fwin
 
    Ecore_Timer *popup_timer;
    Ecore_Job *popup_del_job;
+   Ecore_Job *object_del_job;
    Eina_List *popup_handlers;
    Evas_Object *popup;
 
@@ -831,7 +832,10 @@ _e_fwin_free(E_Fwin *fwin)
      {
         evas_object_hide(fwin->popup);
         evas_object_del(fwin->popup);
+        fwin->popup = NULL;
      }
+   if (fwin->object_del_job) ecore_job_del(fwin->object_del_job);
+   fwin->object_del_job = NULL;
    if (fwin->popup_timer) ecore_timer_del(fwin->popup_timer);
    fwin->popup_timer = NULL;
    if (fwin->win)
@@ -1099,7 +1103,9 @@ _e_fwin_page_create(E_Fwin *fwin)
    o = e_fm2_add(evas);
    page->fm_obj = o;
    e_fm2_view_flags_set(o, E_FM2_VIEW_DIR_CUSTOM);
-   evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN, 
_e_fwin_cb_key_down, page);
+   // low priority to be called last... after e_fm's own cb's
+   evas_object_event_callback_priority_add(o, EVAS_CALLBACK_KEY_DOWN,
+                                           1000, _e_fwin_cb_key_down, page);
 
    evas_object_smart_callback_add(o, "changed", _e_fwin_icon_mouse_out, fwin);
    evas_object_smart_callback_add(o, "dir_changed",
@@ -1965,6 +1971,15 @@ _e_fwin_cb_all_change(void *data,
      e_widget_entry_text_set(fad->o_entry, fad->app2);
 }
 
+static void
+_e_fwin_cb_delay_del_job(void *data)
+{
+   E_Fwin *fwin = data;
+
+   fwin->object_del_job = NULL;
+   e_object_del(E_OBJECT(fwin));
+}
+
 static void
 _e_fwin_cb_key_down(void *data,
                     Evas *e          EINA_UNUSED,
@@ -1987,17 +2002,15 @@ _e_fwin_cb_key_down(void *data,
 
              e_fm2_path_get(page->fm_obj, &dev, &path);
              e_fwin_new(dev, path);
-             return;
           }
-        if (!strcmp(ev->key, "w"))
+        else if (!strcmp(ev->key, "a"))
           {
-             e_object_del(E_OBJECT(fwin));
-             return;
+             e_fm2_all_sel(page->fm_obj);
           }
-        if (!strcmp(ev->key, "a"))
+        else if (!strcmp(ev->key, "w"))
           {
-             e_fm2_all_sel(page->fm_obj);
-             return;
+             if (fwin->object_del_job) ecore_job_del(fwin->object_del_job);
+             fwin->object_del_job = ecore_job_add(_e_fwin_cb_delay_del_job, 
fwin);
           }
      }
 }

-- 


Reply via email to