summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-07-06 14:48:46 +0200
committerMarcel Hollerbach <marcel-hollerbach@t-online.de>2016-07-10 14:36:54 +0200
commitcad1541610c61b76587b885503be9aef52a055ff (patch)
treeae8c8c2242ecf06fe6b8511b9d10ccde1b643a95
parente0c425a39fc95bbaa515e49fe81cadd0b048f96e (diff)
downloadefl-cad1541610c61b76587b885503be9aef52a055ff.tar.gz
ecore_wl2: buffer reading of the data
Otherwise callbacks can go out even if the selection data is not ready to read.
-rw-r--r--src/lib/ecore_wl2/Ecore_Wl2.h1
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_dnd.c37
-rw-r--r--src/lib/ecore_wl2/ecore_wl2_private.h2
-rw-r--r--src/lib/elementary/elm_cnp.c100
4 files changed, 68 insertions, 72 deletions
diff --git a/src/lib/ecore_wl2/Ecore_Wl2.h b/src/lib/ecore_wl2/Ecore_Wl2.h
index fef28a6604..615d7285cf 100644
--- a/src/lib/ecore_wl2/Ecore_Wl2.h
+++ b/src/lib/ecore_wl2/Ecore_Wl2.h
@@ -146,7 +146,6 @@ typedef struct _Ecore_Wl2_Event_Selection_Data_Ready
{
char *data;
int len;
- Eina_Bool done;
Ecore_Wl2_Selection_Type sel_type;
} Ecore_Wl2_Event_Selection_Data_Ready;
diff --git a/src/lib/ecore_wl2/ecore_wl2_dnd.c b/src/lib/ecore_wl2/ecore_wl2_dnd.c
index d093d0b0fe..2c63ff24fc 100644
--- a/src/lib/ecore_wl2/ecore_wl2_dnd.c
+++ b/src/lib/ecore_wl2/ecore_wl2_dnd.c
@@ -227,7 +227,6 @@ _selection_data_read(void *data, Ecore_Fd_Handler *fdh)
char buffer[PATH_MAX];
Ecore_Wl2_Dnd_Source *source = data;
Ecore_Wl2_Event_Selection_Data_Ready *event;
- Eina_Bool ret;
fd = ecore_main_fd_handler_fd_get(fdh);
if (fd >= 0)
@@ -254,29 +253,31 @@ _selection_data_read(void *data, Ecore_Fd_Handler *fdh)
ecore_main_fd_handler_del(source->fdh);
source->fdh = NULL;
- event->done = EINA_TRUE;
- event->data = NULL;
- event->len = 0;
- ret = ECORE_CALLBACK_CANCEL;
+ event->data = source->read_data;
+ event->len = source->len;
+ ecore_event_add(ECORE_WL2_EVENT_SELECTION_DATA_READY, event,
+ _selection_data_ready_cb_free, NULL);
+
+ return ECORE_CALLBACK_CANCEL;
}
else
{
- event->data = malloc(len);
- if (!event->data)
+ int old_len = source->len;
+
+ if (!source->read_data)
{
- free(event);
- return ECORE_CALLBACK_CANCEL;
+ source->read_data = malloc(len);
+ source->len = len;
}
- memcpy(event->data, buffer, len);
- event->len = len;
- event->done = EINA_FALSE;
- ret = ECORE_CALLBACK_RENEW;
- }
-
- ecore_event_add(ECORE_WL2_EVENT_SELECTION_DATA_READY, event,
- _selection_data_ready_cb_free, NULL);
+ else
+ {
+ source->len += len;
+ source->read_data = realloc(source->read_data, source->len);
+ }
- return ret;
+ memcpy(((char*)source->read_data) + old_len, buffer, len);
+ return ECORE_CALLBACK_RENEW;
+ }
}
static void
diff --git a/src/lib/ecore_wl2/ecore_wl2_private.h b/src/lib/ecore_wl2/ecore_wl2_private.h
index 1cfae47466..1d27f60257 100644
--- a/src/lib/ecore_wl2/ecore_wl2_private.h
+++ b/src/lib/ecore_wl2/ecore_wl2_private.h
@@ -195,6 +195,8 @@ typedef struct _Ecore_Wl2_Dnd_Source
uint32_t source_actions;
Ecore_Wl2_Selection_Type sel_type;
Eina_Bool active_read;
+ void *read_data;
+ unsigned int len;
} Ecore_Wl2_Dnd_Source;
diff --git a/src/lib/elementary/elm_cnp.c b/src/lib/elementary/elm_cnp.c
index 855e7d8add..28aa2575bf 100644
--- a/src/lib/elementary/elm_cnp.c
+++ b/src/lib/elementary/elm_cnp.c
@@ -3097,74 +3097,68 @@ _wl_selection_receive(void *udata, int type EINA_UNUSED, void *event)
if (sel->requestwidget)
{
- if (!ev->done)
+ if (sel->seltype == ELM_SEL_TYPE_XDND)
{
- if (sel->seltype == ELM_SEL_TYPE_XDND)
- {
- Elm_Selection_Data sdata;
- Eina_List *l;
- Dropable *dropable;
-
- EINA_LIST_FOREACH(drops, l, dropable)
- {
- if (dropable->obj == sel->requestwidget) break;
- dropable = NULL;
- }
-
- if (dropable)
- {
- Dropable_Cbs *cbs;
-
- sdata.x = savedtypes.x;
- sdata.y = savedtypes.y;
- sdata.format = ELM_SEL_FORMAT_TEXT;
- sdata.data = ev->data;
- sdata.len = ev->len;
- sdata.action = sel->action;
-
- EINA_INLIST_FOREACH(dropable->cbs_list, cbs)
- if (cbs->dropcb)
- cbs->dropcb(cbs->dropdata, dropable->obj, &sdata);
+ Elm_Selection_Data sdata;
+ Eina_List *l;
+ Dropable *dropable;
- goto end;
- }
+ EINA_LIST_FOREACH(drops, l, dropable)
+ {
+ if (dropable->obj == sel->requestwidget) break;
+ dropable = NULL;
}
- if (sel->datacb)
+ if (dropable)
{
- Elm_Selection_Data sdata;
+ Dropable_Cbs *cbs;
- sdata.x = sdata.y = 0;
+ sdata.x = savedtypes.x;
+ sdata.y = savedtypes.y;
sdata.format = ELM_SEL_FORMAT_TEXT;
sdata.data = ev->data;
sdata.len = ev->len;
sdata.action = sel->action;
- sel->datacb(sel->udata,
- sel->requestwidget,
- &sdata);
- }
- else
- {
- char *stripstr, *mkupstr;
-
- stripstr = malloc(ev->len + 1);
- if (!stripstr) goto end;
- strncpy(stripstr, (char *)ev->data, ev->len);
- stripstr[ev->len] = '\0';
- mkupstr = _elm_util_text_to_mkup((const char *)stripstr);
- /* TODO BUG: should never NEVER assume it's an elm_entry! */
- _elm_entry_entry_paste(sel->requestwidget, mkupstr);
- free(stripstr);
- free(mkupstr);
+
+ EINA_INLIST_FOREACH(dropable->cbs_list, cbs)
+ if (cbs->dropcb)
+ cbs->dropcb(cbs->dropdata, dropable->obj, &sdata);
+
+ goto end;
}
}
+
+ if (sel->datacb)
+ {
+ Elm_Selection_Data sdata;
+
+ sdata.x = sdata.y = 0;
+ sdata.format = ELM_SEL_FORMAT_TEXT;
+ sdata.data = ev->data;
+ sdata.len = ev->len;
+ sdata.action = sel->action;
+ sel->datacb(sel->udata,
+ sel->requestwidget,
+ &sdata);
+ }
else
{
- evas_object_event_callback_del_full(sel->requestwidget,
- EVAS_CALLBACK_DEL,
- _wl_sel_obj_del2, sel);
- sel->requestwidget = NULL;
+ char *stripstr, *mkupstr;
+
+ stripstr = malloc(ev->len + 1);
+ if (!stripstr) goto end;
+ strncpy(stripstr, (char *)ev->data, ev->len);
+ stripstr[ev->len] = '\0';
+ mkupstr = _elm_util_text_to_mkup((const char *)stripstr);
+ /* TODO BUG: should never NEVER assume it's an elm_entry! */
+ _elm_entry_entry_paste(sel->requestwidget, mkupstr);
+ free(stripstr);
+ free(mkupstr);
}
+ evas_object_event_callback_del_full(sel->requestwidget,
+ EVAS_CALLBACK_DEL,
+ _wl_sel_obj_del2, sel);
+ sel->requestwidget = NULL;
}
end: