forked from enlightenment/efl
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:
parent
4126b7faba
commit
37ed59474e
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue