summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/core/wee-upgrade.c2
-rw-r--r--src/gui/curses/gui-curses-window.c6
-rw-r--r--src/gui/gtk/gui-gtk-window.c6
-rw-r--r--src/gui/gui-buffer.c5
-rw-r--r--src/gui/gui-buffer.h1
-rw-r--r--src/gui/gui-chat.c8
-rw-r--r--src/gui/gui-input.c11
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));