1
0
mirror of https://github.com/weechat/weechat.git synced 2026-07-08 02:33:12 +02:00

added some panel functions, fixed refresh bugs when terminal is resized: too many refreshs, display bug with splited windows

This commit is contained in:
Sebastien Helleu
2006-07-16 11:04:10 +00:00
parent c308b2ec1f
commit 4c4f5ab012
68 changed files with 4256 additions and 2996 deletions
+2 -2
View File
@@ -174,13 +174,13 @@ gui_chat_draw_title (t_gui_buffer *buffer, int erase)
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
{
if (ptr_win->buffer == buffer)
if ((ptr_win->buffer == buffer) && (buffer->num_displayed > 0))
{
if (erase)
gui_window_curses_clear (GUI_CURSES(ptr_win)->win_title, COLOR_WIN_TITLE);
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_title, COLOR_WIN_TITLE);
snprintf (format, 32, "%%-%ds", ptr_win->win_width);
snprintf (format, 32, "%%-%ds", ptr_win->win_title_width);
if (CHANNEL(buffer))
{
if (CHANNEL(buffer)->topic)
+14 -16
View File
@@ -349,7 +349,7 @@ gui_input_draw (t_gui_buffer *buffer, int erase)
prompt_length = gui_input_get_prompt_length (ptr_win, ptr_nickname);
if (ptr_win->win_width - prompt_length < 3)
if (ptr_win->win_input_width - prompt_length < 3)
{
prompt_length = 0;
display_prompt = 0;
@@ -358,9 +358,9 @@ gui_input_draw (t_gui_buffer *buffer, int erase)
display_prompt = 1;
if (buffer->input_buffer_pos - buffer->input_buffer_1st_display + 1 >
ptr_win->win_width - prompt_length)
ptr_win->win_input_width - prompt_length)
buffer->input_buffer_1st_display = buffer->input_buffer_pos -
(ptr_win->win_width - prompt_length) + 1;
(ptr_win->win_input_width - prompt_length) + 1;
else
{
if (buffer->input_buffer_pos < buffer->input_buffer_1st_display)
@@ -370,11 +370,11 @@ gui_input_draw (t_gui_buffer *buffer, int erase)
if ((buffer->input_buffer_1st_display > 0) &&
(buffer->input_buffer_pos -
buffer->input_buffer_1st_display + 1)
< ptr_win->win_width - prompt_length)
< ptr_win->win_input_width - prompt_length)
{
buffer->input_buffer_1st_display =
buffer->input_buffer_pos -
(ptr_win->win_width - prompt_length) + 1;
(ptr_win->win_input_width - prompt_length) + 1;
if (buffer->input_buffer_1st_display < 0)
buffer->input_buffer_1st_display = 0;
}
@@ -384,18 +384,18 @@ gui_input_draw (t_gui_buffer *buffer, int erase)
gui_input_draw_prompt (ptr_win, ptr_nickname);
gui_window_set_weechat_color (GUI_CURSES(ptr_win)->win_input, COLOR_WIN_INPUT);
snprintf (format, 32, "%%-%ds", ptr_win->win_width - prompt_length);
snprintf (format, 32, "%%-%ds", ptr_win->win_input_width - prompt_length);
offset_cursor = 0;
if (ptr_win == gui_current_window)
offset_cursor = gui_input_draw_text (ptr_win,
ptr_win->win_width - prompt_length);
ptr_win->win_input_width - prompt_length);
else
wprintw (GUI_CURSES(ptr_win)->win_input, format, "");
wclrtoeol (GUI_CURSES(ptr_win)->win_input);
ptr_win->win_input_x = prompt_length + offset_cursor;
ptr_win->win_input_cursor_x = prompt_length + offset_cursor;
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x + ptr_win->win_input_x);
move (ptr_win->win_input_y,
ptr_win->win_input_x + ptr_win->win_input_cursor_x);
}
break;
case BUFFER_TYPE_DCC:
@@ -424,18 +424,16 @@ gui_input_draw (t_gui_buffer *buffer, int erase)
wprintw (GUI_CURSES(ptr_win)->win_input, _(" [P] Purge old DCC"));
wprintw (GUI_CURSES(ptr_win)->win_input, _(" [Q] Close DCC view"));
wclrtoeol (GUI_CURSES(ptr_win)->win_input);
ptr_win->win_input_x = 0;
ptr_win->win_input_cursor_x = 0;
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x);
move (ptr_win->win_input_y, ptr_win->win_input_x);
break;
case BUFFER_TYPE_RAW_DATA:
mvwprintw (GUI_CURSES(ptr_win)->win_input, 0, 0, _(" [Q] Close raw data view"));
wclrtoeol (GUI_CURSES(ptr_win)->win_input);
ptr_win->win_input_x = 0;
ptr_win->win_input_cursor_x = 0;
if (ptr_win == gui_current_window)
move (ptr_win->win_y + ptr_win->win_height - 1,
ptr_win->win_x);
move (ptr_win->win_input_y, ptr_win->win_input_x);
break;
}
doupdate ();
+9 -6
View File
@@ -143,9 +143,12 @@ gui_keyboard_default_bindings ()
void
gui_keyboard_grab_end ()
{
char *expanded_key, *expanded_key2;
int length;
char *expanded_key;
char *buffer_before_key;
#ifdef PLUGINS
char *expanded_key2;
int length;
#endif
/* get expanded name (for example: ^U => ctrl-u) */
expanded_key = gui_keyboard_get_expanded_name (gui_key_buffer);
@@ -193,8 +196,11 @@ void
gui_keyboard_read ()
{
int key, i, insert_ok;
char key_str[32], key_str2[33];
char key_str[32];
char *buffer_before_key;
#ifdef PLUGINS
char key_str2[33];
#endif
i = 0;
/* do not loop too much here (for example when big paste was made),
@@ -215,10 +221,7 @@ gui_keyboard_read ()
}
if (key == KEY_RESIZE)
{
gui_window_refresh_screen ();
continue;
}
gui_last_activity_time = time (NULL);
+3 -3
View File
@@ -73,7 +73,7 @@ gui_main_loop ()
{
/* refresh needed ? */
if (gui_refresh_screen_needed)
gui_window_refresh_screen ();
gui_window_refresh_screen (0);
new_time = time (NULL);
local_time = localtime (&new_time);
@@ -112,7 +112,7 @@ gui_main_loop ()
{
gui_infobar_draw_time (gui_current_window->buffer);
wmove (GUI_CURSES(gui_current_window)->win_input,
0, gui_current_window->win_input_x);
0, gui_current_window->win_input_cursor_x);
wrefresh (GUI_CURSES(gui_current_window)->win_input);
}
@@ -291,7 +291,7 @@ gui_main_init ()
gui_infobar = NULL;
gui_ok = ((COLS > 5) && (LINES > 5));
gui_ok = ((COLS > WINDOW_MIN_WIDTH) && (LINES > WINDOW_MIN_HEIGHT));
refresh ();
+2 -2
View File
@@ -36,7 +36,7 @@
*/
void
gui_nicklist_draw (t_gui_buffer *buffer, int erase)
gui_nicklist_draw (t_gui_buffer *buffer, int erase, int calculate_size)
{
t_gui_window *ptr_win;
int i, j, x, y, x2, column, max_length, nicks_displayed;
@@ -52,7 +52,7 @@ gui_nicklist_draw (t_gui_buffer *buffer, int erase)
{
max_length = nick_get_max_length (CHANNEL(buffer));
if (gui_window_calculate_pos_size (ptr_win, 0))
if (calculate_size && (gui_window_calculate_pos_size (ptr_win, 0)))
{
delwin (GUI_CURSES(ptr_win)->win_chat);
delwin (GUI_CURSES(ptr_win)->win_nick);
+19 -4
View File
@@ -33,11 +33,13 @@
/*
* gui_panel_get_size: get total panel size for a position
* gui_panel_windows_get_size: get total panel size (window panels) for a position
* panel is optional, if not NULL, size is computed
* from panel 1 to panel # - 1
*/
int
gui_panel_get_size (t_gui_window *window, int position)
gui_panel_window_get_size (t_gui_panel *panel, t_gui_window *window, int position)
{
t_gui_panel_window *ptr_panel_win;
int total_size;
@@ -46,6 +48,10 @@ gui_panel_get_size (t_gui_window *window, int position)
for (ptr_panel_win = GUI_CURSES(window)->panel_windows; ptr_panel_win;
ptr_panel_win = ptr_panel_win->next_panel_window)
{
/* stop before panel */
if ((panel) && (ptr_panel_win->panel == panel))
return total_size;
if (ptr_panel_win->panel->position == position)
{
switch (position)
@@ -76,6 +82,7 @@ gui_panel_window_new (t_gui_panel *panel, t_gui_window *window)
{
t_gui_panel_window *new_panel_win;
int x1, y1, x2, y2;
int add_top, add_bottom, add_left, add_right;
if (window)
{
@@ -83,6 +90,10 @@ gui_panel_window_new (t_gui_panel *panel, t_gui_window *window)
y1 = window->win_y + 1;
x2 = x1 + window->win_width - 1;
y2 = y1 + window->win_height - 1 - 4;
add_left = gui_panel_window_get_size (panel, window, GUI_PANEL_LEFT);
add_right = gui_panel_window_get_size (panel, window, GUI_PANEL_RIGHT);
add_top = gui_panel_window_get_size (panel, window, GUI_PANEL_TOP);
add_bottom = gui_panel_window_get_size (panel, window, GUI_PANEL_BOTTOM);
}
else
{
@@ -90,6 +101,10 @@ gui_panel_window_new (t_gui_panel *panel, t_gui_window *window)
y1 = 0;
x2 = gui_window_get_width () - 1;
y2 = gui_window_get_height () - 1;
add_left = gui_panel_global_get_size (panel, GUI_PANEL_LEFT);
add_right = gui_panel_global_get_size (panel, GUI_PANEL_RIGHT);
add_top = gui_panel_global_get_size (panel, GUI_PANEL_TOP);
add_bottom = gui_panel_global_get_size (panel, GUI_PANEL_BOTTOM);
}
if ((new_panel_win = (t_gui_panel_window *) malloc (sizeof (t_gui_panel_window))))
@@ -109,8 +124,8 @@ gui_panel_window_new (t_gui_panel *panel, t_gui_window *window)
switch (panel->position)
{
case GUI_PANEL_TOP:
new_panel_win->x = x1;
new_panel_win->y = y1;
new_panel_win->x = x1 + add_left;
new_panel_win->y = y1 + add_top;
new_panel_win->width = x2 - x1 + 1;
new_panel_win->height = panel->size;
break;
+2 -2
View File
@@ -361,10 +361,10 @@ gui_status_draw (t_gui_buffer *buffer, int erase)
if (BUFFER_HAS_NICKLIST(ptr_win->buffer))
{
snprintf (str_nicks, sizeof (str_nicks) - 1, "%d", CHANNEL(ptr_win->buffer)->nicks_count);
x = ptr_win->win_width - strlen (str_nicks) - 4;
x = ptr_win->win_status_width - strlen (str_nicks) - 4;
}
else
x = ptr_win->win_width - 2;
x = ptr_win->win_status_width - 2;
more = strdup (_("-MORE-"));
x -= strlen (more) - 1;
if (x < 0)
+152 -89
View File
@@ -175,10 +175,10 @@ gui_window_calculate_pos_size (t_gui_window *window, int force_calculate)
if (!gui_ok)
return 0;
add_left = gui_panel_get_size (window, GUI_PANEL_LEFT);
add_right = gui_panel_get_size (window, GUI_PANEL_RIGHT);
add_top = gui_panel_get_size (window, GUI_PANEL_TOP);
add_bottom = gui_panel_get_size (window, GUI_PANEL_BOTTOM);
add_left = gui_panel_window_get_size (NULL, window, GUI_PANEL_LEFT);
add_right = gui_panel_window_get_size (NULL, window, GUI_PANEL_RIGHT);
add_top = gui_panel_window_get_size (NULL, window, GUI_PANEL_TOP);
add_bottom = gui_panel_window_get_size (NULL, window, GUI_PANEL_BOTTOM);
/* init chat & nicklist settings */
if (cfg_look_nicklist && BUFFER_IS_CHANNEL(window->buffer))
@@ -203,16 +203,17 @@ gui_window_calculate_pos_size (t_gui_window *window, int force_calculate)
{
nick_count (CHANNEL(window->buffer), &num_nicks, &num_op,
&num_halfop, &num_voice, &num_normal);
if (((max_length + 2) * num_nicks) % window->win_width == 0)
lines = ((max_length + 2) * num_nicks) / window->win_width;
if (((max_length + 2) * num_nicks) % (window->win_width - add_left - add_right) == 0)
lines = ((max_length + 2) * num_nicks) / (window->win_width - add_left - add_right);
else
lines = (((max_length + 2) * num_nicks) / window->win_width) + 1;
lines = (((max_length + 2) * num_nicks) / (window->win_width - add_left - add_right)) + 1;
if ((cfg_look_nicklist_max_size > 0) && (lines > cfg_look_nicklist_max_size))
lines = cfg_look_nicklist_max_size;
if ((cfg_look_nicklist_min_size > 0) && (lines < cfg_look_nicklist_min_size))
lines = cfg_look_nicklist_min_size;
max_height = (cfg_look_infobar) ?
window->win_height - 3 - 4 : window->win_height - 2 - 4;
window->win_height - add_top - add_bottom - 3 - 4 :
window->win_height - add_top - add_bottom - 2 - 4;
if (lines > max_height)
lines = max_height;
if (!force_calculate && (window->win_nick_height == lines + 1))
@@ -223,95 +224,132 @@ gui_window_calculate_pos_size (t_gui_window *window, int force_calculate)
{
case CFG_LOOK_NICKLIST_LEFT:
window->win_chat_x = window->win_x + add_left + max_length + 2;
window->win_chat_y = window->win_y + 1;
window->win_chat_width = window->win_width - add_left - max_length - 2;
window->win_nick_x = window->win_x + 0;
window->win_nick_y = window->win_y + 1;
window->win_chat_y = window->win_y + add_top + 1;
window->win_chat_width = window->win_width - add_left - add_right - max_length - 2;
window->win_nick_x = window->win_x + add_left + 0;
window->win_nick_y = window->win_y + add_top + 1;
window->win_nick_width = max_length + 2;
if (cfg_look_infobar)
{
window->win_chat_height = window->win_height - 4;
window->win_nick_height = window->win_height - 4;
window->win_chat_height = window->win_height - add_top - add_bottom - 4;
window->win_nick_height = window->win_height - add_top - add_bottom - 4;
}
else
{
window->win_chat_height = window->win_height - 3;
window->win_nick_height = window->win_height - 3;
window->win_chat_height = window->win_height - add_top - add_bottom - 3;
window->win_nick_height = window->win_height - add_top - add_bottom - 3;
}
window->win_nick_num_max = window->win_nick_height;
break;
case CFG_LOOK_NICKLIST_RIGHT:
window->win_chat_x = window->win_x + add_left;
window->win_chat_y = window->win_y + 1;
window->win_chat_width = window->win_width - add_left - max_length - 2;
window->win_nick_x = window->win_x + window->win_width - max_length - 2;
window->win_nick_y = window->win_y + 1;
window->win_chat_y = window->win_y + add_top + 1;
window->win_chat_width = window->win_width - add_left - add_right - max_length - 2;
window->win_nick_x = window->win_x + window->win_width - add_right - max_length - 2;
window->win_nick_y = window->win_y + add_top + 1;
window->win_nick_width = max_length + 2;
if (cfg_look_infobar)
{
window->win_chat_height = window->win_height - 4;
window->win_nick_height = window->win_height - 4;
window->win_chat_height = window->win_height - add_top - add_bottom - 4;
window->win_nick_height = window->win_height - add_top - add_bottom - 4;
}
else
{
window->win_chat_height = window->win_height - 3;
window->win_nick_height = window->win_height - 3;
window->win_chat_height = window->win_height - add_top - add_bottom - 3;
window->win_nick_height = window->win_height - add_top - add_bottom - 3;
}
window->win_nick_num_max = window->win_nick_height;
break;
case CFG_LOOK_NICKLIST_TOP:
window->win_chat_x = window->win_x + add_left;
window->win_chat_y = window->win_y + 1 + (lines + 1);
window->win_chat_width = window->win_width - add_left;
window->win_chat_y = window->win_y + add_top + 1 + (lines + 1);
window->win_chat_width = window->win_width - add_left - add_right;
if (cfg_look_infobar)
window->win_chat_height = window->win_height - 3 - (lines + 1) - 1;
window->win_chat_height = window->win_height - add_top - add_bottom - 3 - (lines + 1) - 1;
else
window->win_chat_height = window->win_height - 3 - (lines + 1);
window->win_nick_x = window->win_x;
window->win_nick_y = window->win_y + 1;
window->win_nick_width = window->win_width;
window->win_chat_height = window->win_height - add_top - add_bottom - 3 - (lines + 1);
window->win_nick_x = window->win_x + add_left;
window->win_nick_y = window->win_y + add_top + 1;
window->win_nick_width = window->win_width - add_left - add_right;
window->win_nick_height = lines + 1;
window->win_nick_num_max = lines * (window->win_nick_width / (max_length + 2));
break;
case CFG_LOOK_NICKLIST_BOTTOM:
window->win_chat_x = window->win_x + add_left;
window->win_chat_y = window->win_y + 1;
window->win_chat_width = window->win_width - add_left;
window->win_chat_y = window->win_y + add_top + 1;
window->win_chat_width = window->win_width - add_left - add_right;
if (cfg_look_infobar)
window->win_chat_height = window->win_height - 3 - (lines + 1) - 1;
window->win_chat_height = window->win_height - add_top - add_bottom - 3 - (lines + 1) - 1;
else
window->win_chat_height = window->win_height - 3 - (lines + 1);
window->win_nick_x = window->win_x;
window->win_chat_height = window->win_height - add_top - add_bottom - 3 - (lines + 1);
window->win_nick_x = window->win_x + add_left;
if (cfg_look_infobar)
window->win_nick_y = window->win_y + window->win_height - 2 - (lines + 1) - 1;
window->win_nick_y = window->win_y + window->win_height - add_bottom - 2 - (lines + 1) - 1;
else
window->win_nick_y = window->win_y + window->win_height - 2 - (lines + 1);
window->win_nick_width = window->win_width;
window->win_nick_y = window->win_y + window->win_height - add_bottom - 2 - (lines + 1);
window->win_nick_width = window->win_width - add_left - add_right;
window->win_nick_height = lines + 1;
window->win_nick_num_max = lines * (window->win_nick_width / (max_length + 2));
break;
}
window->win_chat_cursor_x = window->win_x;
window->win_chat_cursor_y = window->win_y;
window->win_chat_cursor_x = window->win_x + add_left;
window->win_chat_cursor_y = window->win_y + add_top;
}
else
{
window->win_chat_x = window->win_x + add_left;
window->win_chat_y = window->win_y + 1;
window->win_chat_width = window->win_width - add_left;
window->win_chat_y = window->win_y + add_top + 1;
window->win_chat_width = window->win_width - add_left - add_right;
if (cfg_look_infobar)
window->win_chat_height = window->win_height - 4;
window->win_chat_height = window->win_height - add_top - add_bottom - 4;
else
window->win_chat_height = window->win_height - 3;
window->win_chat_height = window->win_height - add_top - add_bottom - 3;
window->win_chat_cursor_x = window->win_x + add_left;
window->win_chat_cursor_y = window->win_y;
window->win_chat_cursor_y = window->win_y + add_top;
window->win_nick_x = -1;
window->win_nick_y = -1;
window->win_nick_width = -1;
window->win_nick_height = -1;
window->win_nick_num_max = -1;
}
/* title window */
window->win_title_x = window->win_x;
window->win_title_y = window->win_y;
window->win_title_width = window->win_width;
window->win_title_height = 1;
/* status window */
window->win_status_x = window->win_x;
if (cfg_look_infobar)
window->win_status_y = window->win_y + window->win_height - 3;
else
window->win_status_y = window->win_y + window->win_height - 2;
window->win_status_width = window->win_width;
window->win_status_height = 1;
/* infobar window */
if (cfg_look_infobar)
{
window->win_infobar_x = window->win_x;
window->win_infobar_y = window->win_y + window->win_height - 2;
window->win_infobar_width = window->win_width;
window->win_infobar_height = 1;
}
else
{
window->win_infobar_x = -1;
window->win_infobar_y = -1;
window->win_infobar_width = -1;
window->win_infobar_height = -1;
}
/* input window */
window->win_input_x = window->win_x;
window->win_input_y = window->win_y + window->win_height - 1;
window->win_input_width = window->win_width;
window->win_input_height = 1;
return 1;
}
@@ -358,7 +396,7 @@ gui_window_redraw_buffer (t_gui_buffer *buffer)
gui_chat_draw_title (buffer, 1);
gui_chat_draw (buffer, 1);
if (GUI_CURSES(ptr_win)->win_nick)
gui_nicklist_draw (buffer, 1);
gui_nicklist_draw (buffer, 1, 0);
gui_status_draw (buffer, 1);
if (cfg_look_infobar)
gui_infobar_draw (buffer, 1);
@@ -377,7 +415,7 @@ gui_window_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
{
if (!gui_ok)
return;
if (window->buffer->num_displayed > 0)
window->buffer->num_displayed--;
@@ -390,20 +428,21 @@ gui_window_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
window->buffer = buffer;
window->win_nick_start = 0;
gui_window_calculate_pos_size (window, 1);
/* destroy Curses windows */
gui_window_objects_free (window, 0);
/* create Curses windows */
GUI_CURSES(window)->win_title = newwin (1,
window->win_width,
window->win_y,
window->win_x);
GUI_CURSES(window)->win_input = newwin (1,
window->win_width,
window->win_y + window->win_height - 1,
window->win_x);
GUI_CURSES(window)->win_title = newwin (window->win_title_height,
window->win_title_width,
window->win_title_y,
window->win_title_x);
GUI_CURSES(window)->win_input = newwin (window->win_input_height,
window->win_input_width,
window->win_input_y,
window->win_input_x);
if (BUFFER_IS_CHANNEL(buffer))
{
if (GUI_CURSES(window)->win_chat)
@@ -432,22 +471,19 @@ gui_window_switch_to_buffer (t_gui_window *window, t_gui_buffer *buffer)
/* create status/infobar windows */
if (cfg_look_infobar)
{
GUI_CURSES(window)->win_infobar = newwin (1, window->win_width,
window->win_y + window->win_height - 2,
window->win_x);
GUI_CURSES(window)->win_status = newwin (1, window->win_width,
window->win_y + window->win_height - 3,
window->win_x);
}
else
GUI_CURSES(window)->win_status = newwin (1, window->win_width,
window->win_y + window->win_height - 2,
window->win_x);
GUI_CURSES(window)->win_infobar = newwin (window->win_infobar_height,
window->win_infobar_width,
window->win_infobar_y,
window->win_infobar_x);
GUI_CURSES(window)->win_status = newwin (window->win_status_height,
window->win_status_width,
window->win_status_y,
window->win_status_x);
window->start_line = NULL;
window->start_line_pos = 0;
buffer->num_displayed++;
hotlist_remove_buffer (buffer);
@@ -623,7 +659,7 @@ gui_window_nick_beginning (t_gui_window *window)
if (window->win_nick_start > 0)
{
window->win_nick_start = 0;
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -652,7 +688,7 @@ gui_window_nick_end (t_gui_window *window)
if (new_start != window->win_nick_start)
{
window->win_nick_start = new_start;
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -674,7 +710,7 @@ gui_window_nick_page_up (t_gui_window *window)
window->win_nick_start -= (window->win_nick_num_max - 1);
if (window->win_nick_start <= 1)
window->win_nick_start = 0;
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -699,7 +735,7 @@ gui_window_nick_page_down (t_gui_window *window)
window->win_nick_start += (window->win_nick_num_max - 1);
else
window->win_nick_start += (window->win_nick_num_max - 2);
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -778,17 +814,19 @@ gui_window_refresh_windows ()
gui_window_get_width (),
gui_window_get_height (), 0) < 0)
gui_window_merge_all (gui_current_window);
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
{
gui_window_switch_to_buffer (ptr_win, ptr_win->buffer);
}
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window)
{
gui_window_redraw_buffer (ptr_win->buffer);
gui_window_draw_separator (ptr_win);
}
gui_current_window = old_current_window;
gui_window_switch_to_buffer (gui_current_window, gui_current_window->buffer);
gui_window_redraw_buffer (gui_current_window->buffer);
}
}
@@ -1133,24 +1171,32 @@ gui_window_switch_right (t_gui_window *window)
/*
* gui_window_refresh_screen: called when term size is modified
* force == 1 when Ctrl+L is pressed
*/
void
gui_window_refresh_screen ()
gui_window_refresh_screen (int force)
{
int new_height, new_width;
endwin ();
refresh ();
getmaxyx (stdscr, new_height, new_width);
gui_ok = ((new_width > WINDOW_MIN_WIDTH) && (new_height > WINDOW_MIN_HEIGHT));
if (gui_ok)
gui_window_refresh_windows ();
gui_refresh_screen_needed = 0;
if (force || (gui_refresh_screen_needed == 1))
{
endwin ();
refresh ();
getmaxyx (stdscr, new_height, new_width);
gui_ok = ((new_width > WINDOW_MIN_WIDTH) && (new_height > WINDOW_MIN_HEIGHT));
if (gui_ok)
{
refresh ();
gui_window_refresh_windows ();
}
}
if (!force && (gui_refresh_screen_needed > 0))
gui_refresh_screen_needed--;
}
/*
@@ -1160,7 +1206,8 @@ gui_window_refresh_screen ()
void
gui_window_refresh_screen_sigwinch ()
{
gui_refresh_screen_needed = 1;
if (gui_refresh_screen_needed < 2)
gui_refresh_screen_needed++;
signal (SIGWINCH, gui_window_refresh_screen_sigwinch);
}
@@ -1253,6 +1300,8 @@ gui_window_reset_title ()
void
gui_window_objects_print_log (t_gui_window *window)
{
t_gui_panel_window *ptr_panel_win;
weechat_log_printf (" win_title . . . . . : 0x%X\n", GUI_CURSES(window)->win_title);
weechat_log_printf (" win_chat. . . . . . : 0x%X\n", GUI_CURSES(window)->win_chat);
weechat_log_printf (" win_nick. . . . . . : 0x%X\n", GUI_CURSES(window)->win_nick);
@@ -1260,4 +1309,18 @@ gui_window_objects_print_log (t_gui_window *window)
weechat_log_printf (" win_infobar . . . . : 0x%X\n", GUI_CURSES(window)->win_infobar);
weechat_log_printf (" win_input . . . . . : 0x%X\n", GUI_CURSES(window)->win_input);
weechat_log_printf (" win_separator . . . : 0x%X\n", GUI_CURSES(window)->win_separator);
for (ptr_panel_win = GUI_CURSES(window)->panel_windows;
ptr_panel_win; ptr_panel_win = ptr_panel_win->next_panel_window)
{
weechat_log_printf ("\n");
weechat_log_printf (" [window panel (addr:0x%X)]\n", ptr_panel_win);
weechat_log_printf (" panel . . . . . . : 0x%X\n", ptr_panel_win->panel);
weechat_log_printf (" x . . . . . . . . : %d\n", ptr_panel_win->x);
weechat_log_printf (" y . . . . . . . . : %d\n", ptr_panel_win->y);
weechat_log_printf (" width . . . . . . : %d\n", ptr_panel_win->width);
weechat_log_printf (" height. . . . . . : %d\n", ptr_panel_win->height);
weechat_log_printf (" win_panel . . . . : 0x%X\n", ptr_panel_win->win_panel);
weechat_log_printf (" win_separator . . : 0x%X\n", ptr_panel_win->win_separator);
weechat_log_printf (" next_panel_window : 0x%X\n", ptr_panel_win->next_panel_window);
}
}
+4 -1
View File
@@ -39,6 +39,9 @@
#define WEECHAT_COLOR_CYAN COLOR_YELLOW
#define WEECHAT_COLOR_WHITE COLOR_WHITE
#define WINDOW_MIN_WIDTH 10
#define WINDOW_MIN_HEIGHT 5
#define GUI_CURSES(window) ((t_gui_curses_objects *)(window->gui_objects))
typedef struct t_gui_panel_window t_gui_panel_window;
@@ -92,7 +95,7 @@ extern void gui_window_set_title ();
extern void gui_window_reset_title ();
/* panel functions */
extern int gui_panel_get_size (t_gui_window *, int);
extern int gui_panel_window_get_size (t_gui_panel *, t_gui_window *, int);
extern void gui_panel_redraw_buffer (t_gui_buffer *);
#endif /* gui-curses.h */
+2 -1
View File
@@ -36,7 +36,7 @@
*/
void
gui_nicklist_draw (t_gui_buffer *buffer, int erase)
gui_nicklist_draw (t_gui_buffer *buffer, int erase, int calculate_size)
{
/*t_gui_window *ptr_win;
int i, j, x, y, column, max_length, nicks_displayed;
@@ -49,4 +49,5 @@ gui_nicklist_draw (t_gui_buffer *buffer, int erase)
/* TODO: write this function for Gtk */
(void) buffer;
(void) erase;
(void) calculate_size;
}
+6 -10
View File
@@ -386,7 +386,7 @@ gui_window_nick_beginning (t_gui_window *window)
if (window->win_nick_start > 0)
{
window->win_nick_start = 0;
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -415,7 +415,7 @@ gui_window_nick_end (t_gui_window *window)
if (new_start != window->win_nick_start)
{
window->win_nick_start = new_start;
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -437,7 +437,7 @@ gui_window_nick_page_up (t_gui_window *window)
window->win_nick_start -= (window->win_nick_height - 1);
if (window->win_nick_start <= 1)
window->win_nick_start = 0;
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -462,7 +462,7 @@ gui_window_nick_page_down (t_gui_window *window)
window->win_nick_start += (window->win_nick_height - 1);
else
window->win_nick_start += (window->win_nick_height - 2);
gui_nicklist_draw (window->buffer, 1);
gui_nicklist_draw (window->buffer, 1, 0);
}
}
}
@@ -485,8 +485,6 @@ gui_window_auto_resize (t_gui_window_tree *tree,
{
if (tree->window)
{
if ((width < WINDOW_MIN_WIDTH) || (height < WINDOW_MIN_HEIGHT))
return -1;
if (!simulate)
{
tree->window->win_x = x;
@@ -555,8 +553,7 @@ gui_window_split_horiz (t_gui_window *window, int pourcentage)
height1 = (window->win_height * pourcentage) / 100;
height2 = window->win_height - height1;
if ((height1 >= WINDOW_MIN_HEIGHT) && (height2 >= WINDOW_MIN_HEIGHT)
&& (pourcentage > 0) && (pourcentage <= 100))
if ((pourcentage > 0) && (pourcentage <= 100))
{
if ((new_window = gui_window_new (window,
window->win_x, window->win_y,
@@ -597,8 +594,7 @@ gui_window_split_vertic (t_gui_window *window, int pourcentage)
width1 = (window->win_width * pourcentage) / 100;
width2 = window->win_width - width1 - 1;
if ((width1 >= WINDOW_MIN_WIDTH) && (width2 >= WINDOW_MIN_WIDTH)
&& (pourcentage > 0) && (pourcentage <= 100))
if ((pourcentage > 0) && (pourcentage <= 100))
{
if ((new_window = gui_window_new (window,
window->win_x + width1 + 1, window->win_y,
+1 -1
View File
@@ -1200,7 +1200,7 @@ gui_action_refresh_screen (t_gui_window *window)
/* make gcc happy */
(void) window;
gui_window_refresh_screen ();
gui_window_refresh_screen (1);
}
/*
+63 -2
View File
@@ -35,18 +35,55 @@
#include "../common/weechat.h"
#include "gui.h"
#include "../common/log.h"
t_gui_panel *gui_panels = NULL; /* pointer to first panel */
t_gui_panel *last_gui_panel = NULL; /* pointer to last panel */
/*
* gui_panel_global_get_size: get total panel size (global panels) for a position
*/
int
gui_panel_global_get_size (t_gui_panel *panel, int position)
{
t_gui_panel *ptr_panel;
int total_size;
total_size = 0;
for (ptr_panel = gui_panels; ptr_panel; ptr_panel = ptr_panel->next_panel)
{
if ((panel) && (ptr_panel == panel))
return total_size;
if (ptr_panel->position == position)
{
switch (position)
{
case GUI_PANEL_TOP:
case GUI_PANEL_BOTTOM:
total_size += ptr_panel->size;
break;
case GUI_PANEL_LEFT:
case GUI_PANEL_RIGHT:
total_size += ptr_panel->size;
break;
}
if (ptr_panel->separator)
total_size++;
}
}
return total_size;
}
/*
* gui_panel_new: create a new panel
*/
t_gui_panel *
gui_panel_new (char *name, int position, int type, int size, int separator)
gui_panel_new (char *name, int type, int position, int size, int separator)
{
t_gui_panel *new_panel;
t_gui_window *ptr_win;
@@ -56,8 +93,9 @@ gui_panel_new (char *name, int position, int type, int size, int separator)
if ((new_panel = (t_gui_panel *) malloc (sizeof (t_gui_panel))))
{
new_panel->position = position;
new_panel->number = (last_gui_panel) ? last_gui_panel->number + 1 : 1;
new_panel->name = strdup (name);
new_panel->position = position;
new_panel->separator = separator;
new_panel->size = size;
if (type == GUI_PANEL_WINDOWS)
@@ -111,3 +149,26 @@ gui_panel_free (t_gui_panel *panel)
free (panel);
}
/*
* gui_panel_print_log: print panel infos in log (usually for crash dump)
*/
void
gui_panel_print_log ()
{
t_gui_panel *ptr_panel;
for (ptr_panel = gui_panels; ptr_panel; ptr_panel = ptr_panel->next_panel)
{
weechat_log_printf ("\n");
weechat_log_printf ("[panel (addr:0x%X)]\n", ptr_panel);
weechat_log_printf (" position. . . . . . : %d\n", ptr_panel->position);
weechat_log_printf (" name. . . . . . . . : '%s'\n", ptr_panel->name);
weechat_log_printf (" panel_window. . . . : 0x%X\n", ptr_panel->panel_window);
weechat_log_printf (" separator . . . . . : %d\n", ptr_panel->separator);
weechat_log_printf (" size. . . . . . . . : %d\n", ptr_panel->size);
weechat_log_printf (" prev_panel . .. . . : 0x%X\n", ptr_panel->prev_panel);
weechat_log_printf (" next_panel . .. . . : 0x%X\n", ptr_panel->next_panel);
}
}
+6 -5
View File
@@ -23,11 +23,11 @@
#define GUI_PANEL_TOP 1
#define GUI_PANEL_BOTTOM 2
#define GUI_PANEL_LEFT 3
#define GUI_PANEL_RIGHT 4
#define GUI_PANEL_LEFT 4
#define GUI_PANEL_RIGHT 8
#define GUI_PANEL_GLOBAL 0
#define GUI_PANEL_WINDOWS 1
#define GUI_PANEL_GLOBAL 1
#define GUI_PANEL_WINDOWS 2
/* panel structure */
@@ -36,8 +36,9 @@ typedef struct t_gui_panel t_gui_panel;
struct t_gui_panel
{
int position; /* position (top, bottom, left, right) */
int number; /* panel number */
char *name; /* panel name */
int position; /* position (top, bottom, left, right) */
void *panel_window; /* pointer to panel window, NULL if */
/* displayed on each window (in this */
/* case, pointers are in windows) */
+18 -2
View File
@@ -213,7 +213,7 @@ gui_window_new (t_gui_window *parent, int x, int y, int width, int height,
new_window->win_nick_num_max = 0;
new_window->win_nick_start = 0;
new_window->win_input_x = 0;
new_window->win_input_cursor_x = 0;
new_window->dcc_first = NULL;
new_window->dcc_selected = NULL;
@@ -409,6 +409,23 @@ gui_window_print_log (t_gui_window *window)
weechat_log_printf (" win_nick_width. . . : %d\n", window->win_nick_width);
weechat_log_printf (" win_nick_height . . : %d\n", window->win_nick_height);
weechat_log_printf (" win_nick_start. . . : %d\n", window->win_nick_start);
weechat_log_printf (" win_title_x . . . . : %d\n", window->win_title_x);
weechat_log_printf (" win_title_y . . . . : %d\n", window->win_title_y);
weechat_log_printf (" win_title_width . . : %d\n", window->win_title_width);
weechat_log_printf (" win_title_height. . : %d\n", window->win_title_height);
weechat_log_printf (" win_status_x. . . . : %d\n", window->win_status_x);
weechat_log_printf (" win_status_y. . . . : %d\n", window->win_status_y);
weechat_log_printf (" win_status_width. . : %d\n", window->win_status_width);
weechat_log_printf (" win_status_height . : %d\n", window->win_status_height);
weechat_log_printf (" win_infobar_x . . . : %d\n", window->win_infobar_x);
weechat_log_printf (" win_infobar_y . . . : %d\n", window->win_infobar_y);
weechat_log_printf (" win_infobar_width . : %d\n", window->win_infobar_width);
weechat_log_printf (" win_infobar_height. : %d\n", window->win_infobar_height);
weechat_log_printf (" win_input_x . . . . : %d\n", window->win_input_x);
weechat_log_printf (" win_input_y . . . . : %d\n", window->win_input_y);
weechat_log_printf (" win_input_width . . : %d\n", window->win_input_width);
weechat_log_printf (" win_input_height. . : %d\n", window->win_input_height);
weechat_log_printf (" win_input_cursor_x. : %d\n", window->win_input_cursor_x);
gui_window_objects_print_log (window);
weechat_log_printf (" dcc_first . . . . . : 0x%X\n", window->dcc_first);
weechat_log_printf (" dcc_selected. . . . : 0x%X\n", window->dcc_selected);
@@ -419,5 +436,4 @@ gui_window_print_log (t_gui_window *window)
weechat_log_printf (" start_line_pos. . . : %d\n", window->start_line_pos);
weechat_log_printf (" prev_window . . . . : 0x%X\n", window->prev_window);
weechat_log_printf (" next_window . . . . : 0x%X\n", window->next_window);
}
+24 -5
View File
@@ -21,9 +21,6 @@
#ifndef __WEECHAT_GUI_WINDOW_H
#define __WEECHAT_GUI_WINDOW_H 1
#define WINDOW_MIN_WIDTH 10
#define WINDOW_MIN_HEIGHT 5
/* window structures */
typedef struct t_gui_window_tree t_gui_window_tree;
@@ -54,9 +51,31 @@ struct t_gui_window
int win_nick_num_max; /* maximum number of nicks displayed */
int win_nick_start; /* # of 1st nick for display (scroll) */
/* title window settings */
int win_title_x; /* title window position */
int win_title_y; /* title window position */
int win_title_width; /* width of title window */
int win_title_height; /* height of title window */
/* status bar settings */
int win_status_x; /* status window position */
int win_status_y; /* status window position */
int win_status_width; /* width of status window */
int win_status_height; /* height of status window */
/* infobar bar settings */
int win_infobar_x; /* infobar window position */
int win_infobar_y; /* infobar window position */
int win_infobar_width; /* width of infobar window */
int win_infobar_height; /* height of infobar window */
/* input window settings */
int win_input_x; /* position of cursor in input window */
int win_input_x; /* input window position */
int win_input_y; /* input window position */
int win_input_width; /* width of input window */
int win_input_height; /* height of input window */
int win_input_cursor_x; /* position of cursor in input window */
/* GUI specific objects */
void *gui_objects; /* pointer to a GUI specific struct */
+3 -1
View File
@@ -100,8 +100,10 @@ extern void gui_buffer_move_to_number (t_gui_buffer *, int);
extern void gui_buffer_print_log (t_gui_buffer *);
/* panel */
extern int gui_panel_global_get_size (t_gui_panel *, int);
extern t_gui_panel *gui_panel_new (char *, int, int, int, int);
extern void gui_panel_free (t_gui_panel *);
extern void gui_panel_print_log ();
/* action */
extern void gui_action_clipboard_copy (char *, int);
@@ -220,7 +222,7 @@ extern void gui_status_draw (t_gui_buffer *, int);
extern void gui_input_draw (t_gui_buffer *, int);
/* nicklist */
extern void gui_nicklist_draw (t_gui_buffer *, int);
extern void gui_nicklist_draw (t_gui_buffer *, int, int);
/* window */
extern int gui_window_get_width ();