diff options
author | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2022-01-21 15:53:50 +0000 |
---|---|---|
committer | Carsten Haitzler (Rasterman) <raster@rasterman.com> | 2022-01-21 16:10:38 +0000 |
commit | 921f5208e74e309dc96d202c424a5948d8ed1ec5 (patch) | |
tree | 051863b8073aa40dc002f5dbaba40950dd98172f | |
parent | 6d2b5e91445b16c32193c4e0319a793d9be599ef (diff) | |
download | enlightenment-921f5208e74e309dc96d202c424a5948d8ed1ec5.tar.gz |
xkb config - fix segv on close advanced mode dialog
didnt remove the lists with del callbacks that accessed the cfdata
struct to set lisrts to null on del before cfdata was freed...
callback hell. yay.
@fix
-rw-r--r-- | src/modules/xkbswitch/e_mod_config.c | 33 |
1 files changed, 24 insertions, 9 deletions
diff --git a/src/modules/xkbswitch/e_mod_config.c b/src/modules/xkbswitch/e_mod_config.c index 534cb2f122..e405165121 100644 --- a/src/modules/xkbswitch/e_mod_config.c +++ b/src/modules/xkbswitch/e_mod_config.c @@ -232,9 +232,7 @@ _create_data(E_Config_Dialog *cfd) static void _list_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED) { - Evas_Object **o; - - o = data; + Evas_Object **o = data; *o = NULL; } @@ -246,12 +244,29 @@ _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata) _xkb.cfd = NULL; - if (cfdata->compose_list) - evas_object_event_callback_del(cfdata->compose_list, EVAS_CALLBACK_DEL, _list_del); - if (cfdata->lv3_list) - evas_object_event_callback_del(cfdata->lv3_list, EVAS_CALLBACK_DEL, _list_del); - if (cfdata->switch_list) - evas_object_event_callback_del(cfdata->switch_list, EVAS_CALLBACK_DEL, _list_del); +#define FRAME_DEL(list) \ + if (list) { \ + evas_object_del(list); \ + list = NULL; \ + } + FRAME_DEL(cfdata->compose_list); + FRAME_DEL(cfdata->lv3_list); + FRAME_DEL(cfdata->switch_list); + FRAME_DEL(cfdata->led_list); + FRAME_DEL(cfdata->ctrl_list); + FRAME_DEL(cfdata->keypad_list); + FRAME_DEL(cfdata->delkeypad_list); + FRAME_DEL(cfdata->capslock_list); + FRAME_DEL(cfdata->altwin_list); + FRAME_DEL(cfdata->currency_list); + FRAME_DEL(cfdata->lv5_list); + FRAME_DEL(cfdata->spacebar_list); + FRAME_DEL(cfdata->japan_list); + FRAME_DEL(cfdata->korean_list); + FRAME_DEL(cfdata->esperanto_list); + FRAME_DEL(cfdata->solaris_list); + FRAME_DEL(cfdata->terminate_list); + FRAME_DEL(cfdata->misc_list); EINA_LIST_FREE(cfdata->cfg_layouts, cl) { |