netstar pushed a commit to branch master.

http://git.enlightenment.org/apps/ecrire.git/commit/?id=8185ae4d2bc4dee3eb507de11a0ffcbf63b7191c

commit 8185ae4d2bc4dee3eb507de11a0ffcbf63b7191c
Author: Alastair Poole <nets...@gmail.com>
Date:   Thu Apr 8 17:01:57 2021 +0100

    goto: race with instances and global.
---
 src/bin/ui/goto_dialog.c | 93 +++++++++++++++++++++++++-----------------------
 1 file changed, 48 insertions(+), 45 deletions(-)

diff --git a/src/bin/ui/goto_dialog.c b/src/bin/ui/goto_dialog.c
index 0a4ae32..1e242c2 100644
--- a/src/bin/ui/goto_dialog.c
+++ b/src/bin/ui/goto_dialog.c
@@ -3,21 +3,31 @@
 
 #include "../Ecrire.h"
 
-static Evas_Object *goto_popup, *sent;
+typedef struct
+{
+   Evas_Object   *popup;
+   Evas_Object   *entry;
+   Ecrire_Editor *inst;
+} Goto_Data;
 
 static void
-_goto_do(Evas_Object *entry, const char *text)
+_goto_do(Goto_Data *gd)
 {
+   Evas_Object *entry, *tb;
+   Evas_Textblock_Cursor *mcur;
    int line;
-   Evas_Object *tb = elm_entry_textblock_get(entry);
-   Evas_Textblock_Cursor *mcur = evas_object_textblock_cursor_get(tb);
 
-   line = atoi(text);
+   line = atoi(elm_object_text_get(gd->entry));
+   entry = gd->inst->entry;
+   tb = elm_entry_textblock_get(entry);
+   mcur = evas_object_textblock_cursor_get(tb);
+
+   evas_object_del(gd->popup);
 
-   evas_object_hide(goto_popup);
    if (line > 0)
      {
         Evas_Coord x, y;
+
         evas_textblock_cursor_line_set(mcur, line-1);
         elm_entry_calc_force(entry);
         evas_object_smart_callback_call(entry, "cursor,changed", NULL);
@@ -31,81 +41,74 @@ _goto_do(Evas_Object *entry, const char *text)
 static void
 _cb_goto_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info 
EINA_UNUSED)
 {
-   _goto_do(data, elm_object_text_get(sent));
+   Goto_Data *gd = data;
+
+   _goto_do(gd);
 }
 
 static void
 _cb_goto_key_down(void *data, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED, void *event_info)
 {
+   Goto_Data *gd;
    Evas_Event_Key_Down *ev;
 
+   gd = data;
    ev = event_info;
 
    if (!strcmp(ev->keyname, "Return"))
-     {
-        _goto_do(data, elm_object_text_get(sent));
-     }
+     _goto_do(gd);
    else if (!strcmp(ev->keyname, "Escape"))
-     {
-        evas_object_hide(goto_popup);
-     }
+     evas_object_del(gd->popup);
 }
 
 static void
-_my_parent_del(void *data EINA_UNUSED, Evas_Object *obj, void *event_info)
+_cb_popup_del(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj 
EINA_UNUSED,
+              void *event_info EINA_UNUSED)
 {
-   (void) obj;
-   (void) event_info;
-   /* Reset the stuff that need reseting */
-   goto_popup = NULL;
+   Goto_Data *gd = data;
+
+   free(gd);
 }
 
 Evas_Object *
 ui_goto_dialog_open(Evas_Object *parent, Ecrire_Editor *inst)
 {
-   Evas_Object *entry = inst->entry;
-   Evas_Object *popup, *bx, *hbx, *btn;
+   Evas_Object *popup, *hbx, *ent, *btn;
+   Goto_Data *gd;
 
-   if (goto_popup)
-     {
-        evas_object_show(goto_popup);
-        return goto_popup;
-     }
+   gd = calloc(1, sizeof(Goto_Data));
+   if (!gd) return NULL;
 
-   goto_popup = popup = elm_popup_add(parent);
+   gd->inst = inst;
+   gd->popup = popup = elm_popup_add(parent);
    elm_object_part_text_set(popup, "title,text", _("Go to line..."));
-   evas_object_smart_callback_add(popup, "dismissed", _my_parent_del, entry);
-
-   bx = elm_box_add(parent);
-   evas_object_size_hint_weight_set(bx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   evas_object_show(bx);
+   evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _cb_popup_del, gd);
 
    hbx = elm_box_add(parent);
    elm_box_horizontal_set(hbx, EINA_TRUE);
    evas_object_size_hint_align_set(hbx, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_size_hint_weight_set(hbx, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_show(hbx);
-   elm_box_pack_end(bx, hbx);
-
-   sent = elm_entry_add(parent);
-   elm_entry_scrollable_set(sent, EINA_TRUE);
-   elm_entry_single_line_set(sent, EINA_TRUE);
-   elm_entry_editable_set(sent, EINA_TRUE);
-   evas_object_size_hint_align_set(sent, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_size_hint_weight_set(sent, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-   elm_box_pack_end(hbx, sent);
-   evas_object_show(sent);
-   evas_object_event_callback_add(sent, EVAS_CALLBACK_KEY_DOWN, 
_cb_goto_key_down, entry);
+
+   gd->entry = ent = elm_entry_add(parent);
+   elm_entry_scrollable_set(ent, EINA_TRUE);
+   elm_entry_single_line_set(ent, EINA_TRUE);
+   elm_entry_editable_set(ent, EINA_TRUE);
+   evas_object_size_hint_align_set(ent, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   evas_object_size_hint_weight_set(ent, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   elm_box_pack_end(hbx, ent);
+   evas_object_show(ent);
+   evas_object_event_callback_add(ent, EVAS_CALLBACK_KEY_DOWN, 
_cb_goto_key_down, gd);
 
    btn = elm_button_add(parent);
    elm_object_text_set(btn, _("Go"));
    evas_object_size_hint_align_set(btn, EVAS_HINT_FILL, 0.0);
    evas_object_size_hint_weight_set(btn, 0.1, EVAS_HINT_EXPAND);
-   evas_object_show(btn);
    elm_box_pack_end(hbx, btn);
-   evas_object_smart_callback_add(btn, "clicked", _cb_goto_clicked, entry);
-   elm_object_content_set(popup, bx);
+   evas_object_show(btn);
+   evas_object_smart_callback_add(btn, "clicked", _cb_goto_clicked, gd);
 
+   elm_object_content_set(popup, hbx);
    elm_popup_orient_set(popup, ELM_POPUP_ORIENT_CENTER);
    evas_object_show(popup);
 

-- 


Reply via email to