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