Enlightenment CVS committal

Author  : moom
Project : e17
Module  : libs/etk

Dir     : e17/libs/etk/src/lib


Modified Files:
        etk_signal.c etk_signal.h etk_signal_callback.c 
        etk_signal_callback.h 


Log Message:
* [Signal] Add etk_signal_block() and etk_signal_unblock(). Not tested 
it yet though...


===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_signal.c,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -3 -r1.18 -r1.19
--- etk_signal.c        24 Aug 2006 18:09:16 -0000      1.18
+++ etk_signal.c        13 Jan 2007 05:19:11 -0000      1.19
@@ -276,6 +276,92 @@
 }
 
 /**
+ * @brief Blocks a callback from being called when the corresponding signal is 
emitted. Unlike etk_signal_disconnect(),
+ * the callback is note removed, and can be easily unblock with 
etk_signal_unblock()
+ * @param signal_name the name of the signal connected to the callback to block
+ * @param object the object connected to the callback to block
+ * @param callback the callback function to block
+ */
+void etk_signal_block(const char *signal_name, Etk_Object *object, 
Etk_Callback callback)
+{
+   Etk_Signal *signal;
+   Evas_List *callbacks;
+   Etk_Signal_Callback *signal_callback;
+
+   if (!object || !signal_name || !callback)
+      return;
+   
+   if (!(signal = etk_signal_lookup(signal_name, 
etk_object_object_type_get(object))))
+   {
+      ETK_WARNING("Invalid signal block: the object type \"%s\" doesn't have a 
signal called \"%s\"",
+         object->type->name, signal_name);
+      return;
+   }
+   
+   callbacks = NULL;
+   etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_FALSE);
+   while (callbacks)
+   {
+      signal_callback = callbacks->data;
+      if (signal_callback->callback == callback)
+         etk_signal_callback_block(signal_callback);
+      callbacks = evas_list_remove_list(callbacks, callbacks);
+   }
+   
+   etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_TRUE);
+   while (callbacks)
+   {
+      signal_callback = callbacks->data;
+      if (signal_callback->callback == callback)
+         etk_signal_callback_block(signal_callback);
+      callbacks = evas_list_remove_list(callbacks, callbacks);
+   }
+}
+
+/**
+ * @brief Unblocks a blocked callback. The callback will no longer be 
prevented from being called when the
+ * corresponding signal is emitted
+ * @param signal_name the name of the signal connected to the callback to 
unblock
+ * @param object the object connected to the callback to unblock
+ * @param callback the callback function to unblock
+ */
+void etk_signal_unblock(const char *signal_name, Etk_Object *object, 
Etk_Callback callback)
+{
+   Etk_Signal *signal;
+   Evas_List *callbacks;
+   Etk_Signal_Callback *signal_callback;
+
+   if (!object || !signal_name || !callback)
+      return;
+   
+   if (!(signal = etk_signal_lookup(signal_name, 
etk_object_object_type_get(object))))
+   {
+      ETK_WARNING("Invalid signal unblock: the object type \"%s\" doesn't have 
a signal called \"%s\"",
+         object->type->name, signal_name);
+      return;
+   }
+   
+   callbacks = NULL;
+   etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_FALSE);
+   while (callbacks)
+   {
+      signal_callback = callbacks->data;
+      if (signal_callback->callback == callback)
+         etk_signal_callback_unblock(signal_callback);
+      callbacks = evas_list_remove_list(callbacks, callbacks);
+   }
+   
+   etk_object_signal_callbacks_get(object, signal, &callbacks, ETK_TRUE);
+   while (callbacks)
+   {
+      signal_callback = callbacks->data;
+      if (signal_callback->callback == callback)
+         etk_signal_callback_unblock(signal_callback);
+      callbacks = evas_list_remove_list(callbacks, callbacks);
+   }
+}
+
+/**
  * @brief Emits the signal: it will call the callbacks connected to the signal 
@a signal
  * @param signal the signal to emit
  * @param object the object which will emit the signal
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_signal.h,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- etk_signal.h        24 Aug 2006 18:09:16 -0000      1.11
+++ etk_signal.h        13 Jan 2007 05:19:11 -0000      1.12
@@ -45,6 +45,8 @@
 void etk_signal_connect_swapped(const char *signal_name, Etk_Object *object, 
Etk_Callback callback, void *data);
 void etk_signal_connect_full(Etk_Signal *signal, Etk_Object *object, 
Etk_Callback callback, void *data, Etk_Bool swapped, Etk_Bool after);
 void etk_signal_disconnect(const char *signal_name, Etk_Object *object, 
Etk_Callback callback);
+void etk_signal_block(const char *signal_name, Etk_Object *object, 
Etk_Callback callback);
+void etk_signal_unblock(const char *signal_name, Etk_Object *object, 
Etk_Callback callback);
 
 Etk_Bool etk_signal_emit(Etk_Signal *signal, Etk_Object *object, void 
*return_value, ...);
 Etk_Bool etk_signal_emit_by_name(const char *signal_name, Etk_Object *object, 
void *return_value, ...);
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_signal_callback.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -3 -r1.7 -r1.8
--- etk_signal_callback.c       6 Oct 2006 17:04:15 -0000       1.7
+++ etk_signal_callback.c       13 Jan 2007 05:19:11 -0000      1.8
@@ -38,6 +38,7 @@
    new_callback->callback = callback;
    new_callback->data = data;
    new_callback->swapped = swapped;
+   new_callback->blocked = ETK_FALSE;
 
    return new_callback;
 }
@@ -59,12 +60,13 @@
  * @param object the object to call the callback on
  * @param return_value the location for the return value (if none, it can be 
NULL)
  * @param ... the arguments to pass to the callback
+ * @note if the callback is blocked, it won't be called
  */
 void etk_signal_callback_call(Etk_Signal_Callback *callback, Etk_Object 
*object, void *return_value,  ...)
 {
    va_list args;
 
-   if (!callback || !object)
+   if (!callback || !object || callback->blocked)
       return;
 
    va_start(args, return_value);
@@ -79,12 +81,13 @@
  * @param object the object to call the callback on
  * @param return_value the location for the return value (if none, it can be 
NULL)
  * @param args the arguments to pass to the callback
+ * @note if the callback is blocked, it won't be called
  */
 void etk_signal_callback_call_valist(Etk_Signal_Callback *callback, Etk_Object 
*object, void *return_value, va_list args)
 {
    Etk_Marshaller marshaller;
 
-   if (!callback || !callback->callback || !callback->signal
+   if (!callback || !callback->callback || !callback->signal || 
callback->blocked
       || !object || !(marshaller = 
etk_signal_marshaller_get(callback->signal)))
    {
       return;
@@ -103,6 +106,43 @@
       marshaller(callback->callback, object, callback->data, return_value, 
args2);
       va_end(args2);
    }
+}
+
+/**
+ * @internal
+ * @brief Prevents the callback from being called: etk_signal_callback_call() 
will have no effect on the callback
+ * @param callback the callback to block
+ */
+void etk_signal_callback_block(Etk_Signal_Callback *callback)
+{
+   if (!callback)
+      return;
+   callback->blocked = ETK_TRUE;
+}
+
+/**
+ * @internal
+ * @brief Unblocks the callback. It can no be called again by calling 
etk_signal_callback_call()
+ * @param callback the callback to unblock
+ */
+void etk_signal_callback_unblock(Etk_Signal_Callback *callback)
+{
+   if (!callback)
+      return;
+   callback->blocked = ETK_FALSE;
+}
+
+/**
+ * @internal
+ * @brief Gets whether or not the callback is blocked
+ * @param callback a callback
+ * @return Returns ETK_TRUE if the callback is blocked, ETK_FALSE otherwise
+ */
+Etk_Bool etk_signal_callback_is_blocked(Etk_Signal_Callback *callback)
+{
+   if (!callback)
+      return ETK_FALSE;
+   return callback->blocked;
 }
 
 /** @} */
===================================================================
RCS file: /cvs/e/e17/libs/etk/src/lib/etk_signal_callback.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -3 -r1.3 -r1.4
--- etk_signal_callback.h       17 Aug 2006 17:18:14 -0000      1.3
+++ etk_signal_callback.h       13 Jan 2007 05:19:11 -0000      1.4
@@ -24,14 +24,20 @@
    Etk_Signal *signal;
    Etk_Callback callback;
    Etk_Bool swapped;
+   Etk_Bool blocked;
    void *data;
 };
 
 
 Etk_Signal_Callback *etk_signal_callback_new(Etk_Signal *signal, Etk_Callback 
callback, void *data, Etk_Bool swapped);
 void                 etk_signal_callback_del(Etk_Signal_Callback 
*signal_callback);
-void                 etk_signal_callback_call(Etk_Signal_Callback *callback, 
Etk_Object *object, void *return_value, ...);
-void                 etk_signal_callback_call_valist(Etk_Signal_Callback 
*callback, Etk_Object *object, void *return_value, va_list args);
+
+void     etk_signal_callback_call(Etk_Signal_Callback *callback, Etk_Object 
*object, void *return_value, ...);
+void     etk_signal_callback_call_valist(Etk_Signal_Callback *callback, 
Etk_Object *object, void *return_value, va_list args);
+void     etk_signal_callback_block(Etk_Signal_Callback *callback);
+void     etk_signal_callback_unblock(Etk_Signal_Callback *callback);
+Etk_Bool etk_signal_callback_is_blocked(Etk_Signal_Callback *callback);
+
 
 /** @} */
 



-------------------------------------------------------------------------
Take Surveys. Earn Cash. Influence the Future of IT
Join SourceForge.net's Techsay panel and you'll get the chance to share your
opinions on IT & business topics through brief surveys - and earn cash
http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to