summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2013-02-04 08:29:57 +0100
committerSebastien Helleu <flashcode@flashtux.org>2013-02-04 08:29:57 +0100
commit1cdbc27abf3ed5d7b1544a3a56ed4624f8ea21d5 (patch)
tree47442d26a4f0b4779e839e2c8a9eaad78a1bbc1b /src/gui
parent95687e80576b4a74587fc3da6586ac8ea2afdab3 (diff)
downloadweechat-1cdbc27abf3ed5d7b1544a3a56ed4624f8ea21d5.zip
core: fix refresh of line after changes with hdata_update (update flag "displayed" according to filters)
Diffstat (limited to 'src/gui')
-rw-r--r--src/gui/gui-filter.c71
-rw-r--r--src/gui/gui-filter.h6
-rw-r--r--src/gui/gui-line.c68
-rw-r--r--src/gui/gui-line.h6
4 files changed, 85 insertions, 66 deletions
diff --git a/src/gui/gui-filter.c b/src/gui/gui-filter.c
index d2a96efeb..003c011cc 100644
--- a/src/gui/gui-filter.c
+++ b/src/gui/gui-filter.c
@@ -57,13 +57,13 @@ int gui_filters_enabled = 1; /* filters enabled? */
*/
int
-gui_filter_line_has_tag_no_filter (struct t_gui_line *line)
+gui_filter_line_has_tag_no_filter (struct t_gui_line_data *line_data)
{
int i;
- for (i = 0; i < line->data->tags_count; i++)
+ for (i = 0; i < line_data->tags_count; i++)
{
- if (strcmp (line->data->tags_array[i], GUI_FILTER_TAG_NO_FILTER) == 0)
+ if (strcmp (line_data->tags_array[i], GUI_FILTER_TAG_NO_FILTER) == 0)
return 1;
}
@@ -80,7 +80,7 @@ gui_filter_line_has_tag_no_filter (struct t_gui_line *line)
*/
int
-gui_filter_check_line (struct t_gui_line *line)
+gui_filter_check_line (struct t_gui_line_data *line_data)
{
struct t_gui_filter *ptr_filter;
int rc;
@@ -89,7 +89,7 @@ gui_filter_check_line (struct t_gui_line *line)
if (!gui_filters_enabled)
return 1;
- if (gui_filter_line_has_tag_no_filter (line))
+ if (gui_filter_line_has_tag_no_filter (line_data))
return 1;
for (ptr_filter = gui_filters; ptr_filter;
@@ -98,12 +98,12 @@ gui_filter_check_line (struct t_gui_line *line)
if (ptr_filter->enabled)
{
/* check buffer */
- if (gui_buffer_match_list_split (line->data->buffer,
+ if (gui_buffer_match_list_split (line_data->buffer,
ptr_filter->num_buffers,
ptr_filter->buffers))
{
if ((strcmp (ptr_filter->tags, "*") == 0)
- || (gui_line_match_tags (line,
+ || (gui_line_match_tags (line_data,
ptr_filter->tags_count,
ptr_filter->tags_array)))
{
@@ -111,7 +111,7 @@ gui_filter_check_line (struct t_gui_line *line)
rc = 1;
if (!ptr_filter->regex_prefix && !ptr_filter->regex_message)
rc = 0;
- if (gui_line_match_regex (line,
+ if (gui_line_match_regex (line_data,
ptr_filter->regex_prefix,
ptr_filter->regex_message))
{
@@ -132,44 +132,56 @@ gui_filter_check_line (struct t_gui_line *line)
/*
* Filters a buffer, using message filters.
+ *
+ * If line_data is NULL, filters all lines in buffer.
+ * If line_data is not NULL, filters only this line_data.
*/
void
-gui_filter_buffer (struct t_gui_buffer *buffer)
+gui_filter_buffer (struct t_gui_buffer *buffer,
+ struct t_gui_line_data *line_data)
{
struct t_gui_line *ptr_line;
+ struct t_gui_line_data *ptr_line_data;
struct t_gui_window *ptr_window;
int lines_changed, line_displayed, lines_hidden;
lines_changed = 0;
- lines_hidden = 0;
+ lines_hidden = buffer->lines->lines_hidden;
- buffer->lines->prefix_max_length = CONFIG_INTEGER(config_look_prefix_align_min);
+ if (!line_data)
+ buffer->lines->prefix_max_length = CONFIG_INTEGER(config_look_prefix_align_min);
- for (ptr_line = buffer->lines->first_line; ptr_line;
- ptr_line = ptr_line->next_line)
+ ptr_line = buffer->lines->first_line;
+ while (ptr_line || line_data)
{
- line_displayed = gui_filter_check_line (ptr_line);
+ ptr_line_data = (line_data) ? line_data : ptr_line->data;
+
+ line_displayed = gui_filter_check_line (ptr_line_data);
if (line_displayed
- && (ptr_line->data->prefix_length > buffer->lines->prefix_max_length))
+ && (ptr_line_data->prefix_length > buffer->lines->prefix_max_length))
{
- buffer->lines->prefix_max_length = ptr_line->data->prefix_length;
+ buffer->lines->prefix_max_length = ptr_line_data->prefix_length;
}
- /* force chat refresh if at least one line changed */
- if (ptr_line->data->displayed != line_displayed)
+ if (ptr_line_data->displayed != line_displayed)
{
- gui_buffer_ask_chat_refresh (buffer, 2);
lines_changed = 1;
+ lines_hidden += (line_displayed) ? -1 : 1;
}
- ptr_line->data->displayed = line_displayed;
+ ptr_line_data->displayed = line_displayed;
- if (!line_displayed)
- lines_hidden = 1;
+ if (line_data)
+ break;
+
+ ptr_line = ptr_line->next_line;
}
+ if (line_data)
+ gui_line_compute_prefix_max_length (line_data->buffer->lines);
+
if (buffer->lines->lines_hidden != lines_hidden)
{
buffer->lines->lines_hidden = lines_hidden;
@@ -177,13 +189,16 @@ gui_filter_buffer (struct t_gui_buffer *buffer)
WEECHAT_HOOK_SIGNAL_POINTER, buffer);
}
- /*
- * if status of at least one line has changed, check that a scroll in a
- * window displaying this buffer is not on a hidden line (if this happens,
- * use the previous displayed line as scroll)
- */
if (lines_changed)
{
+ /* force a full refresh of buffer */
+ gui_buffer_ask_chat_refresh (buffer, 2);
+
+ /*
+ * check that a scroll in a window displaying this buffer is not on a
+ * hidden line (if this happens, use the previous displayed line as
+ * scroll)
+ */
for (ptr_window = gui_windows; ptr_window;
ptr_window = ptr_window->next_window)
{
@@ -211,7 +226,7 @@ gui_filter_all_buffers ()
for (ptr_buffer = gui_buffers; ptr_buffer;
ptr_buffer = ptr_buffer->next_buffer)
{
- gui_filter_buffer (ptr_buffer);
+ gui_filter_buffer (ptr_buffer, NULL);
}
}
diff --git a/src/gui/gui-filter.h b/src/gui/gui-filter.h
index 0afe483b6..b89263559 100644
--- a/src/gui/gui-filter.h
+++ b/src/gui/gui-filter.h
@@ -26,7 +26,7 @@
/* filter structures */
-struct t_gui_line;
+struct t_gui_line_data;
struct t_gui_filter
{
@@ -53,7 +53,9 @@ extern int gui_filters_enabled;
/* filter functions */
-extern int gui_filter_check_line (struct t_gui_line *line);
+extern int gui_filter_check_line (struct t_gui_line_data *line_data);
+extern void gui_filter_buffer (struct t_gui_buffer *buffer,
+ struct t_gui_line_data *line_data);
extern void gui_filter_all_buffers ();
extern void gui_filter_global_enable ();
extern void gui_filter_global_disable ();
diff --git a/src/gui/gui-line.c b/src/gui/gui-line.c
index 0d5838372..31094ccc0 100644
--- a/src/gui/gui-line.c
+++ b/src/gui/gui-line.c
@@ -431,13 +431,13 @@ gui_line_search_text (struct t_gui_line *line, const char *text,
*/
int
-gui_line_match_regex (struct t_gui_line *line, regex_t *regex_prefix,
+gui_line_match_regex (struct t_gui_line_data *line_data, regex_t *regex_prefix,
regex_t *regex_message)
{
char *prefix, *message;
int match_prefix, match_message;
- if (!line || (!regex_prefix && !regex_message))
+ if (!line_data || (!regex_prefix && !regex_message))
return 0;
prefix = NULL;
@@ -446,9 +446,9 @@ gui_line_match_regex (struct t_gui_line *line, regex_t *regex_prefix,
match_prefix = 1;
match_message = 1;
- if (line->data->prefix)
+ if (line_data->prefix)
{
- prefix = gui_color_decode (line->data->prefix, NULL);
+ prefix = gui_color_decode (line_data->prefix, NULL);
if (!prefix
|| (regex_prefix && (regexec (regex_prefix, prefix, 0, NULL, 0) != 0)))
match_prefix = 0;
@@ -459,9 +459,9 @@ gui_line_match_regex (struct t_gui_line *line, regex_t *regex_prefix,
match_prefix = 0;
}
- if (line->data->message)
+ if (line_data->message)
{
- message = gui_color_decode (line->data->message, NULL);
+ message = gui_color_decode (line_data->message, NULL);
if (!message
|| (regex_message && (regexec (regex_message, message, 0, NULL, 0) != 0)))
match_message = 0;
@@ -489,23 +489,23 @@ gui_line_match_regex (struct t_gui_line *line, regex_t *regex_prefix,
*/
int
-gui_line_match_tags (struct t_gui_line *line, int tags_count,
- char **tags_array)
+gui_line_match_tags (struct t_gui_line_data *line_data,
+ int tags_count, char **tags_array)
{
int i, j;
- if (!line)
+ if (!line_data)
return 0;
- if (line->data->tags_count == 0)
+ if (line_data->tags_count == 0)
return 0;
for (i = 0; i < tags_count; i++)
{
- for (j = 0; j < line->data->tags_count; j++)
+ for (j = 0; j < line_data->tags_count; j++)
{
/* check tag */
- if (string_match (line->data->tags_array[j],
+ if (string_match (line_data->tags_array[j],
tags_array[i],
0))
return 1;
@@ -606,7 +606,7 @@ gui_line_has_highlight (struct t_gui_line *line)
*/
if (line->data->buffer->highlight_tags_count > 0)
{
- if (!gui_line_match_tags (line,
+ if (!gui_line_match_tags (line->data,
line->data->buffer->highlight_tags_count,
line->data->buffer->highlight_tags_array))
return 0;
@@ -723,12 +723,16 @@ gui_line_compute_prefix_max_length (struct t_gui_lines *lines)
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, NULL, &prefix_length, NULL);
- if (prefix_length > lines->prefix_max_length)
- lines->prefix_max_length = prefix_length;
+ if (ptr_line->data->displayed)
+ {
+ 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;
+ }
}
}
@@ -1071,7 +1075,7 @@ gui_line_add (struct t_gui_buffer *buffer, time_t date,
new_line->data->highlight = gui_line_has_highlight (new_line);
/* check if line is filtered or not */
- new_line->data->displayed = gui_filter_check_line (new_line);
+ new_line->data->displayed = gui_filter_check_line (new_line->data);
/* add line to lines list */
gui_line_add_to_list (buffer->own_lines, new_line);
@@ -1113,14 +1117,11 @@ gui_line_add (struct t_gui_buffer *buffer, time_t date,
}
else
{
- if (!buffer->own_lines->lines_hidden)
- {
- buffer->own_lines->lines_hidden = 1;
- if (buffer->mixed_lines)
- buffer->mixed_lines->lines_hidden = 1;
- hook_signal_send ("buffer_lines_hidden",
- WEECHAT_HOOK_SIGNAL_POINTER, buffer);
- }
+ buffer->own_lines->lines_hidden++;
+ if (buffer->mixed_lines)
+ buffer->mixed_lines->lines_hidden++;
+ hook_signal_send ("buffer_lines_hidden",
+ WEECHAT_HOOK_SIGNAL_POINTER, buffer);
}
/* add mixed line, if buffer is attched to at least one other buffer */
@@ -1238,15 +1239,12 @@ gui_line_add_y (struct t_gui_buffer *buffer, int y, const char *message)
ptr_line->data->message = (message) ? strdup (message) : strdup ("");
/* check if line is filtered or not */
- ptr_line->data->displayed = gui_filter_check_line (ptr_line);
+ ptr_line->data->displayed = gui_filter_check_line (ptr_line->data);
if (!ptr_line->data->displayed)
{
- if (!buffer->own_lines->lines_hidden)
- {
- buffer->own_lines->lines_hidden = 1;
- hook_signal_send ("buffer_lines_hidden",
- WEECHAT_HOOK_SIGNAL_POINTER, buffer);
- }
+ buffer->own_lines->lines_hidden++;
+ hook_signal_send ("buffer_lines_hidden",
+ WEECHAT_HOOK_SIGNAL_POINTER, buffer);
}
ptr_line->data->refresh_needed = 1;
@@ -1492,7 +1490,11 @@ gui_line_hdata_line_data_update_cb (void *data,
rc++;
}
- gui_buffer_ask_chat_refresh (line_data->buffer, 1);
+ if (rc > 0)
+ {
+ gui_filter_buffer (line_data->buffer, line_data);
+ gui_buffer_ask_chat_refresh (line_data->buffer, 1);
+ }
return rc;
}
diff --git a/src/gui/gui-line.h b/src/gui/gui-line.h
index 21863cfa5..49006647f 100644
--- a/src/gui/gui-line.h
+++ b/src/gui/gui-line.h
@@ -80,11 +80,11 @@ extern struct t_gui_line *gui_line_get_prev_displayed (struct t_gui_line *line);
extern struct t_gui_line *gui_line_get_next_displayed (struct t_gui_line *line);
extern int gui_line_search_text (struct t_gui_line *line, const char *text,
int case_sensitive);
-extern int gui_line_match_regex (struct t_gui_line *line,
+extern int gui_line_match_regex (struct t_gui_line_data *line_data,
regex_t *regex_prefix,
regex_t *regex_message);
-extern int gui_line_match_tags (struct t_gui_line *line, int tags_count,
- char **tags_array);
+extern int gui_line_match_tags (struct t_gui_line_data *line_data,
+ 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);