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

Fix crash when read marker is moved before first line displayed (when first line of buffer is removed)

This commit is contained in:
Sebastien Helleu
2009-02-02 13:53:38 +01:00
parent 7e12f8596a
commit 323290c83e
7 changed files with 35 additions and 4 deletions
+2
View File
@@ -343,6 +343,8 @@ upgrade_weechat_read_cb (int object_id,
upgrade_current_buffer->title =
(infolist_string (infolist, "title")) ?
strdup (infolist_string (infolist, "title")) : NULL;
upgrade_current_buffer->first_line_not_read =
infolist_integer (infolist, "first_line_not_read");
upgrade_current_buffer->input =
infolist_integer (infolist, "input");
upgrade_current_buffer->input_get_unknown_commands =
+6
View File
@@ -470,9 +470,15 @@ gui_window_switch_to_buffer (struct t_gui_window *window,
if (set_last_read)
{
if (window->buffer->num_displayed == 0)
{
window->buffer->last_read_line = window->buffer->last_line;
window->buffer->first_line_not_read = 0;
}
if (buffer->last_read_line == buffer->last_line)
{
buffer->last_read_line = NULL;
buffer->first_line_not_read = 0;
}
}
}
+6
View File
@@ -206,9 +206,15 @@ gui_window_switch_to_buffer (struct t_gui_window *window,
if (set_last_read)
{
if (window->buffer->num_displayed == 0)
{
window->buffer->last_read_line = window->buffer->last_line;
window->buffer->first_line_not_read = 0;
}
if (buffer->last_read_line == buffer->last_line)
{
buffer->last_read_line = NULL;
buffer->first_line_not_read = 0;
}
}
}
+5
View File
@@ -302,6 +302,7 @@ gui_buffer_new (struct t_weechat_plugin *plugin,
new_buffer->lines = NULL;
new_buffer->last_line = NULL;
new_buffer->last_read_line = NULL;
new_buffer->first_line_not_read = 0;
new_buffer->lines_count = 0;
new_buffer->lines_hidden = 0;
new_buffer->prefix_max_length = 0;
@@ -771,6 +772,7 @@ gui_buffer_set_unread (struct t_gui_buffer *buffer)
&& (buffer->last_read_line != buffer->last_line));
buffer->last_read_line = buffer->last_line;
buffer->first_line_not_read = (buffer->last_read_line) ? 0 : 1;
if (refresh)
gui_buffer_ask_chat_refresh (buffer, 2);
@@ -1442,6 +1444,8 @@ gui_buffer_add_to_infolist (struct t_infolist *infolist,
return 0;
if (!infolist_new_var_integer (ptr_item, "num_displayed", buffer->num_displayed))
return 0;
if (!infolist_new_var_integer (ptr_item, "first_line_not_read", buffer->first_line_not_read))
return 0;
if (!infolist_new_var_integer (ptr_item, "lines_hidden", buffer->lines_hidden))
return 0;
if (!infolist_new_var_integer (ptr_item, "nicklist_case_sensitive", buffer->nicklist_case_sensitive))
@@ -1680,6 +1684,7 @@ gui_buffer_print_log ()
log_printf (" lines. . . . . . . . . : 0x%lx", ptr_buffer->lines);
log_printf (" last_line. . . . . . . : 0x%lx", ptr_buffer->last_line);
log_printf (" last_read_line . . . . : 0x%lx", ptr_buffer->last_read_line);
log_printf (" first_line_not_read. . : %d", ptr_buffer->first_line_not_read);
log_printf (" lines_count. . . . . . : %d", ptr_buffer->lines_count);
log_printf (" lines_hidden . . . . . : %d", ptr_buffer->lines_hidden);
log_printf (" prefix_max_length. . . : %d", ptr_buffer->prefix_max_length);
+1
View File
@@ -108,6 +108,7 @@ struct t_gui_buffer
struct t_gui_line *lines; /* lines of chat window */
struct t_gui_line *last_line; /* last line of chat window */
struct t_gui_line *last_read_line; /* last read line before jump */
int first_line_not_read; /* if 1, marker is before first line */
int lines_count; /* number of lines in the buffer */
int lines_hidden; /* 1 if at least one line is hidden */
int prefix_max_length; /* length for prefix align */
+8
View File
@@ -692,6 +692,14 @@ gui_chat_line_free (struct t_gui_buffer *buffer, struct t_gui_line *line)
}
}
/* move read marker if it was on line we are removing */
if (buffer->last_read_line == line)
{
buffer->last_read_line = buffer->last_read_line->prev_line;
buffer->first_line_not_read = (buffer->last_read_line) ? 0 : 1;
gui_buffer_ask_chat_refresh (buffer, 1);
}
/* free data */
if (line->str_time)
free (line->str_time);
+7 -4
View File
@@ -1202,11 +1202,14 @@ gui_input_scroll_unread ()
if (CONFIG_STRING(config_look_read_marker) &&
CONFIG_STRING(config_look_read_marker)[0] &&
(gui_current_window->buffer->type == GUI_BUFFER_TYPE_FORMATED) &&
gui_current_window->buffer->last_read_line &&
gui_current_window->buffer->last_read_line != gui_current_window->buffer->last_line)
(gui_current_window->buffer->first_line_not_read ||
(gui_current_window->buffer->last_read_line &&
gui_current_window->buffer->last_read_line != gui_current_window->buffer->last_line)))
{
gui_current_window->start_line =
gui_current_window->buffer->last_read_line->next_line;
if (gui_current_window->buffer->first_line_not_read)
gui_current_window->start_line = gui_current_window->buffer->lines;
else
gui_current_window->start_line = gui_current_window->buffer->last_read_line->next_line;
gui_current_window->start_line_pos = 0;
gui_current_window->first_line_displayed =
(gui_current_window->start_line == gui_chat_get_first_line_displayed (gui_current_window->buffer));