netstar pushed a commit to branch master. http://git.enlightenment.org/apps/ecrire.git/commit/?id=825d22b44bcf612e8bbdff9acbc68878db8ffcab
commit 825d22b44bcf612e8bbdff9acbc68878db8ffcab Author: Alastair Poole <nets...@gmail.com> Date: Thu Apr 8 09:00:32 2021 +0100 alerts: global callback is racey... two mice. ten keyboards...this CAN happen... --- src/bin/Ecrire.h | 2 + src/bin/ui/alerts.c | 106 ++++++++++++++++++++++++++++++++++------------------ 2 files changed, 72 insertions(+), 36 deletions(-) diff --git a/src/bin/Ecrire.h b/src/bin/Ecrire.h index e20f461..8bacd45 100644 --- a/src/bin/Ecrire.h +++ b/src/bin/Ecrire.h @@ -44,6 +44,8 @@ typedef struct _Ecrire_Editor Eina_List *undo_stack_ptr; Eina_List *last_saved_stack_ptr; Eina_Bool undo_stack_can_merge; + + void *data; } Ecrire_Editor; void ecrire_editor_add(const char *filename, const char *font_name, int font_size); diff --git a/src/bin/ui/alerts.c b/src/bin/ui/alerts.c index d4d1caa..6f244e5 100644 --- a/src/bin/ui/alerts.c +++ b/src/bin/ui/alerts.c @@ -3,78 +3,112 @@ #include "../Ecrire.h" -static void *done_data; -static void (*done_cb)(void *data); +typedef struct +{ + void (*done_cb)(void *data); + void *data; + + Ecrire_Editor *inst; + Evas_Object *popup; +} Alert_Data; + +static void +_alert_del(Alert_Data *ad) +{ + if (ad->popup) + evas_object_del(ad->popup); + free(ad); +} static void -_discard(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cb_discard(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Ecrire_Editor *inst = done_data; + Ecrire_Editor *inst; + Alert_Data *ad = data; + + inst = ad->data; - if (data) - evas_object_del(data); - done_cb(inst); + ad->done_cb(inst); + + _alert_del(ad); } static void _fs_save_done(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info) { + Alert_Data *ad; Ecrire_Editor *inst; const char *selected = event_info; - inst = done_data; + inst = data; + ad = inst->data; + if (selected) { ecrire_editor_save(inst, selected); - done_cb(data); + inst->data = NULL; + ad->done_cb(ad->data); + _alert_del(ad); } } static void -_save(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cb_save(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - Ecrire_Editor *inst = done_data; + Ecrire_Editor *inst; + Alert_Data *ad = data; + + inst = ad->data; + inst->data = ad; + + evas_object_del(ad->popup); + ad->popup = NULL; - evas_object_del(data); ecrire_editor_try_save(inst, _fs_save_done); } static void -_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) +_cb_cancel(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { - evas_object_del(data); + Alert_Data *ad = data; + + _alert_del(ad); } void -ui_alert_need_saving(Evas_Object *entry, void (*done)(void *data), void *data) +ui_alert_need_saving(Evas_Object *entry, void (*done_cb)(void *data), void *data) { - Evas_Object *popup, *btn1, *btn2, *btn3; - popup = elm_popup_add(elm_object_top_widget_get(entry)); + Evas_Object *popup, *btn; + Alert_Data *ad; + + ad = calloc(1, sizeof(Alert_Data)); + EINA_SAFETY_ON_NULL_RETURN(ad); - done_cb = done; - done_data = data; + ad->popup = popup = elm_popup_add(elm_object_top_widget_get(entry)); + ad->done_cb = done_cb; + ad->data = data; elm_object_part_text_set(popup, "title,text", "Unsaved Changes"); elm_object_style_set(popup, "transparent"); elm_object_text_set(popup, - _("<align=center>Would you like to save changes to document?<br>" - "Any unsaved changes will be lost.")); - - btn1 = elm_button_add(popup); - elm_object_text_set(btn1, _("Save")); - elm_object_part_content_set(popup, "button1", btn1); - evas_object_smart_callback_add(btn1, "clicked", _save, popup); - - btn2 = elm_button_add(popup); - elm_object_text_set(btn2, _("Discard")); - elm_object_part_content_set(popup, "button2", btn2); - evas_object_smart_callback_add(btn2, "clicked", _discard, popup); - - btn3 = elm_button_add(popup); - elm_object_text_set(btn3, _("Cancel")); - elm_object_part_content_set(popup, "button3", btn3); - evas_object_smart_callback_add(btn3, "clicked", _cancel, popup); + _("<align=center>Would you like to save changes to document?<br>" + "Any unsaved changes will be lost.")); + + btn = elm_button_add(popup); + elm_object_text_set(btn, _("Save")); + elm_object_part_content_set(popup, "button1", btn); + evas_object_smart_callback_add(btn, "clicked", _cb_save, ad); + + btn = elm_button_add(popup); + elm_object_text_set(btn, _("Discard")); + elm_object_part_content_set(popup, "button2", btn); + evas_object_smart_callback_add(btn, "clicked", _cb_discard, ad); + + btn = elm_button_add(popup); + elm_object_text_set(btn, _("Cancel")); + elm_object_part_content_set(popup, "button3", btn); + evas_object_smart_callback_add(btn, "clicked", _cb_cancel, ad); elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER); evas_object_show(popup); --