From bd21daebd18b1a33262fec56ac16aec52f70f285 Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sun, 6 Jan 2013 19:38:38 +0100 Subject: [PATCH] api: allow return code WEECHAT_RC_OK_EAT in callbacks of hook_signal and hook_hsignal (stop sending the signal immediately) --- ChangeLog | 2 ++ doc/en/weechat_plugin_api.en.txt | 4 ++++ doc/fr/weechat_plugin_api.fr.txt | 4 ++++ doc/it/weechat_plugin_api.it.txt | 6 ++++++ src/core/wee-hook.c | 12 ++++++++++-- 5 files changed, 26 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 431b5c3d9..f12e2d378 100644 --- a/ChangeLog +++ b/ChangeLog @@ -51,6 +51,8 @@ Version 0.4.0 (under dev!) (problem with nick displayed in first line of screen) (bug #37556) * core: fix wrapping of words with wide chars (the break was made before the correct position) +* api: allow return code WEECHAT_RC_OK_EAT in callbacks of hook_signal and + hook_hsignal (stop sending the signal immediately) * api: allow creation of structure with hdata_update (allowed for hdata "history") * api: use hashtable "options" for command arguments in function diff --git a/doc/en/weechat_plugin_api.en.txt b/doc/en/weechat_plugin_api.en.txt index 2526eb58e..3490654e6 100644 --- a/doc/en/weechat_plugin_api.en.txt +++ b/doc/en/weechat_plugin_api.en.txt @@ -7994,6 +7994,8 @@ Arguments: ** 'void *signal_data': data sent with signal ** return value: *** 'WEECHAT_RC_OK' +*** 'WEECHAT_RC_OK_EAT' (stop sending the signal immediately) + (_new in version 0.4.0_) *** 'WEECHAT_RC_ERROR' * 'callback_data': pointer given to callback when it is called by WeeChat @@ -8262,6 +8264,8 @@ pattern. ** 'struct t_hashtable *hashtable': hashtable ** return value: *** 'WEECHAT_RC_OK' +*** 'WEECHAT_RC_OK_EAT' (stop sending the signal immediately) + (_new in version 0.4.0_) *** 'WEECHAT_RC_ERROR' * 'callback_data': pointer given to callback when it is called by WeeChat diff --git a/doc/fr/weechat_plugin_api.fr.txt b/doc/fr/weechat_plugin_api.fr.txt index 2efab7c0c..64faba5dc 100644 --- a/doc/fr/weechat_plugin_api.fr.txt +++ b/doc/fr/weechat_plugin_api.fr.txt @@ -8107,6 +8107,8 @@ Paramètres : ** 'void *signal_data' : données envoyées avec le signal ** valeur de retour : *** 'WEECHAT_RC_OK' +*** 'WEECHAT_RC_OK_EAT' (arrêter l'envoi du signal immédiatement) + (_nouveau dans la version 0.4.0_) *** 'WEECHAT_RC_ERROR' * 'callback_data' : pointeur donné au "callback" lorsqu'il est appelé par WeeChat @@ -8384,6 +8386,8 @@ modèle de redirection ("pattern"). ** 'struct t_hashtable *hashtable' : hashtable ** valeur de retour : *** 'WEECHAT_RC_OK' +*** 'WEECHAT_RC_OK_EAT' (arrêter l'envoi du signal immédiatement) + (_nouveau dans la version 0.4.0_) *** 'WEECHAT_RC_ERROR' * 'callback_data' : pointeur donné au "callback" lorsqu'il est appelé par WeeChat diff --git a/doc/it/weechat_plugin_api.it.txt b/doc/it/weechat_plugin_api.it.txt index 824daa58b..633d005c8 100644 --- a/doc/it/weechat_plugin_api.it.txt +++ b/doc/it/weechat_plugin_api.it.txt @@ -8072,6 +8072,9 @@ Argomenti: ** 'void *signal_data': dati inviati con il segnale ** valore restituito: *** 'WEECHAT_RC_OK' +// TRANSLATION MISSING +*** 'WEECHAT_RC_OK_EAT' (stop sending the signal immediately) + (_novità nella versione 0.4.0_) *** 'WEECHAT_RC_ERROR' * 'callback_data': puntatore fornito alla callback quando chiamata da WeeChat @@ -8348,6 +8351,9 @@ di redirezione. ** 'struct t_hashtable *hashtable': tabella hash ** valore restituito: *** 'WEECHAT_RC_OK' +// TRANSLATION MISSING +*** 'WEECHAT_RC_OK_EAT' (stop sending the signal immediately) + (_novità nella versione 0.4.0_) *** 'WEECHAT_RC_ERROR' * 'callback_data': puntatore fornito alla callback quando chiamata da WeeChat diff --git a/src/core/wee-hook.c b/src/core/wee-hook.c index 1b4ccc6ab..40101abee 100644 --- a/src/core/wee-hook.c +++ b/src/core/wee-hook.c @@ -2175,6 +2175,7 @@ void hook_signal_send (const char *signal, const char *type_data, void *signal_data) { struct t_hook *ptr_hook, *next_hook; + int rc; hook_exec_start (); @@ -2188,9 +2189,12 @@ hook_signal_send (const char *signal, const char *type_data, void *signal_data) && (string_match (signal, HOOK_SIGNAL(ptr_hook, signal), 0))) { ptr_hook->running = 1; - (void) (HOOK_SIGNAL(ptr_hook, callback)) + rc = (HOOK_SIGNAL(ptr_hook, callback)) (ptr_hook->callback_data, signal, type_data, signal_data); ptr_hook->running = 0; + + if (rc == WEECHAT_RC_OK_EAT) + break; } ptr_hook = next_hook; @@ -2248,6 +2252,7 @@ void hook_hsignal_send (const char *signal, struct t_hashtable *hashtable) { struct t_hook *ptr_hook, *next_hook; + int rc; hook_exec_start (); @@ -2261,9 +2266,12 @@ hook_hsignal_send (const char *signal, struct t_hashtable *hashtable) && (string_match (signal, HOOK_HSIGNAL(ptr_hook, signal), 0))) { ptr_hook->running = 1; - (void) (HOOK_HSIGNAL(ptr_hook, callback)) + rc = (HOOK_HSIGNAL(ptr_hook, callback)) (ptr_hook->callback_data, signal, hashtable); ptr_hook->running = 0; + + if (rc == WEECHAT_RC_OK_EAT) + break; } ptr_hook = next_hook;