discomfitor pushed a commit to branch master.

http://git.enlightenment.org/core/enlightenment.git/commit/?id=e58bf33d38f26bad128b151fe3e5fd9c7b8b9de7

commit e58bf33d38f26bad128b151fe3e5fd9c7b8b9de7
Author: Mike Blumenkrantz <zm...@samsung.com>
Date:   Wed Jan 15 18:50:25 2014 -0500

    redo pager16 window dragging
    
    T784, T777
---
 src/modules/pager16/e_mod_main.c | 287 +++++++++++++++++----------------------
 1 file changed, 128 insertions(+), 159 deletions(-)

diff --git a/src/modules/pager16/e_mod_main.c b/src/modules/pager16/e_mod_main.c
index 5168d1f..b806b7a 100644
--- a/src/modules/pager16/e_mod_main.c
+++ b/src/modules/pager16/e_mod_main.c
@@ -49,6 +49,7 @@ struct _Pager
    unsigned char   just_dragged : 1;
    Evas_Coord      dnd_x, dnd_y;
    Pager_Desk     *active_drop_pd;
+   E_Client       *active_drag_client;
    Eina_Bool invert : 1;
 };
 
@@ -108,7 +109,6 @@ static Eina_Bool        
_pager_cb_event_desk_name_change(void *data __UNUSED__,
 static Eina_Bool        _pager_cb_event_compositor_resize(void *data 
__UNUSED__, int type __UNUSED__, void *event);
 static void             _pager_window_cb_del(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED);
 static void             _pager_window_cb_mouse_down(void *data, Evas *e 
__UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
-static void             _pager_window_cb_mouse_up(void *data, Evas *e 
__UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
 static void             _pager_window_cb_mouse_move(void *data, Evas *e 
__UNUSED__, Evas_Object *obj __UNUSED__, void *event_info);
 static void            *_pager_window_cb_drag_convert(E_Drag *drag, const char 
*type);
 static void             _pager_window_cb_drag_finished(E_Drag *drag, int 
dropped);
@@ -166,6 +166,35 @@ static Eina_List *pagers = NULL;
 
 Config *pager_config = NULL;
 
+
+static Pager_Win *
+_pager_desk_window_find(Pager_Desk *pd, E_Client *client)
+{
+   Eina_List *l;
+   Pager_Win *pw;
+
+   EINA_LIST_FOREACH(pd->wins, l, pw)
+     if (pw->client == client) return pw;
+
+   return NULL;
+}
+
+static Pager_Win *
+_pager_window_find(Pager *p, E_Client *client)
+{
+   Eina_List *l;
+   Pager_Desk *pd;
+
+   EINA_LIST_FOREACH(p->desks, l, pd)
+     {
+        Pager_Win *pw;
+
+        pw = _pager_desk_window_find(pd, client);
+        if (pw) return pw;
+     }
+   return NULL;
+}
+
 static E_Gadcon_Client *
 _gc_init(E_Gadcon *gc, const char *name, const char *id, const char *style)
 {
@@ -635,8 +664,6 @@ _pager_window_new(Pager_Desk *pd, Evas_Object *mirror, 
E_Client *client)
 
    evas_object_event_callback_add(mirror, EVAS_CALLBACK_MOUSE_DOWN,
                                   _pager_window_cb_mouse_down, pw);
-   evas_object_event_callback_add(mirror, EVAS_CALLBACK_MOUSE_UP,
-                                  _pager_window_cb_mouse_up, pw);
    evas_object_event_callback_add(mirror, EVAS_CALLBACK_MOUSE_MOVE,
                                   _pager_window_cb_mouse_move, pw);
    evas_object_event_callback_add(mirror, EVAS_CALLBACK_DEL,
@@ -990,6 +1017,7 @@ _pager_window_cb_mouse_down(void *data, Evas *e 
__UNUSED__, Evas_Object *obj __U
    pw = data;
 
    if (!pw) return;
+   pw->desk->pager->active_drag_client = NULL;
    if (pw->desk->pager->popup && !act_popup) return;
    if (!pw->desk->pager->popup && ev->button == 3) return;
    if (ev->button == (int)pager_config->btn_desk) return;
@@ -1006,36 +1034,7 @@ _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;
-     }
-}
-
-static void
-_pager_window_cb_mouse_up(void *data, Evas *e __UNUSED__, Evas_Object *obj 
__UNUSED__, void *event_info)
-{
-   Evas_Event_Mouse_Up *ev;
-   Pager_Win *pw;
-   Pager *p;
-
-   ev = event_info;
-   pw = data;
-   if (!pw) return;
-
-   p = pw->desk->pager;
-
-   if (pw->desk->pager->popup && !act_popup) return;
-   if (ev->button == (int)pager_config->btn_desk) return;
-   if ((ev->button == (int)pager_config->btn_drag) ||
-       (ev->button == (int)pager_config->btn_noplace))
-     {
-        if (!pw->drag.from_pager)
-          {
-             edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", 
"e");
-             e_comp_object_effect_unclip(pw->client->frame);
-             if (!pw->drag.start) p->just_dragged = 1;
-             pw->drag.in_pager = 0;
-             pw->drag.start = 0;
-             p->dragging = 0;
-          }
+        pw->desk->pager->active_drag_client = pw->client;
      }
 }
 
@@ -1051,8 +1050,6 @@ _pager_window_cb_mouse_move(void *data, Evas *e 
__UNUSED__, Evas_Object *obj __U
    { "enlightenment/pager_win", "enlightenment/border" };
    Evas_Coord dx, dy;
    unsigned int resist = 0;
-   Evas_Coord mx, my, vx, vy;
-   Pager_Desk *pd;
 
    ev = event_info;
    pw = data;
@@ -1060,87 +1057,50 @@ _pager_window_cb_mouse_move(void *data, Evas *e 
__UNUSED__, Evas_Object *obj __U
    if (!pw) return;
    if (pw->client->lock_user_location) return;
    if ((pw->desk->pager->popup) && (!act_popup)) return;
+
    /* prevent drag for a few pixels */
-   if (pw->drag.start)
-     {
-        dx = pw->drag.x - ev->cur.output.x;
-        dy = pw->drag.y - ev->cur.output.y;
-        if ((pw->desk) && (pw->desk->pager))
-          resist = pager_config->drag_resist;
+   if (!pw->drag.start) return;
 
-        if (((unsigned int)(dx * dx) + (unsigned int)(dy * dy)) <=
-            (resist * resist)) return;
+   dx = pw->drag.x - ev->cur.output.x;
+   dy = pw->drag.y - ev->cur.output.y;
+   if ((pw->desk) && (pw->desk->pager))
+     resist = pager_config->drag_resist;
 
-        pw->desk->pager->dragging = 1;
-        pw->drag.start = 0;
-        e_comp_object_effect_clip(pw->client->frame);
-        edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,in", "e");
-        pw->desk->pager->active_drop_pd = pw->desk;
-     }
+   if (((unsigned int)(dx * dx) + (unsigned int)(dy * dy)) <=
+       (resist * resist)) return;
 
-   /* dragging this win around inside the pager */
-   if (pw->drag.in_pager)
-     {
-        /* m for mouse */
-        mx = ev->cur.canvas.x;
-        my = ev->cur.canvas.y;
+   pw->desk->pager->dragging = 1;
+   pw->drag.start = 0;
+   e_comp_object_effect_clip(pw->client->frame);
+   edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,in", "e");
+   pw->desk->pager->active_drop_pd = pw->desk;
 
-        /* find desk at pointer */
-        pd = _pager_desk_at_coord(pw->desk->pager, mx, my);
-        if (pd)
-          {
-             int zx, zy, zw, zh;
+   evas_object_geometry_get(pw->o_mirror, &x, &y, &w, &h);
+   evas_object_hide(pw->o_mirror);
 
-             e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh);
-             e_deskmirror_coord_canvas_to_virtual(pd->o_layout,
-                                              mx + pw->drag.dx,
-                                              my + pw->drag.dy, &vx, &vy);
-             if (pd->pager->active_drop_pd != pd)
-               {
-                  edje_object_signal_emit(pw->desk->o_desk, 
"e,action,drag,out", "e");
-                  pw->client->hidden = 0;
-                  e_client_desk_set(pw->client, 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->client->w);
-             my = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h);
-             fprintf(stderr, "MOVE %d,%d\n", mx, my);
-             evas_object_move(pw->client->frame, mx, my);
-          }
-        else
-          {
-             evas_object_geometry_get(pw->o_mirror, &x, &y, &w, &h);
-             evas_object_hide(pw->o_mirror);
-
-             drag = e_drag_new(pw->client->comp,
-                               x, y, drag_types, 2, pw, -1,
-                               _pager_window_cb_drag_convert,
-                               _pager_window_cb_drag_finished);
+   drag = e_drag_new(pw->client->comp,
+                     x, y, drag_types, 2, pw->desk->pager, -1,
+                     _pager_window_cb_drag_convert,
+                     _pager_window_cb_drag_finished);
 
-             o = e_deskmirror_mirror_copy(pw->o_mirror);
-             evas_object_show(o);
-
-             e_drag_object_set(drag, o);
-             e_drag_resize(drag, w, h);
-             e_drag_start(drag, x - pw->drag.dx, y - pw->drag.dy);
+   /* this is independent of the original mirror */
+   o = e_deskmirror_mirror_copy(pw->o_mirror);
+   evas_object_show(o);
 
-             /* this prevents the desk from switching on drags */
-             pw->drag.from_pager = pw->desk->pager;
-             pw->drag.from_pager->dragging = 1;
-             pw->drag.in_pager = 0;
-          }
-     }
+   e_drag_object_set(drag, o);
+   e_drag_resize(drag, w, h);
+   e_drag_show(drag);
+   e_drag_start(drag, x - pw->drag.dx, y - pw->drag.dy);
 }
 
 static void *
 _pager_window_cb_drag_convert(E_Drag *drag, const char *type)
 {
-   Pager_Win *pw;
+   Pager *p;
 
-   pw = drag->data;
-   if (!strcmp(type, "enlightenment/pager_win")) return pw;
-   if (!strcmp(type, "enlightenment/border")) return pw->client;
+   p = drag->data;
+   if (!strcmp(type, "enlightenment/pager_win")) return _pager_window_find(p, 
p->active_drag_client);
+   if (!strcmp(type, "enlightenment/border")) return p->active_drag_client;
    return NULL;
 }
 
@@ -1148,65 +1108,39 @@ static void
 _pager_window_cb_drag_finished(E_Drag *drag, int dropped)
 {
    Pager_Win *pw;
-   E_Comp *comp;
-   E_Zone *zone;
-   E_Desk *desk;
-   int x, y, dx, dy;
+   Pager *p;
 
-   pw = drag->data;
+   p = drag->data;
+   if (!p) return;
+   pw = _pager_window_find(p, p->active_drag_client);
    if (!pw) return;
+   p->active_drag_client = NULL;
    evas_object_show(pw->o_mirror);
-   if (!dropped)
+   if (dropped)
+     {
+        /* be helpful */
+        if (pw->client->desk->visible && (!e_client_focused_get()))
+          evas_object_focus_set(pw->client->frame, 1);
+     }
+   else
      {
-        int zx, zy, zw, zh;
-
-        /* wasn't dropped (on pager). move it to position of mouse on screen */
-        comp = e_util_comp_current_get();
-        zone = e_zone_current_get(comp);
-        desk = e_desk_current_get(zone);
-
-        e_client_zone_set(pw->client, zone);
-        if ((pw->client->desk != desk) && desk->visible)
-          {
-             pw->client->hidden = 0;
-             e_client_desk_set(pw->client, desk);
-          }
-
-        ecore_x_pointer_last_xy_get(&x, &y);
-
-        dx = (pw->client->w / 2);
-        dy = (pw->client->h / 2);
-
-        e_zone_useful_geometry_get(zone, &zx, &zy, &zw, &zh);
-
-        /* offset so that center of window is on mouse, but keep within desk 
bounds */
-        if (dx < x)
-          {
-             x -= dx;
-             if ((pw->client->w < zw) &&
-                 (x + pw->client->w > zx + zw))
-               x -= x + pw->client->w - (zx + zw);
-          }
-        else x = 0;
-
-        if (dy < y)
-          {
-             y -= dy;
-             if ((pw->client->h < zh) &&
-                 (y + pw->client->h > zy + zh))
-               y -= y + pw->client->h - (zy + zh);
-          }
-        else y = 0;
-        evas_object_move(pw->client->frame, x, y);
-
         if (!(pw->client->lock_user_stacking))
           evas_object_raise(pw->client->frame);
         evas_object_focus_set(pw->client->frame, 1);
      }
-   if (pw->desk->pager->active_drop_pd)
+   if (p->active_drop_pd)
+     {
+        edje_object_signal_emit(p->active_drop_pd->o_desk, 
"e,action,drag,out", "e");
+        if (!pw->drag.start) p->active_drop_pd->pager->just_dragged = 1;
+        p->active_drop_pd = NULL;
+     }
+   edje_object_signal_emit(pw->desk->o_desk, "e,action,drag,out", "e");
+   if (!pw->drag.from_pager)
      {
-        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.start) p->just_dragged = 1;
+        pw->drag.in_pager = 0;
+        pw->drag.button = pw->drag.start = 0;
+        p->dragging = 0;
      }
    if (pw->drag.from_pager) pw->drag.from_pager->dragging = 0;
    pw->drag.from_pager = NULL;
@@ -1231,16 +1165,52 @@ static void
 _pager_update_drop_position(Pager *p, Evas_Coord x, Evas_Coord y)
 {
    Pager_Desk *pd;
+   Pager_Win *pw = NULL;
+   Eina_Bool changed;
 
    p->dnd_x = x;
    p->dnd_y = y;
    pd = _pager_desk_at_coord(p, x, y);
-   if (pd == p->active_drop_pd) return;
+   changed = (pd != p->active_drop_pd);
+   if (changed)
+     {
+        if (pd)
+          edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e");
+        if (p->active_drop_pd)
+          edje_object_signal_emit(p->active_drop_pd->o_desk, 
"e,action,drag,out", "e");
+        p->active_drop_pd = pd;
+     }
    if (pd)
-     edje_object_signal_emit(pd->o_desk, "e,action,drag,in", "e");
-   if (p->active_drop_pd)
-     edje_object_signal_emit(p->active_drop_pd->o_desk, "e,action,drag,out", 
"e");
-   p->active_drop_pd = pd;
+     pw = _pager_desk_window_find(pd, p->active_drag_client);
+   if (!pw)
+     pw = _pager_window_find(p, p->active_drag_client);
+
+   if (!pw) return;
+   if (pd)
+     {
+        int zx, zy, zw, zh, vx, vy;
+
+        pw->drag.in_pager = 1;
+        //makes drags look weird
+        //e_zone_useful_geometry_get(pd->desk->zone, &zx, &zy, &zw, &zh);
+        zx = pd->desk->zone->x, zy = pd->desk->zone->y;
+        zw = pd->desk->zone->w, zh = pd->desk->zone->h;
+        e_deskmirror_coord_canvas_to_virtual(pd->o_layout,
+                                         x + pw->drag.dx,
+                                         y + pw->drag.dy, &vx, &vy);
+        pw->client->hidden = !pd->desk->visible;
+        e_client_desk_set(pw->client, pd->desk);
+        x = E_CLAMP(vx + zx, zx, zx + zw - pw->client->w);
+        y = E_CLAMP(vy + zy, zy, zy + zh - pw->client->h);
+        evas_object_move(pw->client->frame, x, y);
+     }
+   else
+     {
+        /* this prevents the desk from switching on drags */
+        pw->drag.from_pager = pw->desk->pager;
+        pw->drag.from_pager->dragging = 1;
+        pw->drag.in_pager = 0;
+     }
 }
 
 static void
@@ -1351,12 +1321,11 @@ _pager_drop_cb_drop(void *data, const char *type, void 
*event_info)
              if (ec->maximized)
                e_client_unmaximize(ec, E_MAXIMIZE_BOTH);
              if (fullscreen) e_client_unfullscreen(ec);
-             if (pd->desk->visible)
                ec->hidden = 0;
              e_client_desk_set(ec, pd->desk);
              evas_object_raise(ec->frame);
                   
-             if ((!max) && (!fullscreen))
+             if ((!pw) && ((!max) && (!fullscreen)))
                {
                   int zx, zy, zw, zh, mx, my;
 

-- 


Reply via email to