diff options
author | Sébastien Helleu <flashcode@flashtux.org> | 2017-09-02 14:00:20 +0200 |
---|---|---|
committer | Sébastien Helleu <flashcode@flashtux.org> | 2017-09-02 14:00:20 +0200 |
commit | 8c046d9be913a3ee1b990d0f45d2c44338086e3a (patch) | |
tree | 644c352195d03b8ba5a466c562a617785b651076 | |
parent | 24418b30a0f665c997646a400a64d64ec0836055 (diff) | |
download | weechat-8c046d9be913a3ee1b990d0f45d2c44338086e3a.zip |
buflist: remove recursive evaluation of extra variables (closes #1060)
-rw-r--r-- | ChangeLog.adoc | 1 | ||||
-rw-r--r-- | ReleaseNotes.adoc | 17 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-bar-item.c | 30 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-config.c | 81 | ||||
-rw-r--r-- | src/plugins/buflist/buflist-config.h | 3 |
5 files changed, 102 insertions, 30 deletions
diff --git a/ChangeLog.adoc b/ChangeLog.adoc index 8847ce19b..0b633f575 100644 --- a/ChangeLog.adoc +++ b/ChangeLog.adoc @@ -38,6 +38,7 @@ Bug fixes:: * core: call the config hook when options are renamed or removed * api: change type of arguments status/gnutls_rc/sock in hook_connect() callback from string to integer (in scripts) * api: change type of argument fd in hook_fd() callback from string to integer (in scripts) + * buflist: remove recursive evaluation of extra variables (issue #1060) * buflist: fix crash in auto-scroll of bar when the buflist item is not the first item in the bar * irc: fix CTCP PING reply when the option irc.ctcp.ping is set to non-empty value * relay: fix send of "PART" command in backlog (irc protocol) diff --git a/ReleaseNotes.adoc b/ReleaseNotes.adoc index 247137dd8..84a8304c7 100644 --- a/ReleaseNotes.adoc +++ b/ReleaseNotes.adoc @@ -20,6 +20,21 @@ https://weechat.org/files/changelog/ChangeLog-devel.html[ChangeLog] [[v2.0]] == Version 2.0 (under dev) +[[v2.0_buflist_eval]] +=== Evaluation in buflist + +The evaluation of expressions in buflist options is not recursive any more, +to prevent too many evaluations, for example in buffer variables +(see issue #1060 for more information). + +If you are using custom variables/options containing evaluated expressions, +like `${some.config.option}`, and if this option contains evaluated strings (`${...}`), +you must evaluate them with: `${eval:${some.config.option}}`. + +[NOTE] +The default buflist formats (`${format_buffer}`, `${format_name}`, +`${format_hotlist}`, ...) are automatically evaluated in options _buflist.format.buffer_, +_buflist.format.buffer_current_ and _buflist.format.hotlist_. + [[v2.0_hook_connect]] === Function hook_connect @@ -43,8 +58,8 @@ No release note. [[v1.8]] == Version 1.8 (2017-05-13) - [[v1.8_options]] + === Options The option _script.scripts.url_force_https_ has been removed because now the diff --git a/src/plugins/buflist/buflist-bar-item.c b/src/plugins/buflist/buflist-bar-item.c index cf1d22d2a..6d73779a3 100644 --- a/src/plugins/buflist/buflist-bar-item.c +++ b/src/plugins/buflist/buflist-bar-item.c @@ -32,7 +32,6 @@ struct t_gui_bar_item *buflist_bar_item_buflist = NULL; struct t_hashtable *buflist_hashtable_pointers = NULL; struct t_hashtable *buflist_hashtable_extra_vars = NULL; -struct t_hashtable *buflist_hashtable_options = NULL; struct t_hashtable *buflist_hashtable_options_conditions = NULL; struct t_arraylist *buflist_list_buffers = NULL; @@ -257,8 +256,8 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data, buflist = weechat_string_dyn_alloc (256); - ptr_format = weechat_config_string (buflist_config_format_buffer); - ptr_format_current = weechat_config_string (buflist_config_format_buffer_current); + ptr_format = buflist_config_format_buffer_eval; + ptr_format_current = buflist_config_format_buffer_current_eval; ptr_current_buffer = weechat_current_buffer (); @@ -434,8 +433,7 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data, /* set extra variables */ weechat_hashtable_set (buflist_hashtable_extra_vars, "format_buffer", - weechat_config_string ( - buflist_config_format_buffer)); + buflist_config_format_buffer_eval); weechat_hashtable_set (buflist_hashtable_extra_vars, "number", str_number); weechat_hashtable_set (buflist_hashtable_extra_vars, @@ -508,7 +506,7 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data, weechat_hashtable_set ( buflist_hashtable_extra_vars, "format_hotlist", - (str_hotlist) ? weechat_config_string (buflist_config_format_hotlist) : ""); + (str_hotlist) ? buflist_config_format_hotlist_eval : ""); weechat_hashtable_set (buflist_hashtable_extra_vars, "hotlist", (str_hotlist) ? str_hotlist : ""); @@ -535,7 +533,7 @@ buflist_bar_item_buflist_cb (const void *pointer, void *data, (current_buffer) ? ptr_format_current : ptr_format, buflist_hashtable_pointers, buflist_hashtable_extra_vars, - buflist_hashtable_options); + NULL); /* concatenate string */ rc = weechat_string_dyn_concat (buflist, line); @@ -600,20 +598,6 @@ buflist_bar_item_init () return 0; } - buflist_hashtable_options = weechat_hashtable_new ( - 32, - WEECHAT_HASHTABLE_STRING, - WEECHAT_HASHTABLE_STRING, - NULL, - NULL); - if (!buflist_hashtable_options) - { - weechat_hashtable_free (buflist_hashtable_pointers); - weechat_hashtable_free (buflist_hashtable_extra_vars); - return 0; - } - weechat_hashtable_set (buflist_hashtable_options, "extra", "eval"); - buflist_hashtable_options_conditions = weechat_hashtable_new ( 32, WEECHAT_HASHTABLE_STRING, @@ -623,7 +607,6 @@ buflist_bar_item_init () { weechat_hashtable_free (buflist_hashtable_pointers); weechat_hashtable_free (buflist_hashtable_extra_vars); - weechat_hashtable_free (buflist_hashtable_options); return 0; } weechat_hashtable_set (buflist_hashtable_options_conditions, @@ -652,9 +635,6 @@ buflist_bar_item_end () weechat_hashtable_free (buflist_hashtable_extra_vars); buflist_hashtable_extra_vars = NULL; - weechat_hashtable_free (buflist_hashtable_options); - buflist_hashtable_options = NULL; - weechat_hashtable_free (buflist_hashtable_options_conditions); buflist_hashtable_options_conditions = NULL; diff --git a/src/plugins/buflist/buflist-config.c b/src/plugins/buflist/buflist-config.c index 2af36236c..5f03c1713 100644 --- a/src/plugins/buflist/buflist-config.c +++ b/src/plugins/buflist/buflist-config.c @@ -20,6 +20,7 @@ */ #include <stdlib.h> +#include <stdio.h> #include <string.h> #include "../weechat-plugin.h" @@ -62,6 +63,9 @@ struct t_hook **buflist_config_signals_refresh = NULL; int buflist_config_num_signals_refresh = 0; char **buflist_config_sort_fields = NULL; int buflist_config_sort_fields_count = 0; +char *buflist_config_format_buffer_eval = NULL; +char *buflist_config_format_buffer_current_eval = NULL; +char *buflist_config_format_hotlist_eval = NULL; /* @@ -292,7 +296,7 @@ buflist_config_change_nick_prefix (const void *pointer, void *data, } /* - * Callback for changes on format options. + * Callback for changes on options needing bar item refresh. */ void @@ -308,6 +312,67 @@ buflist_config_change_buflist (const void *pointer, void *data, } /* + * Replace formats like ${format_xxx} by evaluated form: ${eval:${format_xxx}}. + * + * Note: result must be freed after use. + */ + +char * +buflist_config_add_eval_for_formats (const char *string) +{ + char *formats[] = { "format_buffer", "format_number", "indent", + "format_nick_prefix", "format_name", + "format_hotlist", "hotlist", "format_lag", + "color_hotlist", NULL }; + char *result, *tmp, format[512], format_eval[512]; + int i; + + result = strdup (string); + for (i = 0; formats[i]; i++) + { + snprintf (format, sizeof (format), + "${%s}", formats[i]); + snprintf (format_eval, sizeof (format_eval), + "${eval:${%s}}", formats[i]); + tmp = weechat_string_replace (result, format, format_eval); + free (result); + result = tmp; + } + return result; +} + +/* + * Callback for changes on some format options. + */ + +void +buflist_config_change_format (const void *pointer, void *data, + struct t_config_option *option) +{ + /* make C compiler happy */ + (void) pointer; + (void) data; + (void) option; + + if (buflist_config_format_buffer_eval) + free (buflist_config_format_buffer_eval); + buflist_config_format_buffer_eval = buflist_config_add_eval_for_formats ( + weechat_config_string (buflist_config_format_buffer)); + + if (buflist_config_format_buffer_current_eval) + free (buflist_config_format_buffer_current_eval); + buflist_config_format_buffer_current_eval = buflist_config_add_eval_for_formats ( + weechat_config_string (buflist_config_format_buffer_current)); + + if (buflist_config_format_hotlist_eval) + free (buflist_config_format_hotlist_eval); + buflist_config_format_hotlist_eval = buflist_config_add_eval_for_formats ( + weechat_config_string (buflist_config_format_hotlist)); + + buflist_bar_item_update (); +} + +/* * Initializes buflist configuration file. * * Returns: @@ -480,7 +545,7 @@ buflist_config_init () "${format_name}", NULL, 0, NULL, NULL, NULL, - &buflist_config_change_buflist, NULL, NULL, + &buflist_config_change_format, NULL, NULL, NULL, NULL, NULL); buflist_config_format_buffer_current = weechat_config_new_option ( buflist_config_file, ptr_section, @@ -489,7 +554,7 @@ buflist_config_init () "(note: content is evaluated, see /help buflist)"), NULL, 0, 0, "${color:,blue}${format_buffer}", NULL, 0, NULL, NULL, NULL, - &buflist_config_change_buflist, NULL, NULL, + &buflist_config_change_format, NULL, NULL, NULL, NULL, NULL); buflist_config_format_hotlist = weechat_config_new_option ( buflist_config_file, ptr_section, @@ -500,7 +565,7 @@ buflist_config_init () " ${color:green}(${hotlist}${color:green})", NULL, 0, NULL, NULL, NULL, - &buflist_config_change_buflist, NULL, NULL, + &buflist_config_change_format, NULL, NULL, NULL, NULL, NULL); buflist_config_format_hotlist_level[0] = weechat_config_new_option ( buflist_config_file, ptr_section, @@ -624,6 +689,7 @@ buflist_config_read () { buflist_config_change_sort (NULL, NULL, NULL); buflist_config_change_signals_refresh (NULL, NULL, NULL); + buflist_config_change_format (NULL, NULL, NULL); } return rc; @@ -657,4 +723,11 @@ buflist_config_free () buflist_config_sort_fields = NULL; buflist_config_sort_fields_count = 0; } + + if (buflist_config_format_buffer_eval) + free (buflist_config_format_buffer_eval); + if (buflist_config_format_buffer_current_eval) + free (buflist_config_format_buffer_current_eval); + if (buflist_config_format_hotlist_eval) + free (buflist_config_format_hotlist_eval); } diff --git a/src/plugins/buflist/buflist-config.h b/src/plugins/buflist/buflist-config.h index 08b611131..bdb53939c 100644 --- a/src/plugins/buflist/buflist-config.h +++ b/src/plugins/buflist/buflist-config.h @@ -58,6 +58,9 @@ extern struct t_config_option *buflist_config_format_number; extern char **buflist_config_sort_fields; extern int buflist_config_sort_fields_count; +extern char *buflist_config_format_buffer_eval; +extern char *buflist_config_format_buffer_current_eval; +extern char *buflist_config_format_hotlist_eval; extern int buflist_config_init (); extern int buflist_config_read (); |