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); } } } --
