summaryrefslogtreecommitdiff
path: root/src/plugins/trigger
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/trigger')
-rw-r--r--src/plugins/trigger/trigger-callback.c149
-rw-r--r--src/plugins/trigger/trigger-callback.h12
-rw-r--r--src/plugins/trigger/trigger-command.c7
-rw-r--r--src/plugins/trigger/trigger.c34
-rw-r--r--src/plugins/trigger/trigger.h1
5 files changed, 185 insertions, 18 deletions
diff --git a/src/plugins/trigger/trigger-callback.c b/src/plugins/trigger/trigger-callback.c
index 2ed0909b4..0ef7cc279 100644
--- a/src/plugins/trigger/trigger-callback.c
+++ b/src/plugins/trigger/trigger-callback.c
@@ -227,6 +227,7 @@ void
trigger_callback_replace_regex (struct t_trigger *trigger,
struct t_hashtable *pointers,
struct t_hashtable *extra_vars,
+ struct t_weelist *vars_updated,
int display_monitor)
{
char *value;
@@ -312,6 +313,11 @@ trigger_callback_replace_regex (struct t_trigger *trigger,
weechat_color ("chat_delimiters"));
}
weechat_hashtable_set (extra_vars, ptr_key, value);
+ if (vars_updated)
+ {
+ weechat_list_add (vars_updated, ptr_key, WEECHAT_LIST_POS_END,
+ NULL);
+ }
free (value);
}
}
@@ -392,7 +398,8 @@ void
trigger_callback_execute (struct t_trigger *trigger,
struct t_gui_buffer *buffer,
struct t_hashtable *pointers,
- struct t_hashtable *extra_vars)
+ struct t_hashtable *extra_vars,
+ struct t_weelist *vars_updated)
{
int display_monitor;
@@ -409,7 +416,7 @@ trigger_callback_execute (struct t_trigger *trigger,
{
/* replace text with regex */
trigger_callback_replace_regex (trigger, pointers, extra_vars,
- display_monitor);
+ vars_updated, display_monitor);
/* execute command(s) */
trigger_callback_run_command (trigger, buffer, pointers, extra_vars,
@@ -521,7 +528,7 @@ trigger_callback_signal_cb (const void *pointer, void *data,
weechat_hashtable_set (extra_vars, "tg_signal_data", ptr_signal_data);
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, NULL, pointers, extra_vars);
+ trigger_callback_execute (trigger, NULL, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -569,7 +576,7 @@ trigger_callback_hsignal_cb (const void *pointer, void *data,
weechat_hashtable_set (extra_vars, "tg_signal", signal);
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, NULL, pointers, extra_vars);
+ trigger_callback_execute (trigger, NULL, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -753,7 +760,7 @@ trigger_callback_modifier_cb (const void *pointer, void *data,
}
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, buffer, pointers, extra_vars);
+ trigger_callback_execute (trigger, buffer, pointers, extra_vars, NULL);
end:
ptr_string = weechat_hashtable_get (extra_vars, "tg_string");
@@ -769,6 +776,126 @@ end:
}
/*
+ * Callback for a line hooked.
+ */
+
+struct t_hashtable *
+trigger_callback_line_cb (const void *pointer, void *data,
+ struct t_hashtable *line)
+{
+ struct t_hashtable *hashtable;
+ struct t_gui_buffer *buffer;
+ struct t_weelist_item *ptr_item;
+ long unsigned int value;
+ const char *ptr_key, *ptr_value;
+ char **tags, *str_tags;
+ int rc, num_tags, length;
+
+ TRIGGER_CALLBACK_CB_INIT(NULL);
+
+ hashtable = NULL;
+
+ TRIGGER_CALLBACK_CB_NEW_POINTERS;
+ TRIGGER_CALLBACK_CB_NEW_VARS_UPDATED;
+
+ extra_vars = weechat_hashtable_dup (line);
+
+ weechat_hashtable_remove (extra_vars, "buffer");
+ weechat_hashtable_remove (extra_vars, "tags_count");
+ weechat_hashtable_remove (extra_vars, "tags");
+
+ /* add data in hashtables used for conditions/replace/command */
+ ptr_value = weechat_hashtable_get (line, "buffer");
+ if (!ptr_value || (ptr_value[0] != '0') || (ptr_value[1] != 'x'))
+ goto end;
+ rc = sscanf (ptr_value + 2, "%lx", &value);
+ if ((rc == EOF) || (rc < 1))
+ goto end;
+ buffer = (void *)value;
+
+ weechat_hashtable_set (pointers, "buffer", buffer);
+ ptr_value = weechat_hashtable_get (line, "tags");
+ tags = weechat_string_split ((ptr_value) ? ptr_value : "", ",", 0, 0,
+ &num_tags);
+
+ /* build string with tags and commas around: ",tag1,tag2,tag3," */
+ length = 1 + strlen ((ptr_value) ? ptr_value : "") + 1 + 1;
+ str_tags = malloc (length);
+ if (str_tags)
+ {
+ snprintf (str_tags, length, ",%s,",
+ (ptr_value) ? ptr_value : "");
+ weechat_hashtable_set (extra_vars, "tg_tags", str_tags);
+ free (str_tags);
+ }
+
+ if (!trigger_callback_set_tags (buffer, (const char **)tags, num_tags,
+ extra_vars))
+ {
+ goto end;
+ }
+
+ /* execute the trigger (conditions, regex, command) */
+ trigger_callback_execute (trigger, buffer, pointers, extra_vars,
+ vars_updated);
+
+ hashtable = weechat_hashtable_new (32,
+ WEECHAT_HASHTABLE_STRING,
+ WEECHAT_HASHTABLE_STRING,
+ NULL, NULL);
+ if (hashtable)
+ {
+ /* copy updated variables into the result "hashtable" */
+ for (ptr_item = weechat_list_get (vars_updated, 0); ptr_item;
+ ptr_item = weechat_list_next (ptr_item))
+ {
+ ptr_key = weechat_list_string (ptr_item);
+ if (weechat_hashtable_has_key (extra_vars, ptr_key))
+ {
+ if (strcmp (ptr_key, "tg_tags") == 0)
+ {
+ /*
+ * remove commas at the beginning/end of tg_tags and
+ * rename the key to "tags"
+ */
+ ptr_value = weechat_hashtable_get (extra_vars, ptr_key);
+ if (ptr_value && ptr_value[0])
+ {
+ str_tags = strdup (
+ (ptr_value[0] == ',') ? ptr_value + 1 : ptr_value);
+ if (str_tags)
+ {
+ if (str_tags[0]
+ && (str_tags[strlen (str_tags) - 1] == ','))
+ {
+ str_tags[strlen (str_tags) - 1] = '\0';
+ }
+ weechat_hashtable_set (hashtable,
+ "tags", str_tags);
+ free (str_tags);
+ }
+ }
+ else
+ {
+ weechat_hashtable_set (hashtable, "tags", ptr_value);
+ }
+ }
+ else
+ {
+ weechat_hashtable_set (
+ hashtable,
+ ptr_key,
+ weechat_hashtable_get (extra_vars, ptr_key));
+ }
+ }
+ }
+ }
+
+end:
+ TRIGGER_CALLBACK_CB_END(hashtable);
+}
+
+/*
* Callback for a print hooked.
*/
@@ -840,7 +967,7 @@ trigger_callback_print_cb (const void *pointer, void *data,
goto end;
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, buffer, pointers, extra_vars);
+ trigger_callback_execute (trigger, buffer, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -874,7 +1001,7 @@ trigger_callback_command_cb (const void *pointer, void *data,
}
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, buffer, pointers, extra_vars);
+ trigger_callback_execute (trigger, buffer, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -899,7 +1026,7 @@ trigger_callback_command_run_cb (const void *pointer, void *data,
weechat_hashtable_set (extra_vars, "tg_command", command);
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, buffer, pointers, extra_vars);
+ trigger_callback_execute (trigger, buffer, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -949,7 +1076,7 @@ trigger_callback_timer_cb (const void *pointer, void *data,
}
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, NULL, pointers, extra_vars);
+ trigger_callback_execute (trigger, NULL, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -972,7 +1099,7 @@ trigger_callback_config_cb (const void *pointer, void *data,
weechat_hashtable_set (extra_vars, "tg_value", value);
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, NULL, pointers, extra_vars);
+ trigger_callback_execute (trigger, NULL, pointers, extra_vars, NULL);
end:
TRIGGER_CALLBACK_CB_END(trigger_rc);
@@ -1011,7 +1138,7 @@ trigger_callback_focus_cb (const void *pointer, void *data,
}
/* execute the trigger (conditions, regex, command) */
- trigger_callback_execute (trigger, NULL, pointers, info);
+ trigger_callback_execute (trigger, NULL, pointers, info, NULL);
end:
TRIGGER_CALLBACK_CB_END(info);
diff --git a/src/plugins/trigger/trigger-callback.h b/src/plugins/trigger/trigger-callback.h
index 8eeec3171..f9081aa19 100644
--- a/src/plugins/trigger/trigger-callback.h
+++ b/src/plugins/trigger/trigger-callback.h
@@ -25,10 +25,13 @@
#define TRIGGER_CALLBACK_CB_INIT(__rc) \
struct t_trigger *trigger; \
struct t_hashtable *pointers, *extra_vars; \
+ struct t_weelist *vars_updated; \
int trigger_rc; \
pointers = NULL; \
extra_vars = NULL; \
+ vars_updated = NULL; \
(void) data; \
+ (void) vars_updated; \
(void) trigger_rc; \
if (!trigger_enabled) \
return __rc; \
@@ -59,11 +62,18 @@
if (!extra_vars) \
goto end;
+#define TRIGGER_CALLBACK_CB_NEW_VARS_UPDATED \
+ vars_updated = weechat_list_new (); \
+ if (!vars_updated) \
+ goto end;
+
#define TRIGGER_CALLBACK_CB_END(__rc) \
if (pointers) \
weechat_hashtable_free (pointers); \
if (extra_vars) \
weechat_hashtable_free (extra_vars); \
+ if (vars_updated) \
+ weechat_list_free (vars_updated); \
trigger->hook_running = 0; \
switch (weechat_config_integer ( \
trigger->options[TRIGGER_OPTION_POST_ACTION])) \
@@ -93,6 +103,8 @@ extern char *trigger_callback_modifier_cb (const void *pointer, void *data,
const char *modifier,
const char *modifier_data,
const char *string);
+extern struct t_hashtable *trigger_callback_line_cb (const void *pointer, void *data,
+ struct t_hashtable *line);
extern int trigger_callback_print_cb (const void *pointer, void *data,
struct t_gui_buffer *buffer,
time_t date, int tags_count,
diff --git a/src/plugins/trigger/trigger-command.c b/src/plugins/trigger/trigger-command.c
index 5de047bc1..b896d981a 100644
--- a/src/plugins/trigger/trigger-command.c
+++ b/src/plugins/trigger/trigger-command.c
@@ -1153,13 +1153,14 @@ trigger_command_init ()
" addoff: add a trigger (disabled)\n"
" addreplace: add or replace an existing trigger\n"
" name: name of trigger\n"
- " hook: signal, hsignal, modifier, print, command, command_run, "
- "timer, config, focus\n"
+ " hook: signal, hsignal, modifier, line, print, command, "
+ "command_run, timer, config, focus\n"
" arguments: arguments for the hook, depending on hook (separated "
"by semicolons):\n"
" signal: name(s) of signal (required)\n"
" hsignal: name(s) of hsignal (required)\n"
" modifier: name(s) of modifier (required)\n"
+ " line: list of buffer masks, tags\n"
" print: buffer, tags, message, strip colors\n"
" command: command (required), description, arguments, "
"description of arguments, completion\n"
@@ -1212,7 +1213,7 @@ trigger_command_init ()
" 2. replace text using POSIX extended regular expression(s) (if "
"defined in trigger)\n"
" 3. execute command(s) (if defined in trigger)\n"
- " 4. exit with a return code (except for modifiers and focus)\n"
+ " 4. exit with a return code (except for modifier, line and focus)\n"
" 5. perform post action\n"
"\n"
"Examples (you can also look at default triggers with /trigger "
diff --git a/src/plugins/trigger/trigger.c b/src/plugins/trigger/trigger.c
index b088b1f0e..0dcf01473 100644
--- a/src/plugins/trigger/trigger.c
+++ b/src/plugins/trigger/trigger.c
@@ -49,10 +49,11 @@ char *trigger_option_default[TRIGGER_NUM_OPTIONS] =
{ "on", "signal", "", "", "", "", "ok", "none" };
char *trigger_hook_type_string[TRIGGER_NUM_HOOK_TYPES] =
-{ "signal", "hsignal", "modifier", "print", "command", "command_run", "timer",
- "config", "focus" };
+{ "signal", "hsignal", "modifier", "line", "print", "command", "command_run",
+ "timer", "config", "focus" };
char *trigger_hook_option_values =
- "signal|hsignal|modifier|print|command|command_run|timer|config|focus";
+ "signal|hsignal|modifier|line|print|command|command_run|timer|config|"
+ "focus";
char *trigger_hook_default_arguments[TRIGGER_NUM_HOOK_TYPES] =
{ "xxx", "xxx", "xxx", "", "cmd;desc;args;args_desc;%(buffers_names)", "/cmd",
"60000;0;0", "xxx", "chat" };
@@ -262,7 +263,8 @@ trigger_unhook (struct t_trigger *trigger)
void
trigger_hook (struct t_trigger *trigger)
{
- char **argv, **argv_eol, *tags, *message, *error1, *error2, *error3;
+ char **argv, **argv_eol, *buffer_type, *buffer_name, *tags, *message;
+ char *error1, *error2, *error3;
int i, argc, strip_colors;
long interval, align_second, max_calls;
@@ -329,6 +331,30 @@ trigger_hook (struct t_trigger *trigger)
}
}
break;
+ case TRIGGER_HOOK_LINE:
+ buffer_type = NULL;
+ buffer_name = NULL;
+ tags = NULL;
+ if (argv && (argc >= 1))
+ {
+ buffer_type = argv[0];
+ if ((argc >= 2) && (strcmp (argv[1], "*") != 0))
+ buffer_name = argv[1];
+ if ((argc >= 3) && (strcmp (argv[2], "*") != 0))
+ tags = argv[2];
+ }
+ trigger->hooks = malloc (sizeof (trigger->hooks[0]));
+ if (trigger->hooks)
+ {
+ trigger->hooks_count = 1;
+ trigger->hooks[0] = weechat_hook_line (
+ buffer_type,
+ buffer_name,
+ tags,
+ &trigger_callback_line_cb,
+ trigger, NULL);
+ }
+ break;
case TRIGGER_HOOK_PRINT:
tags = NULL;
message = NULL;
diff --git a/src/plugins/trigger/trigger.h b/src/plugins/trigger/trigger.h
index 78984277b..d4b5119b4 100644
--- a/src/plugins/trigger/trigger.h
+++ b/src/plugins/trigger/trigger.h
@@ -48,6 +48,7 @@ enum t_trigger_hook_type
TRIGGER_HOOK_SIGNAL = 0,
TRIGGER_HOOK_HSIGNAL,
TRIGGER_HOOK_MODIFIER,
+ TRIGGER_HOOK_LINE,
TRIGGER_HOOK_PRINT,
TRIGGER_HOOK_COMMAND,
TRIGGER_HOOK_COMMAND_RUN,