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

-- 


Reply via email to