Enlightenment CVS committal

Author  : rephorm
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/modules/pager


Modified Files:
        e_mod_config.c e_mod_main.c e_mod_main.h 


Log Message:

better pager dragging
  * drag windows around within pager
  * dnd when going outside of the pager
  * window placed at location in pager of drop
  * window centered under mouse when dropped off of pager
  
  
I'm not sure yet to do with original window when dragging off the pager. Right 
now it stays at last "on pager" location, which is a bit ugly. Should it jump 
back to the original position? Or disappear entirely?

===================================================================
RCS file: /cvs/e/e17/apps/e/src/modules/pager/e_mod_config.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- e_mod_config.c      18 Mar 2006 16:46:00 -0000      1.16
+++ e_mod_config.c      29 Mar 2006 00:35:16 -0000      1.17
@@ -9,6 +9,7 @@
    int name_pos;
    int show_popup;
    double popup_speed;
+   int drag_resist;
 };
 
 /* Protos */
@@ -55,6 +56,7 @@
    
    cfdata->show_popup = p->conf->popup;
    cfdata->popup_speed = p->conf->popup_speed;
+   cfdata->drag_resist = p->conf->drag_resist;
 }
 
 static void *
@@ -141,6 +143,10 @@
    e_widget_framelist_object_append(of, ob);
    ob = e_widget_check_add(evas, _("Show Desktop Name"), &(cfdata->show_name));
    e_widget_framelist_object_append(of, ob);
+   ob = e_widget_label_add(evas, _("Resistance to Dragging Windows:"));
+   e_widget_framelist_object_append(of, ob);
+   ob = e_widget_slider_add(evas, 1, 0, _("%.0f px"), 0.0, 10.0, 1.0, 0, NULL, 
&(cfdata->drag_resist), 200);
+   e_widget_framelist_object_append(of, ob);
    e_widget_list_object_append(o, of, 1, 1, 0.5);
 
    of = e_widget_framelist_add(evas, _("Desktop Name Position"), 0);   
@@ -181,6 +187,7 @@
    if (!cfdata->show_name) 
      p->conf->deskname_pos = PAGER_DESKNAME_NONE;
    p->conf->popup_speed = cfdata->popup_speed;
+   p->conf->drag_resist = cfdata->drag_resist;
    
    e_border_button_bindings_grab_all();
    e_config_save_queue();
===================================================================
RCS file: /cvs/e/e17/apps/e/src/modules/pager/e_mod_main.c,v
retrieving revision 1.165
retrieving revision 1.166
diff -u -3 -r1.165 -r1.166
--- e_mod_main.c        12 Mar 2006 16:12:59 -0000      1.165
+++ e_mod_main.c        29 Mar 2006 00:35:16 -0000      1.166
@@ -34,6 +34,7 @@
 static Pager_Win  *_pager_face_border_find(Pager_Face *face, E_Border *border);
 static Pager_Win  *_pager_desk_border_find(Pager_Desk *pd, E_Border *border);
 static Pager_Desk *_pager_face_desk_find(Pager_Face *face, E_Desk *desk);
+static Pager_Desk *_pager_face_desk_at_coord(Pager_Face *face, Evas_Coord x, 
Evas_Coord y);
 static void        _pager_face_desk_select(Pager_Desk *pd);
 static void        _pager_popup_free(Pager_Popup *pp);
 
@@ -223,6 +224,7 @@
    E_CONFIG_VAL(D, T, deskname_pos, UINT);
    E_CONFIG_VAL(D, T, popup_speed, DOUBLE);
    E_CONFIG_VAL(D, T, popup, UINT);
+   E_CONFIG_VAL(D, T, drag_resist, UINT);
 
    pager->conf = e_config_domain_load("module.pager", _conf_edd);
 
@@ -232,6 +234,7 @@
        pager->conf->deskname_pos = PAGER_DESKNAME_NONE;
        pager->conf->popup_speed = 1.0;
        pager->conf->popup = 1;
+       pager->conf->drag_resist = 3;
      }
    E_CONFIG_LIMIT(pager->conf->deskname_pos, PAGER_DESKNAME_NONE, 
PAGER_DESKNAME_RIGHT);
    E_CONFIG_LIMIT(pager->conf->popup_speed, 0.1, 10.0);
@@ -830,6 +833,29 @@
    return NULL;
 }
 
+/**
+ * Return Pager_Desk at canvas coord x, y
+ */
+static Pager_Desk *
+_pager_face_desk_at_coord(Pager_Face *face, Evas_Coord x, Evas_Coord y)
+{
+   Evas_List *l;
+
+   for (l = face->desks; l; l = l->next)
+     {
+       Pager_Desk *pd;
+       Evas_Coord dx, dy, dw, dh;
+
+       pd = l->data;
+       evas_object_geometry_get(pd->desk_object, &dx, &dy, &dw, &dh);
+       if (E_INSIDE(x, y, dx, dy, dw, dh))
+         {
+            return pd;
+         }
+     }
+   return NULL;
+}
+
 static void
 _pager_face_desk_select(Pager_Desk *pd)
 {
@@ -1784,9 +1810,16 @@
    /* make this configurable */
    if (ev->button == 1)
      {
+       Evas_Coord ox, oy;
+
+       evas_object_geometry_get(pw->window_object, &ox, &oy, NULL, NULL);
+       pw->drag.in_pager = 1;
+
+       pw->drag.x = ev->canvas.x;
+       pw->drag.y = ev->canvas.y;
+       pw->drag.dx = ox - ev->canvas.x;
+       pw->drag.dy = oy - ev->canvas.y;
        pw->drag.start = 1;
-       pw->drag.x = -1;
-       pw->drag.y = -1;
      }
 }
 
@@ -1800,7 +1833,9 @@
    pw = data;
    if (!pw) return;
 
+   pw->drag.in_pager = 0;
    pw->drag.start = 0;
+   pw->desk->face->dragging = 0;
 }
 
 static void
@@ -1813,9 +1848,92 @@
    pw = data;
 
    if (!pw) return;
+
+   /* prevent drag for a few pixels */
    if (pw->drag.start)
      {
-#if 1
+       Evas_Coord dx, dy;
+       unsigned int resist = 0;
+
+       dx = pw->drag.x - ev->cur.output.x;
+       dy = pw->drag.y - ev->cur.output.y;
+       if (pw->desk && pw->desk->face && pw->desk->face->pager) 
+         resist = pw->desk->face->pager->conf->drag_resist;
+       
+       if (((dx * dx) + (dy * dy)) <= (resist * resist)) return;
+
+       pw->desk->face->dragging = 1;
+       pw->drag.start = 0;
+     }
+
+   /* dragging this win around inside the pager */
+   if (pw->drag.in_pager)
+     {
+       Evas_Coord mx, my, vx, vy;
+       Pager_Desk *desk;
+
+       /* m for mouse */
+       mx = ev->cur.canvas.x;
+       my = ev->cur.canvas.y;
+
+       /* find desk at pointer */
+       desk = _pager_face_desk_at_coord(pw->desk->face, mx, my);
+
+       if (desk)
+         {
+          e_layout_coord_canvas_to_virtual(desk->layout_object, mx + 
pw->drag.dx, my + pw->drag.dy, &vx, &vy);
+
+          if (desk != pw->desk) e_border_desk_set(pw->border, desk->desk);
+          e_border_move(pw->border, vx + desk->desk->zone->x, vy + 
desk->desk->zone->y);
+         }
+       else
+         {
+            /* not over a desk, start dnd drag */
+            if (pw->window_object)
+              {
+                 E_Drag *drag;
+                 Evas_Object *o, *oo;
+                 Evas_Coord x, y, w, h;
+                 const char *file, *part;
+                 const char *drag_types[] = { "enlightenment/pager_win" };
+
+                 evas_object_geometry_get(pw->window_object,
+                       &x, &y, &w, &h);
+
+                 /* XXX this relies on screen and canvas coords matching. is 
this a valid assumption? */
+                 drag = e_drag_new(pw->desk->face->zone->container, x, y,
+                                   drag_types, 1, pw, -1,
+                                   _pager_window_cb_drag_finished);
+
+                 
+                 o = edje_object_add(drag->evas);
+                 edje_object_file_get(pw->window_object, &file, &part);
+                 edje_object_file_set(o, file, part);
+
+                 oo = o;
+
+                 o = edje_object_add(drag->evas);
+                 edje_object_file_get(pw->icon_object, &file, &part);
+                 edje_object_file_set(o, file, part);
+                 edje_object_part_swallow(oo, "icon", o);
+
+                 e_drag_object_set(drag, oo);
+
+                 e_drag_resize(drag, w, h);
+                 e_drag_start(drag, x - pw->drag.dx, y - pw->drag.dy);
+
+                 /* this prevents the desk from switching on drags */
+                 pw->drag.from_face = pw->desk->face;
+                 pw->drag.from_face->dragging = 1;
+                 evas_event_feed_mouse_up(pw->desk->face->evas, 1,
+                       EVAS_BUTTON_NONE, ecore_time_get(), NULL);
+              }
+            pw->drag.in_pager = 0;
+         }
+     }
+
+#if 0
+     {
 //     printf("DRAG: %d\n", pw);
        if ((pw->drag.x == -1) && (pw->drag.y == -1))
          {
@@ -1873,9 +1991,8 @@
 
               }
          }
-
-#endif
      }
+#endif
 }
 
 static void
@@ -1885,7 +2002,55 @@
 
    pw = drag->data;
 
-   if (pw && pw->desk && pw->desk->face)
+   if (!pw) return;
+
+   if (!dropped)
+     {
+       /* wasn't dropped (on pager). move it to position of mouse on screen */
+       int x, y, dx, dy;
+       E_Container *cont;
+       E_Zone *zone;
+       E_Desk *desk;
+
+       cont = e_container_current_get(e_manager_current_get());
+       zone = e_zone_current_get(cont);
+       desk = e_desk_current_get(zone);
+
+       e_border_zone_set(pw->border, zone);
+       e_border_desk_set(pw->border, desk);
+
+       ecore_x_pointer_last_xy_get(&x, &y);
+       x = x + zone->x;
+       y = y + zone->y;
+
+       dx = (pw->border->w / 2);
+       dy = (pw->border->h / 2);
+
+       /* offset so that center of window is on mouse, but keep within desk 
bounds */
+       if (dx < x)
+         {
+            x -= dx;
+            if ((pw->border->w < zone->w) && (x + pw->border->w > zone->x + 
zone->w))
+              {
+                 x -= x + pw->border->w - (zone->x + zone->w);
+              }
+         }
+       else x = 0;
+
+       if (dy < y)
+         {
+            y -= dy;
+            if ((pw->border->h < zone->h) && (y + pw->border->h > zone->y + 
zone->h))
+              {
+                 y -= y + pw->border->h - (zone->y + zone->h);
+              }
+         }
+       else y = 0;
+
+       e_border_move(pw->border, x, y);
+       
+     }
+   if (pw && pw->drag.from_face)
      {
        pw->drag.from_face->dragging = 0;
      }
@@ -2011,48 +2176,60 @@
 {
    E_Event_Dnd_Drop *ev;
    Pager_Face *face;
-   E_Desk *desk;
+   Pager_Desk *desk;
    E_Border *bd;
    Evas_List *l;
-   int x, y;
-   double w, h;
+   int dx = 0, dy = 0;
 
    ev = event_info;
    face = data;
 
-   w = (face->fw - (face->inset.l + face->inset.r)) / (double) face->xnum;
-   h = (face->fh - (face->inset.t + face->inset.b)) / (double) face->ynum;
-
-   x = (ev->x - (face->fx + face->inset.l)) / w;
-   y = (ev->y - (face->fy + face->inset.t)) / h;
-
-   desk = e_desk_at_xy_get(face->zone, x, y);
+   /* XXX convert screen -> evas coords? */ 
+   desk = _pager_face_desk_at_coord(face, ev->x, ev->y);
+   if (desk)
+     {
+       if (!strcmp(type, "enlightenment/pager_win"))
+         {
+            Pager_Win *pw;
+            pw = (Pager_Win *)(ev->data);
+            if (pw)
+              {
+                 bd = pw->border;
+                 dx = pw->drag.dx;
+                 dy = pw->drag.dy;
+              }
+         }
+       else if (!strcmp(type, "enlightenment/border"))
+         {
+            Evas_Coord wx, wy, wx2, wy2;
+            bd = ev->data;
+            e_layout_coord_virtual_to_canvas(desk->layout_object, bd->x, 
bd->y, &wx, &wy);
+            e_layout_coord_virtual_to_canvas(desk->layout_object, bd->x + 
bd->w, bd->y + bd->h, &wx2, &wy2);
+            dx = (wx - wx2) / 2;
+            dy = (wy - wy2) / 2;
+         }
+       else
+         {
+            return;
+         }
 
+       if ((bd) && (desk))
+         {
+            Evas_Coord nx, ny;
+            e_border_desk_set(bd, desk->desk);
+            e_layout_coord_canvas_to_virtual(desk->layout_object, ev->x + dx, 
ev->y + dy, &nx, &ny);
 
-   if (!strcmp(type, "enlightenment/pager_win"))
-     {
-       bd = ((Pager_Win *)(ev->data))->border;
-     }
-   else if (!strcmp(type, "enlightenment/border"))
-     {
-       bd = ev->data;
-     }
-   else
-     {
-       return;
-     }
+            e_border_move(bd, nx + desk->desk->zone->x, ny + 
desk->desk->zone->y);
+         }
 
-   if ((bd) && (desk))
-     {
-       e_border_desk_set(bd, desk);
      }
 
-   for (l = face->desks; l; l = l->next)
-     {
-       Pager_Desk *pd;
-       pd = l->data;
-       edje_object_signal_emit(pd->desk_object, "drag", "out");
-     }
+     for (l = face->desks; l; l = l->next)
+       {
+         Pager_Desk *pd;
+         pd = l->data;
+         edje_object_signal_emit(pd->desk_object, "drag", "out");
+       }
 }
 
 static void
===================================================================
RCS file: /cvs/e/e17/apps/e/src/modules/pager/e_mod_main.h,v
retrieving revision 1.42
retrieving revision 1.43
diff -u -3 -r1.42 -r1.43
--- e_mod_main.h        12 Mar 2006 16:12:59 -0000      1.42
+++ e_mod_main.h        29 Mar 2006 00:35:16 -0000      1.43
@@ -33,6 +33,7 @@
    /* Show popup? */
    unsigned int popup;
 
+   unsigned int drag_resist;
 };
 
 struct _Config_Face
@@ -130,7 +131,10 @@
    struct {
        Pager_Face *from_face;
        unsigned char start : 1;
+       unsigned char in_pager : 1;
+       unsigned char dnd : 1;
        int x, y;
+       int dx, dy;
    } drag;
 };
 




-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to