diff options
-rw-r--r-- | src/core/wee-upgrade.c | 2 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-window.c | 6 | ||||
-rw-r--r-- | src/gui/gtk/gui-gtk-window.c | 6 | ||||
-rw-r--r-- | src/gui/gui-buffer.c | 5 | ||||
-rw-r--r-- | src/gui/gui-buffer.h | 1 | ||||
-rw-r--r-- | src/gui/gui-chat.c | 8 | ||||
-rw-r--r-- | src/gui/gui-input.c | 11 |
7 files changed, 35 insertions, 4 deletions
diff --git a/src/core/wee-upgrade.c b/src/core/wee-upgrade.c index 3b54ddfd4..e01d4c83d 100644 --- a/src/core/wee-upgrade.c +++ b/src/core/wee-upgrade.c @@ -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 = diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c index 91d8c87a0..aed643dca 100644 --- a/src/gui/curses/gui-curses-window.c +++ b/src/gui/curses/gui-curses-window.c @@ -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; + } } } diff --git a/src/gui/gtk/gui-gtk-window.c b/src/gui/gtk/gui-gtk-window.c index 1ff046acc..aee7b046d 100644 --- a/src/gui/gtk/gui-gtk-window.c +++ b/src/gui/gtk/gui-gtk-window.c @@ -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; + } } } diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index c701be677..2b18bfb49 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -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); diff --git a/src/gui/gui-buffer.h b/src/gui/gui-buffer.h index 17a0216f6..7572ef614 100644 --- a/src/gui/gui-buffer.h +++ b/src/gui/gui-buffer.h @@ -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 */ diff --git a/src/gui/gui-chat.c b/src/gui/gui-chat.c index 2e0b7c40d..87249999a 100644 --- a/src/gui/gui-chat.c +++ b/src/gui/gui-chat.c @@ -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); diff --git a/src/gui/gui-input.c b/src/gui/gui-input.c index 59be19d63..3284a2c82 100644 --- a/src/gui/gui-input.c +++ b/src/gui/gui-input.c @@ -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)); |