Enlightenment CVS committal

Author  : codewarrior
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_main.c etk_widget.c etk_widget.h 


Log Message:
- per widget drag_motion events
- per widget drag_leave events
- make dnd widget search faster

===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_main.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- etk_main.c  8 Feb 2006 12:49:38 -0000       1.11
+++ etk_main.c  9 Feb 2006 01:52:19 -0000       1.12
@@ -33,13 +33,15 @@
 static int _etk_xdnd_drop_handler(void *data, int type, void *event);
 static int _etk_xdnd_leave_handler(void *data, int type, void *event);
 static int _etk_xdnd_selection_handler(void *data, int type, void *event);
+
+static Etk_Widget *_etk_dnd_widget = NULL;
+Evas_List  *_etk_dnd_widgets = NULL;
 #endif   
 
 static Evas_List *_etk_main_toplevel_widgets = NULL;
 static Etk_Bool _etk_main_running = ETK_FALSE;
 static Etk_Bool _etk_main_initialized = ETK_FALSE;
 static Ecore_Job *_etk_main_iterate_job = NULL;
-static Etk_Widget *_etk_dnd_widget = NULL;
 
 /**************************
  *
@@ -247,49 +249,42 @@
 
 #if HAVE_ECORE_X
 #define E_INSIDE(x, y, xx, yy, ww, hh) (((x) < ((xx) + (ww))) && ((y) < ((yy) 
+ (hh))) && ((x) >= (xx)) && ((y) >= (yy)))
-static int _etk_xdnd_enter_handler(void *data, int type, void *event)
-{
-   Ecore_X_Event_Xdnd_Enter *ev;
-   int i;
-   
-   /* printf("enter\n"); */
-   ev = event;
-   /* 
-    for (i = 0; i < ev->num_types; i++)
-     printf("type: %s\n", ev->types[i]);
-    */
-   return 1;
-}
 
 /* Search the container recursively for the widget that accepts xdnd */
-static void _etk_xdnd_container_get_widgets_at(Etk_Container *cont, int x, int 
y, int offx, int offy, Evas_List **list)
+static void _etk_xdnd_container_get_widgets_at(Etk_Toplevel_Widget *top, int 
x, int y, int offx, int offy, Evas_List **list)
 {
-   Evas_List *child;
+   Evas_List *l;
      
-   for(child = etk_container_children_get(cont); child; child = child->next)
+   for(l = _etk_dnd_widgets; l; l = l->next)
      {
        Etk_Widget *widget;
        
-       if(!(widget = ETK_WIDGET(child->data)))
+       if(!(widget = ETK_WIDGET(l->data)))
          continue;
        
        if(E_INSIDE(x, y, 
                    widget->inner_geometry.x + offx,
                    widget->inner_geometry.y + offy,
                    widget->inner_geometry.w, 
-                   widget->inner_geometry.h))
-         {
-            if(widget->accepts_xdnd)
-              {
-                 *list = evas_list_append(*list, widget);
-              }
-            
-            if(ETK_IS_CONTAINER(widget))
-              _etk_xdnd_container_get_widgets_at(ETK_CONTAINER(widget), x, y, 
offx, offy, list);
-         }
+                   widget->inner_geometry.h))    
+         *list = evas_list_append(*list, widget);        
      }   
 }
 
+static int _etk_xdnd_enter_handler(void *data, int type, void *event)
+{
+   Ecore_X_Event_Xdnd_Enter *ev;
+   int i;
+   
+   ev = event;
+   
+//   printf("enter window!\n");
+//     for (i = 0; i < ev->num_types; i++)
+//       printf("type: %s\n", ev->types[i]);   
+   
+   return 1;
+}
+
 static int _etk_xdnd_position_handler(void *data, int type, void *event)
 {
    Ecore_X_Event_Xdnd_Position *ev;
@@ -297,13 +292,13 @@
    Evas_List *l;
    Evas_List *children = NULL;
    Etk_Widget *widget;
+   int x = 0, y = 0;
+   
    ev = event;
    
    /* loop top level widgets (windows) */
    for(l = _etk_main_toplevel_widgets; l; l = l->next)
-     {
-       int x, y;
-         
+     {   
        if (!(window = ETK_WINDOW(l->data)))
          continue;
        
@@ -312,15 +307,30 @@
          continue;       
        
        ecore_evas_geometry_get(window->ecore_evas, &x, &y, NULL, NULL);
-       
+
        /* find the widget we want to drop on */
-       _etk_xdnd_container_get_widgets_at(ETK_CONTAINER(window), 
ev->position.x, ev->position.y, x, y, &children);
-     }
+       _etk_xdnd_container_get_widgets_at(ETK_TOPLEVEL_WIDGET(window), 
ev->position.x, ev->position.y, x, y, &children);
+       
+       /* check if we're leaving a widget */
+       if(_etk_dnd_widget)
+         {
+            if(!E_INSIDE(ev->position.x, ev->position.y, 
+                         _etk_dnd_widget->geometry.x + x, 
_etk_dnd_widget->geometry.y + y,
+                         _etk_dnd_widget->geometry.w, 
_etk_dnd_widget->geometry.h))
+              {
+                 etk_widget_drag_leave(_etk_dnd_widget);
+                 _etk_dnd_widget = NULL;
+              }
+         }     
+       
+       break;
+     }   
    
    /* if we found a widget, emit signals */
    if(children != NULL)
-     {
+     { 
        Ecore_X_Rectangle rect;
+       
        widget = (evas_list_last(children))->data;
        _etk_dnd_widget = widget;
        /* TODO: filter types according to what widget wants */
@@ -329,6 +339,8 @@
        rect.width = widget->inner_geometry.w;
        rect.height = widget->inner_geometry.h; 
        ecore_x_dnd_send_status(1, 1, rect, ECORE_X_DND_ACTION_PRIVATE);
+       
+       etk_widget_drag_motion(widget);
      }
    
    return 1;
@@ -340,14 +352,15 @@
    
    /* printf("drop\n"); */
    ev = event;
-   
+      
    ecore_x_selection_xdnd_request(ev->win, "text/uri-list");
    return 1;
 }
 
 static int _etk_xdnd_leave_handler(void *data, int type, void *event)
 {
-   /* printf("leave\n"); */
+   //printf("leave window\n");
+      
    return 1;
 }
 
@@ -360,7 +373,7 @@
    Ecore_X_Selection_Data_Targets *targets;
    int i;
 
-   /* printf("selection\n"); */
+   //printf("selection\n"); 
    ev = event;
    switch (ev->selection) 
      {
@@ -425,7 +438,7 @@
       case ECORE_X_SELECTION_CLIPBOARD:
        if (!strcmp(ev->target, ECORE_X_SELECTION_TARGET_TARGETS)) 
          {
-            printf("clipboard: %s\n", ev->target);
+            //printf("clipboard: %s\n", ev->target);
             targets = ev->data;
             /*
             for (i = 0; i < targets->num_targets; i++)
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -3 -r1.19 -r1.20
--- etk_widget.c        8 Feb 2006 12:49:38 -0000       1.19
+++ etk_widget.c        9 Feb 2006 01:52:20 -0000       1.20
@@ -20,6 +20,8 @@
  * @{
  */
 
+extern Evas_List *_etk_dnd_widgets;
+
 typedef struct _Etk_Widget_Smart_Data
 {
    Etk_Widget *widget;
@@ -62,6 +64,8 @@
    ETK_WIDGET_UNFOCUS_SIGNAL,
    ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL,
    ETK_WIDGET_DRAG_DROP_SIGNAL,
+   ETK_WIDGET_DRAG_MOTION_SIGNAL,
+   ETK_WIDGET_DRAG_LEAVE_SIGNAL,     
    ETK_WIDGET_NUM_SIGNALS
 };
 
@@ -93,6 +97,8 @@
 static void _etk_widget_focus_handler(Etk_Widget *widget);
 static void _etk_widget_unfocus_handler(Etk_Widget *widget);
 static void _etk_widget_drag_drop_handler(Etk_Widget *widget);
+static void _etk_widget_drag_motion_handler(Etk_Widget *widget);
+static void _etk_widget_drag_leave_handler(Etk_Widget *widget);
 
 static void _etk_widget_mouse_in_cb(void *data, Evas *evas, Evas_Object 
*object, void *event_info);
 static void _etk_widget_signal_mouse_in_cb(Etk_Object *object, 
Etk_Event_Mouse_In_Out *event, void *data);
@@ -171,6 +177,8 @@
       _etk_widget_signals[ETK_WIDGET_UNFOCUS_SIGNAL] =       
etk_signal_new("unfocus",       widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
unfocus), etk_marshaller_VOID__VOID,    NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_SCROLL_SIZE_CHANGED_SIGNAL] = 
etk_signal_new("scroll_size_changed", widget_type, -1, 
etk_marshaller_VOID__VOID, NULL, NULL);
       _etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL] =     
etk_signal_new("drag_drop",     widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
drag_drop),etk_marshaller_VOID__VOID,    NULL, NULL);
+      _etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL] =     
etk_signal_new("drag_motion",     widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
drag_motion),etk_marshaller_VOID__VOID,    NULL, NULL);
+      _etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL] =     
etk_signal_new("drag_leave",     widget_type, ETK_MEMBER_OFFSET(Etk_Widget, 
drag_leave),etk_marshaller_VOID__VOID,    NULL, NULL);
       
       etk_type_property_add(widget_type, "name",              
ETK_WIDGET_NAME_PROPERTY,              ETK_PROPERTY_STRING,  
ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_string(NULL));
       etk_type_property_add(widget_type, "parent",            
ETK_WIDGET_PARENT_PROPERTY,            ETK_PROPERTY_POINTER, 
ETK_PROPERTY_READABLE_WRITABLE, etk_property_value_pointer(NULL));
@@ -1411,6 +1419,28 @@
    etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_DROP_SIGNAL], 
ETK_OBJECT(widget), NULL);
 }
 
+/**
+ * @brief Sends the "drag_motion" signal
+ * @param widget a widget
+ */
+void etk_widget_drag_motion(Etk_Widget *widget)
+{
+   if (!widget)
+     return;
+   etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_MOTION_SIGNAL], 
ETK_OBJECT(widget), NULL);
+}
+
+/**
+ * @brief Sends the "drag_motion" signal
+ * @param widget a widget
+ */
+void etk_widget_drag_leave(Etk_Widget *widget)
+{
+   if (!widget)
+     return;
+   etk_signal_emit(_etk_widget_signals[ETK_WIDGET_DRAG_LEAVE_SIGNAL], 
ETK_OBJECT(widget), NULL);
+}
+
 #endif
 
 /**************************
@@ -1447,6 +1477,8 @@
    widget->focus = _etk_widget_focus_handler;
    widget->unfocus = _etk_widget_unfocus_handler;
    widget->drag_drop = _etk_widget_drag_drop_handler;
+   widget->drag_motion = _etk_widget_drag_motion_handler;
+   widget->drag_leave = _etk_widget_drag_leave_handler;   
    
    widget->left_inset = 0;
    widget->right_inset = 0;
@@ -1664,6 +1696,22 @@
    etk_widget_theme_object_signal_emit(widget, "drag_drop");
 }
 
+/* Default handler for the "drag_motion" signal */
+static void _etk_widget_drag_motion_handler(Etk_Widget *widget)
+{
+   if (!widget)
+     return;
+   etk_widget_theme_object_signal_emit(widget, "drag_motion");
+}
+
+/* Default handler for the "drag_leave" signal */
+static void _etk_widget_drag_leave_handler(Etk_Widget *widget)
+{
+   if (!widget)
+     return;
+   etk_widget_theme_object_signal_emit(widget, "drag_leave");
+}
+
 
 /* Sets the widget as visible and queues a visibility update */
 static void _etk_widget_show_handler(Etk_Widget *widget)
@@ -1962,9 +2010,15 @@
 void etk_widget_xdnd_set(Etk_Widget *widget, Etk_Bool on)
 {
    if(on)
-     widget->accepts_xdnd = 1;
+     {
+       widget->accepts_xdnd = 1;
+       _etk_dnd_widgets = evas_list_append(_etk_dnd_widgets, widget);
+     }
    else
-     widget->accepts_xdnd = 0;
+     {
+       widget->accepts_xdnd = 0;
+       _etk_dnd_widgets = evas_list_remove(_etk_dnd_widgets, widget);
+     }
 }
 
 Etk_Bool etk_widget_xdnd_get(Etk_Widget *widget)
@@ -1982,7 +2036,7 @@
    if(num_files)
      *num_files = widget->xdnd_files_num;
      
-   return widget->xdnd_files;
+   return (const char **)widget->xdnd_files;
 }
 #endif
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/proto/etk/src/lib/etk_widget.h,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- etk_widget.h        8 Feb 2006 12:49:38 -0000       1.13
+++ etk_widget.h        9 Feb 2006 01:52:21 -0000       1.14
@@ -167,6 +167,8 @@
    void (*scroll_margins_get)(Etk_Widget *widget, Etk_Size *margin_size);
    void (*scroll)(Etk_Widget *widget, int x, int y);
    void (*drag_drop)(Etk_Widget *widget);
+   void (*drag_motion)(Etk_Widget *widget);
+   void (*drag_leave)(Etk_Widget *widget);   
    
    void (*show)(Etk_Widget *widget);
    void (*enter)(Etk_Widget *widget);
@@ -268,6 +270,8 @@
 Etk_Bool      etk_widget_xdnd_get(Etk_Widget *widget);
 const char  **etk_widget_xdnd_files_get(Etk_Widget *e, int *num_files);
 void          etk_widget_drag_drop(Etk_Widget *widget);
+void          etk_widget_drag_motion(Etk_Widget *widget);
+void          etk_widget_drag_leave(Etk_Widget *widget);
 //#endif
 
 /** @} */




-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=103432&bid=230486&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to