yakov pushed a commit to branch master. http://git.enlightenment.org/tools/erigo.git/commit/?id=aac7fd9b446199c4e47de555cd9c98817a16da92
commit aac7fd9b446199c4e47de555cd9c98817a16da92 Author: Yakov Goldberg <yako...@samsung.com> Date: Tue Nov 17 17:08:01 2015 +0200 Refactoring popup internals Get rid of global variables and save all needed data in object itself. It allows to have multiple popup windows. --- src/bin/gui/popup.c | 66 ++++++++++++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 29 deletions(-) diff --git a/src/bin/gui/popup.c b/src/bin/gui/popup.c index f031257..072fd70 100644 --- a/src/bin/gui/popup.c +++ b/src/bin/gui/popup.c @@ -5,58 +5,66 @@ #include "elm_widget.h" -/* Only one popup at the moment is supported */ -static Eo *_popup = NULL; +#define POPUP_WIN "__popup_win__" +#define POPUP_CB "__popup_cb__" +#define POPUP_CB_DATA "__popup_cb_data___" -/* User callback to be called after popup closes. */ -static Popup_Cb _popup_cb = NULL; -static void *_data = NULL; + +#define DATA_SET(btn, popup, cb, data) \ + ({ \ + eo_do(btn, eo_key_data_set(POPUP_WIN, popup)); \ + eo_do(btn, eo_key_data_set(POPUP_CB, cb)); \ + eo_do(btn, eo_key_data_set(POPUP_CB_DATA, data)); \ + }) static Eina_Bool -_popup_close_cb(void *data, Eo *obj EINA_UNUSED, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) +_popup_close_cb(void *data, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED) { Popup_Button_Type _pressed_button_type = (uintptr_t) data; /* Delete popup and call a callback afterwards. */ - eo_del(_popup); - if (_popup_cb) + Eo *popup; + Popup_Cb cb; + void *cb_data; + + eo_do(obj, popup = eo_key_data_get(POPUP_WIN)); + eo_do(obj, cb = eo_key_data_get(POPUP_CB)); + eo_do(obj, cb_data = eo_key_data_get(POPUP_CB_DATA)); + + eo_del(popup); + + if (cb) { - _popup_cb(_pressed_button_type, _data); + cb(_pressed_button_type, cb_data); } - - _popup = NULL; - _popup_cb = NULL; - _data = 0; return EINA_TRUE; } void popup_show(void *parent, const char *title, const char *text, Popup_Button_Type button_type, Popup_Cb cb, void *data) { - if (_popup) return; - _popup = eo_add(ELM_POPUP_CLASS, parent); - _popup_cb = cb; - _data = data; + Eo *popup = eo_add(ELM_POPUP_CLASS, parent); - eo_do(_popup, elm_obj_widget_part_text_set("title,text", title)); - eo_do(_popup, elm_obj_widget_part_text_set(NULL, text)); + eo_do(popup, elm_obj_widget_part_text_set("title,text", title), + elm_obj_widget_part_text_set(NULL, text)); if (button_type & POPUP_OK_BUTTON) { - Eo *btn = eo_add(ELM_BUTTON_CLASS, _popup); - eo_do(btn, elm_obj_widget_part_text_set(NULL, "OK")); - eo_do(_popup, elm_obj_container_content_set("button1", btn)); - eo_do(btn, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, (void*)(uintptr_t) POPUP_OK_BUTTON)); + Eo *btn = eo_add(ELM_BUTTON_CLASS, popup); + eo_do(btn, elm_obj_widget_part_text_set(NULL, "OK"), + eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, (void*)(uintptr_t) POPUP_OK_BUTTON)); + eo_do(popup, elm_obj_container_content_set("button1", btn)); + DATA_SET(btn, popup, cb, data); } if (button_type & POPUP_CANCEL_BUTTON) { - Eo *btn = eo_add(ELM_BUTTON_CLASS, _popup); - eo_do(btn, elm_obj_widget_part_text_set(NULL, "Cancel")); - eo_do(_popup, elm_obj_container_content_set("button2", btn)); - eo_do(btn, eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, (void*)(uintptr_t) POPUP_CANCEL_BUTTON)); + Eo *btn = eo_add(ELM_BUTTON_CLASS, popup); + eo_do(btn, elm_obj_widget_part_text_set(NULL, "Cancel"), + eo_event_callback_add(EVAS_CLICKABLE_INTERFACE_EVENT_CLICKED, _popup_close_cb, (void*)(uintptr_t) POPUP_CANCEL_BUTTON)); + eo_do(popup, elm_obj_container_content_set("button2", btn)); + DATA_SET(btn, popup, cb, data); } - - eo_do(_popup, efl_gfx_visible_set(EINA_TRUE)); + eo_do(popup, efl_gfx_visible_set(EINA_TRUE)); } --