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