pager dnd is now significantly more awesome

This commit is contained in:
Mike Blumenkrantz 2013-05-30 09:42:29 +01:00
parent 36d45c65ef
commit 9a24c85571
1 changed files with 48 additions and 20 deletions

View File

@ -82,7 +82,6 @@ struct _Pager_Win
Pager *from_pager;
unsigned char start : 1;
unsigned char in_pager : 1;
unsigned char no_place : 1;
unsigned char desktop : 1;
int x, y, dx, dy, button;
} drag;
@ -1838,14 +1837,6 @@ _pager_window_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __U
pw->drag.dy = oy - ev->canvas.y;
pw->drag.start = 1;
pw->drag.button = ev->button;
#if 0
/* FIXME: disable move in pager for now, as dropping in between
desks causes lost window */
pw->drag.no_place = 0;
if (ev->button == pager_config->btn_noplace) pw->drag.no_place = 1;
#else
pw->drag.no_place = 1;
#endif
}
}
@ -1869,6 +1860,8 @@ _pager_window_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNU
{
if (!pw->drag.from_pager)
{
edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
e_comp_win_effect_unclip(pw->border->cw);
if (!pw->drag.start) p->just_dragged = 1;
pw->drag.in_pager = 0;
pw->drag.start = 0;
@ -1911,6 +1904,9 @@ _pager_window_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __U
pw->desk->pager->dragging = 1;
pw->drag.start = 0;
e_comp_win_effect_clip(pw->border->cw);
edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,in", "e");
pw->desk->pager->active_drop_pd = pw->desk;
}
/* dragging this win around inside the pager */
@ -1922,17 +1918,28 @@ _pager_window_cb_mouse_move(void *data, Evas *e __UNUSED__, Evas_Object *obj __U
/* find desk at pointer */
pd = _pager_desk_at_coord(pw->desk->pager, mx, my);
if ((pd) && (!pw->drag.no_place))
if (pd)
{
int zx, zy;
int zx, zy, zw, zh;
e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, NULL, NULL);
e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh);
e_layout_coord_canvas_to_virtual(pd->o_layout,
mx + pw->drag.dx,
my + pw->drag.dy, &vx, &vy);
if (pd != pw->desk)
e_border_desk_set(pw->border, pd->desk);
e_border_move(pw->border, vx + zx, vy + zy);
{
edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
if (pd->desk != e_desk_current_get(pd->desk->zone))
e_border_hide(pw->border, 2);
else
e_border_show(pw->border);
e_border_desk_set(pw->border, pd->desk);
edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e");
pd->pager->active_drop_pd = pd;
}
mx = E_CLAMP(vx + zx, zx, zx + zw - pw->border->w);
my = E_CLAMP(vy + zy, zy, zy + zh - pw->border->h);
e_border_move(pw->border, mx, my);
}
else
{
@ -2033,9 +2040,14 @@ _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
if (!(pw->border->lock_user_stacking)) e_border_raise(pw->border);
}
if (pw->desk->pager->active_drop_pd)
{
edje_object_signal_emit(pw->desk->pager->active_drop_pd->o_desk, "e,action,drag,out", "e");
pw->desk->pager->active_drop_pd = NULL;
}
if (pw->drag.from_pager) pw->drag.from_pager->dragging = 0;
pw->drag.from_pager = NULL;
e_comp_win_effect_unclip(pw->border->cw);
if (act_popup)
{
e_grabinput_get(input_window, 0, input_window);
@ -2171,24 +2183,30 @@ _pager_drop_cb_drop(void *data, const char *type, void *event_info)
E_Maximize max = bd->maximized;
E_Fullscreen fs = bd->fullscreen_policy;
Eina_Bool fullscreen = bd->fullscreen;
if (bd->iconic) e_border_uniconify(bd);
if (bd->maximized)
e_border_unmaximize(bd, E_MAXIMIZE_BOTH);
if (fullscreen) e_border_unfullscreen(bd);
if (pd->desk != e_desk_current_get(pd->desk->zone))
e_border_hide(bd, 2);
e_border_desk_set(bd, pd->desk);
e_border_raise(bd);
if ((!pw) || ((pw) && (!pw->drag.no_place)))
if ((!max) && (!fullscreen))
{
int zx, zy;
int zx, zy, zw, zh, mx, my;
e_layout_coord_canvas_to_virtual(pd->o_layout,
ev->x + dx,
ev->y + dy,
&nx, &ny);
e_zone_useful_geometry_get(pd->desk->zone,
&zx, &zy, NULL, NULL);
&zx, &zy, &zw, &zh);
e_border_move(bd, nx + zx, ny + zy);
mx = E_CLAMP(nx + zx, zx, zx + zw - bd->w);
my = E_CLAMP(ny + zy, zy, zy + zh - bd->h);
e_border_move(bd, mx, my);
}
if (max) e_border_maximize(bd, max);
if (fullscreen) e_border_fullscreen(bd, fs);
@ -2230,6 +2248,11 @@ _pager_desk_cb_mouse_down(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNU
pd->drag.y = ev->canvas.y;
pd->drag.button = ev->button;
}
else
{
pd->drag.dx = pd->drag.dy = pd->drag.x = pd->drag.y = 0;
}
pd->pager->just_dragged = 0;
}
static void
@ -2253,8 +2276,8 @@ _pager_desk_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSE
e_desk_show(pd->desk);
pd->drag.start = 0;
pd->drag.in_pager = 0;
p->active_drop_pd = NULL;
}
pd->pager->just_dragged = 0;
if ((p->popup) && (p->popup->urgent)) _pager_popup_free(p->popup);
}
@ -2379,6 +2402,11 @@ _pager_desk_cb_drag_finished(E_Drag *drag, int dropped)
pd->drag.from_pager->dragging = 0;
pd->drag.from_pager->just_dragged = 0;
}
if (pd->pager->active_drop_pd)
{
edje_object_signal_emit(pd->pager->active_drop_pd->o_desk, "e,action,drag,out", "e");
pd->pager->active_drop_pd = NULL;
}
pd->drag.from_pager = NULL;
if (act_popup)