Enlightenment CVS committal

Author  : moom
Project : e17
Module  : proto

Dir     : e17/proto/etk/src/lib


Modified Files:
        etk_signal.c etk_widget.c 


Log Message:
* Stop calling the signal callbacks when the object is destroyed by a previous 
callback


===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_signal.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -3 -r1.13 -r1.14
--- etk_signal.c        26 Jul 2006 14:57:18 -0000      1.13
+++ etk_signal.c        8 Aug 2006 00:18:40 -0000       1.14
@@ -354,27 +354,30 @@
    va_copy(args2, args);
 
    /* We call the callbacks to call before the default handler */
-   callbacks = NULL;
-   etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_FALSE);
-   while (!emitted_signal->stop_emission && callbacks && object_ptr)
+   if (object_ptr)
    {
-      callback = callbacks->data;
-      if (!return_value_set || !signal->accumulator)
+      callbacks = NULL;
+      etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_FALSE);
+      while (!emitted_signal->stop_emission && callbacks && object_ptr)
       {
-         etk_signal_callback_call_valist(callback, object, return_value, 
args2);
-         return_value_set = ETK_TRUE;
-      }
-      else
-      {
-         etk_signal_callback_call_valist(callback, object, result, args2);
-         signal->accumulator(return_value, result, signal->accum_data);
+         callback = callbacks->data;
+         if (!return_value_set || !signal->accumulator)
+         {
+            etk_signal_callback_call_valist(callback, object, return_value, 
args2);
+            return_value_set = ETK_TRUE;
+         }
+         else
+         {
+            etk_signal_callback_call_valist(callback, object, result, args2);
+            signal->accumulator(return_value, result, signal->accum_data);
+         }
+         callbacks = evas_list_remove_list(callbacks, callbacks);
       }
-      callbacks = evas_list_remove_list(callbacks, callbacks);
+      callbacks = evas_list_free(callbacks);
    }
-   callbacks = evas_list_free(callbacks);
 
    /* Calls the default handler */
-   if (!emitted_signal->stop_emission && object_ptr && 
signal->default_handler_offset >= 0 && signal->marshaller)
+   if (object_ptr && !emitted_signal->stop_emission && 
signal->default_handler_offset >= 0 && signal->marshaller)
    {
       Etk_Signal_Callback_Function *default_handler;
 
@@ -393,26 +396,29 @@
          }
       }
    }
-
+   
    /* We call the callbacks to call after the default handler */
-   callbacks = NULL;
-   etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_TRUE);
-   while (!emitted_signal->stop_emission && callbacks && object_ptr)
+   if (object_ptr)
    {
-      callback = callbacks->data;
-      if (!return_value_set || !signal->accumulator)
+      callbacks = NULL;
+      etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_TRUE);
+      while (!emitted_signal->stop_emission && callbacks && object_ptr)
       {
-         etk_signal_callback_call_valist(callback, object, return_value, 
args2);
-         return_value_set = ETK_TRUE;
-      }
-      else
-      {
-         etk_signal_callback_call_valist(callback, object, result, args2);
-         signal->accumulator(return_value, result, signal->accum_data);
+         callback = callbacks->data;
+         if (!return_value_set || !signal->accumulator)
+         {
+            etk_signal_callback_call_valist(callback, object, return_value, 
args2);
+            return_value_set = ETK_TRUE;
+         }
+         else
+         {
+            etk_signal_callback_call_valist(callback, object, result, args2);
+            signal->accumulator(return_value, result, signal->accum_data);
+         }
+         callbacks = evas_list_remove_list(callbacks, callbacks);
       }
-      callbacks = evas_list_remove_list(callbacks, callbacks);
+      callbacks = evas_list_free(callbacks);
    }
-   callbacks = evas_list_free(callbacks);
    
    if (object_ptr)
       etk_object_weak_pointer_remove(object, &object_ptr);
===================================================================
RCS file: /cvs/e/e17/proto/etk/src/lib/etk_widget.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -3 -r1.62 -r1.63
--- etk_widget.c        4 Aug 2006 20:05:55 -0000       1.62
+++ etk_widget.c        8 Aug 2006 00:18:40 -0000       1.63
@@ -2333,6 +2333,7 @@
          evas_event->canvas.y >= widget->geometry.y && evas_event->canvas.y <= 
widget->geometry.y + widget->geometry.h)
       etk_signal_emit(_etk_widget_signals[ETK_WIDGET_MOUSE_CLICK_SIGNAL], 
ETK_OBJECT(widget), NULL, &event);
    
+   /* TODO: what if the widget is destroyed by one of the callbacks (recurrent 
problem!!!) ?? */
    if (widget->repeat_mouse_events && widget->parent)
       _etk_widget_mouse_up_cb(widget->parent, evas, NULL, event_info);
 }



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to