summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <mail@marcel-hollerbach.de>2020-04-12 11:54:41 +0200
committerMarcel Hollerbach <mail@marcel-hollerbach.de>2020-04-14 11:55:27 +0200
commit5551a39d68f7eeafd020a4777db37ce408226bae (patch)
tree9d37a45fc931f64d0229c8b17ca3bb4d4feb689d
parent75b86bc548b68959241fe410bd36882efee41512 (diff)
downloadefl-5551a39d68f7eeafd020a4777db37ce408226bae.tar.gz
ecore_evas_x: allow parsing of links form the link list
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. Differential Revision: https://phab.enlightenment.org/D11697
-rw-r--r--meson.build2
-rw-r--r--src/modules/ecore_evas/engines/x/ecore_evas_x.c37
-rw-r--r--src/modules/ecore_evas/engines/x/meson.build2
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 <Ecore_X.h>
#include <Ecore_X_Atoms.h>
+#include <Efreet.h>
#ifdef BUILD_ECORE_EVAS_SOFTWARE_X11
# include <Evas_Engine_Software_X11.h>
@@ -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