add drop handler "hidden" flag to block drops

This commit is contained in:
Mike Blumenkrantz 2013-06-12 07:40:43 +01:00
parent 90e91530f8
commit 74baabb034
2 changed files with 36 additions and 42 deletions

View File

@ -69,6 +69,34 @@ static Eina_Stringshare **_e_dnd_types[] =
static Eina_Hash *_drop_handlers_responsives;
static Ecore_X_Atom _action;
static void
_e_drop_handler_active_check(E_Drop_Handler *h, const E_Drag *drag, Eina_Stringshare *type)
{
unsigned int i, j;
if (h->hidden) return;
for (i = 0; i < h->num_types; i++)
{
if (drag)
{
for (j = 0; j < drag->num_types; j++)
{
if (h->types[i] != drag->types[j]) continue;
h->active = 1;
h->active_type = eina_stringshare_ref(h->types[i]);
return;
}
}
else
{
if (h->types[i] != type) continue;
h->active = 1;
h->active_type = eina_stringshare_ref(h->types[i]);
return;
}
}
}
/* externally accessible functions */
EINTERN int
@ -254,24 +282,11 @@ e_drag_start(E_Drag *drag, int x, int y)
_active_handlers = eina_list_free(_active_handlers);
EINA_LIST_FOREACH(_drop_handlers, l, h)
{
unsigned int i, j;
Eina_Bool active = h->active;
h->active = 0;
eina_stringshare_replace(&h->active_type, NULL);
for (i = 0; i < h->num_types; i++)
{
for (j = 0; j < drag->num_types; j++)
{
if (h->types[i] == drag->types[j])
{
h->active = 1;
h->active_type = eina_stringshare_ref(h->types[i]);
break;
}
}
if (h->active) break;
}
_e_drop_handler_active_check(h, drag, NULL);
if (h->active != active)
{
if (h->active)
@ -318,24 +333,11 @@ e_drag_xdnd_start(E_Drag *drag, int x, int y)
_active_handlers = eina_list_free(_active_handlers);
EINA_LIST_FOREACH(_drop_handlers, l, h)
{
unsigned int i, j;
Eina_Bool active = h->active;
h->active = 0;
eina_stringshare_replace(&h->active_type, NULL);
for (i = 0; i < h->num_types; i++)
{
for (j = 0; j < drag->num_types; j++)
{
if (h->types[i] == drag->types[j])
{
h->active = 1;
h->active_type = eina_stringshare_ref(h->types[i]);
break;
}
}
if (h->active) break;
}
_e_drop_handler_active_check(h, drag, NULL);
if (h->active != active)
{
if (h->active)
@ -1175,7 +1177,6 @@ _e_dnd_cb_event_dnd_enter(void *data __UNUSED__, int type __UNUSED__, void *even
E_Drop_Handler *h;
const char *id;
const Eina_List *l;
unsigned int j;
int i;
id = e_util_winid_str_get(ev->win);
@ -1197,17 +1198,9 @@ _e_dnd_cb_event_dnd_enter(void *data __UNUSED__, int type __UNUSED__, void *even
_xdnd->type = t;
EINA_LIST_FOREACH(_drop_handlers, l, h)
{
for (j = 0; j < h->num_types; j++)
{
if (h->types[j] == _xdnd->type)
{
h->active = 1;
h->active_type = eina_stringshare_ref(_xdnd->type);
_active_handlers = eina_list_append(_active_handlers, h);
break;
}
}
_e_drop_handler_active_check(h, NULL, _xdnd->type);
if (h->active)
_active_handlers = eina_list_append(_active_handlers, h);
h->entered = 0;
}
break;

View File

@ -69,9 +69,10 @@ struct _E_Drop_Handler
Evas_Object *base;
int x, y, w, h;
unsigned char active : 1;
unsigned char entered : 1;
const char *active_type;
Eina_Bool active : 1;
Eina_Bool entered : 1;
Eina_Bool hidden : 1;
unsigned int num_types;
Eina_Stringshare *types[];
};