summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/weeconfig.c5
-rw-r--r--src/common/weeconfig.h1
-rw-r--r--src/gui/curses/gui-display.c254
-rw-r--r--src/gui/curses/gui-input.c51
-rw-r--r--src/gui/gui-common.c2
-rw-r--r--src/gui/gui.h36
6 files changed, 254 insertions, 95 deletions
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 */
@@ -1815,6 +1847,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 *);