From 7288e98b9ea0b94285f1adbb3711ed050757e29b Mon Sep 17 00:00:00 2001 From: Marcel Hollerbach Date: Tue, 14 Apr 2020 11:29:32 -0400 Subject: [PATCH] ecore_evas_x: allow parsing of links form the link list Summary: this is needed in order to return the data the same way the legacy impl did. This however has the annoying sideeffect that ecore_evas_x now depends on efreet, and we had to change the build order. Depends on D11696 Reviewers: zmike, stefan_schmidt, raster Reviewed By: zmike Subscribers: devilhorns, cedric, #reviewers, #committers Tags: #efl Differential Revision: https://phab.enlightenment.org/D11697 --- meson.build | 2 +- .../ecore_evas/engines/x/ecore_evas_x.c | 37 +++++++++++++++++-- src/modules/ecore_evas/engines/x/meson.build | 2 +- 3 files changed, 36 insertions(+), 5 deletions(-) diff --git a/meson.build b/meson.build index 0250512057..23c515c379 100644 --- a/meson.build +++ b/meson.build @@ -317,11 +317,11 @@ subprojects = [ ['ecore_drm2' ,['drm'] , false, true, false, false, false, false, ['ecore'], ['libdrm']], ['ecore_cocoa' ,['cocoa'] , false, true, false, false, false, false, ['eina'], []], ['evas' ,[] , true, true, false, false, true, true, ['eina', 'efl', 'eo'], ['vg_common', 'libunibreak']], +['efreet' ,[] , false, true, false, false, true, false, ['eina', 'efl', 'eo'], []], ['ecore_input_evas' ,[] , false, true, false, false, false, false, ['eina', 'evas'], []], ['ecore_evas' ,[] , true, true, true, false, false, false, ['evas', 'ector'], []], ['ecore_imf' ,[] , true, true, false, false, false, false, ['eina'], []], ['embryo' ,[] , false, true, true, false, false, false, ['eina', 'efl', 'eo'], []], -['efreet' ,[] , false, true, false, false, true, false, ['eina', 'efl', 'eo'], []], ['eio' ,[] , false, true, false, false, true, true, ['eina', 'eet'], []], ['efreet' ,[] , false, false, true, false, false, false, ['eina', 'efl', 'eo'], []], ['ecore_imf_evas' ,[] , false, true, false, false, false, false, ['eina', 'efl', 'eo'], []], diff --git a/src/modules/ecore_evas/engines/x/ecore_evas_x.c b/src/modules/ecore_evas/engines/x/ecore_evas_x.c index 68f437c4a2..eb545a256a 100644 --- a/src/modules/ecore_evas/engines/x/ecore_evas_x.c +++ b/src/modules/ecore_evas/engines/x/ecore_evas_x.c @@ -13,6 +13,7 @@ #include #include +#include #ifdef BUILD_ECORE_EVAS_SOFTWARE_X11 # include @@ -3858,17 +3859,45 @@ _create_deliveriy_content(unsigned long int size, const void *mem, const char *m static void _deliver_content(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Evas_Selection_Buffer selection, Ecore_X_Event_Selection_Notify *ev) { - Ecore_X_Selection_Data *x11_data = ev->data; Eina_Content *result = NULL; Eina_Stringshare *mime_type = _decrypt_type(edata->selection_data[selection].requested_type); - if (!x11_data->data) + if (!ev->data) { ERR("delivering NULL content"); return; } - if (eina_str_has_prefix(mime_type,"text")) + + if (eina_streq(mime_type, "text/uri-list")) { + Ecore_X_Selection_Data_Files *files = ev->data; + Efreet_Uri *uri; + Eina_Strbuf *strbuf; + int i; + + strbuf = eina_strbuf_new(); + + for (i = 0; i < files->num_files ; i++) + { + uri = efreet_uri_decode(files->files[i]); + if (uri) + { + eina_strbuf_append(strbuf, uri->path); + efreet_uri_free(uri); + } + else + { + eina_strbuf_append(strbuf, files->files[i]); + } + if (i < (files->num_files - 1)) + eina_strbuf_append(strbuf, "\n"); + } + result = _create_deliveriy_content(eina_strbuf_length_get(strbuf) + 1, eina_strbuf_string_get(strbuf), mime_type); + eina_strbuf_free(strbuf); + } + else if (eina_str_has_prefix(mime_type,"text")) + { + Ecore_X_Selection_Data *x11_data = ev->data; //ensure that we always have a \0 at the end, there is no assertion that \0 is included here. void *null_terminated = eina_memdup(x11_data->data, x11_data->length, EINA_TRUE); @@ -3877,6 +3906,7 @@ _deliver_content(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Evas_S } else if (eina_str_has_prefix(mime_type,"image")) { + Ecore_X_Selection_Data *x11_data = ev->data; Eina_Content *tmp_container = eina_content_new((Eina_Slice){.len = x11_data->length, .mem = x11_data->data}, mime_type); const char *file = eina_content_as_file(tmp_container); @@ -3885,6 +3915,7 @@ _deliver_content(Ecore_Evas *ee, Ecore_Evas_Engine_Data_X11 *edata, Ecore_Evas_S } else { + Ecore_X_Selection_Data *x11_data = ev->data; result = _create_deliveriy_content(x11_data->length, x11_data->data, mime_type); } EINA_SAFETY_ON_NULL_RETURN(result); diff --git a/src/modules/ecore_evas/engines/x/meson.build b/src/modules/ecore_evas/engines/x/meson.build index 582a782115..1108f9c755 100644 --- a/src/modules/ecore_evas/engines/x/meson.build +++ b/src/modules/ecore_evas/engines/x/meson.build @@ -14,7 +14,7 @@ endif shared_module(mod_full_name, engine_src, include_directories : config_dir + [engine_include_dir], - dependencies : [eina, ecore_evas, ecore_input_evas] + engine_deps, + dependencies : [eina, ecore_evas, ecore_input_evas, efreet] + engine_deps, install : true, install_dir : mod_install_dir, name_suffix : sys_mod_extension