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
This commit is contained in:
Carsten Haitzler 2020-11-27 09:22:25 +00:00
parent 281675ee3c
commit 97977f9f41
1 changed files with 22 additions and 9 deletions

View File

@ -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"))
{
e_object_del(E_OBJECT(fwin));
return;
}
if (!strcmp(ev->key, "a"))
else if (!strcmp(ev->key, "a"))
{
e_fm2_all_sel(page->fm_obj);
return;
}
else if (!strcmp(ev->key, "w"))
{
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);
}
}
}