1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-04 00:33:13 +02:00

Add priority for hooks (task #10550)

This commit is contained in:
Sebastien Helleu
2010-08-11 18:42:38 +02:00
parent d59d099e82
commit 6317dba790
5 changed files with 183 additions and 65 deletions
+1
View File
@@ -7,6 +7,7 @@ v0.3.4-dev, 2010-08-11
Version 0.3.4 (under dev!)
--------------------------
* api: add priority for hooks (task #10550)
* rmodifier: new plugin "rmodifier": alter modifier strings with regular
expressions (bug #26964)
+161 -61
View File
@@ -103,29 +103,46 @@ hook_search_type (const char *type)
}
/*
* hook_find_pos: find position for new hook (keeping command list sorted)
* hook_find_pos: find position for new hook:
* - for type command: sort on command name, then priority
* - for all other types: sort on priority
*/
struct t_hook *
hook_find_pos (struct t_hook *hook)
{
struct t_hook *ptr_hook;
int rc_cmp;
/* if it's not command hook, then add to the end of list */
if (hook->type != HOOK_TYPE_COMMAND)
return NULL;
/* for command hook, keep list sorted */
for (ptr_hook = weechat_hooks[hook->type]; ptr_hook;
ptr_hook = ptr_hook->next_hook)
if (hook->type == HOOK_TYPE_COMMAND)
{
if (!ptr_hook->deleted
&& (string_strcasecmp (HOOK_COMMAND(hook, command),
HOOK_COMMAND(ptr_hook, command)) <= 0))
return ptr_hook;
/* for command hook, sort on command name */
for (ptr_hook = weechat_hooks[hook->type]; ptr_hook;
ptr_hook = ptr_hook->next_hook)
{
if (!ptr_hook->deleted)
{
rc_cmp = string_strcasecmp (HOOK_COMMAND(hook, command),
HOOK_COMMAND(ptr_hook, command));
if (rc_cmp < 0)
return ptr_hook;
if ((rc_cmp == 0) && (hook->priority >= ptr_hook->priority))
return ptr_hook;
}
}
}
else
{
/* for other types, sort on priority */
for (ptr_hook = weechat_hooks[hook->type]; ptr_hook;
ptr_hook = ptr_hook->next_hook)
{
if (!ptr_hook->deleted && (hook->priority >= ptr_hook->priority))
return ptr_hook;
}
}
/* position not found, best position is at the end */
/* position not found, add at the end */
return NULL;
}
@@ -143,7 +160,7 @@ hook_add_to_list (struct t_hook *new_hook)
pos_hook = hook_find_pos (new_hook);
if (pos_hook)
{
/* add hook somewhere in the list */
/* add hook before "pos_hook" */
new_hook->prev_hook = pos_hook->prev_hook;
new_hook->next_hook = pos_hook;
if (pos_hook->prev_hook)
@@ -229,27 +246,72 @@ hook_remove_deleted ()
}
}
/*
* hook_get_priority_and_name: get priority (integer) and pointer to start of
* name, from argument "name"
* name may be:
* - a simple name like "test":
* => priority = 1000 (default), ptr_name = "test"
* - a priority + "|" + name, like "500|test":
* => priority = 500, ptr_name = "test"
*/
void
hook_get_priority_and_name (const char *name,
int *priority, const char **ptr_name)
{
char *pos, *str_priority, *error;
long number;
if (priority)
*priority = HOOK_PRIORITY_DEFAULT;
if (ptr_name)
*ptr_name = name;
pos = strchr (name, '|');
if (pos)
{
str_priority = string_strndup (name, pos - name);
if (str_priority)
{
error = NULL;
number = strtol (str_priority, &error, 10);
if (error && !error[0])
{
if (priority)
*priority = number;
if (ptr_name)
*ptr_name = pos + 1;
}
free (str_priority);
}
}
}
/*
* hook_init_data: init data a new hook with default values
*/
void
hook_init_data (struct t_hook *hook, struct t_weechat_plugin *plugin,
int type, void *callback_data)
int type, int priority, void *callback_data)
{
hook->plugin = plugin;
hook->type = type;
hook->deleted = 0;
hook->running = 0;
hook->priority = priority;
hook->callback_data = callback_data;
hook->hook_data = NULL;
if (weechat_debug_core >= 2)
{
gui_chat_printf (NULL,
"debug: adding hook: type=%d (%s), plugin=%lx (%s)",
"debug: adding hook: type=%d (%s), plugin=%lx (%s), "
"priority=%d",
hook->type, hook_type_string[hook->type],
hook->plugin, plugin_get_name (hook->plugin));
hook->plugin, plugin_get_name (hook->plugin),
hook->priority);
}
}
@@ -505,6 +567,8 @@ hook_command (struct t_weechat_plugin *plugin, const char *command,
{
struct t_hook *new_hook;
struct t_hook_command *new_hook_command;
int priority;
const char *ptr_command;
if (!callback)
return NULL;
@@ -530,20 +594,19 @@ hook_command (struct t_weechat_plugin *plugin, const char *command,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_COMMAND, callback_data);
hook_get_priority_and_name (command, &priority, &ptr_command);
hook_init_data (new_hook, plugin, HOOK_TYPE_COMMAND, priority,
callback_data);
new_hook->hook_data = new_hook_command;
new_hook_command->callback = callback;
new_hook_command->command = (command) ?
strdup (command) : strdup ("");
new_hook_command->description = (description) ?
strdup (description) : strdup ("");
new_hook_command->args = (args) ?
strdup (args) : strdup ("");
new_hook_command->args_description = (args_description) ?
strdup (args_description) : strdup ("");
new_hook_command->completion = (completion) ?
strdup (completion) : strdup ("");
new_hook_command->command = strdup ((ptr_command) ? ptr_command :
((command) ? command : ""));
new_hook_command->description = strdup ((description) ? description : "");
new_hook_command->args = strdup ((args) ? args : "");
new_hook_command->args_description = strdup ((args_description) ?
args_description : "");
new_hook_command->completion = strdup ((completion) ? completion : "");
/* build completion variables for command */
new_hook_command->cplt_num_templates = 0;
@@ -687,6 +750,8 @@ hook_command_run (struct t_weechat_plugin *plugin, const char *command,
{
struct t_hook *new_hook;
struct t_hook_command_run *new_hook_command_run;
int priority;
const char *ptr_command;
if (!callback)
return NULL;
@@ -701,12 +766,14 @@ hook_command_run (struct t_weechat_plugin *plugin, const char *command,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_COMMAND_RUN, callback_data);
hook_get_priority_and_name (command, &priority, &ptr_command);
hook_init_data (new_hook, plugin, HOOK_TYPE_COMMAND_RUN, priority,
callback_data);
new_hook->hook_data = new_hook_command_run;
new_hook_command_run->callback = callback;
new_hook_command_run->command = (command) ?
strdup (command) : strdup ("");
new_hook_command_run->command = strdup ((ptr_command) ? ptr_command :
((command) ? command : ""));
hook_add_to_list (new_hook);
@@ -865,7 +932,8 @@ hook_timer (struct t_weechat_plugin *plugin, long interval, int align_second,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_TIMER, callback_data);
hook_init_data (new_hook, plugin, HOOK_TYPE_TIMER, HOOK_PRIORITY_DEFAULT,
callback_data);
new_hook->hook_data = new_hook_timer;
new_hook_timer->callback = callback;
@@ -1095,7 +1163,8 @@ hook_fd (struct t_weechat_plugin *plugin, int fd, int flag_read,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_FD, callback_data);
hook_init_data (new_hook, plugin, HOOK_TYPE_FD, HOOK_PRIORITY_DEFAULT,
callback_data);
new_hook->hook_data = new_hook_fd;
new_hook_fd->callback = callback;
@@ -1216,7 +1285,8 @@ hook_process (struct t_weechat_plugin *plugin,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_PROCESS, callback_data);
hook_init_data (new_hook, plugin, HOOK_TYPE_PROCESS, HOOK_PRIORITY_DEFAULT,
callback_data);
new_hook->hook_data = new_hook_process;
new_hook_process->callback = callback;
@@ -1520,7 +1590,8 @@ hook_connect (struct t_weechat_plugin *plugin, const char *proxy, const char *ad
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_CONNECT, callback_data);
hook_init_data (new_hook, plugin, HOOK_TYPE_CONNECT, HOOK_PRIORITY_DEFAULT,
callback_data);
new_hook->hook_data = new_hook_connect;
new_hook_connect->callback = callback;
@@ -1609,7 +1680,8 @@ hook_print (struct t_weechat_plugin *plugin, struct t_gui_buffer *buffer,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_PRINT, callback_data);
hook_init_data (new_hook, plugin, HOOK_TYPE_PRINT, HOOK_PRIORITY_DEFAULT,
callback_data);
new_hook->hook_data = new_hook_print;
new_hook_print->callback = callback;
@@ -1740,6 +1812,8 @@ hook_signal (struct t_weechat_plugin *plugin, const char *signal,
{
struct t_hook *new_hook;
struct t_hook_signal *new_hook_signal;
int priority;
const char *ptr_signal;
if (!signal || !signal[0] || !callback)
return NULL;
@@ -1754,11 +1828,13 @@ hook_signal (struct t_weechat_plugin *plugin, const char *signal,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_SIGNAL, callback_data);
hook_get_priority_and_name (signal, &priority, &ptr_signal);
hook_init_data (new_hook, plugin, HOOK_TYPE_SIGNAL, priority,
callback_data);
new_hook->hook_data = new_hook_signal;
new_hook_signal->callback = callback;
new_hook_signal->signal = strdup (signal);
new_hook_signal->signal = strdup ((ptr_signal) ? ptr_signal : signal);
hook_add_to_list (new_hook);
@@ -1807,6 +1883,8 @@ hook_config (struct t_weechat_plugin *plugin, const char *option,
{
struct t_hook *new_hook;
struct t_hook_config *new_hook_config;
int priority;
const char *ptr_option;
if (!callback)
return NULL;
@@ -1821,11 +1899,14 @@ hook_config (struct t_weechat_plugin *plugin, const char *option,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_CONFIG, callback_data);
hook_get_priority_and_name (option, &priority, &ptr_option);
hook_init_data (new_hook, plugin, HOOK_TYPE_CONFIG, priority,
callback_data);
new_hook->hook_data = new_hook_config;
new_hook_config->callback = callback;
new_hook_config->option = (option) ? strdup (option) : strdup ("");
new_hook_config->option = strdup ((ptr_option) ? ptr_option :
((option) ? option : ""));
hook_add_to_list (new_hook);
@@ -1876,6 +1957,8 @@ hook_completion (struct t_weechat_plugin *plugin, const char *completion_item,
{
struct t_hook *new_hook;
struct t_hook_completion *new_hook_completion;
int priority;
const char *ptr_completion_item;
if (!completion_item || !completion_item[0]
|| strchr (completion_item, ' ') || !callback)
@@ -1891,13 +1974,16 @@ hook_completion (struct t_weechat_plugin *plugin, const char *completion_item,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_COMPLETION, callback_data);
hook_get_priority_and_name (completion_item, &priority, &ptr_completion_item);
hook_init_data (new_hook, plugin, HOOK_TYPE_COMPLETION, priority,
callback_data);
new_hook->hook_data = new_hook_completion;
new_hook_completion->callback = callback;
new_hook_completion->completion_item = strdup (completion_item);
new_hook_completion->description =
(description) ? strdup (description) : strdup ("");
new_hook_completion->completion_item = strdup ((ptr_completion_item) ?
ptr_completion_item : completion_item);
new_hook_completion->description = strdup ((description) ?
description : "");
hook_add_to_list (new_hook);
@@ -1965,6 +2051,8 @@ hook_modifier (struct t_weechat_plugin *plugin, const char *modifier,
{
struct t_hook *new_hook;
struct t_hook_modifier *new_hook_modifier;
int priority;
const char *ptr_modifier;
if (!modifier || !modifier[0] || !callback)
return NULL;
@@ -1979,11 +2067,13 @@ hook_modifier (struct t_weechat_plugin *plugin, const char *modifier,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_MODIFIER, callback_data);
hook_get_priority_and_name (modifier, &priority, &ptr_modifier);
hook_init_data (new_hook, plugin, HOOK_TYPE_MODIFIER, priority,
callback_data);
new_hook->hook_data = new_hook_modifier;
new_hook_modifier->callback = callback;
new_hook_modifier->modifier = strdup (modifier);
new_hook_modifier->modifier = strdup ((ptr_modifier) ? ptr_modifier : modifier);
hook_add_to_list (new_hook);
@@ -2065,6 +2155,8 @@ hook_info (struct t_weechat_plugin *plugin, const char *info_name,
{
struct t_hook *new_hook;
struct t_hook_info *new_hook_info;
int priority;
const char *ptr_info_name;
if (!info_name || !info_name[0] || !callback)
return NULL;
@@ -2079,15 +2171,16 @@ hook_info (struct t_weechat_plugin *plugin, const char *info_name,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_INFO, callback_data);
hook_get_priority_and_name (info_name, &priority, &ptr_info_name);
hook_init_data (new_hook, plugin, HOOK_TYPE_INFO, priority, callback_data);
new_hook->hook_data = new_hook_info;
new_hook_info->callback = callback;
new_hook_info->info_name = strdup (info_name);
new_hook_info->description = (description) ?
strdup (description) : strdup ("");
new_hook_info->args_description = (args_description) ?
strdup (args_description) : strdup ("");
new_hook_info->info_name = strdup ((ptr_info_name) ?
ptr_info_name : info_name);
new_hook_info->description = strdup ((description) ? description : "");
new_hook_info->args_description = strdup ((args_description) ?
args_description : "");
hook_add_to_list (new_hook);
@@ -2153,6 +2246,8 @@ hook_infolist (struct t_weechat_plugin *plugin, const char *infolist_name,
{
struct t_hook *new_hook;
struct t_hook_infolist *new_hook_infolist;
int priority;
const char *ptr_infolist_name;
if (!infolist_name || !infolist_name[0] || !callback)
return NULL;
@@ -2167,17 +2262,19 @@ hook_infolist (struct t_weechat_plugin *plugin, const char *infolist_name,
return NULL;
}
hook_init_data (new_hook, plugin, HOOK_TYPE_INFOLIST, callback_data);
hook_get_priority_and_name (infolist_name, &priority, &ptr_infolist_name);
hook_init_data (new_hook, plugin, HOOK_TYPE_INFOLIST, priority,
callback_data);
new_hook->hook_data = new_hook_infolist;
new_hook_infolist->callback = callback;
new_hook_infolist->infolist_name = strdup (infolist_name);
new_hook_infolist->description = (description) ?
strdup (description) : strdup ("");
new_hook_infolist->pointer_description = (pointer_description) ?
strdup (pointer_description) : strdup ("");
new_hook_infolist->args_description = (args_description) ?
strdup (args_description) : strdup ("");
new_hook_infolist->infolist_name = strdup ((ptr_infolist_name) ?
ptr_infolist_name : infolist_name);
new_hook_infolist->description = strdup ((description) ? description : "");
new_hook_infolist->pointer_description = strdup ((pointer_description) ?
pointer_description : "");
new_hook_infolist->args_description = strdup ((args_description) ?
args_description : "");
hook_add_to_list (new_hook);
@@ -2494,6 +2591,8 @@ hook_add_to_infolist_type (struct t_infolist *infolist,
return 0;
if (!infolist_new_var_integer (ptr_item, "running", ptr_hook->running))
return 0;
if (!infolist_new_var_integer (ptr_item, "priority", ptr_hook->priority))
return 0;
switch (ptr_hook->type)
{
case HOOK_TYPE_COMMAND:
@@ -2807,6 +2906,7 @@ hook_print_log ()
ptr_hook->plugin, plugin_get_name (ptr_hook->plugin));
log_printf (" deleted . . . . . . . . : %d", ptr_hook->deleted);
log_printf (" running . . . . . . . . : %d", ptr_hook->running);
log_printf (" priority. . . . . . . . : %d", ptr_hook->priority);
log_printf (" type. . . . . . . . . . : %d (%s)",
ptr_hook->type, hook_type_string[ptr_hook->type]);
log_printf (" callback_data . . . . . : 0x%lx", ptr_hook->callback_data);
+7
View File
@@ -51,6 +51,12 @@ enum t_hook_type
HOOK_NUM_TYPES,
};
/*
* default priority: higher value means higher priority, ie added at the
* beginning of the hook list
*/
#define HOOK_PRIORITY_DEFAULT 1000
/* max calls that can be done for a command (recursive calls) */
#define HOOK_COMMAND_MAX_CALLS 5
@@ -82,6 +88,7 @@ struct t_hook
enum t_hook_type type; /* hook type */
int deleted; /* hook marked for deletion ? */
int running; /* 1 if hook is currently running */
int priority; /* priority (to sort hooks) */
void *callback_data; /* data sent to callback */
/* hook data (depends on hook type) */
+6 -2
View File
@@ -985,8 +985,12 @@ weechat_plugin_init (struct t_weechat_plugin *plugin, int argc, char *argv[])
weechat_hook_signal ("buffer_switch",
&weechat_aspell_buffer_switch_cb, NULL);
/* callback for spell checking input text */
weechat_hook_modifier ("input_text_display",
/*
* callback for spell checking input text
* we use a low priority here, so that other modifiers "input_text_display"
* (from other plugins) will be called before this one
*/
weechat_hook_modifier ("500|input_text_display",
&weechat_aspell_modifier_cb, NULL);
weechat_aspell_create_spellers (weechat_current_buffer ());
+8 -2
View File
@@ -247,7 +247,7 @@ rmodifier_create_regex (struct t_rmodifier *rmodifier)
void
rmodifier_hook_modifiers (struct t_rmodifier *rmodifier)
{
char **argv;
char **argv, str_modifier[128];
int argc, i;
argv = weechat_string_split (rmodifier->modifiers, ",", 0, 0, &argc);
@@ -259,7 +259,13 @@ rmodifier_hook_modifiers (struct t_rmodifier *rmodifier)
{
for (i = 0; i < argc; i++)
{
rmodifier->hooks[i] = weechat_hook_modifier (argv[i],
/*
* we use a high priority here, so that other modifiers
* (from other plugins) will be called after this one
*/
snprintf (str_modifier, sizeof (str_modifier) - 1,
"5000|%s", argv[i]);
rmodifier->hooks[i] = weechat_hook_modifier (str_modifier,
&rmodifier_modifier_cb,
rmodifier);
}