Enlightenment CVS committal

Author  : sebastid
Project : e17
Module  : apps/e

Dir     : e17/apps/e/src/bin


Modified Files:
        e_dnd.c e_dnd.h e_main.c 


Log Message:
Dnd update, shape works now.

===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_dnd.c,v
retrieving revision 1.22
retrieving revision 1.23
diff -u -3 -r1.22 -r1.23
--- e_dnd.c     11 May 2005 06:30:56 -0000      1.22
+++ e_dnd.c     11 May 2005 21:33:52 -0000      1.23
@@ -6,6 +6,7 @@
 /* local subsystem functions */
 
 static void _e_drag_free(E_Drag *drag);
+static int  _e_dnd_cb_window_shape(void *data, int type, void *event);
 
 static int  _e_dnd_cb_mouse_up(void *data, int type, void *event);
 static int  _e_dnd_cb_mouse_move(void *data, int type, void *event);
@@ -22,7 +23,7 @@
 
 static Ecore_X_Window _drag_win = 0;
 
-static Evas_List *_draggies = NULL;
+static Evas_List *_drag_list = NULL;
 static E_Drag *_drag_current = NULL;
 
 /* externally accessible functions */
@@ -40,6 +41,9 @@
    _event_handlers = evas_list_append(_event_handlers,
                                      
ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE,
                                                              
_e_dnd_cb_mouse_move, NULL));
+   _event_handlers = evas_list_append(_event_handlers,
+                                     
ecore_event_handler_add(ECORE_X_EVENT_WINDOW_SHAPE,
+                                                             
_e_dnd_cb_window_shape, NULL));
 
    for (l = e_manager_list(); l; l = l->next)
      {
@@ -80,7 +84,7 @@
 {
    Evas_List *l;
 
-   for (l = _draggies; l;)
+   for (l = _drag_list; l;)
      {
        E_Drag *drag;
 
@@ -88,8 +92,8 @@
        l = l->next;
        e_object_del(E_OBJECT(drag));
      }
-   evas_list_free(_draggies);
-   _draggies = NULL;
+   evas_list_free(_drag_list);
+   _drag_list = NULL;
 
    for (l = _event_handlers; l; l = l->next)
      {
@@ -170,11 +174,13 @@
    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 = strdup(type);
    drag->data = data;
    drag->cb.finished = finished_cb;
 
+   _drag_list = evas_list_append(_drag_list, drag);
+
    return drag;
 }
 
@@ -189,6 +195,7 @@
 {
    if (drag->object) evas_object_del(drag->object);
    drag->object = object;
+   evas_object_resize(drag->object, drag->w, drag->h);
 }
 
 void
@@ -196,6 +203,7 @@
 {
    if (drag->visible) return;
    drag->visible = 1;
+   evas_object_show(drag->object);
    ecore_evas_show(drag->ecore_evas);
    e_container_shape_show(drag->shape);
 }
@@ -205,6 +213,7 @@
 {
    if (!drag->visible) return;
    drag->visible = 0;
+   evas_object_hide(drag->object);
    ecore_evas_hide(drag->ecore_evas);
    e_container_shape_hide(drag->shape);
 }
@@ -229,6 +238,7 @@
    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);
 }
@@ -412,14 +422,45 @@
    free(handler);
 }
 
+
+void
+e_drag_idler_before(void)
+{
+   Evas_List *l;
+   
+   for (l = _drag_list; l; l = l->next)
+     {
+       E_Drag *drag;
+       
+       drag = l->data;
+       if (drag->need_shape_export)
+         {
+            Ecore_X_Rectangle *rects;
+            int num;
+            
+            rects = ecore_x_window_shape_rectangles_get(drag->evas_win, &num);
+            if (rects)
+              {
+                 e_container_shape_rects_set(drag->shape, rects, num);
+                 free(rects);
+              }
+            drag->need_shape_export = 0;
+            if (drag->visible)
+              e_container_shape_show(drag->shape);
+         }
+     }
+}
+
 /* local subsystem functions */
 
 static void
 _e_drag_free(E_Drag *drag)
 {
-   _draggies = evas_list_remove(_draggies, drag);
+   _drag_list = evas_list_remove(_drag_list, drag);
 
    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);
@@ -427,6 +468,25 @@
    free(drag);
 }
 
+
+static int
+_e_dnd_cb_window_shape(void *data, int ev_type, void *ev)
+{
+   Evas_List *l;
+   Ecore_X_Event_Window_Shape *e;
+   
+   e = ev;
+   for (l = _drag_list; l; l = l->next)
+     {
+       E_Drag *drag;
+       
+       drag = l->data;
+       if (drag->evas_win == e->win)
+         drag->need_shape_export = 1;
+     }
+   return 1;
+}
+
 static int
 _e_dnd_cb_mouse_up(void *data, int type, void *event)
 {
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_dnd.h,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- e_dnd.h     11 May 2005 06:30:56 -0000      1.16
+++ e_dnd.h     11 May 2005 21:33:53 -0000      1.17
@@ -37,6 +37,7 @@
 
    unsigned int   layer;
    unsigned char  visible : 1;
+   unsigned char  need_shape_export : 1;
 };
 
 struct _E_Drop_Handler
@@ -88,6 +89,7 @@
 EAPI void    e_drag_hide(E_Drag *drag);
 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_start(E_Drag *drag);
 EAPI void e_drag_update(int x, int y);
===================================================================
RCS file: /cvsroot/enlightenment/e17/apps/e/src/bin/e_main.c,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -3 -r1.77 -r1.78
--- e_main.c    11 May 2005 09:00:32 -0000      1.77
+++ e_main.c    11 May 2005 21:33:54 -0000      1.78
@@ -814,6 +814,7 @@
    e_focus_idler_before();
    e_border_idler_before();
    e_popup_idler_before();
+   e_drag_idler_before();
    for (l = _e_main_idler_before_list; l; l = l->next)
      {
        E_Before_Idler *eb;




-------------------------------------------------------
This SF.Net email is sponsored by Oracle Space Sweepstakes
Want to be the first software developer in space?
Enter now for the Oracle Space Sweepstakes!
http://ads.osdn.com/?ad_id=7393&alloc_id=16281&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to