1
0
mirror of https://github.com/weechat/weechat.git synced 2026-06-29 14:26:39 +02:00

Fixed scroll problem (screen moving when scrolling and new line displayed)

This commit is contained in:
Sebastien Helleu
2005-09-15 08:21:36 +00:00
parent e18f14e5d3
commit 7f4a213239
12 changed files with 442 additions and 192 deletions
+1 -2
View File
@@ -1,9 +1,8 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
WeeChat known bugs, 2005-09-14
WeeChat known bugs, 2005-09-15
- when scrolling back in history, if a new message is displayed, screen moves
- color display problems when term has white background
- ./configure does not check that Ruby libraries are installed
- ./configure does not check that Gtk 2.0 libraries are installed
+3 -1
View File
@@ -1,10 +1,12 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2005-09-14
ChangeLog - 2005-09-15
Version 0.1.5 (under dev!):
* fixed scroll problem (screen moving when scrolling and new line
displayed)
* fixed infinite loop when scrolling back and displaying long lines
* fixed crash when closing a buffer used by more than one window
* added some missing IRC commands
+198 -79
View File
@@ -594,9 +594,6 @@ gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulat
int word_length_with_spaces, word_length;
int skip_spaces;
if (window->win_chat_cursor_y > window->win_chat_height - 1)
return 0;
if (simulate)
{
x = window->win_chat_cursor_x;
@@ -607,6 +604,8 @@ gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulat
}
else
{
if (window->win_chat_cursor_y > window->win_chat_height - 1)
return 0;
x = window->win_chat_cursor_x;
y = window->win_chat_cursor_y;
num_lines = gui_display_line (window, line, 0, 1);
@@ -681,6 +680,105 @@ gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulat
return lines_displayed;
}
/*
* gui_calculate_line_diff: returns pointer to line & offset for a difference
* with given line
*/
void
gui_calculate_line_diff (t_gui_window *window, t_gui_line **line, int *line_pos,
int difference)
{
int backward, current_size;
if (!line || !line_pos)
return;
backward = (difference < 0);
if (!(*line))
{
/* if looking backward, start at last line of buffer */
if (backward)
{
*line = window->buffer->last_line;
if (!(*line))
return;
current_size = gui_display_line (window, *line, 0, 1);
if (current_size == 0)
current_size = 1;
*line_pos = current_size - 1;
}
/* if looking forward, start at first line of buffer */
else
{
*line = window->buffer->lines;
if (!(*line))
return;
*line_pos = 0;
current_size = gui_display_line (window, *line, 0, 1);
}
}
else
current_size = gui_display_line (window, *line, 0, 1);
while ((*line) && (difference != 0))
{
/* looking backward */
if (backward)
{
if (*line_pos > 0)
(*line_pos)--;
else
{
*line = (*line)->prev_line;
if (*line)
{
current_size = gui_display_line (window, *line, 0, 1);
if (current_size == 0)
current_size = 1;
*line_pos = current_size - 1;
}
}
difference++;
}
/* looking forward */
else
{
if (*line_pos < current_size - 1)
(*line_pos)++;
else
{
*line = (*line)->next_line;
if (*line)
{
current_size = gui_display_line (window, *line, 0, 1);
if (current_size == 0)
current_size = 1;
*line_pos = 0;
}
}
difference--;
}
}
/* first or last line reached */
if (!(*line))
{
if (backward)
{
/* first line reached */
*line = window->buffer->lines;
*line_pos = 0;
}
else
{
/* last line reached => consider we'll display all until the end */
*line_pos = 0;
}
}
}
/*
* gui_draw_buffer_chat: draw chat window for a buffer
*/
@@ -692,7 +790,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
t_gui_line *ptr_line;
t_irc_dcc *dcc_first, *dcc_selected, *ptr_dcc;
char format_empty[32];
int i, j, lines_used, num_bars;
int i, j, line_pos, count, num_bars;
char *unit_name[] = { N_("bytes"), N_("Kb"), N_("Mb"), N_("Gb") };
char *unit_format[] = { "%.0Lf", "%.1Lf", "%.02Lf", "%.02Lf" };
long unit_divide[] = { 1, 1024, 1024*1024, 1024*1024,1024 };
@@ -835,48 +933,56 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
}
else
{
ptr_line = buffer->last_line;
lines_used = 0;
ptr_win->win_chat_cursor_x = 0;
ptr_win->win_chat_cursor_y = 0;
while (ptr_line
&& (lines_used < (ptr_win->win_chat_height + ptr_win->sub_lines)))
/* display at position of scrolling */
if (ptr_win->start_line)
{
lines_used += gui_display_line (ptr_win, ptr_line, 0, 1);
ptr_line = ptr_line->prev_line;
ptr_line = ptr_win->start_line;
line_pos = ptr_win->start_line_pos;
}
if (lines_used > (ptr_win->win_chat_height + ptr_win->sub_lines))
else
{
/* screen will be full (we'll display only end of 1st line) */
ptr_line = (ptr_line) ? ptr_line->next_line : buffer->lines;
/* look for first line to display, sarting from last line */
ptr_line = NULL;
line_pos = 0;
gui_calculate_line_diff (ptr_win, &ptr_line, &line_pos,
(-1) * (ptr_win->win_chat_height - 1));
}
if (line_pos > 0)
{
/* display end of first line at top of screen */
gui_display_line (ptr_win, ptr_line,
gui_display_line (ptr_win, ptr_line, 0, 1) -
(lines_used - (ptr_win->win_chat_height + ptr_win->sub_lines)), 0);;
line_pos, 0);
ptr_line = ptr_line->next_line;
ptr_win->first_line_displayed = 0;
}
else
{
/* all lines are displayed */
if (!ptr_line)
{
ptr_win->first_line_displayed = 1;
ptr_line = buffer->lines;
}
else
{
ptr_win->first_line_displayed = 0;
ptr_line = ptr_line->next_line;
}
}
ptr_win->first_line_displayed =
(ptr_line == ptr_win->buffer->lines);
/* display lines */
count = 0;
while (ptr_line && (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1))
{
gui_display_line (ptr_win, ptr_line, 0, 0);
count = gui_display_line (ptr_win, ptr_line, 0, 0);
ptr_line = ptr_line->next_line;
}
/* 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 (count == gui_display_line (ptr_win, ptr_win->buffer->last_line, 0, 1))
{
ptr_win->start_line = NULL;
ptr_win->start_line_pos = 0;
}
}
/* cursor is below end line of chat window? */
if (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1)
{
@@ -1360,7 +1466,7 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
if (x < 0)
x = 0;
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS_MORE);
if (ptr_win->sub_lines > 0)
if (ptr_win->start_line)
mvwprintw (ptr_win->win_status, 0, x, "%s", string);
else
{
@@ -1762,7 +1868,8 @@ gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
else
window->win_status = newwin (1, window->win_width, window->win_y + window->win_height - 2, window->win_x);
window->sub_lines = 0;
window->start_line = NULL;
window->start_line_pos = 0;
buffer->num_displayed++;
@@ -1774,7 +1881,7 @@ gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
*/
t_gui_buffer *
gui_get_dcc_buffer ()
gui_get_dcc_buffer (t_gui_window *window)
{
t_gui_buffer *ptr_buffer;
@@ -1787,7 +1894,7 @@ gui_get_dcc_buffer ()
if (ptr_buffer)
return ptr_buffer;
else
return gui_buffer_new (gui_current_window, NULL, NULL, 1, 0);
return gui_buffer_new (window, NULL, NULL, 1, 0);
}
/*
@@ -1795,17 +1902,20 @@ gui_get_dcc_buffer ()
*/
void
gui_input_page_up ()
gui_input_page_up (t_gui_window *window)
{
if (!gui_ok)
return;
if (!gui_current_window->first_line_displayed)
if (!window->first_line_displayed)
{
gui_current_window->sub_lines +=
gui_current_window->win_chat_height - 1;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
gui_calculate_line_diff (window, &window->start_line,
&window->start_line_pos,
(window->start_line) ?
(-1) * (window->win_chat_height - 1) :
(-1) * ((window->win_chat_height - 1) * 2));
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
}
}
@@ -1814,19 +1924,34 @@ gui_input_page_up ()
*/
void
gui_input_page_down ()
gui_input_page_down (t_gui_window *window)
{
t_gui_line *ptr_line;
int line_pos;
if (!gui_ok)
return;
if (gui_current_window->sub_lines > 0)
if (window->start_line)
{
gui_current_window->sub_lines -=
gui_current_window->win_chat_height - 1;
if (gui_current_window->sub_lines < 0)
gui_current_window->sub_lines = 0;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
gui_calculate_line_diff (window, &window->start_line,
&window->start_line_pos,
window->win_chat_height - 1);
/* check if we can display all */
ptr_line = window->start_line;
line_pos = window->start_line_pos;
gui_calculate_line_diff (window, &ptr_line,
&line_pos,
window->win_chat_height - 1);
if (!ptr_line)
{
window->start_line = NULL;
window->start_line_pos = 0;
}
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
}
}
@@ -1835,17 +1960,17 @@ gui_input_page_down ()
*/
void
gui_input_nick_beginning ()
gui_input_nick_beginning (t_gui_window *window)
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
if (gui_current_window->win_nick_start > 0)
if (window->win_nick_start > 0)
{
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
window->win_nick_start = 0;
gui_draw_buffer_nick (window->buffer, 1);
}
}
}
@@ -1855,27 +1980,26 @@ gui_input_nick_beginning ()
*/
void
gui_input_nick_end ()
gui_input_nick_end (t_gui_window *window)
{
int new_start;
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
new_start =
CHANNEL(gui_current_window->buffer)->nicks_count -
gui_current_window->win_nick_height;
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 != gui_current_window->win_nick_start)
if (new_start != window->win_nick_start)
{
gui_current_window->win_nick_start = new_start;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
window->win_nick_start = new_start;
gui_draw_buffer_nick (window->buffer, 1);
}
}
}
@@ -1885,20 +2009,19 @@ gui_input_nick_end ()
*/
void
gui_input_nick_page_up ()
gui_input_nick_page_up (t_gui_window *window)
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
if (gui_current_window->win_nick_start > 0)
if (window->win_nick_start > 0)
{
gui_current_window->win_nick_start -=
(gui_current_window->win_nick_height - 1);
if (gui_current_window->win_nick_start <= 1)
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
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);
}
}
}
@@ -1908,26 +2031,22 @@ gui_input_nick_page_up ()
*/
void
gui_input_nick_page_down ()
gui_input_nick_page_down (t_gui_window *window)
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
if ((CHANNEL(gui_current_window->buffer)->nicks_count >
gui_current_window->win_nick_height)
&& (gui_current_window->win_nick_start +
gui_current_window->win_nick_height - 1
< CHANNEL(gui_current_window->buffer)->nicks_count))
if ((CHANNEL(window->buffer)->nicks_count > window->win_nick_height)
&& (window->win_nick_start + window->win_nick_height - 1
< CHANNEL(window->buffer)->nicks_count))
{
if (gui_current_window->win_nick_start == 0)
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 1);
if (window->win_nick_start == 0)
window->win_nick_start += (window->win_nick_height - 1);
else
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 2);
gui_draw_buffer_nick (gui_current_window->buffer, 1);
window->win_nick_start += (window->win_nick_height - 2);
gui_draw_buffer_nick (window->buffer, 1);
}
}
}
+8 -4
View File
@@ -115,7 +115,8 @@ gui_window_new (int x, int y, int width, int height)
new_window->buffer = NULL;
new_window->first_line_displayed = 0;
new_window->sub_lines = 0;
new_window->start_line = NULL;
new_window->start_line_pos = 0;
/* add window to windows queue */
new_window->prev_window = last_gui_window;
@@ -179,7 +180,8 @@ gui_buffer_new (t_gui_window *window, void *server, void *channel, int dcc,
{
window->buffer = new_buffer;
window->first_line_displayed = 1;
window->sub_lines = 0;
window->start_line = NULL;
window->start_line_pos = 0;
gui_calculate_pos_size (window);
gui_window_init_subwindows (window);
}
@@ -284,7 +286,8 @@ gui_buffer_clear (t_gui_buffer *buffer)
if (ptr_win->buffer == buffer)
{
ptr_win->first_line_displayed = 1;
ptr_win->sub_lines = 0;
ptr_win->start_line = NULL;
ptr_win->start_line_pos = 0;
}
}
@@ -1867,7 +1870,8 @@ gui_window_print_log (t_gui_window *window)
wee_log_printf (" dcc_last_displayed. : 0x%X\n", window->dcc_last_displayed);
wee_log_printf (" buffer. . . . . . . : 0x%X\n", window->buffer);
wee_log_printf (" first_line_displayed: %d\n", window->first_line_displayed);
wee_log_printf (" sub_lines . . . . . : %d\n", window->sub_lines);
wee_log_printf (" start_line. . . . . : 0x%X\n", window->start_line);
wee_log_printf (" start_line_pos. . . : %d\n", window->start_line_pos);
wee_log_printf (" prev_window . . . . : 0x%X\n", window->prev_window);
wee_log_printf (" next_window . . . . : 0x%X\n", window->next_window);
+9 -8
View File
@@ -260,7 +260,8 @@ struct t_gui_window
t_gui_buffer *buffer; /* buffer currently displayed in window */
int first_line_displayed; /* = 1 if first line is displayed */
int sub_lines; /* if > 0 then do not display until end */
t_gui_line *start_line; /* pointer to line if scrolling */
int start_line_pos; /* position in first line displayed */
t_gui_window *prev_window; /* link to previous window */
t_gui_window *next_window; /* link to next window */
@@ -391,13 +392,13 @@ extern void gui_draw_buffer_infobar (t_gui_buffer *, int);
extern void gui_draw_buffer_input (t_gui_buffer *, int);
extern void gui_redraw_buffer (t_gui_buffer *);
extern void gui_switch_to_buffer (t_gui_window *, t_gui_buffer *);
extern t_gui_buffer *gui_get_dcc_buffer ();
extern void gui_input_page_up ();
extern void gui_input_page_down ();
extern void gui_input_nick_beginning ();
extern void gui_input_nick_end ();
extern void gui_input_nick_page_up ();
extern void gui_input_nick_page_down ();
extern t_gui_buffer *gui_get_dcc_buffer (t_gui_window *);
extern void gui_input_page_up (t_gui_window *);
extern void gui_input_page_down (t_gui_window *);
extern void gui_input_nick_beginning (t_gui_window *);
extern void gui_input_nick_end (t_gui_window *);
extern void gui_input_nick_page_up (t_gui_window *);
extern void gui_input_nick_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 *);
+2 -2
View File
@@ -57,10 +57,10 @@ char *dcc_status_string[] = /* strings for DCC status */
void
dcc_redraw (int highlight)
{
gui_redraw_buffer (gui_get_dcc_buffer ());
gui_redraw_buffer (gui_get_dcc_buffer (gui_current_window));
if (highlight)
{
hotlist_add (highlight, gui_get_dcc_buffer ());
hotlist_add (highlight, gui_get_dcc_buffer (gui_current_window));
gui_draw_buffer_status (gui_current_window->buffer, 0);
}
}
+1 -2
View File
@@ -1,9 +1,8 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
WeeChat known bugs, 2005-09-14
WeeChat known bugs, 2005-09-15
- when scrolling back in history, if a new message is displayed, screen moves
- color display problems when term has white background
- ./configure does not check that Ruby libraries are installed
- ./configure does not check that Gtk 2.0 libraries are installed
+3 -1
View File
@@ -1,10 +1,12 @@
WeeChat - Wee Enhanced Environment for Chat
===========================================
ChangeLog - 2005-09-14
ChangeLog - 2005-09-15
Version 0.1.5 (under dev!):
* fixed scroll problem (screen moving when scrolling and new line
displayed)
* fixed infinite loop when scrolling back and displaying long lines
* fixed crash when closing a buffer used by more than one window
* added some missing IRC commands
+198 -79
View File
@@ -594,9 +594,6 @@ gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulat
int word_length_with_spaces, word_length;
int skip_spaces;
if (window->win_chat_cursor_y > window->win_chat_height - 1)
return 0;
if (simulate)
{
x = window->win_chat_cursor_x;
@@ -607,6 +604,8 @@ gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulat
}
else
{
if (window->win_chat_cursor_y > window->win_chat_height - 1)
return 0;
x = window->win_chat_cursor_x;
y = window->win_chat_cursor_y;
num_lines = gui_display_line (window, line, 0, 1);
@@ -681,6 +680,105 @@ gui_display_line (t_gui_window *window, t_gui_line *line, int count, int simulat
return lines_displayed;
}
/*
* gui_calculate_line_diff: returns pointer to line & offset for a difference
* with given line
*/
void
gui_calculate_line_diff (t_gui_window *window, t_gui_line **line, int *line_pos,
int difference)
{
int backward, current_size;
if (!line || !line_pos)
return;
backward = (difference < 0);
if (!(*line))
{
/* if looking backward, start at last line of buffer */
if (backward)
{
*line = window->buffer->last_line;
if (!(*line))
return;
current_size = gui_display_line (window, *line, 0, 1);
if (current_size == 0)
current_size = 1;
*line_pos = current_size - 1;
}
/* if looking forward, start at first line of buffer */
else
{
*line = window->buffer->lines;
if (!(*line))
return;
*line_pos = 0;
current_size = gui_display_line (window, *line, 0, 1);
}
}
else
current_size = gui_display_line (window, *line, 0, 1);
while ((*line) && (difference != 0))
{
/* looking backward */
if (backward)
{
if (*line_pos > 0)
(*line_pos)--;
else
{
*line = (*line)->prev_line;
if (*line)
{
current_size = gui_display_line (window, *line, 0, 1);
if (current_size == 0)
current_size = 1;
*line_pos = current_size - 1;
}
}
difference++;
}
/* looking forward */
else
{
if (*line_pos < current_size - 1)
(*line_pos)++;
else
{
*line = (*line)->next_line;
if (*line)
{
current_size = gui_display_line (window, *line, 0, 1);
if (current_size == 0)
current_size = 1;
*line_pos = 0;
}
}
difference--;
}
}
/* first or last line reached */
if (!(*line))
{
if (backward)
{
/* first line reached */
*line = window->buffer->lines;
*line_pos = 0;
}
else
{
/* last line reached => consider we'll display all until the end */
*line_pos = 0;
}
}
}
/*
* gui_draw_buffer_chat: draw chat window for a buffer
*/
@@ -692,7 +790,7 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
t_gui_line *ptr_line;
t_irc_dcc *dcc_first, *dcc_selected, *ptr_dcc;
char format_empty[32];
int i, j, lines_used, num_bars;
int i, j, line_pos, count, num_bars;
char *unit_name[] = { N_("bytes"), N_("Kb"), N_("Mb"), N_("Gb") };
char *unit_format[] = { "%.0Lf", "%.1Lf", "%.02Lf", "%.02Lf" };
long unit_divide[] = { 1, 1024, 1024*1024, 1024*1024,1024 };
@@ -835,48 +933,56 @@ gui_draw_buffer_chat (t_gui_buffer *buffer, int erase)
}
else
{
ptr_line = buffer->last_line;
lines_used = 0;
ptr_win->win_chat_cursor_x = 0;
ptr_win->win_chat_cursor_y = 0;
while (ptr_line
&& (lines_used < (ptr_win->win_chat_height + ptr_win->sub_lines)))
/* display at position of scrolling */
if (ptr_win->start_line)
{
lines_used += gui_display_line (ptr_win, ptr_line, 0, 1);
ptr_line = ptr_line->prev_line;
ptr_line = ptr_win->start_line;
line_pos = ptr_win->start_line_pos;
}
if (lines_used > (ptr_win->win_chat_height + ptr_win->sub_lines))
else
{
/* screen will be full (we'll display only end of 1st line) */
ptr_line = (ptr_line) ? ptr_line->next_line : buffer->lines;
/* look for first line to display, sarting from last line */
ptr_line = NULL;
line_pos = 0;
gui_calculate_line_diff (ptr_win, &ptr_line, &line_pos,
(-1) * (ptr_win->win_chat_height - 1));
}
if (line_pos > 0)
{
/* display end of first line at top of screen */
gui_display_line (ptr_win, ptr_line,
gui_display_line (ptr_win, ptr_line, 0, 1) -
(lines_used - (ptr_win->win_chat_height + ptr_win->sub_lines)), 0);;
line_pos, 0);
ptr_line = ptr_line->next_line;
ptr_win->first_line_displayed = 0;
}
else
{
/* all lines are displayed */
if (!ptr_line)
{
ptr_win->first_line_displayed = 1;
ptr_line = buffer->lines;
}
else
{
ptr_win->first_line_displayed = 0;
ptr_line = ptr_line->next_line;
}
}
ptr_win->first_line_displayed =
(ptr_line == ptr_win->buffer->lines);
/* display lines */
count = 0;
while (ptr_line && (ptr_win->win_chat_cursor_y <= ptr_win->win_chat_height - 1))
{
gui_display_line (ptr_win, ptr_line, 0, 0);
count = gui_display_line (ptr_win, ptr_line, 0, 0);
ptr_line = ptr_line->next_line;
}
/* 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 (count == gui_display_line (ptr_win, ptr_win->buffer->last_line, 0, 1))
{
ptr_win->start_line = NULL;
ptr_win->start_line_pos = 0;
}
}
/* cursor is below end line of chat window? */
if (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1)
{
@@ -1360,7 +1466,7 @@ gui_draw_buffer_status (t_gui_buffer *buffer, int erase)
if (x < 0)
x = 0;
gui_window_set_color (ptr_win->win_status, COLOR_WIN_STATUS_MORE);
if (ptr_win->sub_lines > 0)
if (ptr_win->start_line)
mvwprintw (ptr_win->win_status, 0, x, "%s", string);
else
{
@@ -1762,7 +1868,8 @@ gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
else
window->win_status = newwin (1, window->win_width, window->win_y + window->win_height - 2, window->win_x);
window->sub_lines = 0;
window->start_line = NULL;
window->start_line_pos = 0;
buffer->num_displayed++;
@@ -1774,7 +1881,7 @@ gui_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
*/
t_gui_buffer *
gui_get_dcc_buffer ()
gui_get_dcc_buffer (t_gui_window *window)
{
t_gui_buffer *ptr_buffer;
@@ -1787,7 +1894,7 @@ gui_get_dcc_buffer ()
if (ptr_buffer)
return ptr_buffer;
else
return gui_buffer_new (gui_current_window, NULL, NULL, 1, 0);
return gui_buffer_new (window, NULL, NULL, 1, 0);
}
/*
@@ -1795,17 +1902,20 @@ gui_get_dcc_buffer ()
*/
void
gui_input_page_up ()
gui_input_page_up (t_gui_window *window)
{
if (!gui_ok)
return;
if (!gui_current_window->first_line_displayed)
if (!window->first_line_displayed)
{
gui_current_window->sub_lines +=
gui_current_window->win_chat_height - 1;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
gui_calculate_line_diff (window, &window->start_line,
&window->start_line_pos,
(window->start_line) ?
(-1) * (window->win_chat_height - 1) :
(-1) * ((window->win_chat_height - 1) * 2));
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
}
}
@@ -1814,19 +1924,34 @@ gui_input_page_up ()
*/
void
gui_input_page_down ()
gui_input_page_down (t_gui_window *window)
{
t_gui_line *ptr_line;
int line_pos;
if (!gui_ok)
return;
if (gui_current_window->sub_lines > 0)
if (window->start_line)
{
gui_current_window->sub_lines -=
gui_current_window->win_chat_height - 1;
if (gui_current_window->sub_lines < 0)
gui_current_window->sub_lines = 0;
gui_draw_buffer_chat (gui_current_window->buffer, 0);
gui_draw_buffer_status (gui_current_window->buffer, 0);
gui_calculate_line_diff (window, &window->start_line,
&window->start_line_pos,
window->win_chat_height - 1);
/* check if we can display all */
ptr_line = window->start_line;
line_pos = window->start_line_pos;
gui_calculate_line_diff (window, &ptr_line,
&line_pos,
window->win_chat_height - 1);
if (!ptr_line)
{
window->start_line = NULL;
window->start_line_pos = 0;
}
gui_draw_buffer_chat (window->buffer, 0);
gui_draw_buffer_status (window->buffer, 0);
}
}
@@ -1835,17 +1960,17 @@ gui_input_page_down ()
*/
void
gui_input_nick_beginning ()
gui_input_nick_beginning (t_gui_window *window)
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
if (gui_current_window->win_nick_start > 0)
if (window->win_nick_start > 0)
{
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
window->win_nick_start = 0;
gui_draw_buffer_nick (window->buffer, 1);
}
}
}
@@ -1855,27 +1980,26 @@ gui_input_nick_beginning ()
*/
void
gui_input_nick_end ()
gui_input_nick_end (t_gui_window *window)
{
int new_start;
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
new_start =
CHANNEL(gui_current_window->buffer)->nicks_count -
gui_current_window->win_nick_height;
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 != gui_current_window->win_nick_start)
if (new_start != window->win_nick_start)
{
gui_current_window->win_nick_start = new_start;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
window->win_nick_start = new_start;
gui_draw_buffer_nick (window->buffer, 1);
}
}
}
@@ -1885,20 +2009,19 @@ gui_input_nick_end ()
*/
void
gui_input_nick_page_up ()
gui_input_nick_page_up (t_gui_window *window)
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
if (gui_current_window->win_nick_start > 0)
if (window->win_nick_start > 0)
{
gui_current_window->win_nick_start -=
(gui_current_window->win_nick_height - 1);
if (gui_current_window->win_nick_start <= 1)
gui_current_window->win_nick_start = 0;
gui_draw_buffer_nick (gui_current_window->buffer, 1);
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);
}
}
}
@@ -1908,26 +2031,22 @@ gui_input_nick_page_up ()
*/
void
gui_input_nick_page_down ()
gui_input_nick_page_down (t_gui_window *window)
{
if (!gui_ok)
return;
if (gui_buffer_has_nicklist (gui_current_window->buffer))
if (gui_buffer_has_nicklist (window->buffer))
{
if ((CHANNEL(gui_current_window->buffer)->nicks_count >
gui_current_window->win_nick_height)
&& (gui_current_window->win_nick_start +
gui_current_window->win_nick_height - 1
< CHANNEL(gui_current_window->buffer)->nicks_count))
if ((CHANNEL(window->buffer)->nicks_count > window->win_nick_height)
&& (window->win_nick_start + window->win_nick_height - 1
< CHANNEL(window->buffer)->nicks_count))
{
if (gui_current_window->win_nick_start == 0)
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 1);
if (window->win_nick_start == 0)
window->win_nick_start += (window->win_nick_height - 1);
else
gui_current_window->win_nick_start +=
(gui_current_window->win_nick_height - 2);
gui_draw_buffer_nick (gui_current_window->buffer, 1);
window->win_nick_start += (window->win_nick_height - 2);
gui_draw_buffer_nick (window->buffer, 1);
}
}
}
+8 -4
View File
@@ -115,7 +115,8 @@ gui_window_new (int x, int y, int width, int height)
new_window->buffer = NULL;
new_window->first_line_displayed = 0;
new_window->sub_lines = 0;
new_window->start_line = NULL;
new_window->start_line_pos = 0;
/* add window to windows queue */
new_window->prev_window = last_gui_window;
@@ -179,7 +180,8 @@ gui_buffer_new (t_gui_window *window, void *server, void *channel, int dcc,
{
window->buffer = new_buffer;
window->first_line_displayed = 1;
window->sub_lines = 0;
window->start_line = NULL;
window->start_line_pos = 0;
gui_calculate_pos_size (window);
gui_window_init_subwindows (window);
}
@@ -284,7 +286,8 @@ gui_buffer_clear (t_gui_buffer *buffer)
if (ptr_win->buffer == buffer)
{
ptr_win->first_line_displayed = 1;
ptr_win->sub_lines = 0;
ptr_win->start_line = NULL;
ptr_win->start_line_pos = 0;
}
}
@@ -1867,7 +1870,8 @@ gui_window_print_log (t_gui_window *window)
wee_log_printf (" dcc_last_displayed. : 0x%X\n", window->dcc_last_displayed);
wee_log_printf (" buffer. . . . . . . : 0x%X\n", window->buffer);
wee_log_printf (" first_line_displayed: %d\n", window->first_line_displayed);
wee_log_printf (" sub_lines . . . . . : %d\n", window->sub_lines);
wee_log_printf (" start_line. . . . . : 0x%X\n", window->start_line);
wee_log_printf (" start_line_pos. . . : %d\n", window->start_line_pos);
wee_log_printf (" prev_window . . . . : 0x%X\n", window->prev_window);
wee_log_printf (" next_window . . . . : 0x%X\n", window->next_window);
+9 -8
View File
@@ -260,7 +260,8 @@ struct t_gui_window
t_gui_buffer *buffer; /* buffer currently displayed in window */
int first_line_displayed; /* = 1 if first line is displayed */
int sub_lines; /* if > 0 then do not display until end */
t_gui_line *start_line; /* pointer to line if scrolling */
int start_line_pos; /* position in first line displayed */
t_gui_window *prev_window; /* link to previous window */
t_gui_window *next_window; /* link to next window */
@@ -391,13 +392,13 @@ extern void gui_draw_buffer_infobar (t_gui_buffer *, int);
extern void gui_draw_buffer_input (t_gui_buffer *, int);
extern void gui_redraw_buffer (t_gui_buffer *);
extern void gui_switch_to_buffer (t_gui_window *, t_gui_buffer *);
extern t_gui_buffer *gui_get_dcc_buffer ();
extern void gui_input_page_up ();
extern void gui_input_page_down ();
extern void gui_input_nick_beginning ();
extern void gui_input_nick_end ();
extern void gui_input_nick_page_up ();
extern void gui_input_nick_page_down ();
extern t_gui_buffer *gui_get_dcc_buffer (t_gui_window *);
extern void gui_input_page_up (t_gui_window *);
extern void gui_input_page_down (t_gui_window *);
extern void gui_input_nick_beginning (t_gui_window *);
extern void gui_input_nick_end (t_gui_window *);
extern void gui_input_nick_page_up (t_gui_window *);
extern void gui_input_nick_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 *);
+2 -2
View File
@@ -57,10 +57,10 @@ char *dcc_status_string[] = /* strings for DCC status */
void
dcc_redraw (int highlight)
{
gui_redraw_buffer (gui_get_dcc_buffer ());
gui_redraw_buffer (gui_get_dcc_buffer (gui_current_window));
if (highlight)
{
hotlist_add (highlight, gui_get_dcc_buffer ());
hotlist_add (highlight, gui_get_dcc_buffer (gui_current_window));
gui_draw_buffer_status (gui_current_window->buffer, 0);
}
}