DnD: Fix compilation errors by adapting the multi-callbacks to Wayland.

This commit is contained in:
Daniel Zaoui 2013-11-05 17:26:51 +02:00 committed by Rafael Antognolli
parent 48792c035f
commit c4f8c9d5b7
1 changed files with 178 additions and 140 deletions

View File

@ -178,6 +178,7 @@ static Eina_List *cont_drag_tg = NULL; /* List of Item_Container_Drag_Info */
static void _cont_obj_mouse_up( void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _cont_obj_mouse_move( void *data, Evas *e, Evas_Object *obj, void *event_info);
static void _all_drop_targets_cbs_del(void *data, Evas *e, Evas_Object *obj, void *info);
static Eina_Bool
_drag_cancel_animate(void *data __UNUSED__, double pos)
@ -198,6 +199,24 @@ _drag_cancel_animate(void *data __UNUSED__, double pos)
return ECORE_CALLBACK_RENEW;
}
static void
_all_drop_targets_cbs_del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *info __UNUSED__)
{
Dropable *dropable = NULL;
eo_do(obj, eo_base_data_get("__elm_dropable", (void **)&dropable));
if (dropable)
{
Eina_Inlist *itr;
Dropable_Cbs *cbs;
EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
{
elm_drop_target_del(obj, cbs->types,
cbs->entercb, cbs->enterdata, cbs->leavecb, cbs->leavedata,
cbs->poscb, cbs->posdata, cbs->dropcb, cbs->dropdata);
}
}
}
#ifdef HAVE_ELEMENTARY_X
static Tmp_Info *_tempfile_new (int size);
static int _tmpinfo_free (Tmp_Info *tmp);
@ -293,7 +312,6 @@ static Eina_Bool _x11_elm_drop_target_del (Evas_Object *obj, Elm_
Elm_Drag_State leavecb, void *leavedata,
Elm_Drag_Pos poscb, void *posdata,
Elm_Drop_Cb dropcb, void *dropdata);
static void _all_drop_targets_cbs_del(void *data, Evas *e, Evas_Object *obj, void *info);
static Eina_Bool _x11_elm_selection_selection_has_owner (Evas_Object *obj __UNUSED__);
static X11_Cnp_Atom _x11_atoms[CNP_N_ATOMS] = {
@ -1940,7 +1958,6 @@ _x11_elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format,
dropable = NULL;
evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL,
_all_drop_targets_cbs_del);
}
}
else return EINA_FALSE;
@ -1975,24 +1992,6 @@ _x11_elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format,
return EINA_TRUE;
}
static void
_all_drop_targets_cbs_del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *info __UNUSED__)
{
Dropable *dropable = NULL;
eo_do(obj, eo_base_data_get("__elm_dropable", (void **)&dropable));
if (dropable)
{
Eina_Inlist *itr;
Dropable_Cbs *cbs;
EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs)
{
elm_drop_target_del(obj, cbs->types,
cbs->entercb, cbs->enterdata, cbs->leavecb, cbs->leavedata,
cbs->poscb, cbs->posdata, cbs->dropcb, cbs->dropdata);
}
}
}
static void
_x11_drag_target_del(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *info __UNUSED__)
{
@ -2163,7 +2162,7 @@ static Eina_Bool _wl_selection_receive(void *udata, int type __UNUSED__, void *e
static Eina_Bool _wl_elm_dnd_init(void);
static Eina_Bool _wl_elm_drop_target_add(Evas_Object *obj, Elm_Sel_Format format, Elm_Drag_State entercb, void *enterdata, Elm_Drag_State leavecb, void *leavedata, Elm_Drag_Pos poscb, void *posdata, Elm_Drop_Cb dropcb, void *dropdata);
static Eina_Bool _wl_elm_drop_target_del(Evas_Object *obj);
static Eina_Bool _wl_elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format, Elm_Drag_State entercb, void *enterdata, Elm_Drag_State leavecb, void *leavedata, Elm_Drag_Pos poscb, void *posdata, Elm_Drop_Cb dropcb, void *dropdata);
static Eina_Bool _wl_elm_drag_action_set(Evas_Object *obj, Elm_Xdnd_Action action);
static Eina_Bool _wl_elm_drag_start(Evas_Object *obj, Elm_Sel_Format format, const char *data, Elm_Xdnd_Action action, Elm_Drag_Icon_Create_Cb createicon, void *createdata, Elm_Drag_Pos dragpos, void *dragdata, Elm_Drag_Accept acceptcb, void *acceptdata, Elm_Drag_State dragdone, void *donecbdata);
@ -2345,46 +2344,39 @@ _wl_elm_dnd_init(void)
static Eina_Bool
_wl_elm_drop_target_add(Evas_Object *obj, Elm_Sel_Format format, Elm_Drag_State entercb, void *enterdata, Elm_Drag_State leavecb, void *leavedata, Elm_Drag_Pos poscb, void *posdata, Elm_Drop_Cb dropcb, void *dropdata)
{
Dropable *drop;
Eina_List *l;
Eina_Bool first = EINA_FALSE;
Dropable *dropable = NULL;
Dropable_Cbs *cbs = NULL;
first = (!drops) ? EINA_TRUE : EINA_FALSE;
Eina_Bool first = !drops;
EINA_LIST_FOREACH(drops, l, drop)
cbs = calloc(1, sizeof(*cbs));
if (!cbs) return EINA_FALSE;
cbs->entercb = entercb;
cbs->enterdata = enterdata;
cbs->leavecb = leavecb;
cbs->leavedata = leavedata;
cbs->poscb = poscb;
cbs->posdata = posdata;
cbs->dropcb = dropcb;
cbs->dropdata = dropdata;
cbs->types = format;
eo_do(obj, eo_base_data_get("__elm_dropable", (void **)&dropable));
if (!dropable)
{
if (drop->obj == obj)
{
drop->dropcb = dropcb;
drop->dropdata = dropdata;
drop->types = format;
return EINA_TRUE;
}
/* Create new drop */
dropable = calloc(1, sizeof(Dropable));
if (!dropable) goto error;
drops = eina_list_append(drops, dropable);
if (!drops) goto error;
dropable->obj = obj;
eo_do(obj, eo_base_data_set("__elm_dropable", dropable, NULL));
}
if (!(drop = calloc(1, sizeof(Dropable))))
return EINA_FALSE;
if (!(drops = eina_list_append(drops, drop)))
{
free(drop);
return EINA_FALSE;
}
drop->entercb = entercb;
drop->enterdata = enterdata;
drop->leavecb = leavecb;
drop->leavedata = leavedata;
drop->poscb = poscb;
drop->posdata = posdata;
drop->dropcb = dropcb;
drop->dropdata = dropdata;
drop->types = format;
drop->obj = obj;
dropable->cbs_list = eina_inlist_append(dropable->cbs_list, EINA_INLIST_GET(cbs));
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
(Evas_Object_Event_Cb)elm_drop_target_del,
obj);
_all_drop_targets_cbs_del, obj);
if (first)
{
@ -2403,25 +2395,50 @@ _wl_elm_drop_target_add(Evas_Object *obj, Elm_Sel_Format format, Elm_Drag_State
}
return EINA_TRUE;
error:
free(cbs);
free(dropable);
return EINA_FALSE;
}
static Eina_Bool
_wl_elm_drop_target_del(Evas_Object *obj)
_wl_elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format,
Elm_Drag_State entercb, void *enterdata,
Elm_Drag_State leavecb, void *leavedata,
Elm_Drag_Pos poscb, void *posdata,
Elm_Drop_Cb dropcb, void *dropdata)
{
Dropable *drop;
Eina_List *l;
Dropable *dropable;
EINA_LIST_FOREACH(drops, l, drop)
eo_do(obj, eo_base_data_get("__elm_dropable", (void **)&dropable));
if (dropable)
{
if (drop->obj == obj)
Eina_Inlist *itr;
Dropable_Cbs *cbs_info;
/* Look for the callback in the list */
EINA_INLIST_FOREACH_SAFE(dropable->cbs_list, itr, cbs_info)
if (cbs_info->entercb == entercb && cbs_info->enterdata == enterdata &&
cbs_info->leavecb == leavecb && cbs_info->leavedata == leavedata &&
cbs_info->poscb == poscb && cbs_info->posdata == posdata &&
cbs_info->dropcb == dropcb && cbs_info->dropdata == dropdata &&
cbs_info->types == format)
{
dropable->cbs_list = eina_inlist_remove(dropable->cbs_list,
EINA_INLIST_GET(cbs_info));
free(cbs_info);
}
/* In case no more callbacks are listed for the object */
if (!dropable->cbs_list)
{
drops = eina_list_remove_list(drops, l);
evas_object_event_callback_del(drop->obj, EVAS_CALLBACK_FREE,
(Evas_Object_Event_Cb)elm_drop_target_del);
free(drop);
break;
drops = eina_list_remove(drops, dropable);
eo_do(obj, eo_base_data_del("__elm_dropable"));
free(dropable);
dropable = NULL;
evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL,
_all_drop_targets_cbs_del);
}
}
else return EINA_FALSE;
if (!drops)
{
@ -2642,21 +2659,24 @@ _wl_dnd_position(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
for (i = 0; i < savedtypes.ntypes; i++)
{
switch (drop->types)
Dropable_Cbs *cbs;
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
{
case ELM_SEL_FORMAT_TARGETS:
case ELM_SEL_FORMAT_IMAGE:
if ((!strncmp(savedtypes.types[i], "text/uri", 8)) ||
(!strncmp(savedtypes.types[i], "image/", 6)))
switch (cbs->types)
{
wl_cnp_selection.requestwidget = drop->obj;
will_accept = EINA_TRUE;
case ELM_SEL_FORMAT_TARGETS:
case ELM_SEL_FORMAT_IMAGE:
if ((!strncmp(savedtypes.types[i], "text/uri", 8)) ||
(!strncmp(savedtypes.types[i], "image/", 6)))
{
wl_cnp_selection.requestwidget = drop->obj;
will_accept = EINA_TRUE;
}
break;
default:
break;
}
break;
default:
break;
}
if (will_accept) break;
}
}
@ -2700,17 +2720,21 @@ _wl_dnd_drop(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
for (i = 0; i < savedtypes.ntypes; i++)
{
if ((savedtypes.types[i] == text_uri) &&
((drop->types & ELM_SEL_FORMAT_MARKUP) ||
(drop->types & ELM_SEL_FORMAT_IMAGE)))
Dropable_Cbs *cbs;
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
{
wl_cnp_selection.requestwidget = drop->obj;
evas_object_event_callback_add(wl_cnp_selection.requestwidget,
EVAS_CALLBACK_DEL,
_wl_sel_obj_del2,
&wl_cnp_selection);
ecore_wl_dnd_drag_get(ecore_wl_input_get(), text_uri);
break;
if ((savedtypes.types[i] == text_uri) &&
(cbs->types & ELM_SEL_FORMAT_MARKUP) &&
(cbs->types & ELM_SEL_FORMAT_IMAGE))
{
wl_cnp_selection.requestwidget = drop->obj;
evas_object_event_callback_add(wl_cnp_selection.requestwidget,
EVAS_CALLBACK_DEL,
_wl_sel_obj_del2,
&wl_cnp_selection);
ecore_wl_dnd_drag_get(ecore_wl_input_get(), text_uri);
return ECORE_CALLBACK_PASS_ON;
}
}
}
@ -2847,30 +2871,32 @@ _wl_dropable_data_handle(Wl_Cnp_Selection *sel, char *data)
if (!savedtypes.imgfile) return;
if ((drop->types & ELM_SEL_FORMAT_MARKUP) &&
(drop->types & ELM_SEL_FORMAT_IMAGE))
Dropable_Cbs *cbs;
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
{
int l = 0;
/* If it's markup that also supports images */
if ((cbs->types & ELM_SEL_FORMAT_MARKUP) &&
(cbs->types & ELM_SEL_FORMAT_IMAGE))
{
int l = 0;
sdata.format = ELM_SEL_FORMAT_MARKUP;
l = strlen(tagstring) + strlen(savedtypes.imgfile);
entrytag = alloca(l + 1);
snprintf(entrytag, l + 1, tagstring, savedtypes.imgfile);
sdata.data = entrytag;
drop->dropcb(drop->dropdata, drop->obj, &sdata);
ecore_wl_dnd_drag_end(ecore_wl_input_get());
free(savedtypes.imgfile);
savedtypes.imgfile = NULL;
}
else if (drop->types & ELM_SEL_FORMAT_IMAGE)
{
sdata.format = ELM_SEL_FORMAT_IMAGE;
sdata.data = (char *)savedtypes.imgfile;
drop->dropcb(drop->dropdata, drop->obj, &sdata);
ecore_wl_dnd_drag_end(ecore_wl_input_get());
free(savedtypes.imgfile);
savedtypes.imgfile = NULL;
sdata.format = ELM_SEL_FORMAT_MARKUP;
l = strlen(tagstring) + strlen(savedtypes.imgfile);
entrytag = alloca(l + 1);
snprintf(entrytag, l + 1, tagstring, savedtypes.imgfile);
sdata.data = entrytag;
if (cbs->dropcb) cbs->dropcb(cbs->dropdata, drop->obj, &sdata);
ecore_wl_dnd_drag_end(ecore_wl_input_get());
}
else if (cbs->types & ELM_SEL_FORMAT_IMAGE)
{
sdata.format = ELM_SEL_FORMAT_IMAGE;
sdata.data = (char *)savedtypes.imgfile;
if (cbs->dropcb) cbs->dropcb(cbs->dropdata, drop->obj, &sdata);
ecore_wl_dnd_drag_end(ecore_wl_input_get());
}
}
ELM_SAFE_FREE(savedtypes.imgfile, free);
}
static Dropable *
@ -2911,6 +2937,8 @@ static void
_wl_dropable_handle(Dropable *drop, Evas_Coord x, Evas_Coord y, Eina_Bool have_obj)
{
Dropable *last = NULL;
Dropable_Cbs *cbs;
if (drop->last.in)
last = _wl_dropable_find_geom(_wl_elm_widget_window_get(drop->obj),
@ -2918,30 +2946,36 @@ _wl_dropable_handle(Dropable *drop, Evas_Coord x, Evas_Coord y, Eina_Bool have_o
if ((have_obj) && (last == drop))
{
if (drop->poscb)
drop->poscb(drop->posdata, drop->obj, x, y, dragaction);
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
if (cbs->poscb)
cbs->poscb(cbs->posdata, drop->obj, x, y, dragaction);
}
else if ((have_obj) && (!last))
{
if (drop->entercb)
drop->entercb(drop->enterdata, drop->obj);
if (drop->poscb)
drop->poscb(drop->posdata, drop->obj, x, y, dragaction);
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
if (cbs->entercb)
cbs->entercb(cbs->enterdata, drop->obj);
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
if (cbs->poscb)
cbs->poscb(cbs->posdata, drop->obj, x, y, dragaction);
}
else if ((!have_obj) && (last))
{
if (drop->leavecb)
drop->leavecb(drop->leavedata, drop->obj);
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
if (cbs->leavecb)
cbs->leavecb(cbs->leavedata, drop->obj);
}
else if (have_obj)
{
if (drop->entercb)
drop->entercb(drop->enterdata, drop->obj);
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
if (cbs->entercb)
cbs->entercb(cbs->enterdata, drop->obj);
if (last)
{
drop = last;
if (drop->leavecb)
drop->leavecb(drop->leavedata, drop->obj);
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
if (cbs->leavecb)
cbs->leavecb(cbs->leavedata, drop->obj);
}
}
}
@ -2972,27 +3006,31 @@ _wl_drops_accept(const char *type)
EINA_LIST_FOREACH(drops, l, drop)
{
switch (drop->types)
Dropable_Cbs *cbs;
EINA_INLIST_FOREACH(drop->cbs_list, cbs)
{
case ELM_SEL_FORMAT_TARGETS:
case ELM_SEL_FORMAT_IMAGE:
if ((!strncmp(type, "text/uri", 8)) ||
(!strncmp(type, "image/", 6)))
switch (cbs->types)
{
wl_cnp_selection.requestwidget = drop->obj;
return EINA_TRUE;
case ELM_SEL_FORMAT_TARGETS:
case ELM_SEL_FORMAT_IMAGE:
if ((!strncmp(type, "text/uri", 8)) ||
(!strncmp(type, "image/", 6)))
{
wl_cnp_selection.requestwidget = drop->obj;
return EINA_TRUE;
}
break;
case ELM_SEL_FORMAT_NONE:
break;
case ELM_SEL_FORMAT_TEXT:
break;
case ELM_SEL_FORMAT_MARKUP:
break;
case ELM_SEL_FORMAT_VCARD:
break;
case ELM_SEL_FORMAT_HTML:
break;
}
break;
case ELM_SEL_FORMAT_NONE:
break;
case ELM_SEL_FORMAT_TEXT:
break;
case ELM_SEL_FORMAT_MARKUP:
break;
case ELM_SEL_FORMAT_VCARD:
break;
case ELM_SEL_FORMAT_HTML:
break;
}
}
@ -3021,8 +3059,7 @@ _wl_elm_widget_window_get(Evas_Object *obj)
win = ecore_evas_wayland_window_get(ee);
}
if (win) return win->id;
return 0;
return ecore_wl_window_id_get(win);
}
#endif
@ -3469,7 +3506,8 @@ elm_drop_target_del(Evas_Object *obj, Elm_Sel_Format format,
leavecb, leavedata, poscb, posdata, dropcb, dropdata);
#endif
#ifdef HAVE_ELEMENTARY_WAYLAND
return _wl_elm_drop_target_del(obj);
return _wl_elm_drop_target_del(obj, format, entercb, enterdata,
leavecb, leavedata, poscb, posdata, dropcb, dropdata);
#endif
return _local_elm_drop_target_del(obj);
}