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:
@@ -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 =
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user