diff --git a/CHANGELOG.md b/CHANGELOG.md index 08e80ea7f..7447b1051 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - api: return the buffer input callback return code in functions command and command_options - api: add special value `-` (hyphen-minus) in options of function command_options to prevent execution of commands - api: add property `hotlist_conditions` in function buffer_set +- api: add support of flags in functions hook_signal_send and hook_hsignal_send - relay/api: allow array with multiple requests in websocket frame received from client - core, plugins: simplify help on parameters that can be repeated in commands - core: add optional hook types in command `/debug hooks` diff --git a/doc/en/weechat_plugin_api.en.adoc b/doc/en/weechat_plugin_api.en.adoc index 6ba53ea1d..75ac6a904 100644 --- a/doc/en/weechat_plugin_api.en.adoc +++ b/doc/en/weechat_plugin_api.en.adoc @@ -12488,7 +12488,7 @@ hook = weechat.hook_signal("quit;upgrade", "my_signal_cb", "") ==== hook_signal_send -_Updated in 1.0._ +_Updated in 1.0, 4.5.0._ Send a signal. @@ -12502,10 +12502,20 @@ int weechat_hook_signal_send (const char *signal, const char *type_data, Arguments: -* _signal_: signal to send +* _signal_: signal to send; flags are allowed before the signal name (see below) + _(WeeChat ≥ 4.5.0)_ * _type_data_: type of data sent with signal (see <<_hook_signal,hook_signal>>) * _signal_data_: data sent with signal +The signal name can contain flags with the following format: `[flags:xxx,yyy]signal` +where `xxx` and `yyy` are names of flags, and `signal` the signal name. + +The following flags are supported: + +* _stop_on_error_: exit immediately if a callback returns WEECHAT_RC_ERROR + (remaining callbacks are then NOT executed) _(WeeChat ≥ 4.5.0)_ +* _ignore_eat_: consider any callback returning WEECHAT_RC_OK_EAT is in fact + WEECHAT_RC_OK and execute remaining callbacks _(WeeChat ≥ 4.5.0)_ + Return value _(WeeChat ≥ 1.0)_: * return code of last callback executed (_WEECHAT_RC_OK_ if no callback was @@ -12519,6 +12529,8 @@ C example: [source,c] ---- int rc = weechat_hook_signal_send ("my_signal", WEECHAT_HOOK_SIGNAL_STRING, my_string); +int rc2 = weechat_hook_signal_send ("[flags:stop_on_error,ignore_eat]my_signal2", + WEECHAT_HOOK_SIGNAL_STRING, my_string); ---- Script (Python): @@ -12528,8 +12540,10 @@ Script (Python): # prototype def hook_signal_send(signal: str, type_data: str, signal_data: str) -> int: ... -# example +# examples rc = weechat.hook_signal_send("my_signal", weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) +rc2 = weechat.hook_signal_send("[flags:stop_on_error,ignore_eat]my_signal2", + weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) ---- [[signal_logger_backlog]] @@ -12814,7 +12828,7 @@ hook = weechat.hook_hsignal("test", "my_hsignal_cb", "") ==== hook_hsignal_send -_WeeChat ≥ 0.3.4, updated in 1.0._ +_WeeChat ≥ 0.3.4, updated in 1.0, 4.5.0._ Send a hsignal (signal with hashtable). @@ -12827,7 +12841,8 @@ int weechat_hook_hsignal_send (const char *signal, struct t_hashtable *hashtable Arguments: -* _signal_: signal to send +* _signal_: signal to send; flags are allowed before the signal name + (see function <<_hook_signal_send,hook_signal_send>>) _(WeeChat ≥ 4.5.0)_ * _hashtable_: hashtable Return value _(WeeChat ≥ 1.0)_: @@ -12842,7 +12857,7 @@ C example: [source,c] ---- -int rc; +int rc, rc2; struct t_hashtable *hashtable = weechat_hashtable_new (8, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, @@ -12852,6 +12867,7 @@ if (hashtable) { weechat_hashtable_set (hashtable, "key", "value"); rc = weechat_hook_hsignal_send ("my_hsignal", hashtable); + rc2 = weechat_hook_hsignal_send ("[flags:stop_on_error,ignore_eat]my_hsignal2", hashtable); weechat_hashtable_free (hashtable); } ---- @@ -12863,8 +12879,9 @@ Script (Python): # prototype def hook_hsignal_send(signal: str, hashtable: Dict[str, str]) -> int: ... -# example +# examples rc = weechat.hook_hsignal_send("my_hsignal", {"key": "value"}) +rc2 = weechat.hook_hsignal_send("[flags:stop_on_error,ignore_eat]my_hsignal2", {"key": "value"}) ---- [[hsignal_irc_redirect_command]] diff --git a/doc/fr/weechat_plugin_api.fr.adoc b/doc/fr/weechat_plugin_api.fr.adoc index c48d7b663..b0e9af0b0 100644 --- a/doc/fr/weechat_plugin_api.fr.adoc +++ b/doc/fr/weechat_plugin_api.fr.adoc @@ -12740,7 +12740,7 @@ hook = weechat.hook_signal("quit;upgrade", "my_signal_cb", "") ==== hook_signal_send -_Mis à jour dans la 1.0._ +_Mis à jour dans la 1.0, 4.5.0._ Envoyer un signal. @@ -12754,11 +12754,23 @@ int weechat_hook_signal_send (const char *signal, const char *type_data, Paramètres : -* _signal_ : signal à envoyer +* _signal_ : signal à envoyer ; des drapeaux sont autorisés avant le nom du signal + (voir ci-dessous) _(WeeChat ≥ 4.5.0)_ * _type_data_ : type de données à envoyer avec le signal (voir <<_hook_signal,hook_signal>>) * _signal_data_ : données envoyées avec le signal +Le nom du signal peut contenir des drapeaux avec le format suivant : `[flags:xxx,yyy]signal` +où `xxx` et `yyy` sont des noms de drapeaux et `signal` le nom du signal. + +Les drapeaux suivants sont supportés : + +* _stop_on_error_ : sortir immédiatement si une fonction de rappel retourne + WEECHAT_RC_ERROR (les autres fonctions de rappel ne sont donc PAS exécutées) + _(WeeChat ≥ 4.5.0)_ +* _ignore_eat_ : considérer que toute fonction de rappel renvoyant WEECHAT_RC_OK_EAT + est en fait WEECHAT_RC_OK et exécuter les fonctions de rappel restantes + _(WeeChat ≥ 4.5.0)_ + Valeur de retour _(WeeChat ≥ 1.0)_ : * code retour de la dernière fonction de rappel exécutée (_WEECHAT_RC_OK_ si @@ -12772,6 +12784,8 @@ Exemple en C : [source,c] ---- int rc = weechat_hook_signal_send ("mon_signal", WEECHAT_HOOK_SIGNAL_STRING, ma_chaine); +int rc2 = weechat_hook_signal_send ("[flags:stop_on_error,ignore_eat]my_signal2", + WEECHAT_HOOK_SIGNAL_STRING, my_string); ---- Script (Python) : @@ -12781,8 +12795,10 @@ Script (Python) : # prototype def hook_signal_send(signal: str, type_data: str, signal_data: str) -> int: ... -# exemple +# exemples rc = weechat.hook_signal_send("mon_signal", weechat.WEECHAT_HOOK_SIGNAL_STRING, ma_chaine) +rc2 = weechat.hook_signal_send("[flags:stop_on_error,ignore_eat]my_signal2", + weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) ---- [[signal_logger_backlog]] @@ -13076,7 +13092,7 @@ hook = weechat.hook_hsignal("test", "my_hsignal_cb", "") ==== hook_hsignal_send -_WeeChat ≥ 0.3.4, mis à jour dans la 1.0._ +_WeeChat ≥ 0.3.4, mis à jour dans la 1.0, 4.5.0._ Envoyer un hsignal (signal avec table de hachage). @@ -13089,7 +13105,8 @@ int weechat_hook_hsignal_send (const char *signal, struct t_hashtable *hashtable Paramètres : -* _signal_ : signal à envoyer +* _signal_ : signal à envoyer ; des drapeaux sont autorisés avant le nom du signal + (voir la fonction <<_hook_signal_send,hook_signal_send>>) _(WeeChat ≥ 4.5.0)_ * _hashtable_ : table de hachage Valeur de retour _(WeeChat ≥ 1.0)_ : @@ -13104,7 +13121,7 @@ Exemple en C : [source,c] ---- -int rc; +int rc, rc2; struct t_hashtable *hashtable = weechat_hashtable_new (8, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, @@ -13114,6 +13131,7 @@ if (hashtable) { weechat_hashtable_set (hashtable, "clé", "valeur"); rc = weechat_hook_hsignal_send ("my_hsignal", hashtable); + rc2 = weechat_hook_hsignal_send ("[flags:stop_on_error,ignore_eat]my_hsignal2", hashtable); weechat_hashtable_free (hashtable); } ---- @@ -13125,8 +13143,9 @@ Script (Python) : # prototype def hook_hsignal_send(signal: str, hashtable: Dict[str, str]) -> int: ... -# exemple +# exemples rc = weechat.hook_hsignal_send("my_hsignal", {"clé": "valeur"}) +rc2 = weechat.hook_hsignal_send("[flags:stop_on_error,ignore_eat]my_hsignal2", {"key": "value"}) ---- [[hsignal_irc_redirect_command]] diff --git a/doc/it/weechat_plugin_api.it.adoc b/doc/it/weechat_plugin_api.it.adoc index c0b728c61..07c1542be 100644 --- a/doc/it/weechat_plugin_api.it.adoc +++ b/doc/it/weechat_plugin_api.it.adoc @@ -13039,7 +13039,7 @@ hook = weechat.hook_signal("quit;upgrade", "my_signal_cb", "") ==== hook_signal_send // TRANSLATION MISSING -_Updated in 1.0._ +_Updated in 1.0, 4.5.0._ Invia un segnale. @@ -13053,10 +13053,22 @@ int weechat_hook_signal_send (const char *signal, const char *type_data, Argomenti: -* _signal_: segnale da inviare +// TRANSLATION MISSING +* _signal_: segnale da inviare; flags are allowed before the signal name (see below) + _(WeeChat ≥ 4.5.0)_ * _type_data_: tipo di dati inviati con il segnale (consultare <<_hook_signal,hook_signal>>) * _signal_data_: dati inviati con il segnale +// TRANSLATION MISSING +The signal name can contain flags with the following format: `[flags:xxx,yyy]signal` +where `xxx` and `yyy` are names of flags, and `signal` the signal name. + +The following flags are supported: + +* _stop_on_error_: exit immediately if a callback returns WEECHAT_RC_ERROR + (remaining callbacks are then NOT executed) _(WeeChat ≥ 4.5.0)_ +* _ignore_eat_: consider any callback returning WEECHAT_RC_OK_EAT is in fact + WEECHAT_RC_OK and execute remaining callbacks _(WeeChat ≥ 4.5.0)_ + // TRANSLATION MISSING Return value _(WeeChat ≥ 1.0)_: @@ -13072,6 +13084,8 @@ Esempio in C: [source,c] ---- int rc = weechat_hook_signal_send ("my_signal", WEECHAT_HOOK_SIGNAL_STRING, my_string); +int rc2 = weechat_hook_signal_send ("[flags:stop_on_error,ignore_eat]my_signal2", + WEECHAT_HOOK_SIGNAL_STRING, my_string); ---- Script (Python): @@ -13083,6 +13097,8 @@ def hook_signal_send(signal: str, type_data: str, signal_data: str) -> int: ... # esempio rc = weechat.hook_signal_send("my_signal", weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) +rc2 = weechat.hook_signal_send("[flags:stop_on_error,ignore_eat]my_signal2", + weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) ---- [[signal_logger_backlog]] @@ -13390,7 +13406,7 @@ hook = weechat.hook_hsignal("test", "my_hsignal_cb", "") ==== hook_hsignal_send // TRANSLATION MISSING -_WeeChat ≥ 0.3.4, updated in 1.0._ +_WeeChat ≥ 0.3.4, updated in 1.0, 4.5.0._ Invia un hsignal (segnale con tabella hash). @@ -13403,7 +13419,9 @@ int weechat_hook_hsignal_send (const char *signal, struct t_hashtable *hashtable Argomenti: -* _signal_: segnale da inviare +// TRANSLATION MISSING +* _signal_: segnale da inviare; flags are allowed before the signal name + (see function <<_hook_signal_send,hook_signal_send>>) _(WeeChat ≥ 4.5.0)_ * _hashtable_: tabella hash // TRANSLATION MISSING @@ -13420,7 +13438,7 @@ Esempio in C: [source,c] ---- -int rc; +int rc, rc2; struct t_hashtable *hashtable = weechat_hashtable_new (8, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, @@ -13430,6 +13448,7 @@ if (hashtable) { weechat_hashtable_set (hashtable, "key", "value"); rc = weechat_hook_hsignal_send ("my_hsignal", hashtable); + rc2 = weechat_hook_hsignal_send ("[flags:stop_on_error,ignore_eat]my_hsignal2", hashtable); weechat_hashtable_free (hashtable); } ---- @@ -13443,6 +13462,7 @@ def hook_hsignal_send(signal: str, hashtable: Dict[str, str]) -> int: ... # esempio rc = weechat.hook_hsignal_send("my_hsignal", {"key": "value"}) +rc2 = weechat.hook_hsignal_send("[flags:stop_on_error,ignore_eat]my_hsignal2", {"key": "value"}) ---- [[hsignal_irc_redirect_command]] diff --git a/doc/ja/weechat_plugin_api.ja.adoc b/doc/ja/weechat_plugin_api.ja.adoc index 849553164..e3b52af56 100644 --- a/doc/ja/weechat_plugin_api.ja.adoc +++ b/doc/ja/weechat_plugin_api.ja.adoc @@ -12669,7 +12669,7 @@ hook = weechat.hook_signal("quit;upgrade", "my_signal_cb", "") ==== hook_signal_send -_WeeChat バージョン 1.0 で更新。_ +_WeeChat バージョン 1.0, 4.5.0 で更新。_ シグナルを送信。 @@ -12683,11 +12683,23 @@ int weechat_hook_signal_send (const char *signal, const char *type_data, 引数: -* _signal_: 送信するシグナル +// TRANSLATION MISSING +* _signal_: 送信するシグナル; flags are allowed before the signal name (see below) + _(WeeChat ≥ 4.5.0)_ * _type_data_: シグナルと一緒に送信するデータの型 (<<_hook_signal,hook_signal>> を参照) * _signal_data_: シグナルと一緒に送信するデータ +// TRANSLATION MISSING +The signal name can contain flags with the following format: `[flags:xxx,yyy]signal` +where `xxx` and `yyy` are names of flags, and `signal` the signal name. + +The following flags are supported: + +* _stop_on_error_: exit immediately if a callback returns WEECHAT_RC_ERROR + (remaining callbacks are then NOT executed) _(WeeChat ≥ 4.5.0)_ +* _ignore_eat_: consider any callback returning WEECHAT_RC_OK_EAT is in fact + WEECHAT_RC_OK and execute remaining callbacks _(WeeChat ≥ 4.5.0)_ + 戻り値 _(WeeChat バージョン 1.0 以上で利用可)_: * 最後に実行したコールバックの戻り値 @@ -12701,6 +12713,8 @@ C 言語での使用例: [source,c] ---- int rc = weechat_hook_signal_send ("my_signal", WEECHAT_HOOK_SIGNAL_STRING, my_string); +int rc2 = weechat_hook_signal_send ("[flags:stop_on_error,ignore_eat]my_signal2", + WEECHAT_HOOK_SIGNAL_STRING, my_string); ---- スクリプト (Python) での使用例: @@ -12712,6 +12726,8 @@ def hook_signal_send(signal: str, type_data: str, signal_data: str) -> int: ... # 例 rc = weechat.hook_signal_send("my_signal", weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) +rc2 = weechat.hook_signal_send("[flags:stop_on_error,ignore_eat]my_signal2", + weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) ---- [[signal_logger_backlog]] @@ -12998,7 +13014,7 @@ hook = weechat.hook_hsignal("test", "my_hsignal_cb", "") ==== hook_hsignal_send -_WeeChat バージョン 0.3.4 以上で利用可、バージョン 1.0 で更新。_ +_WeeChat バージョン 0.3.4 以上で利用可、バージョン 1.0, 4.5.0 で更新。_ hsignal (ハッシュテーブルを持つシグナル) を送信。 @@ -13011,7 +13027,9 @@ int weechat_hook_hsignal_send (const char *signal, struct t_hashtable *hashtable 引数: -* _signal_: 送信するシグナル +// TRANSLATION MISSING +* _signal_: 送信するシグナル; flags are allowed before the signal name + (see function <<_hook_signal_send,hook_signal_send>>) _(WeeChat ≥ 4.5.0)_ * _hashtable_: ハッシュテーブル 戻り値 _(WeeChat バージョン 1.0 以上で利用可)_: @@ -13026,7 +13044,7 @@ C 言語での使用例: [source,c] ---- -int rc; +int rc, rc2; struct t_hashtable *hashtable = weechat_hashtable_new (8, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, @@ -13036,6 +13054,7 @@ if (hashtable) { weechat_hashtable_set (hashtable, "key", "value"); rc = weechat_hook_hsignal_send ("my_hsignal", hashtable); + rc2 = weechat_hook_hsignal_send ("[flags:stop_on_error,ignore_eat]my_hsignal2", hashtable); weechat_hashtable_free (hashtable); } ---- @@ -13049,6 +13068,7 @@ def hook_hsignal_send(signal: str, hashtable: Dict[str, str]) -> int: ... # 例 rc = weechat.hook_hsignal_send("my_hsignal", {"key": "value"}) +rc2 = weechat.hook_hsignal_send("[flags:stop_on_error,ignore_eat]my_hsignal2", {"key": "value"}) ---- [[hsignal_irc_redirect_command]] diff --git a/doc/sr/weechat_plugin_api.sr.adoc b/doc/sr/weechat_plugin_api.sr.adoc index 3e2f006e9..50270af92 100644 --- a/doc/sr/weechat_plugin_api.sr.adoc +++ b/doc/sr/weechat_plugin_api.sr.adoc @@ -12163,7 +12163,7 @@ hook = weechat.hook_signal("quit;upgrade", "my_signal_cb", "") ==== hook_signal_send -_Ажурирано у верзији 1.0._ +_Ажурирано у верзији 1.0, 4.5.0._ Шаље сигнал. @@ -12177,10 +12177,22 @@ int weechat_hook_signal_send (const char *signal, const char *type_data, Аргументи: -* _signal_: сигнал који се шаље +// TRANSLATION MISSING +* _signal_: сигнал који се шаље; flags are allowed before the signal name (see below) + _(WeeChat ≥ 4.5.0)_ * _type_data_: тип података који се шаљу уз сигнал (погледајте <<_hook_signal,hook_signal>>) * _signal_data_: подаци који се шаљу уз сигнал +// TRANSLATION MISSING +The signal name can contain flags with the following format: `[flags:xxx,yyy]signal` +where `xxx` and `yyy` are names of flags, and `signal` the signal name. + +The following flags are supported: + +* _stop_on_error_: exit immediately if a callback returns WEECHAT_RC_ERROR + (remaining callbacks are then NOT executed) _(WeeChat ≥ 4.5.0)_ +* _ignore_eat_: consider any callback returning WEECHAT_RC_OK_EAT is in fact + WEECHAT_RC_OK and execute remaining callbacks _(WeeChat ≥ 4.5.0)_ + Повратна вредност _(WeeChat ≥ 1.0)_: * повратни кôд последње извршене функције повратног позива (_WEECHAT_RC_OK_ ако ниједна функција повратног позива није била извршена): @@ -12193,6 +12205,8 @@ C пример: [source,c] ---- int rc = weechat_hook_signal_send ("my_signal", WEECHAT_HOOK_SIGNAL_STRING, my_string); +int rc2 = weechat_hook_signal_send ("[flags:stop_on_error,ignore_eat]my_signal2", + WEECHAT_HOOK_SIGNAL_STRING, my_string); ---- Скрипта (Python): @@ -12202,8 +12216,10 @@ int rc = weechat_hook_signal_send ("my_signal", WEECHAT_HOOK_SIGNAL_STRING, my_s # прототип def hook_signal_send(signal: str, type_data: str, signal_data: str) -> int: ... -# пример +# примери rc = weechat.hook_signal_send("my_signal", weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) +rc2 = weechat.hook_signal_send("[flags:stop_on_error,ignore_eat]my_signal2", + weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) ---- [[signal_logger_backlog]] @@ -12476,7 +12492,7 @@ hook = weechat.hook_hsignal("test", "my_hsignal_cb", "") ==== hook_hsignal_send -_WeeChat ≥ 0.3.4, ажурирано у верзији 1.0._ +_WeeChat ≥ 0.3.4, ажурирано у верзији 1.0, 4.5.0._ Шаље hsignal (сигнал са хеш табелом). @@ -12489,7 +12505,9 @@ int weechat_hook_hsignal_send (const char *signal, struct t_hashtable *hashtable Аргументи: -* _signal_: сигнал који се шаље +// TRANSLATION MISSING +* _signal_: сигнал који се шаље; flags are allowed before the signal name + (see function <<_hook_signal_send,hook_signal_send>>) _(WeeChat ≥ 4.5.0)_ * _hashtable_: хеш табела Повратна вредност _(WeeChat ≥ 1.0)_: @@ -12503,7 +12521,7 @@ C пример: [source,c] ---- -int rc; +int rc, rc2; struct t_hashtable *hashtable = weechat_hashtable_new (8, WEECHAT_HASHTABLE_STRING, WEECHAT_HASHTABLE_STRING, @@ -12513,6 +12531,7 @@ if (hashtable) { weechat_hashtable_set (hashtable, "key", "value"); rc = weechat_hook_hsignal_send ("my_hsignal", hashtable); + rc2 = weechat_hook_hsignal_send ("[flags:stop_on_error,ignore_eat]my_hsignal2", hashtable); weechat_hashtable_free (hashtable); } ---- @@ -12524,8 +12543,9 @@ if (hashtable) # прототип def hook_hsignal_send(signal: str, hashtable: Dict[str, str]) -> int: ... -# пример +# примери rc = weechat.hook_hsignal_send("my_hsignal", {"key": "value"}) +rc2 = weechat.hook_hsignal_send("[flags:stop_on_error,ignore_eat]my_hsignal2", {"key": "value"}) ---- [[hsignal_irc_redirect_command]] diff --git a/src/core/hook/hook-hsignal.c b/src/core/hook/hook-hsignal.c index 235bf37dc..2d29afdad 100644 --- a/src/core/hook/hook-hsignal.c +++ b/src/core/hook/hook-hsignal.c @@ -32,6 +32,7 @@ #include "../core-log.h" #include "../core-string.h" #include "../../plugins/plugin.h" +#include "hook-signal.h" /* @@ -130,10 +131,19 @@ hook_hsignal_send (const char *signal, struct t_hashtable *hashtable) { struct t_hook *ptr_hook, *next_hook; struct t_hook_exec_cb hook_exec_cb; - int rc; + const char *ptr_signal; + int rc, stop_on_error, ignore_eat; rc = WEECHAT_RC_OK; + ptr_signal = signal; + stop_on_error = 0; + ignore_eat = 0; + hook_signal_extract_flags (signal, &ptr_signal, + &stop_on_error, &ignore_eat); + if (!ptr_signal) + return rc; + hook_exec_start (); ptr_hook = weechat_hooks[HOOK_TYPE_HSIGNAL]; @@ -153,8 +163,14 @@ hook_hsignal_send (const char *signal, struct t_hashtable *hashtable) hashtable); hook_callback_end (ptr_hook, &hook_exec_cb); - if (rc == WEECHAT_RC_OK_EAT) + if (ignore_eat && (rc == WEECHAT_RC_OK_EAT)) + rc = WEECHAT_RC_OK; + + if ((rc == WEECHAT_RC_OK_EAT) + || (stop_on_error && (rc == WEECHAT_RC_ERROR))) + { break; + } } ptr_hook = next_hook; diff --git a/src/core/hook/hook-signal.c b/src/core/hook/hook-signal.c index a9c1b3e83..6e272c623 100644 --- a/src/core/hook/hook-signal.c +++ b/src/core/hook/hook-signal.c @@ -121,6 +121,57 @@ hook_signal_match (const char *signal, struct t_hook *hook) return 0; } +/* + * Extracts flags from signal and returns flags and pointer to start of signal. + */ + +void +hook_signal_extract_flags (const char *signal, const char **ptr_signal, + int *stop_on_error, int *ignore_eat) +{ + char *pos, *str_flags, **flags; + int i, num_flags; + + if (!signal || !ptr_signal || !stop_on_error || !ignore_eat) + return; + + *ptr_signal = signal; + *stop_on_error = 0; + *ignore_eat = 0; + + if (strncmp (signal, "[flags:", 7) != 0) + return; + + pos = strchr (signal + 7, ']'); + if (!pos) + return; + + str_flags = string_strndup (signal + 7, pos - signal - 7); + if (!str_flags) + return; + + *ptr_signal = pos + 1; + + flags = string_split (str_flags, ",", NULL, + WEECHAT_STRING_SPLIT_STRIP_LEFT + | WEECHAT_STRING_SPLIT_STRIP_RIGHT + | WEECHAT_STRING_SPLIT_COLLAPSE_SEPS, + 0, &num_flags); + if (flags) + { + for (i = 0; i < num_flags; i++) + { + if (string_strcmp (flags[i], "stop_on_error") == 0) + *stop_on_error = 1; + else if (string_strcmp (flags[i], "ignore_eat") == 0) + *ignore_eat = 1; + } + } + + string_free_split (flags); + free (str_flags); +} + /* * Sends a signal. */ @@ -130,10 +181,19 @@ hook_signal_send (const char *signal, const char *type_data, void *signal_data) { struct t_hook *ptr_hook, *next_hook; struct t_hook_exec_cb hook_exec_cb; - int rc; + const char *ptr_signal; + int rc, stop_on_error, ignore_eat; rc = WEECHAT_RC_OK; + ptr_signal = signal; + stop_on_error = 0; + ignore_eat = 0; + hook_signal_extract_flags (signal, &ptr_signal, + &stop_on_error, &ignore_eat); + if (!ptr_signal) + return rc; + hook_exec_start (); ptr_hook = weechat_hooks[HOOK_TYPE_SIGNAL]; @@ -143,19 +203,25 @@ hook_signal_send (const char *signal, const char *type_data, void *signal_data) if (!ptr_hook->deleted && !ptr_hook->running - && hook_signal_match (signal, ptr_hook)) + && hook_signal_match (ptr_signal, ptr_hook)) { hook_callback_start (ptr_hook, &hook_exec_cb); rc = (HOOK_SIGNAL(ptr_hook, callback)) (ptr_hook->callback_pointer, ptr_hook->callback_data, - signal, + ptr_signal, type_data, signal_data); hook_callback_end (ptr_hook, &hook_exec_cb); - if (rc == WEECHAT_RC_OK_EAT) + if (ignore_eat && (rc == WEECHAT_RC_OK_EAT)) + rc = WEECHAT_RC_OK; + + if ((rc == WEECHAT_RC_OK_EAT) + || (stop_on_error && (rc == WEECHAT_RC_ERROR))) + { break; + } } ptr_hook = next_hook; diff --git a/src/core/hook/hook-signal.h b/src/core/hook/hook-signal.h index 0dbcfa5d8..22bc024a5 100644 --- a/src/core/hook/hook-signal.h +++ b/src/core/hook/hook-signal.h @@ -44,6 +44,10 @@ extern struct t_hook *hook_signal (struct t_weechat_plugin *plugin, t_hook_callback_signal *callback, const void *callback_pointer, void *callback_data); +extern void hook_signal_extract_flags (const char *signal, + const char **ptr_signal, + int *stop_on_error, + int *ignore_eat); extern int hook_signal_send (const char *signal, const char *type_data, void *signal_data); extern void hook_signal_free_data (struct t_hook *hook); diff --git a/src/plugins/python/weechat.pyi b/src/plugins/python/weechat.pyi index a87aad3e5..e61496307 100644 --- a/src/plugins/python/weechat.pyi +++ b/src/plugins/python/weechat.pyi @@ -1558,8 +1558,10 @@ def hook_signal_send(signal: str, type_data: str, signal_data: str) -> int: """`hook_signal_send in WeeChat plugin API reference `_ :: - # example + # examples rc = weechat.hook_signal_send("my_signal", weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) + rc2 = weechat.hook_signal_send("[flags:stop_on_error,ignore_eat]my_signal2", + weechat.WEECHAT_HOOK_SIGNAL_STRING, my_string) """ ... @@ -1582,8 +1584,9 @@ def hook_hsignal_send(signal: str, hashtable: Dict[str, str]) -> int: """`hook_hsignal_send in WeeChat plugin API reference `_ :: - # example + # examples rc = weechat.hook_hsignal_send("my_hsignal", {"key": "value"}) + rc2 = weechat.hook_hsignal_send("[flags:stop_on_error,ignore_eat]my_hsignal2", {"key": "value"}) """ ... diff --git a/tests/unit/core/hook/test-hook-signal.cpp b/tests/unit/core/hook/test-hook-signal.cpp index 0bd9a459a..8f5ba7c9b 100644 --- a/tests/unit/core/hook/test-hook-signal.cpp +++ b/tests/unit/core/hook/test-hook-signal.cpp @@ -26,6 +26,7 @@ extern "C" { #include "src/core/weechat.h" +#include "src/core/hook/hook-signal.h" } TEST_GROUP(HookSignal) @@ -62,6 +63,83 @@ TEST(HookSignal, Match) /* TODO: write tests */ } +/* + * Tests functions: + * hook_signal_extract_flags + */ + +TEST(HookSignal, ExtractFlags) +{ + const char *ptr_signal; + char signal[128]; + int stop_on_error, ignore_eat; + + hook_signal_extract_flags (NULL, NULL, NULL, NULL); + + /* no flags */ + snprintf (signal, sizeof (signal), "test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("test", ptr_signal); + LONGS_EQUAL(0, stop_on_error); + LONGS_EQUAL(0, ignore_eat); + + /* invalid flags (missing "]") */ + snprintf (signal, sizeof (signal), "[flags:test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("[flags:test", ptr_signal); + LONGS_EQUAL(0, stop_on_error); + LONGS_EQUAL(0, ignore_eat); + + /* unknown flag */ + snprintf (signal, sizeof (signal), "[flags:flag1]test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("test", ptr_signal); + LONGS_EQUAL(0, stop_on_error); + LONGS_EQUAL(0, ignore_eat); + + /* unknown flags */ + snprintf (signal, sizeof (signal), "[flags:flag1,flag2]test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("test", ptr_signal); + LONGS_EQUAL(0, stop_on_error); + LONGS_EQUAL(0, ignore_eat); + + /* flag "stop_on_error" */ + snprintf (signal, sizeof (signal), "[flags:stop_on_error]test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("test", ptr_signal); + LONGS_EQUAL(1, stop_on_error); + LONGS_EQUAL(0, ignore_eat); + + /* flag "ignore_eat" */ + snprintf (signal, sizeof (signal), "[flags:ignore_eat]test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("test", ptr_signal); + LONGS_EQUAL(0, stop_on_error); + LONGS_EQUAL(1, ignore_eat); + + /* flags "stop_on_error" and "ignore_eat" */ + snprintf (signal, sizeof (signal), "[flags:stop_on_error,ignore_eat]test"); + stop_on_error = -1; + ignore_eat = -1; + hook_signal_extract_flags (signal, &ptr_signal, &stop_on_error, &ignore_eat); + STRCMP_EQUAL("test", ptr_signal); + LONGS_EQUAL(1, stop_on_error); + LONGS_EQUAL(1, ignore_eat); +} + /* * Tests functions: * hook_signal_send