diff --git a/src/plugins/trigger/trigger-callback.c b/src/plugins/trigger/trigger-callback.c index df51a6b24..f58df497e 100644 --- a/src/plugins/trigger/trigger-callback.c +++ b/src/plugins/trigger/trigger-callback.c @@ -755,6 +755,54 @@ end: return rc; } +/* + * Callback for a config hooked. + */ + +int +trigger_callback_config_cb (void *data, const char *option, const char *value) +{ + struct t_trigger *trigger; + struct t_hashtable *extra_vars; + int rc; + + /* get trigger pointer, return immediately if not found or trigger running */ + trigger = (struct t_trigger *)data; + if (!trigger || trigger->hook_running) + return WEECHAT_RC_OK; + + trigger->hook_count_cb++; + trigger->hook_running = 1; + + extra_vars = NULL; + + rc = trigger_return_code[weechat_config_integer (trigger->options[TRIGGER_OPTION_RETURN_CODE])]; + + /* create hashtable */ + extra_vars = weechat_hashtable_new (32, + WEECHAT_HASHTABLE_STRING, + WEECHAT_HASHTABLE_STRING, + NULL, + NULL); + if (!extra_vars) + goto end; + + /* add data in hashtable used for conditions/replace/command */ + weechat_hashtable_set (extra_vars, "tg_option", option); + weechat_hashtable_set (extra_vars, "tg_value", value); + + /* execute the trigger (conditions, regex, command) */ + trigger_callback_execute (trigger, NULL, NULL, extra_vars); + +end: + if (extra_vars) + weechat_hashtable_free (extra_vars); + + trigger->hook_running = 0; + + return rc; +} + /* * Initializes trigger callback. */ diff --git a/src/plugins/trigger/trigger-callback.h b/src/plugins/trigger/trigger-callback.h index feb8f7953..3d157b4d4 100644 --- a/src/plugins/trigger/trigger-callback.h +++ b/src/plugins/trigger/trigger-callback.h @@ -36,6 +36,8 @@ extern int trigger_callback_command_run_cb (void *data, struct t_gui_buffer *buffer, const char *command); extern int trigger_callback_timer_cb (void *data, int remaining_calls); +extern int trigger_callback_config_cb (void *data, const char *option, + const char *value); extern void trigger_callback_init (); extern void trigger_callback_end (); diff --git a/src/plugins/trigger/trigger-command.c b/src/plugins/trigger/trigger-command.c index 3563fbde5..b46e8f680 100644 --- a/src/plugins/trigger/trigger-command.c +++ b/src/plugins/trigger/trigger-command.c @@ -713,7 +713,8 @@ trigger_command_init () "listdefault: list default triggers\n" " add: add a trigger\n" " name: name of trigger\n" - " hook: signal, hsignal, modifier, print, command_run, timer\n" + " hook: signal, hsignal, modifier, print, command_run, timer, " + "config\n" " arguments: arguments for the hook, depending on hook (separated " "by semicolons):\n" " signal: name(s) of signal\n" @@ -722,6 +723,7 @@ trigger_command_init () " print: buffer, tags, message, strip_colors\n" " command_run: command\n" " timer: interval, align_second, max_calls\n" + " config: name of option\n" " conditions: evaluated conditions for the trigger\n" " regex: one or more regular expressions to replace strings " "in variables\n" diff --git a/src/plugins/trigger/trigger-config.c b/src/plugins/trigger/trigger-config.c index 556d1d76a..f0e7977fa 100644 --- a/src/plugins/trigger/trigger-config.c +++ b/src/plugins/trigger/trigger-config.c @@ -236,7 +236,7 @@ trigger_config_create_option (const char *trigger_name, int index_option, trigger_config_file, trigger_config_section_trigger, option_name, "integer", N_("type of hook used"), - "signal|hsignal|modifier|print|command_run|timer", + trigger_hook_option_values, 0, 0, value, NULL, 0, NULL, NULL, &trigger_config_change_hook, NULL, NULL, NULL); break; diff --git a/src/plugins/trigger/trigger.c b/src/plugins/trigger/trigger.c index e7a52aab2..e33e0e9b5 100644 --- a/src/plugins/trigger/trigger.c +++ b/src/plugins/trigger/trigger.c @@ -48,21 +48,25 @@ char *trigger_option_default[TRIGGER_NUM_OPTIONS] = { "on", "signal", "", "", "", "", "ok" }; char *trigger_hook_type_string[TRIGGER_NUM_HOOK_TYPES] = -{ "signal", "hsignal", "modifier", "print", "command_run", "timer" }; +{ "signal", "hsignal", "modifier", "print", "command_run", "timer", "config" }; +char *trigger_hook_option_values = + "signal|hsignal|modifier|print|command_run|timer|config"; char *trigger_hook_default_arguments[TRIGGER_NUM_HOOK_TYPES] = -{ "xxx", "xxx", "xxx", "", "/cmd", "60000;0;0" }; +{ "xxx", "xxx", "xxx", "", "/cmd", "60000;0;0", "xxx" }; char *trigger_hook_default_conditions[TRIGGER_NUM_HOOK_TYPES] = -{ "${...}", "${...}", "${...}", "${...}", "${...}", "${...}" }; +{ "${...}", "${...}", "${...}", "${...}", "${...}", "${...}", "${...}" }; char *trigger_hook_default_regex[TRIGGER_NUM_HOOK_TYPES] = -{ "/abc/def", "/abc/def", "/abc/def", "/abc/def", "/abc/def", "/abc/def" }; +{ "/abc/def", "/abc/def", "/abc/def", "/abc/def", "/abc/def", "/abc/def", + "/abc/def" }; char *trigger_hook_default_command[TRIGGER_NUM_HOOK_TYPES] = -{ "/cmd", "/cmd", "/cmd", "/cmd", "/cmd", "/cmd" }; +{ "/cmd", "/cmd", "/cmd", "/cmd", "/cmd", "/cmd", "/cmd" }; char *trigger_hook_default_rc[TRIGGER_NUM_HOOK_TYPES] = { "ok,ok_eat,error", "ok,ok_eat,error", "", "ok,error", "ok,ok_eat,error", - "ok" }; + "ok", "ok" }; char *trigger_hook_regex_default_var[TRIGGER_NUM_HOOK_TYPES] = -{ "tg_signal_data", "", "tg_string", "tg_message", "tg_command", "" }; +{ "tg_signal_data", "", "tg_string", "tg_message", "tg_command", "", + "tg_value" }; char *trigger_return_code_string[TRIGGER_NUM_RETURN_CODES] = { "ok", "ok_eat", "error" }; @@ -367,6 +371,22 @@ trigger_hook (struct t_trigger *trigger) } } break; + case TRIGGER_HOOK_CONFIG: + if (argv && (argc >= 1)) + { + trigger->hooks = malloc (argc * sizeof (trigger->hooks[0])); + if (trigger->hooks) + { + trigger->hooks_count = argc; + for (i = 0; i < argc; i++) + { + trigger->hooks[i] = weechat_hook_config (argv[i], + &trigger_callback_config_cb, + trigger); + } + } + } + break; } if (!trigger->hooks) diff --git a/src/plugins/trigger/trigger.h b/src/plugins/trigger/trigger.h index a17ffa772..19149b650 100644 --- a/src/plugins/trigger/trigger.h +++ b/src/plugins/trigger/trigger.h @@ -46,6 +46,7 @@ enum t_trigger_hook_type TRIGGER_HOOK_PRINT, TRIGGER_HOOK_COMMAND_RUN, TRIGGER_HOOK_TIMER, + TRIGGER_HOOK_CONFIG, /* number of hook types */ TRIGGER_NUM_HOOK_TYPES, }; @@ -101,6 +102,7 @@ extern struct t_weechat_plugin *weechat_trigger_plugin; extern char *trigger_option_string[]; extern char *trigger_option_default[]; extern char *trigger_hook_type_string[]; +extern char *trigger_hook_option_values; extern char *trigger_hook_default_arguments[]; extern char *trigger_hook_default_conditions[]; extern char *trigger_hook_default_regex[];