63 |
int color_attr[NUM_COLORS]; |
int color_attr[NUM_COLORS]; |
64 |
|
|
65 |
GtkWidget *gtk_main_window; |
GtkWidget *gtk_main_window; |
66 |
|
GtkWidget *vbox1; |
67 |
|
GtkWidget *entry_topic; |
68 |
|
GtkWidget *notebook1; |
69 |
|
GtkWidget *vbox2; |
70 |
|
GtkWidget *hbox1; |
71 |
|
GtkWidget *scrolledwindow_chat; |
72 |
|
GtkWidget *scrolledwindow_nick; |
73 |
|
GtkWidget *entry_input; |
74 |
|
GtkWidget *label1; |
75 |
|
|
76 |
|
|
77 |
/* |
/* |
286 |
void |
void |
287 |
gui_draw_window_nick (t_gui_window *window) |
gui_draw_window_nick (t_gui_window *window) |
288 |
{ |
{ |
|
int i, x, y, column, max_length; |
|
|
char format[32]; |
|
|
t_irc_nick *ptr_nick; |
|
|
|
|
289 |
/* TODO: manage splitted windows! */ |
/* TODO: manage splitted windows! */ |
290 |
if (window != gui_current_window) |
if (window != gui_current_window) |
291 |
return; |
return; |
292 |
|
|
293 |
if (CHANNEL(window) && CHANNEL(window)->nicks) |
/* TODO: display nicklist for Gtk GUI */ |
|
{ |
|
|
max_length = nick_get_max_length (CHANNEL(window)); |
|
|
if ((window == gui_current_window) && |
|
|
((max_length + 2) != window->win_nick_width)) |
|
|
{ |
|
|
/* TODO: auto resize nicklist and chat windows */ |
|
|
} |
|
|
sprintf (format, "%%-%ds", max_length); |
|
|
|
|
|
switch (cfg_look_nicklist_position) |
|
|
{ |
|
|
case CFG_LOOK_NICKLIST_LEFT: |
|
|
/* TODO: init nicklist (left) */ |
|
|
break; |
|
|
case CFG_LOOK_NICKLIST_RIGHT: |
|
|
/* TODO: init nicklist (right) */ |
|
|
break; |
|
|
case CFG_LOOK_NICKLIST_TOP: |
|
|
/* TODO: init nicklist (top) */ |
|
|
break; |
|
|
case CFG_LOOK_NICKLIST_BOTTOM: |
|
|
/* TODO: init nicklist (bottom) */ |
|
|
break; |
|
|
} |
|
|
/* TODO: draw nicklist! */ |
|
|
(void) i; |
|
|
(void) x; |
|
|
(void) y; |
|
|
(void) column; |
|
|
(void) ptr_nick; |
|
|
} |
|
294 |
} |
} |
295 |
|
|
296 |
/* |
/* |
379 |
|
|
380 |
gui_redraw_window_title (window); |
gui_redraw_window_title (window); |
381 |
gui_redraw_window_chat (window); |
gui_redraw_window_chat (window); |
382 |
if (window->win_nick) |
if (WIN_HAS_NICKLIST(window)) |
383 |
gui_redraw_window_nick (window); |
gui_redraw_window_nick (window); |
384 |
gui_redraw_window_status (window); |
gui_redraw_window_status (window); |
385 |
gui_redraw_window_input (window); |
gui_redraw_window_input (window); |
392 |
void |
void |
393 |
gui_switch_to_window (t_gui_window *window) |
gui_switch_to_window (t_gui_window *window) |
394 |
{ |
{ |
|
int another_window; |
|
395 |
t_gui_window *ptr_win; |
t_gui_window *ptr_win; |
396 |
|
GtkTextIter start, end; |
397 |
|
|
|
another_window = 0; |
|
398 |
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) |
for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) |
399 |
{ |
{ |
400 |
if (ptr_win->win_title) |
if (ptr_win->is_displayed) |
401 |
{ |
{ |
402 |
/* TODO: manage splitted windows */ |
/* TODO: manage splitted windows */ |
403 |
another_window = 1; |
ptr_win->is_displayed = 0; |
|
window->win_title = ptr_win->win_title; |
|
|
window->win_chat = ptr_win->win_chat; |
|
|
window->win_nick = ptr_win->win_nick; |
|
|
window->win_status = ptr_win->win_status; |
|
|
window->win_input = ptr_win->win_input; |
|
|
ptr_win->win_title = NULL; |
|
|
ptr_win->win_chat = NULL; |
|
|
ptr_win->win_nick = NULL; |
|
|
ptr_win->win_status = NULL; |
|
|
ptr_win->win_input = NULL; |
|
404 |
break; |
break; |
405 |
} |
} |
406 |
} |
} |
407 |
|
|
408 |
gui_calculate_pos_size (window); |
gui_calculate_pos_size (window); |
409 |
|
|
410 |
/* first time creation for windows */ |
if (!window->textview_chat) |
|
if (!another_window) |
|
411 |
{ |
{ |
412 |
/* create new windows */ |
window->textview_chat = gtk_text_view_new (); |
413 |
/* TODO: create title, chat, nick, status and input windows */ |
gtk_widget_show (window->textview_chat); |
414 |
|
gtk_container_add (GTK_CONTAINER (scrolledwindow_chat), window->textview_chat); |
415 |
|
gtk_widget_set_size_request (window->textview_chat, 300, -1); |
416 |
|
gtk_text_view_set_editable (GTK_TEXT_VIEW (window->textview_chat), FALSE); |
417 |
|
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (window->textview_chat), FALSE); |
418 |
|
|
419 |
|
window->textbuffer_chat = gtk_text_buffer_new (NULL); |
420 |
|
gtk_text_view_set_buffer (GTK_TEXT_VIEW (window->textview_chat), window->textbuffer_chat); |
421 |
|
|
422 |
|
window->texttag_chat = gtk_text_buffer_create_tag(window->textbuffer_chat, "courier", "font_family", "lucida"); |
423 |
|
gtk_text_buffer_get_bounds (window->textbuffer_chat, &start, &end); |
424 |
|
gtk_text_buffer_apply_tag (window->textbuffer_chat, window->texttag_chat, &start, &end); |
425 |
} |
} |
426 |
else |
if (WIN_IS_CHANNEL (window) && !window->textbuffer_nicklist) |
427 |
{ |
{ |
428 |
/* create chat & nick windows */ |
|
429 |
if (WIN_IS_CHANNEL(window)) |
window->textview_nicklist = gtk_text_view_new (); |
430 |
{ |
gtk_widget_show (window->textview_nicklist); |
431 |
/* (re)create nicklist window */ |
gtk_container_add (GTK_CONTAINER (scrolledwindow_nick), window->textview_nicklist); |
432 |
/* TODO: delete nick/chat windows and create them */ |
gtk_text_view_set_editable (GTK_TEXT_VIEW (window->textview_nicklist), FALSE); |
433 |
} |
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (window->textview_nicklist), FALSE); |
434 |
if (!(WIN_IS_CHANNEL(window))) |
|
435 |
{ |
window->textbuffer_nicklist = gtk_text_buffer_new (NULL); |
436 |
/* remove nick list window */ |
gtk_text_view_set_buffer (GTK_TEXT_VIEW (window->textview_nicklist), window->textbuffer_nicklist); |
|
/* TODO: remove nicklist window and create full chat window */ |
|
|
} |
|
437 |
} |
} |
438 |
|
|
439 |
/* change current window to the new window */ |
/* change current window to the new window */ |
440 |
gui_current_window = window; |
gui_current_window = window; |
441 |
|
|
442 |
|
window->is_displayed = 1; |
443 |
window->unread_data = 0; |
window->unread_data = 0; |
444 |
} |
} |
445 |
|
|
524 |
} |
} |
525 |
|
|
526 |
/* |
/* |
527 |
|
* gui_window_init_subwindows: init subwindows for a WeeChat window |
528 |
|
*/ |
529 |
|
|
530 |
|
void |
531 |
|
gui_window_init_subwindows (t_gui_window *window) |
532 |
|
{ |
533 |
|
window->textview_chat = NULL; |
534 |
|
window->textbuffer_chat = NULL; |
535 |
|
window->texttag_chat = NULL; |
536 |
|
window->textview_nicklist = NULL; |
537 |
|
window->textbuffer_nicklist = NULL; |
538 |
|
} |
539 |
|
|
540 |
|
/* |
541 |
* gui_init_colors: init GUI colors |
* gui_init_colors: init GUI colors |
542 |
*/ |
*/ |
543 |
|
|
554 |
void |
void |
555 |
gui_init () |
gui_init () |
556 |
{ |
{ |
|
GtkWidget *vbox1; |
|
|
GtkWidget *entry_topic; |
|
|
GtkWidget *notebook1; |
|
|
GtkWidget *vbox2; |
|
|
GtkWidget *hbox1; |
|
|
GtkWidget *scrolledwindow_chat; |
|
|
GtkWidget *textview_chat; |
|
|
GtkWidget *scrolledwindow_nick; |
|
|
GtkWidget *textview_nick; |
|
|
GtkWidget *entry_input; |
|
|
GtkWidget *label1; |
|
|
|
|
557 |
gtk_main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
gtk_main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL); |
558 |
gtk_window_set_title (GTK_WINDOW (gtk_main_window), WEECHAT_NAME_AND_VERSION); |
gtk_window_set_title (GTK_WINDOW (gtk_main_window), WEECHAT_NAME_AND_VERSION); |
559 |
|
|
583 |
gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow_chat, TRUE, TRUE, 0); |
gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow_chat, TRUE, TRUE, 0); |
584 |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_chat), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_chat), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); |
585 |
|
|
|
textview_chat = gtk_text_view_new (); |
|
|
gtk_widget_show (textview_chat); |
|
|
gtk_container_add (GTK_CONTAINER (scrolledwindow_chat), textview_chat); |
|
|
gtk_widget_set_size_request (textview_chat, 300, -1); |
|
|
gtk_text_view_set_editable (GTK_TEXT_VIEW (textview_chat), FALSE); |
|
|
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview_chat), FALSE); |
|
|
|
|
586 |
scrolledwindow_nick = gtk_scrolled_window_new (NULL, NULL); |
scrolledwindow_nick = gtk_scrolled_window_new (NULL, NULL); |
587 |
gtk_widget_show (scrolledwindow_nick); |
gtk_widget_show (scrolledwindow_nick); |
588 |
gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow_nick, TRUE, TRUE, 0); |
gtk_box_pack_start (GTK_BOX (hbox1), scrolledwindow_nick, TRUE, TRUE, 0); |
589 |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_nick), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); |
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolledwindow_nick), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS); |
590 |
|
|
|
textview_nick = gtk_text_view_new (); |
|
|
gtk_widget_show (textview_nick); |
|
|
gtk_container_add (GTK_CONTAINER (scrolledwindow_nick), textview_nick); |
|
|
gtk_text_view_set_editable (GTK_TEXT_VIEW (textview_nick), FALSE); |
|
|
gtk_text_view_set_cursor_visible (GTK_TEXT_VIEW (textview_nick), FALSE); |
|
|
|
|
591 |
entry_input = gtk_entry_new (); |
entry_input = gtk_entry_new (); |
592 |
gtk_widget_show (entry_input); |
gtk_widget_show (entry_input); |
593 |
gtk_box_pack_start (GTK_BOX (vbox2), entry_input, FALSE, FALSE, 0); |
gtk_box_pack_start (GTK_BOX (vbox2), entry_input, FALSE, FALSE, 0); |
599 |
|
|
600 |
gtk_widget_show_all (gtk_main_window); |
gtk_widget_show_all (gtk_main_window); |
601 |
|
|
602 |
|
/* create a new window */ |
603 |
|
gui_current_window = gui_window_new (NULL, NULL /*0, 0, COLS, LINES*/); |
604 |
|
|
605 |
/* TODO: set gui_ready to 1 when Gtk display functions will be ok */ |
/* TODO: set gui_ready to 1 when Gtk display functions will be ok */ |
606 |
gui_ready = 0; |
gui_ready = 1; |
607 |
} |
} |
608 |
|
|
609 |
/* |
/* |
632 |
{ |
{ |
633 |
char *pos; |
char *pos; |
634 |
int length; |
int length; |
635 |
|
GtkTextIter start, end; |
636 |
|
|
637 |
/* create new line if previous was ending by '\n' (or if 1st line) */ |
/* create new line if previous was ending by '\n' (or if 1st line) */ |
638 |
if (window->line_complete) |
if (window->line_complete) |
639 |
{ |
{ |
640 |
|
gtk_text_buffer_insert_at_cursor (window->textbuffer_chat, "\n", -1); |
641 |
window->line_complete = 0; |
window->line_complete = 0; |
|
if (!gui_new_line (window)) |
|
|
return; |
|
642 |
} |
} |
|
if (!gui_new_message (window)) |
|
|
return; |
|
643 |
|
|
|
window->last_line->last_message->type = type; |
|
|
window->last_line->last_message->color = color; |
|
644 |
pos = strchr (message, '\n'); |
pos = strchr (message, '\n'); |
645 |
if (pos) |
if (pos) |
646 |
{ |
{ |
647 |
pos[0] = '\0'; |
pos[0] = '\0'; |
648 |
window->line_complete = 1; |
window->line_complete = 1; |
649 |
} |
} |
650 |
window->last_line->last_message->message = strdup (message); |
|
651 |
length = strlen (message); |
gtk_text_buffer_insert_at_cursor (window->textbuffer_chat, message, -1); |
652 |
window->last_line->length += length; |
gtk_text_buffer_get_bounds (window->textbuffer_chat, &start, &end); |
653 |
if (type == MSG_TYPE_MSG) |
gtk_text_buffer_apply_tag (window->textbuffer_chat, window->texttag_chat, &start, &end); |
654 |
window->last_line->line_with_message = 1; |
|
|
if ((type == MSG_TYPE_TIME) || (type == MSG_TYPE_NICK)) |
|
|
window->last_line->length_align += length; |
|
655 |
if (pos) |
if (pos) |
|
{ |
|
656 |
pos[0] = '\n'; |
pos[0] = '\n'; |
|
if ((window == gui_current_window) && (window->sub_lines == 0)) |
|
|
{ |
|
|
if ((window->win_chat_cursor_y |
|
|
+ gui_get_line_num_splits (window, window->last_line)) > |
|
|
(window->win_chat_height - 1)) |
|
|
gui_draw_window_chat (window); |
|
|
else |
|
|
gui_display_line (window, window->last_line, 1); |
|
|
} |
|
|
if ((window != gui_current_window) || (window->sub_lines > 0)) |
|
|
{ |
|
|
window->unread_data = 1 + window->last_line->line_with_message; |
|
|
gui_redraw_window_status (gui_current_window); |
|
|
} |
|
|
} |
|
657 |
} |
} |
658 |
|
|
659 |
/* |
/* |
669 |
va_list argptr; |
va_list argptr; |
670 |
static time_t seconds; |
static time_t seconds; |
671 |
struct tm *date_tmp; |
struct tm *date_tmp; |
672 |
|
|
673 |
/* make gcc hapy */ |
if (gui_ready) |
674 |
(void) window; |
{ |
675 |
(void) type; |
if (color == -1) |
676 |
(void) color; |
color = COLOR_WIN_CHAT; |
677 |
(void) message; |
|
678 |
|
if (window == NULL) |
679 |
|
{ |
680 |
|
if (SERVER(gui_current_window)) |
681 |
|
window = SERVER(gui_current_window)->window; |
682 |
|
else |
683 |
|
window = gui_current_window; |
684 |
|
} |
685 |
|
|
686 |
|
if (window == NULL) |
687 |
|
{ |
688 |
|
log_printf ("gui_printf without window! this is a bug, please send to developers - thanks\n"); |
689 |
|
return; |
690 |
|
} |
691 |
|
} |
692 |
|
|
693 |
va_start (argptr, message); |
va_start (argptr, message); |
694 |
vsnprintf (buffer, sizeof (buffer) - 1, message, argptr); |
vsnprintf (buffer, sizeof (buffer) - 1, message, argptr); |
703 |
while (pos) |
while (pos) |
704 |
{ |
{ |
705 |
/* TODO: read timestamp format from config! */ |
/* TODO: read timestamp format from config! */ |
706 |
if ((!window->last_line) || (window->line_complete)) |
if (window->line_complete) |
707 |
{ |
{ |
708 |
gui_add_message (window, MSG_TYPE_TIME, COLOR_WIN_CHAT_DARK, "["); |
gui_add_message (window, MSG_TYPE_TIME, COLOR_WIN_CHAT_DARK, "["); |
709 |
sprintf (timestamp, "%02d", date_tmp->tm_hour); |
sprintf (timestamp, "%02d", date_tmp->tm_hour); |
716 |
gui_add_message (window, MSG_TYPE_TIME, COLOR_WIN_CHAT_TIME, timestamp); |
gui_add_message (window, MSG_TYPE_TIME, COLOR_WIN_CHAT_TIME, timestamp); |
717 |
gui_add_message (window, MSG_TYPE_TIME, COLOR_WIN_CHAT_DARK, "] "); |
gui_add_message (window, MSG_TYPE_TIME, COLOR_WIN_CHAT_DARK, "] "); |
718 |
} |
} |
719 |
gui_add_message (window, type, color, pos+1); |
gui_add_message (window, type, color, pos + 1); |
720 |
pos = strchr (pos+1, '\n'); |
pos = strchr (pos + 1, '\n'); |
721 |
if (pos) |
if (pos && !pos[1]) |
722 |
if (pos[1] == '\0') |
pos = NULL; |
|
pos = NULL; |
|
723 |
} |
} |
724 |
} |
} |
725 |
else |
else |