summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/gui/curses/gui-display.c19
-rw-r--r--src/gui/curses/gui-input.c3
-rw-r--r--src/gui/gui-action.c86
-rw-r--r--src/gui/gui-common.c1
-rw-r--r--src/gui/gui-keyboard.c80
-rw-r--r--src/gui/gui.h5
6 files changed, 149 insertions, 45 deletions
diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c
index b5514afdd..487b2348d 100644
--- a/src/gui/curses/gui-display.c
+++ b/src/gui/curses/gui-display.c
@@ -1666,15 +1666,20 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
ptr_line = ptr_line->next_line;
}
+ ptr_win->scroll = (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1);
+
/* check if last line of buffer is entirely displayed and scrolling */
- /* if so, disable scroll (to remove status bar indicator) */
- if (!ptr_line && ptr_win->start_line)
+ /* if so, disable scroll indicator */
+ if (!ptr_line && ptr_win->scroll)
{
if (count == gui_display_line (ptr_win, ptr_win->buffer->last_line, 0, 1))
- {
- ptr_win->start_line = NULL;
- ptr_win->start_line_pos = 0;
- }
+ ptr_win->scroll = 0;
+ }
+
+ if (!ptr_win->scroll && (ptr_win->start_line == ptr_win->buffer->lines))
+ {
+ ptr_win->start_line = NULL;
+ ptr_win->start_line_pos = 0;
}
/* cursor is below end line of chat window? */
@@ -2200,7 +2205,7 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
if (x < 0)
x = 0;
gui_window_set_weechat_color (ptr_win->win_status, COLOR_WIN_STATUS_MORE);
- if (ptr_win->start_line)
+ if (ptr_win->scroll)
mvwprintw (ptr_win->win_status, 0, x, "%s", more);
else
{
diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c
index 66c675d61..520179a23 100644
--- a/src/gui/curses/gui-input.c
+++ b/src/gui/curses/gui-input.c
@@ -104,8 +104,11 @@ gui_input_default_key_bindings ()
gui_key_bind ( /* m-j,m-s */ "meta-jmeta-s", "jump_server");
gui_key_bind ( /* m-j,m-x */ "meta-jmeta-x", "jump_next_server");
gui_key_bind ( /* m-k */ "meta-k", "grab_key");
+ gui_key_bind ( /* m-n */ "meta-n", "scroll_next_highlight");
+ gui_key_bind ( /* m-p */ "meta-p", "scroll_previous_highlight");
gui_key_bind ( /* m-r */ "meta-r", "delete_line");
gui_key_bind ( /* m-s */ "meta-s", "switch_server");
+ gui_key_bind ( /* m-u */ "meta-u", "scroll_unread");
/* keys binded with commands */
gui_key_bind ( /* m-left */ "meta-meta2-D", "/buffer -1");
diff --git a/src/gui/gui-action.c b/src/gui/gui-action.c
index 14ec2b90c..772a2f359 100644
--- a/src/gui/gui-action.c
+++ b/src/gui/gui-action.c
@@ -1050,6 +1050,92 @@ gui_action_switch_server (t_gui_window *window)
}
/*
+ * gui_action_scroll_previous_highlight: scroll to previous highlight
+ */
+
+void
+gui_action_scroll_previous_highlight (t_gui_window *window)
+{
+ t_gui_line *ptr_line;
+
+ if (!window->buffer->dcc)
+ {
+ if (window->buffer->lines)
+ {
+ ptr_line = (window->start_line) ?
+ window->start_line->prev_line : window->buffer->last_line->prev_line;
+ while (ptr_line)
+ {
+ if (ptr_line->line_with_highlight)
+ {
+ window->start_line = ptr_line;
+ window->start_line_pos = 0;
+ window->first_line_displayed =
+ (window->start_line == window->buffer->lines);
+ gui_draw_buffer_chat (window->buffer, 1);
+ gui_draw_buffer_status (window->buffer, 0);
+ return;
+ }
+ ptr_line = ptr_line->prev_line;
+ }
+ }
+ }
+}
+
+/*
+ * gui_action_scroll_next_highlight: scroll to next highlight
+ */
+
+void
+gui_action_scroll_next_highlight (t_gui_window *window)
+{
+ t_gui_line *ptr_line;
+
+ if (!window->buffer->dcc)
+ {
+ if (window->buffer->lines)
+ {
+ ptr_line = (window->start_line) ?
+ window->start_line->next_line : window->buffer->lines->next_line;
+ while (ptr_line)
+ {
+ if (ptr_line->line_with_highlight)
+ {
+ window->start_line = ptr_line;
+ window->start_line_pos = 0;
+ window->first_line_displayed =
+ (window->start_line == window->buffer->lines);
+ gui_draw_buffer_chat (window->buffer, 1);
+ gui_draw_buffer_status (window->buffer, 0);
+ return;
+ }
+ ptr_line = ptr_line->next_line;
+ }
+ }
+ }
+}
+
+/*
+ * gui_action_scroll_unread: scroll to first unread line of buffer
+ */
+
+void
+gui_action_scroll_unread (t_gui_window *window)
+{
+ if (!window->buffer->dcc &&
+ window->buffer->last_read_line &&
+ window->buffer->last_read_line != window->buffer->last_line)
+ {
+ window->start_line = window->buffer->last_read_line->next_line;
+ window->start_line_pos = 0;
+ window->first_line_displayed =
+ (window->start_line == window->buffer->lines);
+ gui_draw_buffer_chat (window->buffer, 1);
+ gui_draw_buffer_status (window->buffer, 0);
+ }
+}
+
+/*
* gui_action_hotlist_clear: clear hotlist
*/
diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c
index 6932173c2..b9e4e312c 100644
--- a/src/gui/gui-common.c
+++ b/src/gui/gui-common.c
@@ -244,6 +244,7 @@ gui_window_new (t_gui_window *parent, int x, int y, int width, int height,
new_window->first_line_displayed = 0;
new_window->start_line = NULL;
new_window->start_line_pos = 0;
+ new_window->scroll = 0;
new_window->ptr_tree = ptr_leaf;
ptr_leaf->window = new_window;
diff --git a/src/gui/gui-keyboard.c b/src/gui/gui-keyboard.c
index 2d3431899..a3c5c3329 100644
--- a/src/gui/gui-keyboard.c
+++ b/src/gui/gui-keyboard.c
@@ -41,79 +41,85 @@ int gui_key_grab = 0;
int gui_key_grab_count = 0;
t_gui_key_function gui_key_functions[] =
-{ { "return", gui_action_return,
+{ { "return", gui_action_return,
N_("terminate line") },
- { "tab", gui_action_tab,
+ { "tab", gui_action_tab,
N_("complete word") },
- { "backspace", gui_action_backspace,
+ { "backspace", gui_action_backspace,
N_("delete previous char") },
- { "delete", gui_action_delete,
+ { "delete", gui_action_delete,
N_("delete next char") },
- { "delete_end_line", gui_action_delete_end_of_line,
+ { "delete_end_line", gui_action_delete_end_of_line,
N_("delete until end of line") },
- { "delete_beginning_line", gui_action_delete_begin_of_line,
+ { "delete_beginning_line", gui_action_delete_begin_of_line,
N_("delete until beginning of line") },
- { "delete_line", gui_action_delete_line,
+ { "delete_line", gui_action_delete_line,
N_("delete entire line") },
- { "delete_previous_word", gui_action_delete_previous_word,
+ { "delete_previous_word", gui_action_delete_previous_word,
N_("delete previous word") },
- { "delete_next_word", gui_action_delete_next_word,
+ { "delete_next_word", gui_action_delete_next_word,
N_("delete next word") },
- { "clipboard_paste", gui_action_clipboard_paste,
+ { "clipboard_paste", gui_action_clipboard_paste,
N_("paste current clipboard content") },
- { "transpose_chars", gui_action_transpose_chars,
+ { "transpose_chars", gui_action_transpose_chars,
N_("transpose chars") },
- { "home", gui_action_home,
+ { "home", gui_action_home,
N_("go to beginning of line") },
- { "end", gui_action_end,
+ { "end", gui_action_end,
N_("go to end of line") },
- { "left", gui_action_left,
+ { "left", gui_action_left,
N_("move one char left") },
- { "previous_word", gui_action_previous_word,
+ { "previous_word", gui_action_previous_word,
N_("move to previous word") },
- { "right", gui_action_right,
+ { "right", gui_action_right,
N_("move one char right") },
- { "next_word", gui_action_next_word,
+ { "next_word", gui_action_next_word,
N_("move to next word") },
- { "up", gui_action_up,
+ { "up", gui_action_up,
N_("call previous command in history") },
- { "up_global", gui_action_up_global,
+ { "up_global", gui_action_up_global,
N_("call previous command in global history") },
- { "down", gui_action_down,
+ { "down", gui_action_down,
N_("call next command in history") },
- { "down_global", gui_action_down_global,
+ { "down_global", gui_action_down_global,
N_("call next command in global history") },
- { "page_up", gui_action_page_up,
+ { "page_up", gui_action_page_up,
N_("scroll one page up") },
- { "page_down", gui_action_page_down,
+ { "page_down", gui_action_page_down,
N_("scroll one page down") },
- { "nick_beginning", gui_action_nick_beginning,
+ { "nick_beginning", gui_action_nick_beginning,
N_("display beginning of nicklist") },
- { "nick_end", gui_action_nick_end,
+ { "nick_end", gui_action_nick_end,
N_("display end of nicklist") },
- { "nick_page_up", gui_action_nick_page_up,
+ { "nick_page_up", gui_action_nick_page_up,
N_("scroll nicklist one page up") },
- { "nick_page_down", gui_action_nick_page_down,
+ { "nick_page_down", gui_action_nick_page_down,
N_("scroll nicklist one page down") },
- { "jump_smart", gui_action_jump_smart,
+ { "jump_smart", gui_action_jump_smart,
N_("jump to buffer with activity") },
- { "jump_dcc", gui_action_jump_dcc,
+ { "jump_dcc", gui_action_jump_dcc,
N_("jump to DCC buffer") },
- { "jump_last_buffer", gui_action_jump_last_buffer,
+ { "jump_last_buffer", gui_action_jump_last_buffer,
N_("jump to last buffer") },
- { "jump_server", gui_action_jump_server,
+ { "jump_server", gui_action_jump_server,
N_("jump to server buffer") },
- { "jump_next_server", gui_action_jump_next_server,
+ { "jump_next_server", gui_action_jump_next_server,
N_("jump to next server") },
- { "switch_server", gui_action_switch_server,
+ { "switch_server", gui_action_switch_server,
N_("switch active server on servers buffer") },
- { "hotlist_clear", gui_action_hotlist_clear,
+ { "scroll_previous_highlight", gui_action_scroll_previous_highlight,
+ N_("scroll to previous highlight in buffer") },
+ { "scroll_next_highlight", gui_action_scroll_next_highlight,
+ N_("scroll to next highlight in buffer") },
+ { "scroll_unread", gui_action_scroll_unread,
+ N_("scroll to first unread line in buffer") },
+ { "hotlist_clear", gui_action_hotlist_clear,
N_("clear hotlist") },
- { "infobar_clear", gui_action_infobar_clear,
+ { "infobar_clear", gui_action_infobar_clear,
N_("clear infobar") },
- { "refresh", gui_action_refresh_screen,
+ { "refresh", gui_action_refresh_screen,
N_("refresh screen") },
- { "grab_key", gui_action_grab_key,
+ { "grab_key", gui_action_grab_key,
N_("grab a key") },
{ NULL, NULL, NULL }
};
diff --git a/src/gui/gui.h b/src/gui/gui.h
index 4ffb20c80..ef7ebbe63 100644
--- a/src/gui/gui.h
+++ b/src/gui/gui.h
@@ -330,7 +330,7 @@ struct t_gui_window
int first_line_displayed; /* = 1 if first line is displayed */
t_gui_line *start_line; /* pointer to line if scrolling */
int start_line_pos; /* position in first line displayed */
-
+ int scroll; /* = 1 if "MORE" should be displayed */
t_gui_window_tree *ptr_tree; /* pointer to leaf in windows tree */
t_gui_window *prev_window; /* link to previous window */
@@ -465,6 +465,9 @@ extern void gui_action_jump_last_buffer (t_gui_window *);
extern void gui_action_jump_server (t_gui_window *);
extern void gui_action_jump_next_server (t_gui_window *);
extern void gui_action_switch_server (t_gui_window *);
+extern void gui_action_scroll_previous_highlight (t_gui_window *);
+extern void gui_action_scroll_next_highlight (t_gui_window *);
+extern void gui_action_scroll_unread (t_gui_window *);
extern void gui_action_hotlist_clear (t_gui_window *);
extern void gui_action_infobar_clear (t_gui_window *);
extern void gui_action_refresh_screen ();