devilhorns pushed a commit to branch master. http://git.enlightenment.org/core/elementary.git/commit/?id=5537557d2b5fc16b9ce1850034bde52322eb6c6c
commit 5537557d2b5fc16b9ce1850034bde52322eb6c6c Author: Chris Michael <cp.mich...@samsung.com> Date: Thu Nov 7 12:01:00 2013 +0000 Fix elm_entry to work with copy/paste (mouse and keyboard) under wayland. This also unifies some of the code between X & wayland wrt copy/paste. This is part of a larger copy/paste fix for efl/elm wayland. Previously, copy/paste would not work via keyboard shortcuts. This series of changes fixes that issue (wrt elm_entry anyway). This also adds addtional copy/paste support (wrt efl wayland), including support for various mime types (text/plain, elm-markup, and html). Signed-off-by: Chris Michael <cp.mich...@samsung.com> --- src/lib/elm_entry.c | 108 +++++++++++++++++----------------------------------- 1 file changed, 35 insertions(+), 73 deletions(-) diff --git a/src/lib/elm_entry.c b/src/lib/elm_entry.c index 3ae441d..77ab8d9 100644 --- a/src/lib/elm_entry.c +++ b/src/lib/elm_entry.c @@ -1097,37 +1097,21 @@ _paste_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) { + Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP; + ELM_ENTRY_DATA_GET(data, sd); evas_object_smart_callback_call(data, SIG_SELECTION_PASTE, NULL); - if (sd->sel_notify_handler) - { -#ifdef HAVE_ELEMENTARY_X - Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP; - sd->selection_asked = EINA_TRUE; + sd->selection_asked = EINA_TRUE; - if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT) - formats = ELM_SEL_FORMAT_TEXT; - else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE) - formats |= ELM_SEL_FORMAT_IMAGE; + if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT) + formats = ELM_SEL_FORMAT_TEXT; + else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE) + formats |= ELM_SEL_FORMAT_IMAGE; - elm_cnp_selection_get - (data, ELM_SEL_TYPE_CLIPBOARD, formats, NULL, NULL); -#endif - } - else - { -#ifdef HAVE_ELEMENTARY_WAYLAND - Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP; - sd->selection_asked = EINA_TRUE; - if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT) - formats = ELM_SEL_FORMAT_TEXT; - else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE) - formats |= ELM_SEL_FORMAT_IMAGE; - elm_cnp_selection_get(data, ELM_SEL_TYPE_CLIPBOARD, formats, NULL, NULL); -#endif - } + elm_cnp_selection_get + (data, ELM_SEL_TYPE_CLIPBOARD, formats, NULL, NULL); } static void @@ -1746,6 +1730,8 @@ _entry_selection_start_signal_cb(void *data, { const Eina_List *l; Evas_Object *entry; + const char *txt = elm_entry_selection_get(data); + Evas_Object *top; ELM_ENTRY_DATA_GET(data, sd); @@ -1755,18 +1741,11 @@ _entry_selection_start_signal_cb(void *data, if (entry != data) elm_entry_select_none(entry); } evas_object_smart_callback_call(data, SIG_SELECTION_START, NULL); -#ifdef HAVE_ELEMENTARY_X - if (sd->sel_notify_handler) - { - const char *txt = elm_entry_selection_get(data); - Evas_Object *top; - top = elm_widget_top_get(data); - if (txt && top && (elm_win_xwindow_get(top))) - elm_cnp_selection_set(data, ELM_SEL_TYPE_PRIMARY, - ELM_SEL_FORMAT_MARKUP, txt, strlen(txt)); - } -#endif + top = elm_widget_top_get(data); + if (txt && top && (elm_win_window_id_get(top))) + elm_cnp_selection_set(data, ELM_SEL_TYPE_PRIMARY, + ELM_SEL_FORMAT_MARKUP, txt, strlen(txt)); } static void @@ -1816,27 +1795,24 @@ _entry_selection_cleared_signal_cb(void *data, { if (sd->cut_sel) { -#ifdef HAVE_ELEMENTARY_X Evas_Object *top; top = elm_widget_top_get(data); - if ((top) && (elm_win_xwindow_get(top))) + if ((top) && (elm_win_window_id_get(top))) elm_cnp_selection_set (data, ELM_SEL_TYPE_PRIMARY, ELM_SEL_FORMAT_MARKUP, sd->cut_sel, eina_stringshare_strlen(sd->cut_sel)); -#endif + eina_stringshare_del(sd->cut_sel); sd->cut_sel = NULL; } else { -#ifdef HAVE_ELEMENTARY_X Evas_Object *top; top = elm_widget_top_get(data); - if ((top) && (elm_win_xwindow_get(top))) + if ((top) && (elm_win_window_id_get(top))) elm_object_cnp_selection_clear(data, ELM_SEL_TYPE_PRIMARY); -#endif } } } @@ -1847,35 +1823,29 @@ _entry_paste_request_signal_cb(void *data, const char *emission, const char *source __UNUSED__) { + Evas_Object *top; + ELM_ENTRY_DATA_GET(data, sd); -#ifdef HAVE_ELEMENTARY_X Elm_Sel_Type type = (emission[sizeof("ntry,paste,request,")] == '1') ? ELM_SEL_TYPE_PRIMARY : ELM_SEL_TYPE_CLIPBOARD; -#endif if (!sd->editable) return; evas_object_smart_callback_call(data, SIG_SELECTION_PASTE, NULL); - if (sd->sel_notify_handler) - { -#ifdef HAVE_ELEMENTARY_X - Evas_Object *top; - top = elm_widget_top_get(data); - if ((top) && (elm_win_xwindow_get(top))) - { - Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP; + top = elm_widget_top_get(data); + if ((top) && (elm_win_window_id_get(top))) + { + Elm_Sel_Format formats = ELM_SEL_FORMAT_MARKUP; - sd->selection_asked = EINA_TRUE; + sd->selection_asked = EINA_TRUE; - if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT) - formats = ELM_SEL_FORMAT_TEXT; - else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE) - formats |= ELM_SEL_FORMAT_IMAGE; + if (sd->cnp_mode == ELM_CNP_MODE_PLAINTEXT) + formats = ELM_SEL_FORMAT_TEXT; + else if (sd->cnp_mode != ELM_CNP_MODE_NO_IMAGE) + formats |= ELM_SEL_FORMAT_IMAGE; - elm_cnp_selection_get(data, type, formats, NULL, NULL); - } -#endif + elm_cnp_selection_get(data, type, formats, NULL, NULL); } } @@ -2302,6 +2272,7 @@ _event_selection_clear(void *data __UNUSED__, return ECORE_CALLBACK_PASS_ON; } +#endif static Eina_Bool _drag_drop_cb(void *data __UNUSED__, @@ -2326,8 +2297,6 @@ _drag_drop_cb(void *data __UNUSED__, return EINA_TRUE; } -#endif - static Evas_Object * _item_get(void *data, Evas_Object *edje __UNUSED__, @@ -3108,13 +3077,11 @@ _elm_entry_smart_add(Eo *obj, void *_pd, va_list *list EINA_UNUSED) ecore_event_handler_add (ECORE_X_EVENT_SELECTION_CLEAR, _event_selection_clear, obj); } +#endif + elm_drop_target_add (obj, ELM_SEL_FORMAT_MARKUP | ELM_SEL_FORMAT_IMAGE, - NULL, NULL, - NULL, NULL, - NULL, NULL, - _drag_drop_cb, NULL); -#endif + NULL, NULL, NULL, NULL, NULL, NULL, _drag_drop_cb, NULL); entries = eina_list_prepend(entries, obj); @@ -3421,13 +3388,11 @@ _password_set(Eo *obj, void *_pd, va_list *list) } else { -#ifdef HAVE_ELEMENTARY_X elm_drop_target_add(obj, ELM_SEL_FORMAT_MARKUP, NULL, NULL, NULL, NULL, NULL, NULL, _drag_drop_cb, NULL); -#endif _entry_selection_callbacks_register(obj); } @@ -3679,7 +3644,6 @@ _editable_set(Eo *obj, void *_pd, va_list *list) sd->editable = editable; eo_do(obj, elm_wdg_theme(NULL)); -#ifdef HAVE_ELEMENTARY_X if (editable) elm_drop_target_add(obj, ELM_SEL_FORMAT_MARKUP, NULL, NULL, @@ -3687,7 +3651,6 @@ _editable_set(Eo *obj, void *_pd, va_list *list) NULL, NULL, _drag_drop_cb, NULL); else -#endif elm_drop_target_del(obj, ELM_SEL_FORMAT_MARKUP, NULL, NULL, NULL, NULL, @@ -4724,13 +4687,12 @@ _cnp_mode_set(Eo *obj, void *_pd, va_list *list) format = ELM_SEL_FORMAT_TEXT; else if (cnp_mode == ELM_CNP_MODE_MARKUP) format |= ELM_SEL_FORMAT_IMAGE; -#ifdef HAVE_ELEMENTARY_X + elm_drop_target_add(obj, format, NULL, NULL, NULL, NULL, NULL, NULL, _drag_drop_cb, NULL); -#endif } EAPI Elm_Cnp_Mode --