discomfitor pushed a commit to branch master.
commit 9a24c85571af566e802edd5faa3cf42d29bea7c3
Author: Mike Blumenkrantz <[email protected]>
Date: Thu May 30 09:42:29 2013 +0100
pager dnd is now significantly more awesome
---
src/modules/pager/e_mod_main.c | 68 +++++++++++++++++++++++++++++-------------
1 file changed, 48 insertions(+), 20 deletions(-)
diff --git a/src/modules/pager/e_mod_main.c b/src/modules/pager/e_mod_main.c
index 3a436c2..e2b0cde 100644
--- a/src/modules/pager/e_mod_main.c
+++ b/src/modules/pager/e_mod_main.c
@@ -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)
--
------------------------------------------------------------------------------
Introducing AppDynamics Lite, a free troubleshooting tool for Java/.NET
Get 100% visibility into your production application - at no cost.
Code-level diagnostics for performance bottlenecks with <2% overhead
Download for free and get started troubleshooting in minutes.
http://p.sf.net/sfu/appdyn_d2d_ap1