mirror of
https://github.com/weechat/weechat.git
synced 2026-07-02 15:53:12 +02:00
core: fix bugs with option weechat.look.prefix_same_nick, use nick color for string used as replacement
Bugs fixed: - hide/replace prefix only if prefix is a nick (do not do it for join/part/quit or action messages) - hide/replace prefix only when displaying messages (do not cache value in lines) The nick color used in replacement string comes from tag "prefix_nick_ccc", where "ccc" is the color of nick.
This commit is contained in:
@@ -5659,7 +5659,8 @@ command_init ()
|
||||
" no_filter, no_highlight, no_log, log0..log9 (log level),\n"
|
||||
" notify_none, notify_message, notify_private, "
|
||||
"notify_highlight,\n"
|
||||
" nick_xxx (xxx is nick in message),\n"
|
||||
" nick_xxx (xxx is nick in message), "
|
||||
"prefix_nick_ccc (ccc is color of nick),\n"
|
||||
" irc_xxx (xxx is command name or number, see /server raw),\n"
|
||||
" irc_numeric, irc_error, irc_action, irc_ctcp, "
|
||||
"irc_ctcp_reply, irc_smart_filter, away_info.\n"
|
||||
|
||||
@@ -575,8 +575,9 @@ gui_chat_display_time_to_prefix (struct t_gui_window *window,
|
||||
int simulate)
|
||||
{
|
||||
char str_space[] = " ", str_plus[] = "+";
|
||||
char *prefix_no_color, *prefix_highlighted, *ptr_prefix;
|
||||
const char *short_name;
|
||||
char *prefix_no_color, *prefix_highlighted, *ptr_prefix, *ptr_prefix2;
|
||||
char *ptr_prefix_color;
|
||||
const char *short_name, *str_color;
|
||||
int i, length, length_allowed, num_spaces, prefix_length, extra_spaces;
|
||||
int chars_displayed;
|
||||
struct t_gui_lines *mixed_lines;
|
||||
@@ -738,8 +739,30 @@ gui_chat_display_time_to_prefix (struct t_gui_window *window,
|
||||
}
|
||||
}
|
||||
|
||||
/* get prefix for display */
|
||||
gui_line_get_prefix_for_display (line, &ptr_prefix, &prefix_length,
|
||||
&ptr_prefix_color);
|
||||
if (ptr_prefix)
|
||||
{
|
||||
ptr_prefix2 = NULL;
|
||||
if (ptr_prefix_color && ptr_prefix_color[0])
|
||||
{
|
||||
str_color = gui_color_get_custom (ptr_prefix_color);
|
||||
if (str_color && str_color[0])
|
||||
{
|
||||
length = strlen (str_color) + strlen (ptr_prefix) + 1;
|
||||
ptr_prefix2 = malloc (length);
|
||||
if (ptr_prefix2)
|
||||
{
|
||||
snprintf (ptr_prefix2, length, "%s%s",
|
||||
str_color, ptr_prefix);
|
||||
}
|
||||
}
|
||||
}
|
||||
ptr_prefix = (ptr_prefix2) ? ptr_prefix2 : strdup (ptr_prefix);
|
||||
}
|
||||
|
||||
/* display prefix */
|
||||
gui_line_get_prefix_for_display (line, &ptr_prefix, &prefix_length);
|
||||
if (ptr_prefix
|
||||
&& (ptr_prefix[0]
|
||||
|| (CONFIG_INTEGER(config_look_prefix_align) != CONFIG_LOOK_PREFIX_ALIGN_NONE)))
|
||||
@@ -921,6 +944,8 @@ gui_chat_display_time_to_prefix (struct t_gui_window *window,
|
||||
lines_displayed, simulate, 0);
|
||||
}
|
||||
}
|
||||
if (ptr_prefix)
|
||||
free (ptr_prefix);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -3364,11 +3364,10 @@ gui_buffer_dump_hexa (struct t_gui_buffer *buffer)
|
||||
free (message_without_colors);
|
||||
tags = string_build_with_split_string ((const char **)ptr_line->data->tags_array,
|
||||
",");
|
||||
log_printf (" tags: %s, displayed: %d, highlight: %d, prefix_same_nick: %d",
|
||||
log_printf (" tags: '%s', displayed: %d, highlight: %d",
|
||||
(tags) ? tags : "(none)",
|
||||
ptr_line->data->displayed,
|
||||
ptr_line->data->highlight,
|
||||
ptr_line->data->prefix_same_nick);
|
||||
ptr_line->data->highlight);
|
||||
if (tags)
|
||||
free (tags);
|
||||
snprintf (buf, sizeof (buf), "%s", ctime (&ptr_line->data->date));
|
||||
@@ -3554,13 +3553,12 @@ gui_buffer_print_log ()
|
||||
tags = string_build_with_split_string ((const char **)ptr_line->data->tags_array,
|
||||
",");
|
||||
log_printf (" line N-%05d: y:%d, str_time:'%s', tags:'%s', "
|
||||
"displayed:%d, highlight:%d, prefix_same_nick:%d, "
|
||||
"refresh_needed:%d, prefix:'%s'",
|
||||
"displayed:%d, highlight:%d, refresh_needed:%d, "
|
||||
"prefix:'%s'",
|
||||
num, ptr_line->data->y, ptr_line->data->str_time,
|
||||
(tags) ? tags : "",
|
||||
(int)(ptr_line->data->displayed),
|
||||
(int)(ptr_line->data->highlight),
|
||||
(int)(ptr_line->data->prefix_same_nick),
|
||||
(int)(ptr_line->data->refresh_needed),
|
||||
ptr_line->data->prefix);
|
||||
log_printf (" data: '%s'",
|
||||
|
||||
+1
-13
@@ -133,11 +133,9 @@ void
|
||||
gui_filter_buffer (struct t_gui_buffer *buffer)
|
||||
{
|
||||
struct t_gui_line *ptr_line;
|
||||
int line_displayed, lines_hidden, prev_line_changed, line_changed;
|
||||
int line_displayed, lines_hidden;
|
||||
|
||||
lines_hidden = 0;
|
||||
prev_line_changed = 0;
|
||||
line_changed = 0;
|
||||
|
||||
buffer->lines->prefix_max_length = CONFIG_INTEGER(config_look_prefix_align_min);
|
||||
|
||||
@@ -154,20 +152,10 @@ gui_filter_buffer (struct t_gui_buffer *buffer)
|
||||
|
||||
/* force chat refresh if at least one line changed */
|
||||
if (ptr_line->data->displayed != line_displayed)
|
||||
{
|
||||
line_changed = 1;
|
||||
gui_buffer_ask_chat_refresh (buffer, 2);
|
||||
}
|
||||
else
|
||||
line_changed = 0;
|
||||
|
||||
ptr_line->data->displayed = line_displayed;
|
||||
|
||||
if (line_changed || prev_line_changed)
|
||||
gui_line_set_prefix_same_nick (ptr_line);
|
||||
|
||||
prev_line_changed = line_changed;
|
||||
|
||||
if (!line_displayed)
|
||||
lines_hidden = 1;
|
||||
}
|
||||
|
||||
+118
-60
@@ -83,6 +83,58 @@ gui_lines_free (struct t_gui_lines *lines)
|
||||
free (lines);
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_line_prefix_is_same_nick_as_previous: return 1 if prefix on line is a
|
||||
* nick and is the same as nick on
|
||||
* previour line, otherwise 0
|
||||
*/
|
||||
|
||||
int
|
||||
gui_line_prefix_is_same_nick_as_previous (struct t_gui_line *line)
|
||||
{
|
||||
const char *nick, *nick_previous;
|
||||
struct t_gui_line *prev_line;
|
||||
|
||||
/*
|
||||
* if line is not displayed, has a highlight, or does not have a tag
|
||||
* beginning with "prefix_nick" => display standard prefix
|
||||
*/
|
||||
if (!line->data->displayed || line->data->highlight
|
||||
|| !gui_line_search_tag_starting_with (line, "prefix_nick"))
|
||||
return 0;
|
||||
|
||||
/* no nick on line => display standard prefix */
|
||||
nick = gui_line_get_nick_tag (line);
|
||||
if (!nick)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* previous line is not found => display standard prefix
|
||||
*/
|
||||
prev_line = gui_line_get_prev_displayed (line);
|
||||
if (!prev_line)
|
||||
return 0;
|
||||
|
||||
/* buffer is not the same as previous line => display standard prefix */
|
||||
if (line->data->buffer != prev_line->data->buffer)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* previous line does not have a tag beginning with "prefix_nick"
|
||||
* => display standard prefix
|
||||
*/
|
||||
if (!gui_line_search_tag_starting_with (prev_line, "prefix_nick"))
|
||||
return 0;
|
||||
|
||||
/* no nick on previous line => display standard prefix */
|
||||
nick_previous = gui_line_get_nick_tag (prev_line);
|
||||
if (!nick_previous)
|
||||
return 0;
|
||||
|
||||
/* prefix can be hidden/replaced if nicks are equal */
|
||||
return (strcmp (nick, nick_previous) == 0) ? 1 : 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_line_get_prefix_for_display: get prefix and its length (for display only)
|
||||
* if the prefix can be hidden (same nick as
|
||||
@@ -94,29 +146,50 @@ gui_lines_free (struct t_gui_lines *lines)
|
||||
|
||||
void
|
||||
gui_line_get_prefix_for_display (struct t_gui_line *line,
|
||||
char **prefix, int *length)
|
||||
char **prefix, int *length,
|
||||
char **color)
|
||||
{
|
||||
if (line->data->prefix_same_nick
|
||||
&& CONFIG_STRING(config_look_prefix_same_nick)
|
||||
&& CONFIG_STRING(config_look_prefix_same_nick)[0])
|
||||
const char *tag_prefix_nick;
|
||||
|
||||
if (CONFIG_STRING(config_look_prefix_same_nick)
|
||||
&& CONFIG_STRING(config_look_prefix_same_nick)[0]
|
||||
&& gui_line_prefix_is_same_nick_as_previous (line))
|
||||
{
|
||||
/* same nick: return empty prefix or value from option */
|
||||
if (strcmp (CONFIG_STRING(config_look_prefix_same_nick), " ") == 0)
|
||||
{
|
||||
*prefix = gui_chat_prefix_empty;
|
||||
*length = 0;
|
||||
if (prefix)
|
||||
*prefix = gui_chat_prefix_empty;
|
||||
if (length)
|
||||
*length = 0;
|
||||
if (color)
|
||||
*color = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
*prefix = CONFIG_STRING(config_look_prefix_same_nick);
|
||||
*length = config_length_prefix_same_nick;
|
||||
if (prefix)
|
||||
*prefix = CONFIG_STRING(config_look_prefix_same_nick);
|
||||
if (length)
|
||||
*length = config_length_prefix_same_nick;
|
||||
if (color)
|
||||
{
|
||||
*color = NULL;
|
||||
tag_prefix_nick = gui_line_search_tag_starting_with (line,
|
||||
"prefix_nick_");
|
||||
if (tag_prefix_nick)
|
||||
*color = (char *)(tag_prefix_nick + 12);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* not same nick: return prefix from line */
|
||||
*prefix = line->data->prefix;
|
||||
*length = line->data->prefix_length;
|
||||
if (prefix)
|
||||
*prefix = line->data->prefix;
|
||||
if (length)
|
||||
*length = line->data->prefix_length;
|
||||
if (color)
|
||||
*color = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -129,7 +202,6 @@ gui_line_get_align (struct t_gui_buffer *buffer, struct t_gui_line *line,
|
||||
int with_suffix, int first_line)
|
||||
{
|
||||
int length_time, length_buffer, length_suffix, prefix_length;
|
||||
char *ptr_prefix;
|
||||
|
||||
/* return immediately if alignment for end of lines is "time" */
|
||||
if (!first_line
|
||||
@@ -179,7 +251,7 @@ gui_line_get_align (struct t_gui_buffer *buffer, struct t_gui_line *line,
|
||||
return length_time + length_buffer;
|
||||
}
|
||||
|
||||
gui_line_get_prefix_for_display (line, &ptr_prefix, &prefix_length);
|
||||
gui_line_get_prefix_for_display (line, NULL, &prefix_length, NULL);
|
||||
|
||||
if (CONFIG_INTEGER(config_look_prefix_align) == CONFIG_LOOK_PREFIX_ALIGN_NONE)
|
||||
{
|
||||
@@ -420,6 +492,31 @@ gui_line_match_tags (struct t_gui_line *line, int tags_count,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_line_search_tag_starting_with: return pointer on tag starting with "tag",
|
||||
* NULL if such tag is not found
|
||||
*/
|
||||
|
||||
const char *
|
||||
gui_line_search_tag_starting_with (struct t_gui_line *line, const char *tag)
|
||||
{
|
||||
int i, length;
|
||||
|
||||
if (!line || !tag)
|
||||
return NULL;
|
||||
|
||||
length = strlen (tag);
|
||||
|
||||
for (i = 0; i < line->data->tags_count; i++)
|
||||
{
|
||||
if (strncmp (line->data->tags_array[i], tag, length) == 0)
|
||||
return line->data->tags_array[i];
|
||||
}
|
||||
|
||||
/* tag not found */
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_line_get_nick_tag: get nick in tags: return "xxx" if tag "nick_xxx"
|
||||
* is found
|
||||
@@ -428,14 +525,13 @@ gui_line_match_tags (struct t_gui_line *line, int tags_count,
|
||||
const char *
|
||||
gui_line_get_nick_tag (struct t_gui_line *line)
|
||||
{
|
||||
int i;
|
||||
const char *tag;
|
||||
|
||||
for (i = 0; i < line->data->tags_count; i++)
|
||||
{
|
||||
if (strncmp (line->data->tags_array[i], "nick_", 5) == 0)
|
||||
return line->data->tags_array[i] + 5;
|
||||
}
|
||||
return NULL;
|
||||
tag = gui_line_search_tag_starting_with (line, "nick_");
|
||||
if (!tag)
|
||||
return NULL;
|
||||
|
||||
return tag + 5;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -572,50 +668,18 @@ void
|
||||
gui_line_compute_prefix_max_length (struct t_gui_lines *lines)
|
||||
{
|
||||
struct t_gui_line *ptr_line;
|
||||
char *ptr_prefix;
|
||||
int prefix_length;
|
||||
|
||||
lines->prefix_max_length = CONFIG_INTEGER(config_look_prefix_align_min);
|
||||
for (ptr_line = lines->first_line; ptr_line;
|
||||
ptr_line = ptr_line->next_line)
|
||||
{
|
||||
gui_line_get_prefix_for_display (ptr_line, &ptr_prefix, &prefix_length);
|
||||
gui_line_get_prefix_for_display (ptr_line, NULL, &prefix_length, NULL);
|
||||
if (prefix_length > lines->prefix_max_length)
|
||||
lines->prefix_max_length = prefix_length;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_line_set_prefix_same_nick: set the "prefix_same_nick" flag in a line
|
||||
*/
|
||||
|
||||
void
|
||||
gui_line_set_prefix_same_nick (struct t_gui_line *line)
|
||||
{
|
||||
const char *nick, *nick_previous;
|
||||
struct t_gui_line *prev_line;
|
||||
|
||||
/*
|
||||
* check if prefix can be hidden: if nick is the same as previous message
|
||||
* on this buffer
|
||||
*/
|
||||
line->data->prefix_same_nick = 0;
|
||||
if (line->data->displayed && !line->data->highlight)
|
||||
{
|
||||
nick = gui_line_get_nick_tag (line);
|
||||
if (nick)
|
||||
{
|
||||
prev_line = gui_line_get_prev_displayed (line);
|
||||
if (prev_line)
|
||||
{
|
||||
nick_previous = gui_line_get_nick_tag (prev_line);
|
||||
if (nick_previous && (strcmp (nick, nick_previous) == 0))
|
||||
line->data->prefix_same_nick = 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* gui_line_add_to_list: add a line to a "t_gui_lines" structure
|
||||
*/
|
||||
@@ -624,7 +688,6 @@ void
|
||||
gui_line_add_to_list (struct t_gui_lines *lines,
|
||||
struct t_gui_line *line)
|
||||
{
|
||||
char *ptr_prefix;
|
||||
int prefix_length;
|
||||
|
||||
if (!lines->first_line)
|
||||
@@ -635,10 +698,8 @@ gui_line_add_to_list (struct t_gui_lines *lines,
|
||||
line->next_line = NULL;
|
||||
lines->last_line = line;
|
||||
|
||||
gui_line_set_prefix_same_nick (line);
|
||||
|
||||
/* adjust "prefix_max_length" if this prefix length is > max */
|
||||
gui_line_get_prefix_for_display (line, &ptr_prefix, &prefix_length);
|
||||
gui_line_get_prefix_for_display (line, NULL, &prefix_length, NULL);
|
||||
if (prefix_length > lines->prefix_max_length)
|
||||
lines->prefix_max_length = prefix_length;
|
||||
|
||||
@@ -658,7 +719,6 @@ gui_line_remove_from_list (struct t_gui_buffer *buffer,
|
||||
struct t_gui_window *ptr_win;
|
||||
struct t_gui_window_scroll *ptr_scroll;
|
||||
int i, update_prefix_max_length, prefix_length;
|
||||
char *ptr_prefix;
|
||||
|
||||
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
|
||||
{
|
||||
@@ -684,7 +744,7 @@ gui_line_remove_from_list (struct t_gui_buffer *buffer,
|
||||
}
|
||||
}
|
||||
|
||||
gui_line_get_prefix_for_display (line, &ptr_prefix, &prefix_length);
|
||||
gui_line_get_prefix_for_display (line, NULL, &prefix_length, NULL);
|
||||
update_prefix_max_length =
|
||||
(prefix_length == lines->prefix_max_length);
|
||||
|
||||
@@ -1395,8 +1455,6 @@ gui_line_add_to_infolist (struct t_infolist *infolist,
|
||||
return 0;
|
||||
if (!infolist_new_var_integer (ptr_item, "highlight", line->data->highlight))
|
||||
return 0;
|
||||
if (!infolist_new_var_integer (ptr_item, "prefix_same_nick", line->data->prefix_same_nick))
|
||||
return 0;
|
||||
if (!infolist_new_var_string (ptr_item, "prefix", line->data->prefix))
|
||||
return 0;
|
||||
if (!infolist_new_var_string (ptr_item, "message", line->data->message))
|
||||
|
||||
+4
-3
@@ -37,8 +37,6 @@ struct t_gui_line_data
|
||||
char **tags_array; /* tags for line */
|
||||
char displayed; /* 1 if line is displayed */
|
||||
char highlight; /* 1 if line has highlight */
|
||||
char prefix_same_nick; /* 1 if prefix can be hidden */
|
||||
/* (same nick as previous message) */
|
||||
char refresh_needed; /* 1 if refresh asked (free buffer) */
|
||||
char *prefix; /* prefix for line (may be NULL) */
|
||||
int prefix_length; /* prefix length (on screen) */
|
||||
@@ -70,7 +68,8 @@ struct t_gui_lines
|
||||
extern struct t_gui_lines *gui_lines_alloc ();
|
||||
extern void gui_lines_free (struct t_gui_lines *lines);
|
||||
extern void gui_line_get_prefix_for_display (struct t_gui_line *line,
|
||||
char **prefix, int *length);
|
||||
char **prefix, int *length,
|
||||
char **color);
|
||||
extern int gui_line_get_align (struct t_gui_buffer *buffer,
|
||||
struct t_gui_line *line,
|
||||
int with_suffix, int first_line);
|
||||
@@ -86,6 +85,8 @@ extern int gui_line_match_regex (struct t_gui_line *line,
|
||||
regex_t *regex_message);
|
||||
extern int gui_line_match_tags (struct t_gui_line *line, int tags_count,
|
||||
char **tags_array);
|
||||
extern const char *gui_line_search_tag_starting_with (struct t_gui_line *line,
|
||||
const char *tag);
|
||||
extern const char *gui_line_get_nick_tag (struct t_gui_line *line);
|
||||
extern int gui_line_has_highlight (struct t_gui_line *line);
|
||||
extern void gui_line_compute_buffer_max_length (struct t_gui_buffer *buffer,
|
||||
|
||||
Reference in New Issue
Block a user