thiep pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=ae1b2a124fcb8fb2d7a53e9b578b8cb846f09e8a
commit ae1b2a124fcb8fb2d7a53e9b578b8cb846f09e8a Author: Thiep Ha <thie...@gmail.com> Date: Tue May 3 09:49:14 2016 +0000 elm cnp/Wl: set selection for all data types Currently, not all selection data types are set. This patch sets selection for all suitable types that we supported. --- src/lib/elementary/elm_cnp.c | 73 +++++++++++++++++++++++++++++++------------- 1 file changed, 51 insertions(+), 22 deletions(-) diff --git a/src/lib/elementary/elm_cnp.c b/src/lib/elementary/elm_cnp.c index 5e9ca60..ab0951e 100644 --- a/src/lib/elementary/elm_cnp.c +++ b/src/lib/elementary/elm_cnp.c @@ -2470,6 +2470,21 @@ static Ecore_Wl2_Window *_wl_elm_widget_window_get(const Evas_Object *obj); static Evas * _wl_evas_get_from_win(unsigned int win); static Eina_Bool +_wl_is_uri_type_data(const char *data, int len) +{ + char *p; + if (len < 6) return EINA_FALSE; + + p = (char *)data; + if (!p) return EINA_FALSE; + if (strncmp(p, "file:/", 6)) + { + if (*p != '/') return EINA_FALSE; + } + return EINA_TRUE; +} + +static Eina_Bool _wl_targets_converter(char *target, Wl_Cnp_Selection *sel EINA_UNUSED, void *data EINA_UNUSED, int size EINA_UNUSED, void **data_ret, int *size_ret) { cnp_debug("in\n"); @@ -2912,6 +2927,10 @@ _wl_elm_cnp_selection_set(Evas_Object *obj, Elm_Sel_Type selection, Elm_Sel_Form if (selbuf) { + int i = 0, count = 0; + Eina_Bool is_uri = EINA_FALSE; + const char **types; + if (format & ELM_SEL_FORMAT_IMAGE) { /* FIXME */ @@ -2927,36 +2946,46 @@ _wl_elm_cnp_selection_set(Evas_Object *obj, Elm_Sel_Type selection, Elm_Sel_Form } else { - const char *types[10] = {0, }; - int i = -1; + free(sel->selbuf); + sel->buflen = buflen; + sel->selbuf = strdup((char*)selbuf); + } - if ((format & ELM_SEL_FORMAT_MARKUP) || - (format & ELM_SEL_FORMAT_TEXT)) + is_uri = _wl_is_uri_type_data(selbuf, buflen); + types = malloc(sizeof(char *)); + if (!types) return EINA_FALSE; + for (i = 0, count = 1; i < CNP_N_ATOMS; i++) + { + if (format & _atoms[i].formats) { - types[++i] = "application/x-elementary-markup"; - types[++i] = "text/plain"; - types[++i] = "text/plain;charset=utf-8"; - } + if ((is_uri) || ((!is_uri) && + strcmp(_atoms[i].name, "text/uri-list"))) + { + const char **t = NULL; - if (format & ELM_SEL_FORMAT_HTML) - { - types[++i] = "text/html"; - types[++i] = "text/html;charset=utf-8"; + types[count - 1] = _atoms[i].name; + count++; + t = realloc(types, sizeof(char *) * count); + if (!t) + { + free(types); + return EINA_FALSE; + } + types = t; + } } + } + types[count - 1] = 0; - if (i < 0) return EINA_FALSE; - - ecore_wl2_dnd_selection_set(ecore_wl2_window_input_get(win), types); + ecore_wl2_dnd_selection_set(ecore_wl2_window_input_get(win), types); - free(sel->selbuf); - sel->buflen = buflen; - sel->selbuf = strdup((char*)selbuf); - - return EINA_TRUE; - } + free(types); + return EINA_TRUE; } else - sel->selbuf = NULL; + { + sel->selbuf = NULL; + } return EINA_FALSE; } --