Hello,

> On May 11, 2016, at 3:08 AM, Mike Blumenkrantz 
> <michael.blumenkra...@gmail.com> wrote:
> 
>> On Tue, May 3, 2016 at 4:29 AM Thiep Ha <thie...@gmail.com> wrote:
>> 
>> thiep pushed a commit to branch master.
>> 
>> 
>> http://git.enlightenment.org/core/efl.git/commit/?id=8a46f78c7d5637cc4a58bdad16c7e747acf2bda4
>> 
>> commit 8a46f78c7d5637cc4a58bdad16c7e747acf2bda4
>> Author: Thiep Ha <thie...@gmail.com>
>> Date:   Tue May 3 09:30:39 2016 +0000
>> 
>>    elm dnd/wl: add types' notify handler
>> 
>>    This patch adds notify handlers for types.
>>    It provides different ways to handle different data types.
>> ---
>> src/lib/elementary/elm_cnp.c | 388
>> ++++++++++++++++++++++++++++++++++++++-----
>> 1 file changed, 347 insertions(+), 41 deletions(-)
>> 
>> diff --git a/src/lib/elementary/elm_cnp.c b/src/lib/elementary/elm_cnp.c
>> index 8288b5e..61dac7d 100644
>> --- a/src/lib/elementary/elm_cnp.c
>> +++ b/src/lib/elementary/elm_cnp.c
>> @@ -257,6 +257,13 @@ typedef Eina_Bool (*Wl_Converter_Fn_Cb)     (char
>> *target, Wl_Cnp_Selection *sel
>> static Eina_Bool _wl_targets_converter(char *target, Wl_Cnp_Selection
>> *sel, void *data, int size, void **data_ret, int *size_ret);
>> static Eina_Bool _wl_general_converter(char *target, Wl_Cnp_Selection
>> *sel, void *data, int size, void **data_ret, int *size_ret);
>> static Eina_Bool _wl_text_converter(char *target, Wl_Cnp_Selection *sel,
>> void *data, int size, void **data_ret, int *size_ret);
>> +
>> +typedef Eina_Bool       (*Wl_Data_Preparer_Cb)   (Wl_Cnp_Selection *sel,
>> Elm_Selection_Data *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev,
>> Tmp_Info **tmp_info);
>> +static Eina_Bool _wl_data_preparer_markup(Wl_Cnp_Selection *sel,
>> Elm_Selection_Data *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev,
>> Tmp_Info **tmp_info);
>> +static Eina_Bool _wl_data_preparer_uri(Wl_Cnp_Selection *sel,
>> Elm_Selection_Data *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev,
>> Tmp_Info **tmp_info);
>> +static Eina_Bool _wl_data_preparer_vcard(Wl_Cnp_Selection *sel,
>> Elm_Selection_Data *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev,
>> Tmp_Info **tmp_info);
>> +static Eina_Bool _wl_data_preparer_image(Wl_Cnp_Selection *sel,
>> Elm_Selection_Data *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev,
>> Tmp_Info **tmp_info);
>> +static Eina_Bool _wl_data_preparer_text(Wl_Cnp_Selection *sel,
>> Elm_Selection_Data *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev,
>> Tmp_Info **tmp_info);
>> #endif
>> 
>> struct _Cnp_Atom
>> @@ -272,6 +279,7 @@ struct _Cnp_Atom
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>    Wl_Converter_Fn_Cb       wl_converter;
>> +   Wl_Data_Preparer_Cb      wl_data_preparer;
>> #endif
>> 
>>    void                    *_term;
>> @@ -476,6 +484,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_general_converter,
>> +        .wl_data_preparer = _wl_data_preparer_markup,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_text_urilist) {
>> @@ -487,6 +496,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_general_converter,
>> +        .wl_data_preparer = _wl_data_preparer_uri,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_text_x_vcard) {
>> @@ -496,6 +506,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_vcard_send,
>>         .x_data_preparer = _x11_data_preparer_vcard,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_vcard,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_png) {
>>         .name = "image/png",
>> @@ -504,6 +517,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_jpeg) {
>>         .name = "image/jpeg",
>> @@ -512,6 +528,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_bmp) {
>>         .name = "image/x-ms-bmp",
>> @@ -520,6 +539,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_gif) {
>>         .name = "image/gif",
>> @@ -528,6 +550,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_tiff) {
>>         .name = "image/tiff",
>> @@ -536,6 +561,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_svg) {
>>         .name = "image/svg+xml",
>> @@ -544,6 +572,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_xpm) {
>>         .name = "image/x-xpixmap",
>> @@ -552,6 +583,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_tga) {
>>         .name = "image/x-tga",
>> @@ -560,6 +594,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>>    ARRAYINIT(CNP_ATOM_image_ppm) {
>>         .name = "image/x-portable-pixmap",
>> @@ -568,6 +605,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>>         .x_converter = _x11_image_converter,
>>         .x_data_preparer = _x11_data_preparer_image,
>> #endif
>> +#ifdef HAVE_ELEMENTARY_WL2
>> +        .wl_data_preparer = _wl_data_preparer_image,
>> +#endif
>>    },
>> /*
>>    ARRAYINIT(CNP_ATOM_text_html_utf8) {
>> @@ -579,7 +619,9 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_general_converter,
>> +        .wl_data_preparer = _wl_data_preparer_handler_html,
>> #endif
>> +
>>    },
>>    ARRAYINIT(CNP_ATOM_text_html) {
>>       .name = "text/html",
>> @@ -590,6 +632,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_general_converter,
>> +        .wl_data_preparer = _wl_data_preparer_handler_html,
>> #endif
>>    },
>>  */
>> @@ -602,6 +645,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_text_converter,
>> +        .wl_data_preparer = _wl_data_preparer_text,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_STRING) {
>> @@ -613,6 +657,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_text_converter,
>> +        .wl_data_preparer = _wl_data_preparer_text,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_COMPOUND_TEXT) {
>> @@ -624,6 +669,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_text_converter,
>> +        .wl_data_preparer = _wl_data_preparer_text,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_TEXT) {
>> @@ -635,6 +681,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_text_converter,
>> +        .wl_data_preparer = _wl_data_preparer_text,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_text_plain_utf8) {
>> @@ -646,6 +693,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_text_converter,
>> +        .wl_data_preparer = _wl_data_preparer_text,
>> #endif
>>    },
>>    ARRAYINIT(CNP_ATOM_text_plain) {
>> @@ -657,6 +705,7 @@ static Cnp_Atom _atoms[CNP_N_ATOMS] = {
>> #endif
>> #ifdef HAVE_ELEMENTARY_WL2
>>         .wl_converter = _wl_text_converter,
>> +        .wl_data_preparer = _wl_data_preparer_text,
>> #endif
>>    },
>> };
>> @@ -2412,7 +2461,7 @@ static Eina_Bool _wl_dnd_drop(void *data
>> EINA_UNUSED, int type EINA_UNUSED, void
>> static Eina_Bool _wl_dnd_send(void *data, int type EINA_UNUSED, void
>> *event);
>> static Eina_Bool _wl_dnd_receive(void *data, int type EINA_UNUSED, void
>> *event);
>> static Eina_Bool _wl_dnd_end(void *data EINA_UNUSED, int type
>> EINA_UNUSED, void *event EINA_UNUSED);
>> -static void _wl_dropable_data_handle(Wl_Cnp_Selection *sel, char *data,
>> size_t size);
>> +static void _wl_dropable_data_handle(Wl_Cnp_Selection *sel,
>> Ecore_Wl2_Event_Selection_Data_Ready *ev);
>> 
>> static Dropable *_wl_dropable_find(unsigned int win);
>> static void _wl_dropable_handle(Dropable *drop, Evas_Coord x, Evas_Coord
>> y);
>> @@ -2552,6 +2601,266 @@ _wl_text_converter(char *target, Wl_Cnp_Selection
>> *sel, void *data, int size, vo
>> }
>> 
>> static void
>> +_wl_selection_parser(void *_data,
>> +                        int size,
>> +                        char ***ret_data,
>> +                        int *ret_count)
>> +{
>> +   char **files = NULL;
>> +   int num_files = 0;
>> +   char *data = NULL;
>> +
> 
> This code should probably be unified somewhere since it exists in a lot of
> places.
> 

Yes, we need to work more in cnp to make code better. Actually, I intent to 
work more with cocoa, may be windows. After that, I can unified functions.

> 
>> +   data = malloc(size);
>> +   if (data && (size > 0))
>> +     {
>> +        int i, is;
>> +        char *tmp;
>> +        char **t2;
>> +
>> +        memcpy(data, _data, size);
>> +        if (data[size - 1])
>> +          {
>> +             char *t;
>> +
>> +             /* Isn't nul terminated */
>> +             size++;
>> +             t = realloc(data, size);
>> +             if (!t) goto done;
>> +             data = t;
>> +             data[size - 1] = 0;
>> +          }
>> +
>> +        tmp = malloc(size);
>> +        if (!tmp) goto done;
>> +        i = 0;
>> +        is = 0;
>> +        while ((is < size) && (data[is]))
>> +          {
>> +             if ((i == 0) && (data[is] == '#'))
>> +               for (; ((data[is]) && (data[is] != '\n')); is++) ;
>> +             else
>> +               {
>> +                  if ((data[is] != '\r') &&
>> +                      (data[is] != '\n'))
>> +                    tmp[i++] = data[is++];
>> +                  else
>> +                    {
>> +                       while ((data[is] == '\r') || (data[is] == '\n'))
>> +                         is++;
>> +                       tmp[i] = 0;
>> +                       num_files++;
>> +                       t2 = realloc(files, num_files * sizeof(char *));
>> +                       if (t2)
>> +                         {
>> +                            files = t2;
>> +                            files[num_files - 1] = strdup(tmp);
>> +                         }
>> +                       tmp[0] = 0;
>> +                       i = 0;
>> +                    }
>> +               }
>> +          }
>> +        if (i > 0)
>> +          {
>> +             tmp[i] = 0;
>> +             num_files++;
>> +             t2 = realloc(files, num_files * sizeof(char *));
>> +             if (t2)
>> +               {
>> +                  files = t2;
>> +                  files[num_files - 1] = strdup(tmp);
>> +               }
>> +          }
>> +
>> +        free(tmp);
>> +        free(data);
>> +     }
>> +done:
>> +   if (ret_data) *ret_data = files;
>> +   if (ret_count) *ret_count = num_files;
>> +}
>> +
>> +static Eina_Bool
>> +_wl_data_preparer_markup(Wl_Cnp_Selection *sel, Elm_Selection_Data
>> *ddata, Ecore_Wl2_Event_Selection_Data_Ready *ev, Tmp_Info **tmp_info
>> EINA_UNUSED)
>> +{
>> +   cnp_debug("In\n");
>> +
>> +   ddata->format = ELM_SEL_FORMAT_MARKUP;
>> +   ddata->data = eina_memdup((unsigned char *)ev->data, ev->len,
>> EINA_TRUE);
>> +   ddata->len = ev->len;
>> +   ddata->action = sel->action;
>> +
>> +   return EINA_TRUE;
>> +}
>> +
>> +static Eina_Bool
>> +_wl_data_preparer_uri(Wl_Cnp_Selection *sel, Elm_Selection_Data *ddata,
>> Ecore_Wl2_Event_Selection_Data_Ready *ev, Tmp_Info **tmp_info EINA_UNUSED)
>> +{
>> +   cnp_debug("In\n");
>> +
>> +   char *p, *s, *stripstr = NULL;
>> +   char *data = ev->data;
>> +   Dropable *drop;
>> +   const char *type = NULL;
>> +
>> +   drop = eo_key_data_get(sel->requestwidget, "__elm_dropable");
>> +   if (drop)
>> +     type = drop->last.type;
>> +   if (!strcmp(type, "text/uri-list"))
>> +     {
>> +        int num_files = 0;
>> +        char **files = NULL;
>> +        int i, len = 0;
>> +        Efreet_Uri **uri;
>> +
>> +        _wl_selection_parser(ev->data, ev->len, &files, &num_files);
>> +        cnp_debug("got a files list\n");
>> +        uri = calloc(1, sizeof(*uri) * num_files);
>> +        if (!uri) return EINA_FALSE;
>> +
>> +        for (i = 0; i < num_files ; i++)
>> +          {
>> +             uri[i] = efreet_uri_decode(files[i]);
>> +             if (!uri[i])
>> +               {
>> +                  /* Is there any reason why we care of URI without
>> scheme? */
>> +                  if (files[i][0] != '/') continue;
>> +                  len += strlen(files[i]) + 1;
>> +               }
>> +             else
>> +               {
>> +                  if (strcmp(uri[i]->protocol, "file"))
>> +                    {
>> +                       efreet_uri_free(uri[i]);
>> +                       uri[i] = NULL;
>> +                       continue;
>> +                    }
>> +                  len += strlen(uri[i]->path) + 1;
>> +               }
>> +          }
>> +        p = NULL;
>> +        if (len > 0)
>> +          {
>> +             s = stripstr = malloc(len + 1);
>> +             for (i = 0; i < num_files ; i++)
>> +               {
>> +                  if (uri[i])
>> +                    p = (char *)uri[i]->path;
>> +                  else
>> +                    p = files[i];
>> +
>> +                  if (s)
>> +                    {
>> +                       len = strlen(p);
>> +                       strcpy(s, p);
> 
> Instead of all this complex looping, just use eina_strbuf.
> 
> 
>> +                       if (i < (num_files - 1))
>> +                         {
>> +                            s[len] = '\n';
>> +                            s[len + 1] = 0;
>> +                            s += len + 1;
>> +                         }
>> +                       else
>> +                         {
>> +                            s[len] = 0;
>> +                            s += len;
>> +                         }
>> +                    }
>> +
>> +                  if (uri[i])
>> +                    efreet_uri_free(uri[i]);
>> +               }
>> +          }
>> +        free(uri);
>> +     }
>> +   else
>> +     {
>> +        Efreet_Uri *uri;
>> +
>> +        p = (char *)eina_memdup((unsigned char *)data,
>> +                                ev->len, EINA_TRUE);
>> +        if (!p) return EINA_FALSE;
>> +        uri = efreet_uri_decode(p);
>> +        if (!uri)
>> +          {
>> +             /* Is there any reason why we care of URI without scheme? */
>> +             if (p[0] == '/') stripstr = p;
>> +             else free(p);
>> +          }
>> +        else
>> +          {
>> +             free(p);
>> +             stripstr = (char *)eina_memdup((unsigned char *)uri->path,
>> +                                            strlen(uri->path), EINA_TRUE);
> 
> Why not just use strdup?
> 
> 
>> +             efreet_uri_free(uri);
>> +             if (!stripstr) return EINA_FALSE;
>> +          }
>> +     }
>> +
>> +   if (!stripstr)
>> +     {
>> +        cnp_debug("Couldn't find a file\n");
>> +        return EINA_FALSE;
>> +     }
>> +   free(savedtypes.imgfile);
>> +
>> +   ddata->data = stripstr;
>> +   ddata->len = strlen(stripstr);
>> +   ddata->action = sel->action;
>> +   ddata->format = sel->requestformat;
>> +
>> +   return EINA_TRUE;
>> +}
>> +
>> +static Eina_Bool
>> +_wl_data_preparer_vcard(Wl_Cnp_Selection *sel, Elm_Selection_Data *ddata,
>> Ecore_Wl2_Event_Selection_Data_Ready *ev, Tmp_Info **tmp_info EINA_UNUSED)
>> +{
>> +   cnp_debug("In\n");
>> +
>> +   ddata->format = ELM_SEL_FORMAT_VCARD;
>> +   ddata->data = eina_memdup((unsigned char *)ev->data, ev->len,
>> EINA_TRUE);
>> +   ddata->len = ev->len;
>> +   ddata->action = sel->action;
>> +
>> +   return EINA_TRUE;
>> +}
>> +
>> +static Eina_Bool
>> +_wl_data_preparer_image(Wl_Cnp_Selection *sel, Elm_Selection_Data *ddata,
>> Ecore_Wl2_Event_Selection_Data_Ready *ev, Tmp_Info **tmp_info)
>> +{
>> +   cnp_debug("In\n");
>> +   Tmp_Info *tmp;
>> +   int len = 0;
>> +
>> +   tmp = _tempfile_new(ev->len);
>> +   if (!tmp)
>> +     return EINA_FALSE;
>> +   memcpy(tmp->map, ev->data, ev->len);
>> +   munmap(tmp->map, ev->len);
>> +
>> +   len = strlen(tmp->filename);
>> +   ddata->format = ELM_SEL_FORMAT_IMAGE;
>> +   ddata->data = eina_memdup((unsigned char*)tmp->filename, len,
>> EINA_TRUE);
>> +   ddata->len = len;
>> +   ddata->action = sel->action;
>> +   *tmp_info = tmp;
>> +
>> +   return EINA_TRUE;
>> +}
>> +
>> +static Eina_Bool
>> +_wl_data_preparer_text(Wl_Cnp_Selection *sel, Elm_Selection_Data *ddata,
>> Ecore_Wl2_Event_Selection_Data_Ready *ev, Tmp_Info **tmp_info EINA_UNUSED)
>> +{
>> +   cnp_debug("In\n");
>> +
>> +   ddata->format = ELM_SEL_FORMAT_TEXT;
>> +   ddata->data = eina_memdup((unsigned char *)ev->data, ev->len,
>> EINA_TRUE);
>> +   ddata->len = ev->len;
>> +   ddata->action = sel->action;
>> +
>> +   return EINA_TRUE;
>> +}
>> +
>> +static void
>> _wl_sel_obj_del(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void
>> *event_info EINA_UNUSED)
>> {
>>    Wl_Cnp_Selection *sel = data;
>> @@ -3307,6 +3616,7 @@ _wl_dnd_drop(void *data EINA_UNUSED, int type
>> EINA_UNUSED, void *event)
>>           {
>>              cnp_debug("Request data of type %s\n", drop->last.type);
>>              wl_cnp_selection.requestwidget = drop->obj;
>> +             wl_cnp_selection.requestformat = drop->last.format;
>> 
>> evas_object_event_callback_add(wl_cnp_selection.requestwidget,
>>                    EVAS_CALLBACK_DEL,
>>                    _wl_sel_obj_del2,
>> @@ -3394,7 +3704,9 @@ _wl_dnd_receive(void *data, int type EINA_UNUSED,
>> void *event)
>>    if (sel->requestwidget)
>>      {
>>         if (!ev->done)
>> -          _wl_dropable_data_handle(sel, ev->data, ev->len);
>> +          {
>> +             _wl_dropable_data_handle(sel, ev);
>> +          }
>>         else
>>           {
>>              evas_object_event_callback_del_full(sel->requestwidget,
>> @@ -3448,64 +3760,58 @@ _wl_dnd_end(void *data EINA_UNUSED, int type
>> EINA_UNUSED, void *event)
>>    return ECORE_CALLBACK_PASS_ON;
>> }
>> 
>> -static Eina_Bool
>> -_wl_dropable_match(Dropable_Cbs *cbs, Dropable *drop, Elm_Sel_Format fmt)
>> -{
>> -   return (cbs->types & fmt) && (drop->last.format & fmt);
>> -}
>> -
>> static void
>> -_wl_dropable_data_handle(Wl_Cnp_Selection *sel, char *data, size_t size)
>> +_wl_dropable_data_handle(Wl_Cnp_Selection *sel,
>> Ecore_Wl2_Event_Selection_Data_Ready *ev)
>> {
>>    Dropable *drop;
>> -   Elm_Selection_Data sdata;
>>    Ecore_Wl2_Window *win;
>> -   char *s;
>> 
>>    cnp_debug("In\n");
>> -
>> -   sdata.action = ELM_XDND_ACTION_COPY;
>> -
>> -   sdata.len = size;
>> -   sdata.x = savedtypes.x;
>> -   sdata.y = savedtypes.y;
>> -
>> -   win = _wl_elm_widget_window_get(sel->requestwidget);
>> -
>>    drop = eo_key_data_get(sel->requestwidget, "__elm_dropable");
>>    if (drop)
>>      {
>> -        Eina_Inlist *itr;
>> -        Dropable_Cbs *cbs;
>> -        EINA_INLIST_FOREACH_SAFE(drop->cbs_list, itr, cbs)
>> +        Cnp_Atom *atom = eina_hash_find(_types_hash, drop->last.type);
>> +        if (atom && atom->wl_data_preparer)
>>           {
>> -             if (cbs->types & drop->last.format)
>> +             Elm_Selection_Data ddata;
>> +             Tmp_Info *tmp_info = NULL;
>> +             Eina_Bool success;
>> +             ddata.data = NULL;
>> +
>> +             cnp_debug("Call notify for: %s\n", atom->name);
>> +             success = atom->wl_data_preparer(sel, &ddata, ev, &tmp_info);
>> +             if (success)
>>                {
>> -                  s = (char*)eina_memdup((unsigned char*)data, size,
>> -                      savedtypes.textreq || _wl_dropable_match(cbs, drop,
>> ELM_SEL_FORMAT_TEXT));
>> -                  if (!s)
>> +                  Dropable *dropable;
>> +                  Eina_List *l;
>> +
>> +                  EINA_LIST_FOREACH(drops, l, dropable)
>>                     {
>> -
>> ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
>> -                       return;
>> +                       if (dropable->obj == sel->requestwidget) break;
>> +                       dropable = NULL;
>>                     }
>> -
>> -                  sdata.data = s;
>> -                  if (_wl_dropable_match(cbs, drop, ELM_SEL_FORMAT_IMAGE))
>> +                  if (dropable)
>>                     {
>> -                       /* If it's markup that also supports images */
>> -                       if (_wl_dropable_match(cbs, drop,
>> ELM_SEL_FORMAT_MARKUP))
>> -                         sdata.format = ELM_SEL_FORMAT_MARKUP;
>> -                       else
>> -                         sdata.format = ELM_SEL_FORMAT_IMAGE;
>> +                       cnp_debug("call dropcb\n");
>> +                       Dropable_Cbs *cbs;
>> +                       Eina_Inlist *itr;
>> +                       ddata.x = savedtypes.x;
>> +                       ddata.y = savedtypes.y;
>> +                       EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr,
>> cbs)
>> +                          if ((cbs->types & dropable->last.format) &&
>> +                              cbs->dropcb)
>> +                            cbs->dropcb(cbs->dropdata, dropable->obj,
>> &ddata);
>>                     }
>> -                  else
>> -                    sdata.format = drop->last.format;
>> -                  if (cbs->dropcb) cbs->dropcb(cbs->dropdata, drop->obj,
>> &sdata);
>> -                  free(s);
>>                }
>> +             win = _wl_elm_widget_window_get(sel->requestwidget);
>> +             ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
>> +             if (tmp_info) _tmpinfo_free(tmp_info);
>> +             free(ddata.data);
>> +             return;
>>           }
>>      }
>> 
>> +   win = _wl_elm_widget_window_get(sel->requestwidget);
>>    ecore_wl2_dnd_drag_end(ecore_wl2_window_input_get(win));
>>    savedtypes.textreq = 0;
>> }
>> 
>> --
> ------------------------------------------------------------------------------
> Mobile security can be enabling, not merely restricting. Employees who
> bring their own devices (BYOD) to work are irked by the imposition of MDM
> restrictions. Mobile Device Manager Plus allows you to control only the
> apps on BYO-devices by containerizing them, leaving personal data untouched!
> https://ad.doubleclick.net/ddm/clk/304595813;131938128;j
> _______________________________________________
> enlightenment-devel mailing list
> enlightenment-devel@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

------------------------------------------------------------------------------
Mobile security can be enabling, not merely restricting. Employees who
bring their own devices (BYOD) to work are irked by the imposition of MDM
restrictions. Mobile Device Manager Plus allows you to control only the
apps on BYO-devices by containerizing them, leaving personal data untouched!
https://ad.doubleclick.net/ddm/clk/304595813;131938128;j
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to