forked from enlightenment/enlightenment
giant comp rejiggering commit #4
* dnd canvas removed, dnd objects now drawn directly on compositor canvas * dnd now correctly picks the top-most dnd-receiver location as its drop target instead of just using the first one in the list * various other small changes to go along with this
This commit is contained in:
parent
9eda384ea8
commit
70d68a30e0
|
@ -6,6 +6,7 @@
|
|||
* E_FN_DEL macro renamed to E_FREE_FUNC with param order swapped for consistency
|
||||
* added e_gadcon_repopulate
|
||||
* EFM toolbar now has its own gadcon location
|
||||
* DND canvas merged to compositor
|
||||
|
||||
2013-02-20 Mike Blumenkrantz
|
||||
|
||||
|
|
1
NEWS
1
NEWS
|
@ -118,6 +118,7 @@ Improvements:
|
|||
* e_util_size_debug_set now displays delete events
|
||||
* compositor now allows user changing/remembering of object opacity
|
||||
* EFM toolbar now has its own gadcon location
|
||||
* DND canvas merged to compositor
|
||||
|
||||
Fixes:
|
||||
* IBar menu didn't allow to configure different icon sources, show contents menu even on empty IBar.
|
||||
|
|
|
@ -4843,6 +4843,9 @@ e_comp_get(void *o)
|
|||
E_Container *con = NULL;
|
||||
E_Manager *man = NULL;
|
||||
E_Gadcon_Popup *gp;
|
||||
E_Gadcon *gc;
|
||||
E_Gadcon_Client *gcc;
|
||||
E_Drag *drag;
|
||||
|
||||
if (!o) obj = (E_Object*)e_manager_current_get();
|
||||
/* try to get to zone type first */
|
||||
|
@ -4868,6 +4871,20 @@ e_comp_get(void *o)
|
|||
obj = (void*)gp->win->zone;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
|
||||
break;
|
||||
case E_DRAG_TYPE:
|
||||
drag = (E_Drag*)obj;
|
||||
obj = (void*)drag->container;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
|
||||
break;
|
||||
case E_GADCON_CLIENT_TYPE:
|
||||
gcc = (E_Gadcon_Client*)obj;
|
||||
obj = (void*)gcc->gadcon;
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
|
||||
case E_GADCON_TYPE:
|
||||
gc = (E_Gadcon*)obj;
|
||||
obj = (void*)e_gadcon_zone_get(gc);
|
||||
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -124,6 +124,12 @@ e_comp_cfdata_config_new(void)
|
|||
mat->no_shadow = 1;
|
||||
mat->focus = 1;
|
||||
|
||||
mat = E_NEW(E_Comp_Match, 1);
|
||||
cfg->match.popups = eina_list_append(cfg->match.popups, mat);
|
||||
mat->name = eina_stringshare_add("E Drag");
|
||||
mat->shadow_style = eina_stringshare_add("still");
|
||||
mat->no_shadow = 1;
|
||||
|
||||
mat = E_NEW(E_Comp_Match, 1);
|
||||
cfg->match.popups = eina_list_append(cfg->match.popups, mat);
|
||||
mat->shadow_style = eina_stringshare_add("popup");
|
||||
|
|
493
src/bin/e_dnd.c
493
src/bin/e_dnd.c
|
@ -12,8 +12,6 @@
|
|||
|
||||
/* local subsystem functions */
|
||||
|
||||
static void _e_drag_show(E_Drag *drag);
|
||||
static void _e_drag_hide(E_Drag *drag);
|
||||
static void _e_drag_move(E_Drag *drag, int x, int y);
|
||||
static void _e_drag_coords_update(const E_Drop_Handler *h, int *dx, int *dy);
|
||||
static Ecore_X_Window _e_drag_win_get(const E_Drop_Handler *h, int xdnd);
|
||||
|
@ -21,12 +19,10 @@ static int _e_drag_win_matches(E_Drop_Handler *h, Ecore_X_Window win,
|
|||
static void _e_drag_win_show(E_Drop_Handler *h);
|
||||
static void _e_drag_win_hide(E_Drop_Handler *h);
|
||||
static int _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action);
|
||||
static void _e_drag_end(Ecore_X_Window root, int x, int y);
|
||||
static void _e_drag_end(int x, int y);
|
||||
static void _e_drag_xdnd_end(Ecore_X_Window root, int x, int y);
|
||||
static void _e_drag_free(E_Drag *drag);
|
||||
|
||||
static Eina_Bool _e_dnd_cb_window_shape(void *data, int type, void *event);
|
||||
|
||||
static Eina_Bool _e_dnd_cb_key_down(void *data, int type, void *event);
|
||||
static Eina_Bool _e_dnd_cb_key_up(void *data, int type, void *event);
|
||||
static Eina_Bool _e_dnd_cb_mouse_up(void *data, int type, void *event);
|
||||
|
@ -89,7 +85,6 @@ e_dnd_init(void)
|
|||
|
||||
E_LIST_HANDLER_APPEND(_event_handlers, ECORE_EVENT_MOUSE_BUTTON_UP, _e_dnd_cb_mouse_up, NULL);
|
||||
E_LIST_HANDLER_APPEND(_event_handlers, ECORE_EVENT_MOUSE_MOVE, _e_dnd_cb_mouse_move, NULL);
|
||||
E_LIST_HANDLER_APPEND(_event_handlers, ECORE_X_EVENT_WINDOW_SHAPE, _e_dnd_cb_window_shape, NULL);
|
||||
E_LIST_HANDLER_APPEND(_event_handlers, ECORE_X_EVENT_XDND_ENTER, _e_dnd_cb_event_dnd_enter, NULL);
|
||||
E_LIST_HANDLER_APPEND(_event_handlers, ECORE_X_EVENT_XDND_LEAVE, _e_dnd_cb_event_dnd_leave, NULL);
|
||||
E_LIST_HANDLER_APPEND(_event_handlers, ECORE_X_EVENT_XDND_POSITION, _e_dnd_cb_event_dnd_position, NULL);
|
||||
|
@ -153,38 +148,16 @@ e_drag_new(E_Container *container, int x, int y,
|
|||
drag->layer = E_LAYER_DRAG;
|
||||
drag->container = container;
|
||||
e_object_ref(E_OBJECT(drag->container));
|
||||
drag->ecore_evas = e_canvas_new(drag->container->win,
|
||||
drag->x, drag->y, drag->w, drag->h, 1, 1,
|
||||
&(drag->evas_win));
|
||||
if (!e_config->use_shaped_win)
|
||||
ecore_evas_alpha_set(drag->ecore_evas, 1);
|
||||
else
|
||||
{
|
||||
/* avoid excess exposes when shaped - set damage avoid to 1 */
|
||||
ecore_evas_avoid_damage_set(drag->ecore_evas, 1);
|
||||
ecore_evas_shaped_set(drag->ecore_evas, 1);
|
||||
ecore_x_window_shape_events_select(drag->evas_win, 1);
|
||||
}
|
||||
|
||||
e_canvas_add(drag->ecore_evas);
|
||||
drag->shape = e_container_shape_add(drag->container);
|
||||
e_container_shape_move(drag->shape, drag->x, drag->y);
|
||||
e_container_shape_resize(drag->shape, drag->w, drag->h);
|
||||
drag->evas = e_comp_get(drag)->evas;
|
||||
drag->pop = e_popup_new(e_zone_current_get(container), x, y, drag->w, drag->h);
|
||||
|
||||
drag->evas = ecore_evas_get(drag->ecore_evas);
|
||||
e_container_window_raise(drag->container, drag->evas_win, drag->layer);
|
||||
|
||||
ecore_evas_name_class_set(drag->ecore_evas, "E", "_e_drag_window");
|
||||
ecore_evas_title_set(drag->ecore_evas, "E Drag");
|
||||
ecore_evas_ignore_events_set(drag->ecore_evas, 1);
|
||||
e_popup_name_set(drag->pop, "E Drag");
|
||||
e_popup_layer_set(drag->pop, E_COMP_CANVAS_LAYER_POPUP, 0);
|
||||
e_popup_ignore_events_set(drag->pop, 1);
|
||||
|
||||
drag->object = evas_object_rectangle_add(drag->evas);
|
||||
evas_object_color_set(drag->object, 255, 0, 0, 255);
|
||||
evas_object_show(drag->object);
|
||||
|
||||
evas_object_move(drag->object, 0, 0);
|
||||
evas_object_resize(drag->object, drag->w, drag->h);
|
||||
ecore_evas_resize(drag->ecore_evas, drag->w, drag->h);
|
||||
|
||||
drag->type = E_DRAG_NONE;
|
||||
|
||||
|
@ -219,7 +192,9 @@ e_drag_object_set(E_Drag *drag, Evas_Object *object)
|
|||
{
|
||||
if (drag->object) evas_object_del(drag->object);
|
||||
drag->object = object;
|
||||
evas_object_resize(drag->object, drag->w, drag->h);
|
||||
drag->pop->content = NULL;
|
||||
if (_drag_current == drag)
|
||||
e_popup_content_set(drag->pop, object);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
|
@ -228,7 +203,8 @@ e_drag_move(E_Drag *drag, int x, int y)
|
|||
if ((drag->x == x) && (drag->y == y)) return;
|
||||
drag->x = x;
|
||||
drag->y = y;
|
||||
drag->xy_update = 1;
|
||||
if (_drag_current == drag)
|
||||
e_popup_move(drag->pop, x, y);
|
||||
}
|
||||
|
||||
EAPI void
|
||||
|
@ -237,9 +213,8 @@ e_drag_resize(E_Drag *drag, int w, int h)
|
|||
if ((drag->w == w) && (drag->h == h)) return;
|
||||
drag->h = h;
|
||||
drag->w = w;
|
||||
evas_object_resize(drag->object, drag->w, drag->h);
|
||||
ecore_evas_resize(drag->ecore_evas, drag->w, drag->h);
|
||||
e_container_shape_resize(drag->shape, drag->w, drag->h);
|
||||
if (_drag_current == drag)
|
||||
e_popup_resize(drag->pop, w, h);
|
||||
}
|
||||
|
||||
EAPI int
|
||||
|
@ -265,7 +240,9 @@ e_drag_start(E_Drag *drag, int x, int y)
|
|||
ecore_x_window_free(_drag_win);
|
||||
return 0;
|
||||
}
|
||||
|
||||
e_popup_move_resize(drag->pop, drag->x, drag->y, drag->w, drag->h);
|
||||
e_popup_content_set(drag->pop, drag->object);
|
||||
drag->visible = 1;
|
||||
drag->type = E_DRAG_INTERNAL;
|
||||
|
||||
drag->dx = x - drag->x;
|
||||
|
@ -320,7 +297,9 @@ e_drag_xdnd_start(E_Drag *drag, int x, int y)
|
|||
ecore_x_window_free(_drag_win);
|
||||
return 0;
|
||||
}
|
||||
|
||||
e_popup_move_resize(drag->pop, drag->x, drag->y, drag->w, drag->h);
|
||||
e_popup_content_set(drag->pop, drag->object);
|
||||
drag->visible = 1;
|
||||
drag->type = E_DRAG_XDND;
|
||||
|
||||
drag->dx = x - drag->x;
|
||||
|
@ -489,74 +468,6 @@ e_drop_xdnd_register_set(Ecore_X_Window win, int reg)
|
|||
return 1;
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_drag_idler_before(void)
|
||||
{
|
||||
const Eina_List *l;
|
||||
E_Drag *drag;
|
||||
|
||||
EINA_LIST_FOREACH(_drag_list, l, drag)
|
||||
{
|
||||
if (drag->need_shape_export)
|
||||
{
|
||||
Ecore_X_Rectangle *rects, *orects;
|
||||
int num;
|
||||
|
||||
rects = ecore_x_window_shape_rectangles_get(drag->evas_win, &num);
|
||||
if (rects)
|
||||
{
|
||||
int changed;
|
||||
|
||||
changed = 1;
|
||||
if ((num == drag->shape_rects_num) && (drag->shape_rects))
|
||||
{
|
||||
int i;
|
||||
|
||||
orects = drag->shape_rects;
|
||||
for (i = 0; i < num; i++)
|
||||
{
|
||||
if ((orects[i].x != rects[i].x) ||
|
||||
(orects[i].y != rects[i].y) ||
|
||||
(orects[i].width != rects[i].width) ||
|
||||
(orects[i].height != rects[i].height))
|
||||
{
|
||||
changed = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// TODO: This is meaningless
|
||||
changed = 0;
|
||||
}
|
||||
if (changed)
|
||||
{
|
||||
E_FREE(drag->shape_rects);
|
||||
drag->shape_rects = rects;
|
||||
drag->shape_rects_num = num;
|
||||
e_container_shape_rects_set(drag->shape, rects, num);
|
||||
}
|
||||
else
|
||||
free(rects);
|
||||
}
|
||||
else
|
||||
{
|
||||
E_FREE(drag->shape_rects);
|
||||
drag->shape_rects = NULL;
|
||||
drag->shape_rects_num = 0;
|
||||
e_container_shape_rects_set(drag->shape, NULL, 0);
|
||||
}
|
||||
drag->need_shape_export = 0;
|
||||
if (drag->visible)
|
||||
e_container_shape_show(drag->shape);
|
||||
}
|
||||
if (drag->xy_update)
|
||||
{
|
||||
ecore_evas_move(drag->ecore_evas, drag->x, drag->y);
|
||||
e_container_shape_move(drag->shape, drag->x, drag->y);
|
||||
drag->xy_update = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
EAPI void
|
||||
e_drop_handler_responsive_set(E_Drop_Handler *handler)
|
||||
{
|
||||
|
@ -650,26 +561,6 @@ e_dnd_util_text_uri_list_convert(char *data, int size)
|
|||
|
||||
/* local subsystem functions */
|
||||
|
||||
static void
|
||||
_e_drag_show(E_Drag *drag)
|
||||
{
|
||||
if (drag->visible) return;
|
||||
drag->visible = 1;
|
||||
evas_object_show(drag->object);
|
||||
ecore_evas_show(drag->ecore_evas);
|
||||
e_container_shape_show(drag->shape);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_drag_hide(E_Drag *drag)
|
||||
{
|
||||
if (!drag->visible) return;
|
||||
drag->visible = 0;
|
||||
evas_object_hide(drag->object);
|
||||
ecore_evas_hide(drag->ecore_evas);
|
||||
e_container_shape_hide(drag->shape);
|
||||
}
|
||||
|
||||
static void
|
||||
_e_drag_move(E_Drag *drag, int x, int y)
|
||||
{
|
||||
|
@ -682,7 +573,7 @@ _e_drag_move(E_Drag *drag, int x, int y)
|
|||
|
||||
drag->x = x - drag->dx;
|
||||
drag->y = y - drag->dy;
|
||||
drag->xy_update = 1;
|
||||
e_popup_move(drag->pop, drag->x, drag->y);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -700,10 +591,9 @@ _e_drag_coords_update(const E_Drop_Handler *h, int *dx, int *dy)
|
|||
|
||||
case E_GADCON_TYPE:
|
||||
gc = (E_Gadcon *)h->obj;
|
||||
e_gadcon_canvas_zone_geometry_get(gc, &px, &py, NULL, NULL);
|
||||
if (!gc->toolbar) break;
|
||||
px += gc->toolbar->fwin->x;
|
||||
py += gc->toolbar->fwin->y;
|
||||
if (!gc->toolbar) return;
|
||||
px = gc->toolbar->fwin->x;
|
||||
py = gc->toolbar->fwin->y;
|
||||
break;
|
||||
|
||||
case E_GADCON_CLIENT_TYPE:
|
||||
|
@ -754,14 +644,28 @@ _e_drag_win_get(const E_Drop_Handler *h, int xdnd)
|
|||
{
|
||||
switch (h->obj->type)
|
||||
{
|
||||
E_Gadcon *gc;
|
||||
|
||||
case E_GADCON_TYPE:
|
||||
if (xdnd) hwin = e_gadcon_xdnd_window_get((E_Gadcon *)(h->obj));
|
||||
else hwin = e_gadcon_dnd_window_get((E_Gadcon *)(h->obj));
|
||||
gc = (E_Gadcon *)h->obj;
|
||||
|
||||
if (gc->toolbar) hwin = gc->toolbar->fwin->border->win; //double check for xdnd...
|
||||
else
|
||||
{
|
||||
if (xdnd) hwin = e_gadcon_xdnd_window_get(gc);
|
||||
else hwin = e_gadcon_dnd_window_get(gc);
|
||||
}
|
||||
break;
|
||||
|
||||
case E_GADCON_CLIENT_TYPE:
|
||||
if (xdnd) hwin = e_gadcon_xdnd_window_get(((E_Gadcon_Client *)(h->obj))->gadcon);
|
||||
else hwin = e_gadcon_dnd_window_get(((E_Gadcon_Client *)(h->obj))->gadcon);
|
||||
gc = ((E_Gadcon_Client *)(h->obj))->gadcon;
|
||||
|
||||
if (gc->toolbar) hwin = gc->toolbar->fwin->border->win; //double check for xdnd...
|
||||
else
|
||||
{
|
||||
if (xdnd) hwin = e_gadcon_xdnd_window_get(gc);
|
||||
else hwin = e_gadcon_dnd_window_get(gc);
|
||||
}
|
||||
break;
|
||||
|
||||
case E_WIN_TYPE:
|
||||
|
@ -847,13 +751,32 @@ _e_drag_win_hide(E_Drop_Handler *h)
|
|||
}
|
||||
}
|
||||
|
||||
static unsigned int
|
||||
_e_dnd_object_layer_get(E_Object *obj)
|
||||
{
|
||||
unsigned int adjust = 0;
|
||||
if (!obj) return 0;
|
||||
switch (obj->type)
|
||||
{
|
||||
case E_GADCON_CLIENT_TYPE:
|
||||
/* add 1 to ensure we're above a potential receiving gadcon */
|
||||
adjust = 1;
|
||||
default:
|
||||
adjust += e_comp_e_object_layer_get(obj);
|
||||
}
|
||||
return adjust;
|
||||
}
|
||||
|
||||
static int
|
||||
_e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action)
|
||||
{
|
||||
const Eina_List *l;
|
||||
Eina_List *entered = NULL;
|
||||
E_Event_Dnd_Enter enter_ev;
|
||||
E_Event_Dnd_Move move_ev;
|
||||
E_Event_Dnd_Leave leave_ev;
|
||||
E_Drop_Handler *h, *top = NULL;
|
||||
unsigned int top_layer = 0;
|
||||
int dx, dy;
|
||||
Ecore_X_Window win;
|
||||
int responsive = 0;
|
||||
|
@ -861,26 +784,64 @@ _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action)
|
|||
// double t1 = ecore_time_get(); ////
|
||||
if (_drag_current && !_xdnd)
|
||||
{
|
||||
win = ecore_evas_window_get(_drag_current->ecore_evas);
|
||||
win = e_comp_top_window_at_xy_get(e_comp_get(e_manager_find_by_root(root)), x, y, &win, 1);
|
||||
Ecore_X_Window ignore[1];
|
||||
ignore[0] = _drag_win;
|
||||
win = e_comp_top_window_at_xy_get(e_comp_get(_drag_current), x, y, ignore, 1);
|
||||
}
|
||||
else
|
||||
win = root;
|
||||
|
||||
if (_drag_current)
|
||||
{
|
||||
_e_drag_show(_drag_current);
|
||||
if (_drag_current->visible) e_popup_show(_drag_current->pop);
|
||||
else e_popup_hide(_drag_current->pop);
|
||||
_e_drag_move(_drag_current, x, y);
|
||||
}
|
||||
|
||||
if (_drag_current)
|
||||
EINA_LIST_FOREACH(_drop_handlers, l, h)
|
||||
{
|
||||
E_Drop_Handler *h;
|
||||
if (!h->active) continue;
|
||||
_e_drag_coords_update(h, &dx, &dy);
|
||||
enter_ev.x = x - dx;
|
||||
enter_ev.y = y - dy;
|
||||
enter_ev.data = NULL;
|
||||
enter_ev.action = action;
|
||||
move_ev.x = x - dx;
|
||||
move_ev.y = y - dy;
|
||||
move_ev.action = action;
|
||||
leave_ev.x = x - dx;
|
||||
leave_ev.y = y - dy;
|
||||
|
||||
EINA_LIST_FOREACH(_drop_handlers, l, h)
|
||||
if (E_INSIDE(enter_ev.x, enter_ev.y, h->x, h->y, h->w, h->h) &&
|
||||
((!_drag_current) || _e_drag_win_matches(h, win, 0)))
|
||||
entered = eina_list_append(entered, h);
|
||||
else
|
||||
{
|
||||
if (!h->active) continue;
|
||||
_e_drag_coords_update(h, &dx, &dy);
|
||||
if (h->entered)
|
||||
{
|
||||
if (h->cb.leave)
|
||||
h->cb.leave(h->cb.data, h->active_type, &leave_ev);
|
||||
if (_drag_current)
|
||||
_e_drag_win_hide(h);
|
||||
h->entered = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!entered) return 0;
|
||||
|
||||
EINA_LIST_FREE(entered, h)
|
||||
{
|
||||
unsigned int layer;
|
||||
E_Drop_Handler *h2;
|
||||
|
||||
_e_drag_coords_update(h, &dx, &dy);
|
||||
leave_ev.x = x - dx;
|
||||
leave_ev.y = y - dy;
|
||||
|
||||
layer = _e_dnd_object_layer_get(h->obj);
|
||||
if (!top)
|
||||
{
|
||||
top = h;
|
||||
top_layer = layer;
|
||||
enter_ev.x = x - dx;
|
||||
enter_ev.y = y - dy;
|
||||
enter_ev.data = NULL;
|
||||
|
@ -888,93 +849,58 @@ _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action)
|
|||
move_ev.x = x - dx;
|
||||
move_ev.y = y - dy;
|
||||
move_ev.action = action;
|
||||
leave_ev.x = x - dx;
|
||||
leave_ev.y = y - dy;
|
||||
|
||||
if (E_INSIDE(enter_ev.x, enter_ev.y, h->x, h->y, h->w, h->h) &&
|
||||
_e_drag_win_matches(h, win, 0))
|
||||
{
|
||||
if (e_drop_handler_responsive_get(h)) responsive = 1;
|
||||
|
||||
if (!h->entered)
|
||||
{
|
||||
_e_drag_win_show(h);
|
||||
if (h->cb.enter)
|
||||
{
|
||||
if (_drag_current->cb.convert)
|
||||
{
|
||||
enter_ev.data = _drag_current->cb.convert(_drag_current,
|
||||
h->active_type);
|
||||
}
|
||||
else
|
||||
enter_ev.data = _drag_current->data;
|
||||
h->cb.enter(h->cb.data, h->active_type, &enter_ev);
|
||||
}
|
||||
h->entered = 1;
|
||||
}
|
||||
if (h->cb.move)
|
||||
h->cb.move(h->cb.data, h->active_type, &move_ev);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (h->entered)
|
||||
{
|
||||
if (h->cb.leave)
|
||||
h->cb.leave(h->cb.data, h->active_type, &leave_ev);
|
||||
_e_drag_win_hide(h);
|
||||
h->entered = 0;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
else if (_xdnd)
|
||||
{
|
||||
E_Drop_Handler *h;
|
||||
|
||||
EINA_LIST_FOREACH(_drop_handlers, l, h)
|
||||
if (layer > top_layer)
|
||||
{
|
||||
if (!h->active) continue;
|
||||
_e_drag_coords_update(h, &dx, &dy);
|
||||
h2 = top, top = h, h = h2;
|
||||
enter_ev.x = x - dx;
|
||||
enter_ev.y = y - dy;
|
||||
enter_ev.data = NULL;
|
||||
enter_ev.action = action;
|
||||
move_ev.x = x - dx;
|
||||
move_ev.y = y - dy;
|
||||
move_ev.action = action;
|
||||
leave_ev.x = x - dx;
|
||||
leave_ev.y = y - dy;
|
||||
if (E_INSIDE(enter_ev.x, enter_ev.y, h->x, h->y, h->w, h->h) && _e_drag_win_matches(h, win, 1))
|
||||
{
|
||||
if (e_drop_handler_responsive_get(h)) responsive = 1;
|
||||
|
||||
if (!h->entered)
|
||||
{
|
||||
if (h->cb.enter)
|
||||
h->cb.enter(h->cb.data, h->active_type, &enter_ev);
|
||||
h->entered = 1;
|
||||
}
|
||||
if (h->cb.move)
|
||||
h->cb.move(h->cb.data, h->active_type, &move_ev);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (h->entered)
|
||||
{
|
||||
if (h->cb.leave)
|
||||
h->cb.leave(h->cb.data, h->active_type, &leave_ev);
|
||||
h->entered = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (h == top) continue;
|
||||
if (h->entered)
|
||||
{
|
||||
if (h->cb.leave)
|
||||
h->cb.leave(h->cb.data, h->active_type, &leave_ev);
|
||||
if (_drag_current)
|
||||
_e_drag_win_hide(h);
|
||||
h->entered = 0;
|
||||
}
|
||||
}
|
||||
|
||||
responsive = !!e_drop_handler_responsive_get(top);
|
||||
if (!top->entered)
|
||||
{
|
||||
_e_drag_win_show(top);
|
||||
if (top->cb.enter)
|
||||
{
|
||||
if (_drag_current)
|
||||
{
|
||||
if (_drag_current->cb.convert)
|
||||
{
|
||||
enter_ev.data = _drag_current->cb.convert(_drag_current,
|
||||
top->active_type);
|
||||
}
|
||||
else
|
||||
enter_ev.data = _drag_current->data;
|
||||
}
|
||||
top->cb.enter(top->cb.data, top->active_type, &enter_ev);
|
||||
}
|
||||
top->entered = 1;
|
||||
}
|
||||
if (top->cb.move)
|
||||
top->cb.move(top->cb.data, top->active_type, &move_ev);
|
||||
return responsive;
|
||||
// double t2 = ecore_time_get() - t1; ////
|
||||
// printf("DND UPDATE %3.7f\n", t2); ////
|
||||
}
|
||||
|
||||
static void
|
||||
_e_drag_end(Ecore_X_Window root, int x, int y)
|
||||
_e_drag_end(int x, int y)
|
||||
{
|
||||
E_Zone *zone;
|
||||
const Eina_List *l;
|
||||
|
@ -982,21 +908,22 @@ _e_drag_end(Ecore_X_Window root, int x, int y)
|
|||
int dx, dy;
|
||||
Ecore_X_Window win;
|
||||
E_Drag *tmp;
|
||||
E_Drop_Handler *h;
|
||||
int dropped;
|
||||
Ecore_X_Window ignore[1];
|
||||
|
||||
if (!_drag_current) return;
|
||||
win = ecore_evas_window_get(_drag_current->ecore_evas);
|
||||
win = e_comp_top_window_at_xy_get(e_comp_get(e_manager_find_by_root(root)), x, y, &win, 1);
|
||||
ignore[0] = _drag_win;
|
||||
win = e_comp_top_window_at_xy_get(e_comp_get(_drag_current), x, y, ignore, 1);
|
||||
zone = e_container_zone_at_point_get(_drag_current->container, x, y);
|
||||
/* Pass -1, -1, so that it is possible to drop at the edge. */
|
||||
if (zone) e_zone_flip_coords_handle(zone, -1, -1);
|
||||
|
||||
_e_drag_hide(_drag_current);
|
||||
e_popup_hide(_drag_current->pop);
|
||||
|
||||
e_grabinput_release(_drag_win, _drag_win);
|
||||
while (_drag_current->type == E_DRAG_XDND)
|
||||
{
|
||||
int dropped;
|
||||
|
||||
if (!(dropped = ecore_x_dnd_drop()))
|
||||
{
|
||||
if (win == e_comp_get(NULL)->ee_win) break;
|
||||
|
@ -1019,61 +946,12 @@ _e_drag_end(Ecore_X_Window root, int x, int y)
|
|||
|
||||
ecore_x_window_free(_drag_win);
|
||||
_drag_win = 0;
|
||||
dropped = 0;
|
||||
|
||||
if (_drag_current->data)
|
||||
{
|
||||
E_Drop_Handler *h;
|
||||
int dropped = 0;
|
||||
|
||||
EINA_LIST_FOREACH(_drop_handlers, l, h)
|
||||
{
|
||||
if (!h->active) continue;
|
||||
_e_drag_coords_update(h, &dx, &dy);
|
||||
ev.x = x - dx;
|
||||
ev.y = y - dy;
|
||||
if ((_e_drag_win_matches(h, win, 0)) &&
|
||||
((h->cb.drop) && (E_INSIDE(ev.x, ev.y, h->x, h->y, h->w, h->h))))
|
||||
{
|
||||
Eina_Bool need_free = EINA_FALSE;
|
||||
|
||||
if (_drag_current->cb.convert)
|
||||
{
|
||||
ev.data = _drag_current->cb.convert(_drag_current,
|
||||
h->active_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < _drag_current->num_types; i++)
|
||||
if (_drag_current->types[i] == _type_text_uri_list)
|
||||
{
|
||||
ev.data = e_dnd_util_text_uri_list_convert(_drag_current->data, _drag_current->data_size);
|
||||
need_free = EINA_TRUE;
|
||||
break;
|
||||
}
|
||||
if (!need_free)
|
||||
ev.data = _drag_current->data;
|
||||
}
|
||||
h->cb.drop(h->cb.data, h->active_type, &ev);
|
||||
if (need_free) E_FREE_LIST(ev.data, free);
|
||||
dropped = 1;
|
||||
}
|
||||
h->entered = 0;
|
||||
if (dropped) break;
|
||||
}
|
||||
if (_drag_current->cb.finished)
|
||||
_drag_current->cb.finished(_drag_current, dropped);
|
||||
|
||||
tmp = _drag_current;
|
||||
_drag_current = NULL;
|
||||
e_object_del(E_OBJECT(tmp));
|
||||
}
|
||||
else
|
||||
if (!_drag_current->data)
|
||||
{
|
||||
/* Just leave */
|
||||
E_Event_Dnd_Leave leave_ev;
|
||||
E_Drop_Handler *h;
|
||||
|
||||
/* FIXME: We don't need x and y in leave */
|
||||
leave_ev.x = 0;
|
||||
|
@ -1091,6 +969,50 @@ _e_drag_end(Ecore_X_Window root, int x, int y)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
EINA_LIST_FOREACH(_drop_handlers, l, h)
|
||||
{
|
||||
if (!h->active) continue;
|
||||
_e_drag_coords_update(h, &dx, &dy);
|
||||
ev.x = x - dx;
|
||||
ev.y = y - dy;
|
||||
if ((_e_drag_win_matches(h, win, 0)) &&
|
||||
((h->cb.drop) && (E_INSIDE(ev.x, ev.y, h->x, h->y, h->w, h->h))))
|
||||
{
|
||||
Eina_Bool need_free = EINA_FALSE;
|
||||
|
||||
if (_drag_current->cb.convert)
|
||||
{
|
||||
ev.data = _drag_current->cb.convert(_drag_current,
|
||||
h->active_type);
|
||||
}
|
||||
else
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < _drag_current->num_types; i++)
|
||||
if (_drag_current->types[i] == _type_text_uri_list)
|
||||
{
|
||||
ev.data = e_dnd_util_text_uri_list_convert(_drag_current->data, _drag_current->data_size);
|
||||
need_free = EINA_TRUE;
|
||||
break;
|
||||
}
|
||||
if (!need_free)
|
||||
ev.data = _drag_current->data;
|
||||
}
|
||||
h->cb.drop(h->cb.data, h->active_type, &ev);
|
||||
if (need_free) E_FREE_LIST(ev.data, free);
|
||||
dropped = 1;
|
||||
}
|
||||
h->entered = 0;
|
||||
if (dropped) break;
|
||||
}
|
||||
if (_drag_current->cb.finished)
|
||||
_drag_current->cb.finished(_drag_current, dropped);
|
||||
|
||||
tmp = _drag_current;
|
||||
_drag_current = NULL;
|
||||
e_object_del(E_OBJECT(tmp));
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -1180,35 +1102,14 @@ _e_drag_free(E_Drag *drag)
|
|||
|
||||
_drag_list = eina_list_remove(_drag_list, drag);
|
||||
|
||||
E_FREE(drag->shape_rects);
|
||||
drag->shape_rects_num = 0;
|
||||
e_object_unref(E_OBJECT(drag->container));
|
||||
e_container_shape_hide(drag->shape);
|
||||
e_object_del(E_OBJECT(drag->shape));
|
||||
evas_object_del(drag->object);
|
||||
e_canvas_del(drag->ecore_evas);
|
||||
ecore_evas_free(drag->ecore_evas);
|
||||
E_FREE_FUNC(drag->pop, e_object_del);
|
||||
for (i = 0; i < drag->num_types; i++)
|
||||
eina_stringshare_del(drag->types[i]);
|
||||
free(drag);
|
||||
ecore_x_window_shadow_tree_flush();
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_e_dnd_cb_window_shape(void *data __UNUSED__, int ev_type __UNUSED__, void *ev)
|
||||
{
|
||||
Ecore_X_Event_Window_Shape *e = ev;
|
||||
const Eina_List *l;
|
||||
E_Drag *drag;
|
||||
|
||||
EINA_LIST_FOREACH(_drag_list, l, drag)
|
||||
{
|
||||
if (drag->evas_win == e->win)
|
||||
drag->need_shape_export = 1;
|
||||
}
|
||||
return ECORE_CALLBACK_PASS_ON;
|
||||
}
|
||||
|
||||
static Eina_Bool
|
||||
_e_dnd_cb_key_down(void *data __UNUSED__, int type __UNUSED__, void *event)
|
||||
{
|
||||
|
@ -1249,7 +1150,7 @@ _e_dnd_cb_mouse_up(void *data __UNUSED__, int type __UNUSED__, void *event)
|
|||
ev = event;
|
||||
if (ev->window != _drag_win) return ECORE_CALLBACK_PASS_ON;
|
||||
|
||||
_e_drag_end(_drag_win_root, ev->x, ev->y);
|
||||
_e_drag_end(ev->x, ev->y);
|
||||
|
||||
return ECORE_CALLBACK_PASS_ON;
|
||||
}
|
||||
|
|
|
@ -38,22 +38,15 @@ struct _E_Drag
|
|||
} cb;
|
||||
|
||||
E_Container *container;
|
||||
Ecore_Evas *ecore_evas;
|
||||
Evas *evas;
|
||||
Ecore_X_Window evas_win;
|
||||
E_Container_Shape *shape;
|
||||
E_Popup *pop;
|
||||
Evas_Object *object;
|
||||
|
||||
int x, y, w, h;
|
||||
int dx, dy;
|
||||
|
||||
int shape_rects_num;
|
||||
Ecore_X_Rectangle *shape_rects;
|
||||
|
||||
E_Layer layer;
|
||||
unsigned char visible : 1;
|
||||
unsigned char need_shape_export : 1;
|
||||
unsigned char xy_update : 1;
|
||||
|
||||
unsigned int num_types;
|
||||
const char *types[];
|
||||
|
@ -72,6 +65,7 @@ struct _E_Drop_Handler
|
|||
} cb;
|
||||
|
||||
E_Object *obj;
|
||||
Evas_Object *base;
|
||||
int x, y, w, h;
|
||||
|
||||
unsigned char active : 1;
|
||||
|
@ -120,7 +114,6 @@ EAPI Evas *e_drag_evas_get(const E_Drag *drag);
|
|||
EAPI void e_drag_object_set(E_Drag *drag, Evas_Object *object);
|
||||
EAPI void e_drag_move(E_Drag *drag, int x, int y);
|
||||
EAPI void e_drag_resize(E_Drag *drag, int w, int h);
|
||||
EAPI void e_drag_idler_before(void);
|
||||
EAPI void e_drag_key_down_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_Event_Key *e));
|
||||
EAPI void e_drag_key_up_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_Event_Key *e));
|
||||
|
||||
|
@ -146,11 +139,20 @@ EAPI void e_drop_handler_responsive_set(E_Drop_Handler *handler);
|
|||
EAPI int e_drop_handler_responsive_get(const E_Drop_Handler *handler);
|
||||
EAPI void e_drop_handler_action_set(Ecore_X_Atom action);
|
||||
EAPI Ecore_X_Atom e_drop_handler_action_get(void);
|
||||
|
||||
EAPI Eina_List *e_dnd_util_text_uri_list_convert(char *data, int size);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
# define MIN(x, y) (((x) > (y)) ? (y) : (x))
|
||||
|
||||
static inline void
|
||||
e_drag_show(E_Drag *drag)
|
||||
{
|
||||
drag->visible = 1;
|
||||
}
|
||||
|
||||
static inline void
|
||||
e_drag_hide(E_Drag *drag)
|
||||
{
|
||||
drag->visible = 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
#endif
|
||||
|
|
|
@ -7583,6 +7583,7 @@ _e_fm2_cb_icon_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNU
|
|||
edje_object_signal_emit(o, "e,state,selected", "e");
|
||||
edje_object_signal_emit(o2, "e,state,selected", "e");
|
||||
e_drag_object_set(d, o);
|
||||
e_popup_object_add(d->pop, o2);
|
||||
edje_object_signal_emit(o, "e,state,move", "e");
|
||||
e_drag_resize(d, w, h);
|
||||
evas_object_smart_callback_call(ic->sd->obj, "dnd_begin", &ic->info);
|
||||
|
|
|
@ -2309,6 +2309,7 @@ _e_gadcon_client_drag_begin(E_Gadcon_Client *gcc, int x, int y)
|
|||
e_drag_object_set(drag, o);
|
||||
e_drag_resize(drag, w, h);
|
||||
e_drag_start(drag, x + w / 2, y + h / 2);
|
||||
e_drag_hide(drag);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -2523,7 +2524,7 @@ _e_gadcon_client_move_start(E_Gadcon_Client *gcc)
|
|||
evas_pointer_canvas_xy_get(gcc->gadcon->evas, &gcc->dx, &gcc->dy);
|
||||
else
|
||||
{
|
||||
ecore_x_pointer_xy_get(gcc->gadcon->zone->container->win, &gcc->dx, &gcc->dy);
|
||||
ecore_x_pointer_xy_get(e_comp_get(gcc)->ee_win, &gcc->dx, &gcc->dy);
|
||||
e_gadcon_canvas_zone_geometry_get(gcc->gadcon, &gcx, &gcy, NULL, NULL);
|
||||
evas_object_geometry_get(gcc->gadcon->o_container, &gx, &gy, NULL, NULL);
|
||||
gcc->dx -= (gcx + gx);
|
||||
|
@ -2595,7 +2596,8 @@ _e_gadcon_client_move_go(E_Gadcon_Client *gcc)
|
|||
|
||||
if (e_gadcon_layout_orientation_get(gcc->gadcon->o_container))
|
||||
{
|
||||
if (cy + e_config->drag_resist < 0 || cy - e_config->drag_resist >= gh)
|
||||
if ((cy + e_config->drag_resist < 0 || cy - e_config->drag_resist >= gh) ||
|
||||
(cx + e_config->drag_resist < 0 || cx - e_config->drag_resist > gw))
|
||||
{
|
||||
_e_gadcon_client_drag_begin(gcc, cx, cy);
|
||||
return;
|
||||
|
@ -2610,7 +2612,7 @@ _e_gadcon_client_move_go(E_Gadcon_Client *gcc)
|
|||
changes = 1;
|
||||
}
|
||||
/* DRAG LEFT */
|
||||
else if (x < 0 && (gcc->drag.x - cx < gcc->config.pos))
|
||||
else if (x < 0 && (cx + gcc->drag.x < gcc->config.pos))
|
||||
{
|
||||
if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_DEC)
|
||||
gcc->state_info.resist = 0;
|
||||
|
@ -2632,12 +2634,14 @@ _e_gadcon_client_move_go(E_Gadcon_Client *gcc)
|
|||
}
|
||||
else
|
||||
{
|
||||
if (cx + e_config->drag_resist < 0 || cx - e_config->drag_resist > gw)
|
||||
if ((cy + e_config->drag_resist < 0 || cy - e_config->drag_resist >= gh) ||
|
||||
(cx + e_config->drag_resist < 0 || cx - e_config->drag_resist > gw))
|
||||
{
|
||||
_e_gadcon_client_drag_begin(gcc, cx, cy);
|
||||
return;
|
||||
}
|
||||
|
||||
/* DRAG DOWN */
|
||||
if (y > 0 && (cy + gcc->drag.y > gcc->config.pos))
|
||||
{
|
||||
if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_INC)
|
||||
|
@ -2645,6 +2649,7 @@ _e_gadcon_client_move_go(E_Gadcon_Client *gcc)
|
|||
gcc->state_info.state = E_LAYOUT_ITEM_STATE_POS_INC;
|
||||
changes = 1;
|
||||
}
|
||||
/* DRAG UP */
|
||||
else if (y < 0 && (cy + gcc->drag.y < gcc->config.pos))
|
||||
{
|
||||
if (gcc->state_info.state != E_LAYOUT_ITEM_STATE_POS_DEC)
|
||||
|
@ -2865,7 +2870,7 @@ _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
|
|||
if ((!gcc->hidden) && (gcc->gadcon == gc))
|
||||
{
|
||||
if (gc->dnd_enter_cb) gc->dnd_enter_cb(gc, gc->drag_gcc);
|
||||
evas_object_hide(gc->drag_gcc->drag.drag->object);
|
||||
e_drag_hide(gc->drag_gcc->drag.drag);
|
||||
return;
|
||||
}
|
||||
if (gcc->gadcon != gc)
|
||||
|
@ -2873,7 +2878,7 @@ _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
|
|||
else if (e_gadcon_site_is_desktop(gcc->gadcon->location->site))
|
||||
{
|
||||
e_gadcon_client_show(gc->drag_gcc);
|
||||
evas_object_hide(gc->drag_gcc->drag.drag->object);
|
||||
e_drag_hide(gc->drag_gcc->drag.drag);
|
||||
if (gc->dnd_enter_cb) gc->dnd_enter_cb(gc, gc->drag_gcc);
|
||||
return;
|
||||
}
|
||||
|
@ -2957,7 +2962,7 @@ _e_gadcon_cb_dnd_enter(void *data, const char *type __UNUSED__, void *event)
|
|||
}
|
||||
}
|
||||
|
||||
evas_object_hide(gc->drag_gcc->drag.drag->object);
|
||||
e_drag_hide(gc->drag_gcc->drag.drag);
|
||||
e_gadcon_client_edit_begin(gc->new_gcc);
|
||||
e_gadcon_client_autoscroll_set(gc->new_gcc, gcc->autoscroll);
|
||||
/* e_gadcon_client_resizable_set(gc->new_gcc, gcc->resizable);*/
|
||||
|
@ -3040,7 +3045,7 @@ _e_gadcon_cb_dnd_leave(void *data, const char *type __UNUSED__, void *event __UN
|
|||
//INF("DELETING new_gcc");
|
||||
e_object_del(E_OBJECT(gc->new_gcc));
|
||||
gc->new_gcc = NULL;
|
||||
evas_object_show(gc->drag_gcc->drag.drag->object);
|
||||
e_drag_show(gc->drag_gcc->drag.drag);
|
||||
if (gc->dnd_leave_cb) gc->dnd_leave_cb(gc, gc->drag_gcc);
|
||||
}
|
||||
|
||||
|
|
|
@ -1900,7 +1900,6 @@ _e_main_cb_idle_before(void *data __UNUSED__)
|
|||
e_menu_idler_before();
|
||||
e_focus_idler_before();
|
||||
e_border_idler_before();
|
||||
e_drag_idler_before();
|
||||
e_pointer_idler_before();
|
||||
EINA_LIST_FOREACH(_idle_before_list, l, eb)
|
||||
{
|
||||
|
|
|
@ -1473,8 +1473,8 @@ on_move(void *data, Evas_Object *o __UNUSED__, const char *em __UNUSED__, const
|
|||
|
||||
e_drag_object_set(drag, o);
|
||||
e_drag_resize(drag, ow, oh);
|
||||
evas_object_hide(o);
|
||||
e_drag_start(drag, mx, my);
|
||||
e_drag_hide(drag);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
Loading…
Reference in New Issue