37 |
#include "../../irc/irc.h" |
#include "../../irc/irc.h" |
38 |
|
|
39 |
|
|
|
int gui_ready; /* = 1 if GUI is initialized */ |
|
|
|
|
|
t_gui_window *gui_windows = NULL; /* pointer to first window */ |
|
|
t_gui_window *last_gui_window = NULL; /* pointer to last window */ |
|
|
t_gui_window *gui_current_window = NULL; /* pointer to current window */ |
|
|
|
|
40 |
t_gui_color gui_colors[] = |
t_gui_color gui_colors[] = |
41 |
{ { "default", -1 | A_NORMAL }, |
{ { "default", -1 | A_NORMAL }, |
42 |
{ "black", COLOR_BLACK | A_NORMAL }, |
{ "black", COLOR_BLACK | A_NORMAL }, |
588 |
if (window != gui_current_window) |
if (window != gui_current_window) |
589 |
return; |
return; |
590 |
|
|
591 |
//gui_curses_window_clear (window->win_chat); |
gui_curses_window_clear (window->win_chat); |
592 |
gui_draw_window_chat (window); |
gui_draw_window_chat (window); |
593 |
} |
} |
594 |
|
|
1030 |
} |
} |
1031 |
|
|
1032 |
/* |
/* |
|
* gui_window_clear: clear window content |
|
|
*/ |
|
|
|
|
|
void |
|
|
gui_window_clear (t_gui_window *window) |
|
|
{ |
|
|
t_gui_line *ptr_line; |
|
|
t_gui_message *ptr_message; |
|
|
|
|
|
while (window->lines) |
|
|
{ |
|
|
ptr_line = window->lines->next_line; |
|
|
while (window->lines->messages) |
|
|
{ |
|
|
ptr_message = window->lines->messages->next_message; |
|
|
if (window->lines->messages->message) |
|
|
free (window->lines->messages->message); |
|
|
free (window->lines->messages); |
|
|
window->lines->messages = ptr_message; |
|
|
} |
|
|
free (window->lines); |
|
|
window->lines = ptr_line; |
|
|
} |
|
|
|
|
|
window->lines = NULL; |
|
|
window->last_line = NULL; |
|
|
window->first_line_displayed = 1; |
|
|
window->sub_lines = 0; |
|
|
window->line_complete = 1; |
|
|
window->unread_data = 0; |
|
|
|
|
|
if (window == gui_current_window) |
|
|
gui_redraw_window_chat (window); |
|
|
} |
|
|
|
|
|
/* |
|
|
* gui_window_clear_all: clear all windows content |
|
|
*/ |
|
|
|
|
|
void |
|
|
gui_window_clear_all () |
|
|
{ |
|
|
t_gui_window *ptr_win; |
|
|
|
|
|
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) |
|
|
gui_window_clear (ptr_win); |
|
|
} |
|
|
|
|
|
/* |
|
1033 |
* gui_switch_to_window: switch to another window |
* gui_switch_to_window: switch to another window |
1034 |
*/ |
*/ |
1035 |
|
|
1190 |
} |
} |
1191 |
|
|
1192 |
/* |
/* |
1193 |
* gui_window_new: create a new window |
* gui_curses_resize_handler: called when term size is modified |
|
* (TODO: add coordinates and size, for splited windows) |
|
|
*/ |
|
|
|
|
|
t_gui_window * |
|
|
gui_window_new (void *server, void *channel |
|
|
/*int x, int y, int width, int height*/) |
|
|
{ |
|
|
t_gui_window *new_window; |
|
|
|
|
|
if (gui_windows) |
|
|
{ |
|
|
if (!SERVER(gui_windows)) |
|
|
{ |
|
|
if (server) |
|
|
((t_irc_server *)(server))->window = gui_windows; |
|
|
if (channel) |
|
|
((t_irc_channel *)(channel))->window = gui_windows; |
|
|
SERVER(gui_windows) = server; |
|
|
CHANNEL(gui_windows) = channel; |
|
|
return gui_windows; |
|
|
} |
|
|
} |
|
|
|
|
|
if ((new_window = (t_gui_window *)(malloc (sizeof (t_gui_window))))) |
|
|
{ |
|
|
/* assign server and channel to window */ |
|
|
SERVER(new_window) = server; |
|
|
CHANNEL(new_window) = channel; |
|
|
/* assign window to server and channel */ |
|
|
if (server && !channel) |
|
|
SERVER(new_window)->window = new_window; |
|
|
if (channel) |
|
|
CHANNEL(new_window)->window = new_window; |
|
|
|
|
|
gui_calculate_pos_size (new_window); |
|
|
|
|
|
/* init windows */ |
|
|
new_window->win_title = NULL; |
|
|
new_window->win_chat = NULL; |
|
|
new_window->win_nick = NULL; |
|
|
new_window->win_status = NULL; |
|
|
new_window->win_input = NULL; |
|
|
|
|
|
/* init lines */ |
|
|
new_window->lines = NULL; |
|
|
new_window->last_line = NULL; |
|
|
new_window->first_line_displayed = 1; |
|
|
new_window->sub_lines = 0; |
|
|
new_window->line_complete = 1; |
|
|
new_window->unread_data = 0; |
|
|
|
|
|
/* init input buffer */ |
|
|
new_window->input_buffer_alloc = INPUT_BUFFER_BLOCK_SIZE; |
|
|
new_window->input_buffer = (char *) malloc (INPUT_BUFFER_BLOCK_SIZE); |
|
|
new_window->input_buffer[0] = '\0'; |
|
|
new_window->input_buffer_size = 0; |
|
|
new_window->input_buffer_pos = 0; |
|
|
new_window->input_buffer_1st_display = 0; |
|
|
|
|
|
/* init completion */ |
|
|
completion_init (&(new_window->completion)); |
|
|
|
|
|
/* init history */ |
|
|
new_window->history = NULL; |
|
|
new_window->ptr_history = NULL; |
|
|
|
|
|
/* switch to new window */ |
|
|
gui_switch_to_window (new_window); |
|
|
|
|
|
/* add window to windows queue */ |
|
|
new_window->prev_window = last_gui_window; |
|
|
if (gui_windows) |
|
|
last_gui_window->next_window = new_window; |
|
|
else |
|
|
gui_windows = new_window; |
|
|
last_gui_window = new_window; |
|
|
new_window->next_window = NULL; |
|
|
|
|
|
/* redraw whole screen */ |
|
|
gui_redraw_window (new_window); |
|
|
} |
|
|
else |
|
|
return NULL; |
|
|
|
|
|
return new_window; |
|
|
} |
|
|
|
|
|
/* |
|
|
* gui_window_free: delete a window |
|
1194 |
*/ |
*/ |
1195 |
|
|
1196 |
void |
void |
1197 |
gui_window_free (t_gui_window *window) |
gui_curses_resize_handler () |
|
{ |
|
|
t_gui_line *ptr_line; |
|
|
t_gui_message *ptr_message; |
|
|
int create_new; |
|
|
|
|
|
create_new = (window->server || window->channel); |
|
|
|
|
|
/* TODO: manage splitted windows! */ |
|
|
if ((window == gui_current_window) && |
|
|
((window->next_window) || (window->prev_window))) |
|
|
gui_switch_to_previous_window (); |
|
|
|
|
|
/* free lines and messages */ |
|
|
while (window->lines) |
|
|
{ |
|
|
ptr_line = window->lines->next_line; |
|
|
while (window->lines->messages) |
|
|
{ |
|
|
ptr_message = window->lines->messages->next_message; |
|
|
if (window->lines->messages->message) |
|
|
free (window->lines->messages->message); |
|
|
free (window->lines->messages); |
|
|
window->lines->messages = ptr_message; |
|
|
} |
|
|
free (window->lines); |
|
|
window->lines = ptr_line; |
|
|
} |
|
|
if (window->input_buffer) |
|
|
free (window->input_buffer); |
|
|
|
|
|
/* TODO: free completion struct */ |
|
|
/* there... */ |
|
|
|
|
|
/* remove window from windows list */ |
|
|
if (window->prev_window) |
|
|
window->prev_window->next_window = window->next_window; |
|
|
if (window->next_window) |
|
|
window->next_window->prev_window = window->prev_window; |
|
|
if (gui_windows == window) |
|
|
gui_windows = window->next_window; |
|
|
if (last_gui_window == window) |
|
|
last_gui_window = window->prev_window; |
|
|
|
|
|
free (window); |
|
|
|
|
|
/* always at least one window */ |
|
|
if (!gui_windows && create_new) |
|
|
gui_window_new (NULL, NULL); |
|
|
} |
|
|
|
|
|
/* |
|
|
* gui_resize_term_handler: called when term size is modified |
|
|
*/ |
|
|
|
|
|
void |
|
|
gui_resize_term_handler () |
|
1198 |
{ |
{ |
1199 |
t_gui_window *ptr_win; |
t_gui_window *ptr_win; |
1200 |
int width, height; |
int width, height; |
1352 |
/* create windows */ |
/* create windows */ |
1353 |
gui_current_window = gui_window_new (NULL, NULL /*0, 0, COLS, LINES*/); |
gui_current_window = gui_window_new (NULL, NULL /*0, 0, COLS, LINES*/); |
1354 |
|
|
1355 |
signal (SIGWINCH, gui_resize_term_handler); |
signal (SIGWINCH, gui_curses_resize_handler); |
1356 |
|
|
1357 |
#ifdef __linux__ |
#ifdef __linux__ |
1358 |
/* set title for term window, not for console */ |
/* set title for term window, not for console */ |
1394 |
} |
} |
1395 |
|
|
1396 |
/* |
/* |
|
* gui_new_line: create new line for a window |
|
|
*/ |
|
|
|
|
|
t_gui_line * |
|
|
gui_new_line (t_gui_window *window) |
|
|
{ |
|
|
t_gui_line *new_line; |
|
|
|
|
|
if ((new_line = (t_gui_line *) malloc (sizeof (struct t_gui_line)))) |
|
|
{ |
|
|
new_line->length = 0; |
|
|
new_line->length_align = 0; |
|
|
new_line->line_with_message = 0; |
|
|
new_line->messages = NULL; |
|
|
new_line->last_message = NULL; |
|
|
if (!window->lines) |
|
|
window->lines = new_line; |
|
|
else |
|
|
window->last_line->next_line = new_line; |
|
|
new_line->prev_line = window->last_line; |
|
|
new_line->next_line = NULL; |
|
|
window->last_line = new_line; |
|
|
} |
|
|
else |
|
|
{ |
|
|
wprintw (window->win_chat, |
|
|
_("%s not enough memory for new line!\n"), |
|
|
WEECHAT_ERROR); |
|
|
return NULL; |
|
|
} |
|
|
return new_line; |
|
|
} |
|
|
|
|
|
/* |
|
|
* gui_new_message: create a new message for last line of window |
|
|
*/ |
|
|
|
|
|
t_gui_message * |
|
|
gui_new_message (t_gui_window *window) |
|
|
{ |
|
|
t_gui_message *new_message; |
|
|
|
|
|
if ((new_message = (t_gui_message *) malloc (sizeof (struct t_gui_message)))) |
|
|
{ |
|
|
if (!window->last_line->messages) |
|
|
window->last_line->messages = new_message; |
|
|
else |
|
|
window->last_line->last_message->next_message = new_message; |
|
|
new_message->prev_message = window->last_line->last_message; |
|
|
new_message->next_message = NULL; |
|
|
window->last_line->last_message = new_message; |
|
|
} |
|
|
else |
|
|
{ |
|
|
log_printf (_("not enough memory!\n")); |
|
|
return NULL; |
|
|
} |
|
|
return new_message; |
|
|
} |
|
|
|
|
|
/* |
|
1397 |
* gui_add_message: add a message to a window |
* gui_add_message: add a message to a window |
1398 |
*/ |
*/ |
1399 |
|
|