From dca4064502ebdc9d2d9fbdaa31c1b4a717ca96ae Mon Sep 17 00:00:00 2001 From: Sebastien Helleu Date: Sat, 30 Apr 2005 19:21:28 +0000 Subject: Added nicklist scroll keys (Alt+{home/end/pgup/pgdn} or F11/F12) --- src/common/weeconfig.c | 5 + src/common/weeconfig.h | 1 + src/gui/curses/gui-display.c | 254 ++++++++++++++++++++++++++++++++----------- src/gui/curses/gui-input.c | 51 ++++++--- src/gui/gui-common.c | 2 + src/gui/gui.h | 36 +++--- 6 files changed, 254 insertions(+), 95 deletions(-) (limited to 'src') diff --git a/src/common/weeconfig.c b/src/common/weeconfig.c index 33d9575f1..b341a7fcb 100644 --- a/src/common/weeconfig.c +++ b/src/common/weeconfig.c @@ -215,6 +215,7 @@ int cfg_col_nick_chanadmin; int cfg_col_nick_op; int cfg_col_nick_halfop; int cfg_col_nick_voice; +int cfg_col_nick_more; int cfg_col_nick_sep; int cfg_col_nick_self; int cfg_col_nick_private; @@ -375,6 +376,10 @@ t_config_option weechat_options_colors[] = N_("color for voice symbol"), OPTION_TYPE_COLOR, 0, 0, 0, "yellow", NULL, &cfg_col_nick_voice, NULL, &config_change_color }, + { "col_nick_more", N_("color for '+' when scrolling nicks"), + N_("color for '+' when scrolling nicks"), + OPTION_TYPE_COLOR, 0, 0, 0, + "lightmagenta", NULL, &cfg_col_nick_more, NULL, &config_change_color }, { "col_nick_sep", N_("color for nick separator"), N_("color for nick separator"), OPTION_TYPE_COLOR, 0, 0, 0, diff --git a/src/common/weeconfig.h b/src/common/weeconfig.h index 99275b659..186327a1e 100644 --- a/src/common/weeconfig.h +++ b/src/common/weeconfig.h @@ -133,6 +133,7 @@ extern int cfg_col_nick_chanadmin; extern int cfg_col_nick_op; extern int cfg_col_nick_halfop; extern int cfg_col_nick_voice; +extern int cfg_col_nick_more; extern int cfg_col_nick_sep; extern int cfg_col_nick_self; extern int cfg_col_nick_private; diff --git a/src/gui/curses/gui-display.c b/src/gui/curses/gui-display.c index e1f36e15f..c43718e76 100644 --- a/src/gui/curses/gui-display.c +++ b/src/gui/curses/gui-display.c @@ -874,7 +874,7 @@ void gui_draw_buffer_nick (t_gui_buffer *buffer, int erase) { t_gui_window *ptr_win; - int i, x, y, column, max_length; + int i, j, x, y, column, max_length, nicks_displayed; char format[32], format_empty[32]; t_irc_nick *ptr_nick; @@ -957,71 +957,102 @@ gui_draw_buffer_nick (t_gui_buffer *buffer, int erase) x = 0; y = (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM) ? 1 : 0; column = 0; - for (ptr_nick = CHANNEL(buffer)->nicks; ptr_nick; - ptr_nick = ptr_nick->next_nick) + + if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) || + (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM)) + nicks_displayed = (ptr_win->win_width / (max_length + 2)) * (ptr_win->win_height - 1); + else + nicks_displayed = ptr_win->win_height; + + ptr_nick = CHANNEL(buffer)->nicks; + for (i = 0; i < ptr_win->win_nick_start; i++) { - switch (cfg_look_nicklist_position) - { - case CFG_LOOK_NICKLIST_LEFT: - x = 0; - break; - case CFG_LOOK_NICKLIST_RIGHT: - x = 1; - break; - case CFG_LOOK_NICKLIST_TOP: - case CFG_LOOK_NICKLIST_BOTTOM: - x = column; - break; - } - if (ptr_nick->is_chanowner) - { - gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_CHANOWNER); - mvwprintw (ptr_win->win_nick, y, x, "~"); - x++; - } - else if (ptr_nick->is_chanadmin) - { - gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_CHANADMIN); - mvwprintw (ptr_win->win_nick, y, x, "&"); - x++; - } - else if (ptr_nick->is_op) - { - gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_OP); - mvwprintw (ptr_win->win_nick, y, x, "@"); - x++; - } - else if (ptr_nick->is_halfop) - { - gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_HALFOP); - mvwprintw (ptr_win->win_nick, y, x, "%%"); - x++; - } - else if (ptr_nick->has_voice) - { - gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_VOICE); - mvwprintw (ptr_win->win_nick, y, x, "+"); - x++; - } - else - { - gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK); - mvwprintw (ptr_win->win_nick, y, x, " "); - x++; - } - gui_window_set_color (ptr_win->win_nick, - (ptr_nick->is_away) ? - COLOR_WIN_NICK_AWAY : COLOR_WIN_NICK); - mvwprintw (ptr_win->win_nick, y, x, format, ptr_nick->nick); - y++; - if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) || - (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM)) + if (!ptr_nick) + break; + ptr_nick = ptr_nick->next_nick; + } + if (ptr_nick) + { + for (i = 0; i < nicks_displayed; i++) { - if (y - ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM) ? 1 : 0) >= ptr_win->win_nick_height - 1) + switch (cfg_look_nicklist_position) { - column += max_length + 2; - y = (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) ? - 0 : 1; + case CFG_LOOK_NICKLIST_LEFT: + x = 0; + break; + case CFG_LOOK_NICKLIST_RIGHT: + x = 1; + break; + case CFG_LOOK_NICKLIST_TOP: + case CFG_LOOK_NICKLIST_BOTTOM: + x = column; + break; + } + if ((i == 0) && (ptr_win->win_nick_start > 0)) + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_MORE); + j = (max_length + 1) >= 4 ? 4 : max_length + 1; + for (x = 1; x <= j; x++) + mvwprintw (ptr_win->win_nick, y, x, "+"); + } + else + { + if (ptr_nick->is_chanowner) + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_CHANOWNER); + mvwprintw (ptr_win->win_nick, y, x, "~"); + x++; + } + else if (ptr_nick->is_chanadmin) + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_CHANADMIN); + mvwprintw (ptr_win->win_nick, y, x, "&"); + x++; + } + else if (ptr_nick->is_op) + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_OP); + mvwprintw (ptr_win->win_nick, y, x, "@"); + x++; + } + else if (ptr_nick->is_halfop) + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_HALFOP); + mvwprintw (ptr_win->win_nick, y, x, "%%"); + x++; + } + else if (ptr_nick->has_voice) + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK_VOICE); + mvwprintw (ptr_win->win_nick, y, x, "+"); + x++; + } + else + { + gui_window_set_color (ptr_win->win_nick, COLOR_WIN_NICK); + mvwprintw (ptr_win->win_nick, y, x, " "); + x++; + } + gui_window_set_color (ptr_win->win_nick, + (ptr_nick->is_away) ? + COLOR_WIN_NICK_AWAY : COLOR_WIN_NICK); + mvwprintw (ptr_win->win_nick, y, x, format, ptr_nick->nick); + + ptr_nick = ptr_nick->next_nick; + + if (!ptr_nick) + break; + } + y++; + if ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) || + (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM)) + { + if (y - ((cfg_look_nicklist_position == CFG_LOOK_NICKLIST_BOTTOM) ? 1 : 0) >= ptr_win->win_nick_height - 1) + { + column += max_length + 2; + y = (cfg_look_nicklist_position == CFG_LOOK_NICKLIST_TOP) ? + 0 : 1; + } } } } @@ -1566,6 +1597,7 @@ gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer) gui_current_window->buffer->num_displayed--; window->buffer = buffer; + window->win_nick_start = 0; gui_calculate_pos_size (window); /* destroy Curses windows */ @@ -1814,6 +1846,99 @@ gui_move_page_down (t_gui_window *window) } } +/* + * gui_nick_move_beginning: go to beginning of nicklist + */ + +void +gui_nick_move_beginning (t_gui_window *window) +{ + if (!gui_ok) + return; + + if (gui_buffer_has_nicklist (window->buffer)) + { + if (window->win_nick_start > 0) + { + window->win_nick_start = 0; + gui_draw_buffer_nick (window->buffer, 1); + } + } +} + +/* + * gui_nick_move_end: go to the end of nicklist + */ + +void +gui_nick_move_end (t_gui_window *window) +{ + int new_start; + + if (!gui_ok) + return; + + if (gui_buffer_has_nicklist (window->buffer)) + { + new_start = CHANNEL(window->buffer)->nicks_count - window->win_nick_height; + if (new_start < 0) + new_start = 0; + else if (new_start >= 1) + new_start++; + + if (new_start != window->win_nick_start) + { + window->win_nick_start = new_start; + gui_draw_buffer_nick (window->buffer, 1); + } + } +} + +/* + * gui_nick_move_page_up: scroll one page up in nicklist + */ + +void +gui_nick_move_page_up (t_gui_window *window) +{ + if (!gui_ok) + return; + + if (gui_buffer_has_nicklist (window->buffer)) + { + if (window->win_nick_start > 0) + { + window->win_nick_start -= (window->win_nick_height - 1); + if (window->win_nick_start <= 1) + window->win_nick_start = 0; + gui_draw_buffer_nick (window->buffer, 1); + } + } +} + +/* + * gui_nick_move_page_down: scroll one page down in nicklist + */ + +void +gui_nick_move_page_down (t_gui_window *window) +{ + if (!gui_ok) + return; + + if (gui_buffer_has_nicklist (window->buffer)) + { + if (window->win_nick_start + window->win_nick_height < CHANNEL(window->buffer)->nicks_count) + { + if (window->win_nick_start == 0) + window->win_nick_start += window->win_nick_height; + else + window->win_nick_start += (window->win_nick_height - 1); + gui_draw_buffer_nick (window->buffer, 1); + } + } +} + /* * gui_window_init_subviews: init subviews for a WeeChat window */ @@ -2201,6 +2326,8 @@ gui_init_colors () cfg_col_nick_halfop & A_CHARTEXT, cfg_col_nick_bg); init_pair (COLOR_WIN_NICK_VOICE, cfg_col_nick_voice & A_CHARTEXT, cfg_col_nick_bg); + init_pair (COLOR_WIN_NICK_MORE, + cfg_col_nick_more & A_CHARTEXT, cfg_col_nick_bg); init_pair (COLOR_WIN_NICK_SEP, cfg_col_nick_sep & A_CHARTEXT, cfg_col_nick_bg); init_pair (COLOR_WIN_NICK_SELF, @@ -2260,6 +2387,7 @@ gui_init_colors () color_attr[COLOR_WIN_NICK_OP - 1] = (cfg_col_nick_op >= 0) ? cfg_col_nick_op & A_BOLD : 0; color_attr[COLOR_WIN_NICK_HALFOP - 1] = (cfg_col_nick_halfop >= 0) ? cfg_col_nick_halfop & A_BOLD : 0; color_attr[COLOR_WIN_NICK_VOICE - 1] = (cfg_col_nick_voice >= 0) ? cfg_col_nick_voice & A_BOLD : 0; + color_attr[COLOR_WIN_NICK_MORE - 1] = (cfg_col_nick_more >= 0) ? cfg_col_nick_more & A_BOLD : 0; color_attr[COLOR_WIN_NICK_SEP - 1] = 0; color_attr[COLOR_WIN_NICK_SELF - 1] = (cfg_col_nick_self >= 0) ? cfg_col_nick_self & A_BOLD : 0; color_attr[COLOR_WIN_NICK_PRIVATE - 1] = (cfg_col_nick_private >= 0) ? cfg_col_nick_private & A_BOLD : 0; diff --git a/src/gui/curses/gui-input.c b/src/gui/curses/gui-input.c index 7d92ae8e7..245e0dd10 100644 --- a/src/gui/curses/gui-input.c +++ b/src/gui/curses/gui-input.c @@ -72,8 +72,6 @@ gui_read_keyb () case KEY_F(3): case KEY_F(4): case KEY_F(9): - case KEY_F(11): - case KEY_F(12): break; /* previous buffer in window */ case KEY_F(5): @@ -96,6 +94,12 @@ gui_read_keyb () gui_infobar_remove (); gui_draw_buffer_infobar (gui_current_window->buffer, 1); break; + case KEY_F(11): + gui_nick_move_page_up (gui_current_window); + break; + case KEY_F(12): + gui_nick_move_page_down (gui_current_window); + break; /* cursor up */ case KEY_UP: if (gui_current_window->buffer->dcc) @@ -416,25 +420,38 @@ gui_read_keyb () case KEY_RIGHT: gui_switch_to_next_buffer (gui_current_window); break; + /* Alt + home */ + case KEY_HOME: + gui_nick_move_beginning (gui_current_window); + break; + /* Alt + end */ + case KEY_END: + gui_nick_move_end (gui_current_window); + break; + /* Alt + page up */ + case KEY_PPAGE: + gui_nick_move_page_up (gui_current_window); + break; + /* Alt + page down */ + case KEY_NPAGE: + gui_nick_move_page_down (gui_current_window); + break; case 79: /* TODO: replace 79 by constant name! */ - if (key == 79) + if ((key = getch()) != ERR) { - if ((key = getch()) != ERR) + switch (key) { - switch (key) - { - /* Control + Right */ - case 99: - if (!gui_current_window->buffer->dcc) - gui_move_next_word (gui_current_window->buffer); - break; - /* Control + Left */ - case 100: - if (!gui_current_window->buffer->dcc) - gui_move_previous_word (gui_current_window->buffer); - break; - } + /* Control + Right */ + case 99: + if (!gui_current_window->buffer->dcc) + gui_move_next_word (gui_current_window->buffer); + break; + /* Control + Left */ + case 100: + if (!gui_current_window->buffer->dcc) + gui_move_previous_word (gui_current_window->buffer); + break; } } break; diff --git a/src/gui/gui-common.c b/src/gui/gui-common.c index 8136d49f3..72e79127f 100644 --- a/src/gui/gui-common.c +++ b/src/gui/gui-common.c @@ -87,6 +87,7 @@ gui_window_new (int x, int y, int width, int height) new_window->win_nick_y = 0; new_window->win_nick_width = 0; new_window->win_nick_height = 0; + new_window->win_nick_start = 0; new_window->win_title = NULL; new_window->win_chat = NULL; @@ -842,6 +843,7 @@ gui_window_print_log (t_gui_window *window) wee_log_printf (" win_nick_y. . . . . : %d\n", window->win_nick_y); wee_log_printf (" win_nick_width. . . : %d\n", window->win_nick_width); wee_log_printf (" win_nick_height . . : %d\n", window->win_nick_height); + wee_log_printf (" win_nick_start. . . : %d\n", window->win_nick_start); wee_log_printf (" win_title . . . . . : 0x%X\n", window->win_title); wee_log_printf (" win_chat. . . . . . : 0x%X\n", window->win_chat); wee_log_printf (" win_nick. . . . . . : 0x%X\n", window->win_nick); diff --git a/src/gui/gui.h b/src/gui/gui.h index 34608ff6b..c5bf0db87 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -26,7 +26,7 @@ #define INPUT_BUFFER_BLOCK_SIZE 256 -#define NUM_COLORS 49 +#define NUM_COLORS 50 #define COLOR_WIN_TITLE 1 #define COLOR_WIN_CHAT 2 #define COLOR_WIN_CHAT_TIME 3 @@ -56,19 +56,20 @@ #define COLOR_WIN_NICK_OP 27 #define COLOR_WIN_NICK_HALFOP 28 #define COLOR_WIN_NICK_VOICE 29 -#define COLOR_WIN_NICK_SEP 30 -#define COLOR_WIN_NICK_SELF 31 -#define COLOR_WIN_NICK_PRIVATE 32 -#define COLOR_WIN_NICK_FIRST 33 -#define COLOR_WIN_NICK_LAST 42 +#define COLOR_WIN_NICK_MORE 30 +#define COLOR_WIN_NICK_SEP 31 +#define COLOR_WIN_NICK_SELF 32 +#define COLOR_WIN_NICK_PRIVATE 33 +#define COLOR_WIN_NICK_FIRST 34 +#define COLOR_WIN_NICK_LAST 43 #define COLOR_WIN_NICK_NUMBER (COLOR_WIN_NICK_LAST - COLOR_WIN_NICK_FIRST + 1) -#define COLOR_DCC_SELECTED 43 -#define COLOR_DCC_WAITING 44 -#define COLOR_DCC_CONNECTING 45 -#define COLOR_DCC_ACTIVE 46 -#define COLOR_DCC_DONE 47 -#define COLOR_DCC_FAILED 48 -#define COLOR_DCC_ABORTED 49 +#define COLOR_DCC_SELECTED 44 +#define COLOR_DCC_WAITING 45 +#define COLOR_DCC_CONNECTING 46 +#define COLOR_DCC_ACTIVE 47 +#define COLOR_DCC_DONE 48 +#define COLOR_DCC_FAILED 49 +#define COLOR_DCC_ABORTED 50 #define SERVER(buffer) ((t_irc_server *)(buffer->server)) #define CHANNEL(buffer) ((t_irc_channel *)(buffer->channel)) @@ -212,6 +213,7 @@ struct t_gui_window int win_nick_x, win_nick_y; /* chat window position */ int win_nick_width; /* width of chat window */ int win_nick_height; /* height of chat window */ + int win_nick_start; /* # of 1st nick for display (scroll) */ /* windows for Curses GUI */ void *win_title; /* title window */ @@ -302,8 +304,12 @@ extern void gui_switch_to_previous_buffer (t_gui_window *); extern void gui_switch_to_next_buffer (t_gui_window *); extern void gui_switch_to_previous_window (t_gui_window *); extern void gui_switch_to_next_window (t_gui_window *); -extern void gui_move_page_up (); -extern void gui_move_page_down (); +extern void gui_move_page_up (t_gui_window *); +extern void gui_move_page_down (t_gui_window *); +extern void gui_nick_move_beginning (t_gui_window *); +extern void gui_nick_move_end (t_gui_window *); +extern void gui_nick_move_page_up (t_gui_window *); +extern void gui_nick_move_page_down (t_gui_window *); extern void gui_curses_resize_handler (); extern void gui_window_init_subwindows (t_gui_window *); extern void gui_window_split_horiz (t_gui_window *); -- cgit v1.2.3