Revert "elm cnp/Wl: Remove duplicated data receive callback"

This reverts commit f5d10f1961.

this breaks pasting into efl applications on wayland

fix T3455
This commit is contained in:
Mike Blumenkrantz 2016-05-10 13:16:46 -04:00
parent 4126b7faba
commit 37ed59474e
2 changed files with 119 additions and 103 deletions

View File

@ -235,8 +235,7 @@ _selection_data_read(void *data, Ecore_Fd_Handler *fdh)
event->sel_type = source->sel_type;
if (len <= 0)
{
if (source->input->drag.source &&
source->sel_type == ECORE_WL2_SELECTION_DND)
if (source->input->drag.source)
{
if (source->input->display->wl.data_device_manager_version >=
WL_DATA_OFFER_FINISH_SINCE_VERSION)

View File

@ -2424,8 +2424,6 @@ struct _Wl_Cnp_Selection
Elm_Xdnd_Action action;
Eina_Bool active : 1;
Eina_Bool requestfinished : 1;
const char *requesttype;
};
static Eina_Bool _wl_elm_cnp_init(void);
@ -2434,7 +2432,7 @@ static Wl_Cnp_Selection wl_cnp_selection =
{
0, 0, NULL, NULL,
NULL, 0, 0, NULL, NULL, NULL,
0, NULL, 0, EINA_FALSE, EINA_FALSE, ""
0, NULL, 0, EINA_FALSE
};
static void _wl_sel_obj_del2(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED);
@ -2460,6 +2458,7 @@ static Eina_Bool _wl_dnd_position(void *data EINA_UNUSED, int type EINA_UNUSED,
static Eina_Bool _wl_dnd_drop(void *data EINA_UNUSED, int type EINA_UNUSED, void *event);
/* static Eina_Bool _wl_dnd_offer(void *data EINA_UNUSED, 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, Ecore_Wl2_Event_Selection_Data_Ready *ev);
@ -2709,49 +2708,6 @@ done:
if (ret_count) *ret_count = num_files;
}
static Eina_Bool
_wl_selection_get_timer_cb(void *data)
{
Wl_Cnp_Selection *sel = data;
Ecore_Wl2_Window *win;
win = _wl_elm_widget_window_get(sel->requestwidget);
ecore_wl2_dnd_selection_get(ecore_wl2_window_input_get(win),
sel->requesttype);
return ECORE_CALLBACK_CANCEL;
}
static Eina_Bool
_wl_notify_handler_targets(Wl_Cnp_Selection *sel, Ecore_Wl2_Event_Selection_Data_Ready *ev)
{
cnp_debug("In\n");
if (!ev) return EINA_FALSE;
char *data = ev->data;
int len = ev->len;
int count = 0, i = 0;
char **data_arr = NULL;
Cnp_Atom *atom = NULL;
_wl_selection_parser(data, len, &data_arr, &count);
for (i = 0; i < count; i++)
{
atom = eina_hash_find(_types_hash, data_arr[i]);
if (atom && (atom->formats != ELM_SEL_FORMAT_TARGETS))
{
cnp_debug("Match found: %s\n", atom->name);
sel->requestfinished = EINA_FALSE;
/* Since we cannot call ecore_wl2_dnd_selection_get in here
(it makes selection_send cannot be called), we use ecore_timer
to call it */
sel->requesttype = atom->name;
ecore_timer_add(0.001, _wl_selection_get_timer_cb, sel);
break;
}
}
free(data_arr);
return EINA_TRUE;
}
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)
{
@ -3065,9 +3021,9 @@ _wl_elm_cnp_selection_get(const Evas_Object *obj, Elm_Sel_Type selection, Elm_Se
sel->requestformat = format;
sel->requestwidget = (Evas_Object *) obj;
sel->win = win;
/* sel->request(win, ECORE_X_SELECTION_TARGET_TARGETS); */
sel->datacb = datacb;
sel->udata = udata;
sel->requesttype = "TARGETS";
evas_object_event_callback_add(sel->requestwidget,
EVAS_CALLBACK_DEL, _wl_sel_obj_del2,
@ -3077,7 +3033,28 @@ _wl_elm_cnp_selection_get(const Evas_Object *obj, Elm_Sel_Type selection, Elm_Se
(selection == ELM_SEL_TYPE_PRIMARY) ||
(selection == ELM_SEL_TYPE_SECONDARY))
{
ecore_wl2_dnd_selection_get(ecore_wl2_window_input_get(win), "TARGETS");
const char *types[10] = {0, };
int i = -1, j;
if ((format & ELM_SEL_FORMAT_MARKUP) ||
(format & ELM_SEL_FORMAT_TEXT))
{
types[++i] = "application/x-elementary-markup";
types[++i] = "text/plain";
types[++i] = "text/plain;charset=utf-8";
}
if (format & ELM_SEL_FORMAT_HTML)
{
types[++i] = "text/html";
types[++i] = "text/html;charset=utf-8";
}
if (i < 0) return EINA_FALSE;
for (j = 0; j <= i; j++)
if (ecore_wl2_dnd_selection_get(ecore_wl2_window_input_get(win), types[j]))
break;
}
return EINA_TRUE;
@ -3185,74 +3162,78 @@ _wl_selection_send(void *data, int type EINA_UNUSED, void *event)
return ECORE_CALLBACK_PASS_ON;
}
static void
_wl_selection_data_handle(Wl_Cnp_Selection *sel, Ecore_Wl2_Event_Selection_Data_Ready *ev)
{
cnp_debug("In\n");
sel->requestfinished = EINA_TRUE;
if (sel->datacb)
{
if (!strcmp(sel->requesttype, "TARGETS") ||
!strcmp(sel->requesttype, "ATOMS"))
{
_wl_notify_handler_targets(sel, ev);
}
else
{
Cnp_Atom *atom = eina_hash_find(_types_hash, sel->requesttype);
if (atom && atom->wl_data_preparer)
{
Elm_Selection_Data sdata;
Tmp_Info *tmp_info = NULL;
Eina_Bool success;
sdata.data = NULL;
cnp_debug("Call notify for: %s\n", atom->name);
success = atom->wl_data_preparer(sel, &sdata, ev, &tmp_info);
if (success)
{
sdata.x = sdata.y = 0;
sel->datacb(sel->udata,
sel->requestwidget,
&sdata);
}
if (tmp_info) _tmpinfo_free(tmp_info);
free(sdata.data);
}
}
}
else
{
cnp_debug("request to paste: datacb does not exist\n");
}
}
static Eina_Bool
_wl_selection_receive(void *data, int type EINA_UNUSED, void *event)
_wl_selection_receive(void *udata, int type EINA_UNUSED, void *event)
{
Wl_Cnp_Selection *sel;
Ecore_Wl2_Event_Selection_Data_Ready *ev;
cnp_debug("In\n");
Wl_Cnp_Selection *sel = udata;
Ecore_Wl2_Event_Selection_Data_Ready *ev = event;
_wl_elm_cnp_init();
ev = event;
sel = data;
if (sel->requestwidget)
{
if (!ev->done)
{
if (ev->sel_type == ECORE_WL2_SELECTION_DND)
if (sel->seltype == ELM_SEL_TYPE_XDND)
{
_wl_dropable_data_handle(sel, ev);
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);
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
{
_wl_selection_data_handle(sel, ev);
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);
}
}
else if (sel->requestfinished)
else
{
evas_object_event_callback_del_full(sel->requestwidget,
EVAS_CALLBACK_DEL,
@ -3261,6 +3242,12 @@ _wl_selection_receive(void *data, int type EINA_UNUSED, void *event)
}
}
end:
if (sel->seltype == ELM_SEL_TYPE_XDND)
{
/* FIXME: Send Finished ?? */
}
return ECORE_CALLBACK_PASS_ON;
}
@ -3291,6 +3278,8 @@ _wl_elm_dnd_init(void)
text_uri = eina_stringshare_add("text/uri-list");
_wl_elm_cnp_init();
ecore_event_handler_add(ECORE_WL2_EVENT_SELECTION_DATA_READY,
_wl_dnd_receive, &wl_cnp_selection);
ecore_event_handler_add(ECORE_WL2_EVENT_DND_END,
_wl_dnd_end, &wl_cnp_selection);
@ -3717,6 +3706,34 @@ _wl_dnd_drop(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_wl_dnd_receive(void *data, int type EINA_UNUSED, void *event)
{
Wl_Cnp_Selection *sel;
Ecore_Wl2_Event_Selection_Data_Ready *ev;
cnp_debug("In\n");
ev = event;
sel = data;
if (sel->requestwidget)
{
if (!ev->done)
{
_wl_dropable_data_handle(sel, ev);
}
else
{
evas_object_event_callback_del_full(sel->requestwidget,
EVAS_CALLBACK_DEL,
_wl_sel_obj_del2, sel);
sel->requestwidget = NULL;
}
}
return ECORE_CALLBACK_PASS_ON;
}
static Eina_Bool
_wl_dnd_end(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
{