ajwillia-ms pushed a commit to branch master.

http://git.enlightenment.org/tools/edi.git/commit/?id=f9b8129724399c46799bbc3c6b6797883f3e635a

commit f9b8129724399c46799bbc3c6b6797883f3e635a
Author: YeongJong Lee <clean...@naver.com>
Date:   Fri Dec 23 10:05:33 2016 +0000

    autosuggest: One editor has one suggest evas object
    
    Summary:
    Remove unnecessary global variable.
    
    This commit also fix bug that using autosuggest(<Ctrl> + <Space>) occurs
    segment fault in non-code file.
    
    Test Plan:
    1. Run Edi.
    2. Open project.
    3. Open non-code file (e.g. README).
    4. Call suggest list using <Ctrl> + <Space>.
    5. Check that there is not segment fault.
    
    Reviewers: ajwillia.ms
    
    Reviewed By: ajwillia.ms
    
    Differential Revision: https://phab.enlightenment.org/D4509
---
 src/bin/editor/edi_editor.c | 130 +++++++++++++++++++++++---------------------
 src/bin/editor/edi_editor.h |   3 +
 2 files changed, 71 insertions(+), 62 deletions(-)

diff --git a/src/bin/editor/edi_editor.c b/src/bin/editor/edi_editor.c
index b845148..be7fa06 100644
--- a/src/bin/editor/edi_editor.c
+++ b/src/bin/editor/edi_editor.c
@@ -36,7 +36,7 @@ typedef struct
    Eina_Bool         is_param_cand;
 } Suggest_Item;
 
-static Evas_Object *_suggest_popup_bg, *_suggest_popup_genlist;
+static void _suggest_popup_show(Edi_Editor *editor);
 #endif
 
 void
@@ -225,16 +225,16 @@ _suggest_list_cb_selected(void *data, Evas_Object *obj 
EINA_UNUSED, void *event_
 }
 
 static void
-_suggest_list_update(char *word)
+_suggest_list_update(Edi_Editor *editor, char *word)
 {
    Suggest_Item *suggest_it;
    Eina_List *list, *l;
    Elm_Genlist_Item_Class *ic;
    Elm_Object_Item *item;
 
-   elm_genlist_clear(_suggest_popup_genlist);
+   elm_genlist_clear(editor->suggest_genlist);
 
-   list = (Eina_List *)evas_object_data_get(_suggest_popup_genlist,
+   list = (Eina_List *)evas_object_data_get(editor->suggest_genlist,
                                             "suggest_list");
    ic = elm_genlist_item_class_new();
    ic->item_style = "full";
@@ -244,7 +244,7 @@ _suggest_list_update(char *word)
      {
         if (eina_str_has_prefix(suggest_it->name, word))
           {
-             elm_genlist_item_append(_suggest_popup_genlist,
+             elm_genlist_item_append(editor->suggest_genlist,
                                      ic,
                                      suggest_it,
                                      NULL,
@@ -255,14 +255,15 @@ _suggest_list_update(char *word)
      }
    elm_genlist_item_class_free(ic);
 
-   item = elm_genlist_first_item_get(_suggest_popup_genlist);
+   item = elm_genlist_first_item_get(editor->suggest_genlist);
    if (item)
      {
         elm_genlist_item_selected_set(item, EINA_TRUE);
         elm_genlist_item_show(item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
+        _suggest_popup_show(editor);
      }
    else
-     evas_object_hide(_suggest_popup_bg);
+     evas_object_hide(editor->suggest_bg);
 }
 
 static void
@@ -276,7 +277,10 @@ _suggest_list_set(Edi_Editor *editor)
    unsigned int row, col;
    Eina_List *list = NULL;
 
-   list = (Eina_List *)evas_object_data_get(_suggest_popup_genlist,
+   if (!editor->as_unit)
+     return;
+
+   list = (Eina_List *)evas_object_data_get(editor->suggest_genlist,
                                             "suggest_list");
    if (list)
      {
@@ -286,7 +290,7 @@ _suggest_list_set(Edi_Editor *editor)
           _suggest_item_free(suggest_it);
 
         list = NULL;
-        evas_object_data_del(_suggest_popup_genlist, "suggest_list");
+        evas_object_data_del(editor->suggest_genlist, "suggest_list");
      }
 
    elm_code_widget_cursor_position_get(editor->entry, &row, &col);
@@ -358,8 +362,8 @@ _suggest_list_set(Edi_Editor *editor)
 
    clang_disposeCodeCompleteResults(res);
 
-   evas_object_data_set(_suggest_popup_genlist, "suggest_list", list);
-   _suggest_list_update(curword);
+   evas_object_data_set(editor->suggest_genlist, "suggest_list", list);
+   _suggest_list_update(editor, curword);
    free(curword);
 }
 
@@ -387,12 +391,14 @@ _suggest_list_selection_insert(Edi_Editor *editor, const 
char *selection)
 }
 
 static void
-_suggest_bg_cb_hide(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
+_suggest_bg_cb_hide(void *data, Evas *e EINA_UNUSED,
                     Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
    Eina_List *list = NULL;
+   Edi_Editor *editor;
 
-   list = (Eina_List *)evas_object_data_get(_suggest_popup_genlist,
+   editor = (Edi_Editor *)data;
+   list = (Eina_List *)evas_object_data_get(editor->suggest_genlist,
                                             "suggest_list");
    if (list)
      {
@@ -402,11 +408,11 @@ _suggest_bg_cb_hide(void *data EINA_UNUSED, Evas *e 
EINA_UNUSED,
           _suggest_item_free(suggest_it);
 
         list = NULL;
-        evas_object_data_del(_suggest_popup_genlist, "suggest_list");
+        evas_object_data_del(editor->suggest_genlist, "suggest_list");
      }
-   evas_object_key_ungrab(_suggest_popup_genlist, "Return", 0, 0);
-   evas_object_key_ungrab(_suggest_popup_genlist, "Up", 0, 0);
-   evas_object_key_ungrab(_suggest_popup_genlist, "Down", 0, 0);
+   evas_object_key_ungrab(editor->suggest_genlist, "Return", 0, 0);
+   evas_object_key_ungrab(editor->suggest_genlist, "Up", 0, 0);
+   evas_object_key_ungrab(editor->suggest_genlist, "Down", 0, 0);
 }
 
 static void
@@ -425,7 +431,7 @@ _suggest_list_cb_key_down(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj,
         suggest_it = elm_object_item_data_get(it);
 
         _suggest_list_selection_insert(editor, suggest_it->name);
-        evas_object_hide(_suggest_popup_bg);
+        evas_object_hide(editor->suggest_bg);
      }
    else if (!strcmp(ev->key, "Up"))
      {
@@ -456,7 +462,7 @@ _suggest_list_cb_clicked_double(void *data, Evas_Object 
*obj EINA_UNUSED,
    suggest_it = elm_object_item_data_get(it);
    _suggest_list_selection_insert(editor, suggest_it->name);
 
-   evas_object_hide(_suggest_popup_bg);
+   evas_object_hide(editor->suggest_bg);
 }
 
 static void
@@ -465,21 +471,24 @@ _suggest_popup_show(Edi_Editor *editor)
    unsigned int col, row;
    Evas_Coord cx, cy, cw, ch;
 
-   if (elm_genlist_items_count(_suggest_popup_genlist) <= 0)
+   if (!editor->suggest_genlist)
+     return;
+
+   if (elm_genlist_items_count(editor->suggest_genlist) <= 0)
      return;
 
    elm_code_widget_cursor_position_get(editor->entry, &row, &col);
    elm_code_widget_geometry_for_position_get(editor->entry, row, col,
                                              &cx, &cy, &cw, &ch);
 
-   evas_object_move(_suggest_popup_bg, cx, cy);
-   evas_object_show(_suggest_popup_bg);
+   evas_object_move(editor->suggest_bg, cx, cy);
+   evas_object_show(editor->suggest_bg);
 
-   if (!evas_object_key_grab(_suggest_popup_genlist, "Return", 0, 0, 
EINA_TRUE))
+   if (!evas_object_key_grab(editor->suggest_genlist, "Return", 0, 0, 
EINA_TRUE))
      ERR("Failed to grab key - %s", "Return");
-   if (!evas_object_key_grab(_suggest_popup_genlist, "Up", 0, 0, EINA_TRUE))
+   if (!evas_object_key_grab(editor->suggest_genlist, "Up", 0, 0, EINA_TRUE))
      ERR("Failed to grab key - %s", "Up");
-   if (!evas_object_key_grab(_suggest_popup_genlist, "Down", 0, 0, EINA_TRUE))
+   if (!evas_object_key_grab(editor->suggest_genlist, "Down", 0, 0, EINA_TRUE))
      ERR("Failed to grab key - %s", "Down");
 }
 
@@ -491,7 +500,7 @@ _suggest_popup_key_down_cb(Edi_Editor *editor, const char 
*key, const char *stri
    unsigned int col, row;
    char *word = NULL;
 
-   if (!evas_object_visible_get(_suggest_popup_bg))
+   if (!evas_object_visible_get(editor->suggest_bg))
      return;
 
    elm_code_widget_cursor_position_get(editor->entry, &row, &col);
@@ -503,56 +512,47 @@ _suggest_popup_key_down_cb(Edi_Editor *editor, const char 
*key, const char *stri
      {
         if (col - 1 <= 0)
           {
-             evas_object_hide(_suggest_popup_bg);
+             evas_object_hide(editor->suggest_bg);
              return;
           }
 
         word = _edi_editor_current_word_get(editor, row, col - 1);
         if (!strcmp(word, ""))
-          evas_object_hide(_suggest_popup_bg);
+          evas_object_hide(editor->suggest_bg);
         else
-          {
-             _suggest_list_update(word);
-             _suggest_popup_show(editor);
-          }
+          _suggest_list_update(editor, word);
      }
    else if (!strcmp(key, "Right"))
      {
         if (line->length < col)
           {
-             evas_object_hide(_suggest_popup_bg);
+             evas_object_hide(editor->suggest_bg);
              return;
           }
 
         word = _edi_editor_current_word_get(editor, row, col + 1);
         if (!strcmp(word, ""))
-          evas_object_hide(_suggest_popup_bg);
+          evas_object_hide(editor->suggest_bg);
         else
-          {
-             _suggest_list_update(word);
-             _suggest_popup_show(editor);
-          }
+          _suggest_list_update(editor, word);
      }
    else if (!strcmp(key, "BackSpace"))
      {
         if (col - 1 <= 0)
           {
-             evas_object_hide(_suggest_popup_bg);
+             evas_object_hide(editor->suggest_bg);
              return;
           }
 
         word = _edi_editor_current_word_get(editor, row, col - 1);
         if (!strcmp(word, ""))
-          evas_object_hide(_suggest_popup_bg);
+          evas_object_hide(editor->suggest_bg);
         else
-          {
-             _suggest_list_update(word);
-             _suggest_popup_show(editor);
-          }
+          _suggest_list_update(editor, word);
      }
    else if (!strcmp(key, "Escape"))
      {
-        evas_object_hide(_suggest_popup_bg);
+        evas_object_hide(editor->suggest_bg);
      }
    else if (!strcmp(key, "Delete"))
      {
@@ -562,8 +562,7 @@ _suggest_popup_key_down_cb(Edi_Editor *editor, const char 
*key, const char *stri
      {
         word = _edi_editor_current_word_get(editor, row, col);
         strncat(word, string, 1);
-        _suggest_list_update(word);
-        _suggest_popup_show(editor);
+        _suggest_list_update(editor, word);
      }
    if (word)
      free(word);
@@ -574,11 +573,11 @@ _suggest_popup_setup(Edi_Editor *editor)
 {
    //Popup bg
    Evas_Object *bg = elm_bubble_add(editor->entry);
-   _suggest_popup_bg = bg;
+   editor->suggest_bg = bg;
    evas_object_size_hint_weight_set(bg, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(bg, EVAS_HINT_FILL, EVAS_HINT_FILL);
    evas_object_event_callback_add(bg, EVAS_CALLBACK_HIDE,
-                                  _suggest_bg_cb_hide, NULL);
+                                  _suggest_bg_cb_hide, editor);
    evas_object_resize(bg, 400 * elm_config_scale_get(), 300 * 
elm_config_scale_get());
 
    //Box
@@ -590,7 +589,7 @@ _suggest_popup_setup(Edi_Editor *editor)
 
    //Genlist
    Evas_Object *genlist = elm_genlist_add(box);
-   _suggest_popup_genlist = genlist;
+   editor->suggest_genlist = genlist;
    evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND, 
EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL, EVAS_HINT_FILL);
    elm_object_focus_allow_set(genlist, EINA_FALSE);
@@ -1062,13 +1061,18 @@ _unfocused_cb(void *data, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UN
 
    if (_edi_config->autosave)
      edi_editor_save(editor);
+
+#if HAVE_LIBCLANG
+   if (editor->suggest_bg)
+     evas_object_hide(editor->suggest_bg);
+#endif
 }
 
 static void
-_mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
-             Evas_Object *obj EINA_UNUSED, void *event_info)
+_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+             void *event_info)
 {
-   Elm_Code_Widget *widget;
+   Edi_Editor *editor;
    Evas_Object *popup;
    Evas_Event_Mouse_Up *event;
    Eina_Bool ctrl;
@@ -1076,25 +1080,25 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e 
EINA_UNUSED,
    int col;
    const char *word;
 
-   widget = (Elm_Code_Widget *)data;
+   editor = (Edi_Editor *)data;
    event = (Evas_Event_Mouse_Up *)event_info;
 
 #if HAVE_LIBCLANG
-   if (_suggest_popup_bg)
-     evas_object_hide(_suggest_popup_bg);
+   if (editor->suggest_bg)
+     evas_object_hide(editor->suggest_bg);
 #endif
 
    ctrl = evas_key_modifier_is_set(event->modifiers, "Control");
    if (event->button != 3 || !ctrl)
      return;
 
-   elm_code_widget_position_at_coordinates_get(widget, event->canvas.x, 
event->canvas.y, &row, &col);
-   elm_code_widget_selection_select_word(widget, row, col);
-   word = elm_code_widget_selection_text_get(widget);
+   elm_code_widget_position_at_coordinates_get(editor->entry, event->canvas.x, 
event->canvas.y, &row, &col);
+   elm_code_widget_selection_select_word(editor->entry, row, col);
+   word = elm_code_widget_selection_text_get(editor->entry);
    if (!word || !strlen(word))
      return;
 
-   popup = elm_popup_add(widget);
+   popup = elm_popup_add(editor->entry);
    elm_popup_timeout_set(popup,1.5);
 
    elm_object_style_set(popup, "transparent");
@@ -1208,10 +1212,11 @@ edi_editor_add(Evas_Object *parent, Edi_Mainview_Item 
*item)
    editor = calloc(1, sizeof(*editor));
    editor->entry = widget;
    editor->show_highlight = !strcmp(item->editortype, "code");
+   editor->show_suggest = !strcmp(item->editortype, "code");
    evas_object_event_callback_add(widget, EVAS_CALLBACK_KEY_DOWN,
                                   _smart_cb_key_down, editor);
    evas_object_smart_callback_add(widget, "changed,user", _changed_cb, editor);
-   evas_object_event_callback_add(widget, EVAS_CALLBACK_MOUSE_UP, 
_mouse_up_cb, widget);
+   evas_object_event_callback_add(widget, EVAS_CALLBACK_MOUSE_UP, 
_mouse_up_cb, editor);
    evas_object_smart_callback_add(widget, "unfocused", _unfocused_cb, editor);
 
    elm_code_parser_standard_add(code, ELM_CODE_PARSER_STANDARD_TODO);
@@ -1245,7 +1250,8 @@ edi_editor_add(Evas_Object *parent, Edi_Mainview_Item 
*item)
    evas_object_event_callback_add(vbox, EVAS_CALLBACK_DEL, _editor_del_cb, 
ev_handler);
 
 #if HAVE_LIBCLANG
-   _clang_autosuggest_setup(editor);
+   if (editor->show_suggest)
+     _clang_autosuggest_setup(editor);
 #endif
    return vbox;
 }
diff --git a/src/bin/editor/edi_editor.h b/src/bin/editor/edi_editor.h
index f583cae..9a135f8 100644
--- a/src/bin/editor/edi_editor.h
+++ b/src/bin/editor/edi_editor.h
@@ -38,6 +38,8 @@ typedef struct _Edi_Editor Edi_Editor;
 struct _Edi_Editor
 {
    Evas_Object *entry; /**< The main text entry widget for the editor */
+   Evas_Object *suggest_bg; /**< The autosuggest background */
+   Evas_Object *suggest_genlist; /**< The autosuggest genlist */
    Eina_List *undo_stack; /**< The list of operations that can be undone */
 
    /* Private */
@@ -62,6 +64,7 @@ struct _Edi_Editor
    Eina_Bool highlight_cancel;
    time_t save_time;
 
+   Eina_Bool show_suggest;
    /* Add new members here. */
 };
 

-- 


Reply via email to