diff options
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/CMakeLists.txt | 9 | ||||
-rw-r--r-- | src/gui/Makefile.am | 4 | ||||
-rw-r--r-- | src/gui/curses/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/gui/curses/Makefile.am | 3 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-bar.c | 399 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-chat.c | 12 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-color.c | 6 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-main.c | 9 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-window.c | 194 | ||||
-rw-r--r-- | src/gui/curses/gui-curses.h | 17 | ||||
-rw-r--r-- | src/gui/gtk/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/gui/gtk/Makefile.am | 3 | ||||
-rw-r--r-- | src/gui/gtk/gui-gtk-bar.c | 109 | ||||
-rw-r--r-- | src/gui/gtk/gui-gtk-window.c | 15 | ||||
-rw-r--r-- | src/gui/gtk/gui-gtk.h | 11 | ||||
-rw-r--r-- | src/gui/gui-bar-item.c | 592 | ||||
-rw-r--r-- | src/gui/gui-bar-item.h | 74 | ||||
-rw-r--r-- | src/gui/gui-bar.c | 312 | ||||
-rw-r--r-- | src/gui/gui-bar.h | 96 | ||||
-rw-r--r-- | src/gui/gui-buffer.c | 15 | ||||
-rw-r--r-- | src/gui/gui-hotlist.c | 6 |
21 files changed, 1805 insertions, 93 deletions
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index 75c971aba..962147e55 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -18,10 +18,11 @@ IF(NOT DISABLE_NCURSES) SUBDIRS( curses ) ENDIF(NOT DISABLE_NCURSES) -SET(LIB_GUI_COMMON_SRC gui-action.c gui-action.h gui-buffer.c gui-buffer.h -gui-chat.c gui-chat.h gui-color.c gui-color.h gui-completion.c gui-completion.h -gui-history.c gui-history.h gui-hotlist.c gui-hotlist.h gui-infobar.c -gui-infobar.h gui-input.c gui-input.h gui-keyboard.c gui-keyboard.h gui-main.h +SET(LIB_GUI_COMMON_SRC gui-action.c gui-action.h gui-bar.c gui-bar.h +gui-bar-item.c gui-bar-item.h gui-buffer.c gui-buffer.h gui-chat.c gui-chat.h +gui-color.c gui-color.h gui-completion.c gui-completion.h gui-history.c +gui-history.h gui-hotlist.c gui-hotlist.h gui-infobar.c gui-infobar.h +gui-input.c gui-input.h gui-keyboard.c gui-keyboard.h gui-main.h gui-nicklist.c gui-nicklist.h gui-status.h gui-window.c gui-window.h) INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}) diff --git a/src/gui/Makefile.am b/src/gui/Makefile.am index 49d963709..12c4575fa 100644 --- a/src/gui/Makefile.am +++ b/src/gui/Makefile.am @@ -20,6 +20,10 @@ noinst_LIBRARIES = lib_weechat_gui_common.a lib_weechat_gui_common_a_SOURCES = gui-action.c \ gui-action.h \ + gui-bar.c \ + gui-bar.h \ + gui-bar-item.c \ + gui-bar-item.h \ gui-buffer.c \ gui-buffer.h \ gui-chat.c \ diff --git a/src/gui/curses/CMakeLists.txt b/src/gui/curses/CMakeLists.txt index e9694172f..4d2b8cca9 100644 --- a/src/gui/curses/CMakeLists.txt +++ b/src/gui/curses/CMakeLists.txt @@ -14,9 +14,9 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # -SET(WEECHAT_CURSES_SRC gui-curses-chat.c gui-curses-color.c gui-curses-infobar.c -gui-curses-input.c gui-curses-keyboard.c gui-curses-main.c gui-curses-nicklist.c -gui-curses-status.c gui-curses-window.c gui-curses.h) +SET(WEECHAT_CURSES_SRC gui-curses-bar.c gui-curses-chat.c gui-curses-color.c +gui-curses-infobar.c gui-curses-input.c gui-curses-keyboard.c gui-curses-main.c +gui-curses-nicklist.c gui-curses-status.c gui-curses-window.c gui-curses.h) SET(EXECUTABLE weechat-curses) diff --git a/src/gui/curses/Makefile.am b/src/gui/curses/Makefile.am index 614295899..b936c6c07 100644 --- a/src/gui/curses/Makefile.am +++ b/src/gui/curses/Makefile.am @@ -37,7 +37,8 @@ weechat_curses_LDADD = ../../core/weechat.o \ $(PLUGINS_LFLAGS) \ $(NCURSES_LFLAGS) -weechat_curses_SOURCES = gui-curses-chat.c \ +weechat_curses_SOURCES = gui-curses-bar.c \ + gui-curses-chat.c \ gui-curses-color.c \ gui-curses-infobar.c \ gui-curses-input.c \ diff --git a/src/gui/curses/gui-curses-bar.c b/src/gui/curses/gui-curses-bar.c new file mode 100644 index 000000000..24b350804 --- /dev/null +++ b/src/gui/curses/gui-curses-bar.c @@ -0,0 +1,399 @@ +/* + * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* gui-curses-bar.c: bar functions for Curses GUI */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <string.h> +#include <ctype.h> + +#include "../../core/weechat.h" +#include "../../core/wee-log.h" +#include "../gui-bar.h" +#include "../gui-bar-item.h" +#include "../gui-chat.h" +#include "../gui-color.h" +#include "../gui-window.h" +#include "gui-curses.h" + + +/* + * gui_bar_window_get_size: get total bar size (window bars) for a position + * bar is optional, if not NULL, size is computed + * from bar 1 to bar # - 1 + */ + +int +gui_bar_window_get_size (struct t_gui_bar *bar, struct t_gui_window *window, + int position) +{ + struct t_gui_bar_window *ptr_bar_window; + int total_size; + + total_size = 0; + for (ptr_bar_window = GUI_CURSES(window)->bar_windows; ptr_bar_window; + ptr_bar_window = ptr_bar_window->next_bar_window) + { + /* stop before bar */ + if (bar && (ptr_bar_window->bar == bar)) + return total_size; + + if ((ptr_bar_window->bar->type != GUI_BAR_TYPE_ROOT) + && (ptr_bar_window->bar->position == position)) + { + switch (position) + { + case GUI_BAR_POSITION_BOTTOM: + case GUI_BAR_POSITION_TOP: + total_size += ptr_bar_window->height; + break; + case GUI_BAR_POSITION_LEFT: + case GUI_BAR_POSITION_RIGHT: + total_size += ptr_bar_window->width; + break; + } + if (ptr_bar_window->bar->separator) + total_size++; + } + } + return total_size; +} + +/* + * gui_bar_window_calculate_pos_size: calculate position and size of a bar + */ + +void +gui_bar_window_calculate_pos_size (struct t_gui_bar_window *bar_window, + struct t_gui_window *window) +{ + int x1, y1, x2, y2; + int add_bottom, add_top, add_left, add_right; + + if (window) + { + x1 = window->win_x; + y1 = window->win_y + 1; + x2 = x1 + window->win_width - 1; + y2 = y1 + window->win_height - 1; + add_left = gui_bar_window_get_size (bar_window->bar, window, GUI_BAR_POSITION_LEFT); + add_right = gui_bar_window_get_size (bar_window->bar, window, GUI_BAR_POSITION_RIGHT); + add_top = gui_bar_window_get_size (bar_window->bar, window, GUI_BAR_POSITION_TOP); + add_bottom = gui_bar_window_get_size (bar_window->bar, window, GUI_BAR_POSITION_BOTTOM); + } + else + { + x1 = 0; + y1 = 0; + x2 = gui_window_get_width () - 1; + y2 = gui_window_get_height () - 1; + add_bottom = gui_bar_root_get_size (bar_window->bar, GUI_BAR_POSITION_BOTTOM); + add_top = gui_bar_root_get_size (bar_window->bar, GUI_BAR_POSITION_TOP); + add_left = gui_bar_root_get_size (bar_window->bar, GUI_BAR_POSITION_LEFT); + add_right = gui_bar_root_get_size (bar_window->bar, GUI_BAR_POSITION_RIGHT); + } + + switch (bar_window->bar->position) + { + case GUI_BAR_POSITION_BOTTOM: + bar_window->x = x1 + add_left; + bar_window->y = y2 - add_bottom - bar_window->bar->size + 1; + bar_window->width = x2 - add_right - x1 + 1; + bar_window->height = bar_window->bar->size - add_top - add_bottom; + break; + case GUI_BAR_POSITION_TOP: + bar_window->x = x1 + add_left; + bar_window->y = y1 + add_top; + bar_window->width = x2 - x1 + 1; + bar_window->height = bar_window->bar->size - add_left - add_right; + break; + case GUI_BAR_POSITION_LEFT: + bar_window->x = x1 + add_left; + bar_window->y = y1 + add_top; + bar_window->width = bar_window->bar->size - add_left - add_right; + bar_window->height = y2 - add_top - add_bottom - y1 + 1; + break; + case GUI_BAR_POSITION_RIGHT: + bar_window->x = x2 - add_right - bar_window->bar->size + 1; + bar_window->y = y1 + add_top; + bar_window->width = bar_window->bar->size - add_left - add_right; + bar_window->height = y2 - y1 + 1; + break; + } +} + +/* + * gui_bar_window_new: create a new "window bar" for a bar, in screen or a window + * if window is not NULL, bar window will be in this window + */ + +int +gui_bar_window_new (struct t_gui_bar *bar, struct t_gui_window *window) +{ + struct t_gui_bar_window *new_bar_window; + + new_bar_window = (struct t_gui_bar_window *) malloc (sizeof (struct t_gui_bar_window)); + if (new_bar_window) + { + new_bar_window->bar = bar; + if (window) + { + bar->bar_window = NULL; + new_bar_window->next_bar_window = GUI_CURSES(window)->bar_windows; + GUI_CURSES(window)->bar_windows = new_bar_window; + } + else + { + bar->bar_window = new_bar_window; + new_bar_window->next_bar_window = NULL; + } + + gui_bar_window_calculate_pos_size (new_bar_window, window); + + new_bar_window->win_bar = newwin (new_bar_window->height, + new_bar_window->width, + new_bar_window->y, + new_bar_window->x); + new_bar_window->win_separator = NULL; + if (new_bar_window->bar->separator) + { + switch (bar->position) + { + case GUI_BAR_POSITION_BOTTOM: + new_bar_window->win_separator = newwin (1, + new_bar_window->width, + new_bar_window->y - 1, + new_bar_window->x); + break; + case GUI_BAR_POSITION_TOP: + new_bar_window->win_separator = newwin (1, + new_bar_window->width, + new_bar_window->y + new_bar_window->height, + new_bar_window->x); + break; + case GUI_BAR_POSITION_LEFT: + new_bar_window->win_separator = newwin (new_bar_window->height, + 1, + new_bar_window->y, + new_bar_window->x + new_bar_window->width); + break; + case GUI_BAR_POSITION_RIGHT: + new_bar_window->win_separator = newwin (new_bar_window->height, + 1, + new_bar_window->y, + new_bar_window->x - 1); + break; + } + } + return 1; + } + + /* failed to create bar window */ + return 0; +} + +/* + * gui_bar_window_print: print text on a bar window + */ + +void +gui_bar_window_print (struct t_gui_bar_window *bar_win, char *text, + int *max_width) +{ + int weechat_color; + char str_color[3]; + + if ((bar_win->bar->position == GUI_BAR_POSITION_LEFT) + || (bar_win->bar->position == GUI_BAR_POSITION_RIGHT)) + gui_window_set_weechat_color (bar_win->win_bar, GUI_COLOR_CHAT); + else + gui_window_set_weechat_color (bar_win->win_bar, GUI_COLOR_STATUS); + + while (text && text[0]) + { + if (text[0] == GUI_COLOR_COLOR_CHAR) + { + text++; + if (isdigit (text[0]) && isdigit (text[1])) + { + str_color[0] = text[0]; + str_color[1] = text[1]; + str_color[2] = '\0'; + text += 2; + sscanf (str_color, "%d", &weechat_color); + gui_window_set_weechat_color (bar_win->win_bar, weechat_color); + } + } + else + { + wprintw (bar_win->win_bar, "%c", text[0]); + (*max_width)--; + text++; + } + } +} + +/* + * gui_bar_window_draw: draw a bar for a window + */ + +void +gui_bar_window_draw (struct t_gui_window *window, + struct t_gui_bar_window *bar_win) +{ + int i, max_width; + char *item_value; + struct t_gui_bar_item *ptr_item; + + if ((bar_win->bar->position == GUI_BAR_POSITION_LEFT) + || (bar_win->bar->position == GUI_BAR_POSITION_RIGHT)) + gui_window_curses_clear (bar_win->win_bar, GUI_COLOR_CHAT); + else + gui_window_curses_clear (bar_win->win_bar, GUI_COLOR_STATUS); + + max_width = bar_win->width; + + for (i = 0; i < bar_win->bar->items_count; i++) + { + ptr_item = gui_bar_item_search (bar_win->bar->items_array[i]); + if (ptr_item && ptr_item->build_callback) + { + item_value = (ptr_item->build_callback) (ptr_item->build_callback_data, + ptr_item, window, + max_width); + if (item_value) + { + if (item_value[0]) + { + gui_bar_window_print (bar_win, item_value, &max_width); + if (max_width < 0) + max_width = 0; + } + free (item_value); + } + } + } + + wnoutrefresh (bar_win->win_bar); + + if (bar_win->bar->separator) + { + switch (bar_win->bar->position) + { + case GUI_BAR_POSITION_BOTTOM: + gui_window_set_weechat_color (bar_win->win_separator, + GUI_COLOR_SEPARATOR); + mvwhline (bar_win->win_separator, 0, 0, ACS_HLINE, + bar_win->width); + break; + case GUI_BAR_POSITION_TOP: + gui_window_set_weechat_color (bar_win->win_separator, + GUI_COLOR_SEPARATOR); + mvwhline (bar_win->win_separator, 0, 0, ACS_HLINE, + bar_win->width); + break; + case GUI_BAR_POSITION_LEFT: + gui_window_set_weechat_color (bar_win->win_separator, + GUI_COLOR_SEPARATOR); + mvwvline (bar_win->win_separator, 0, 0, ACS_VLINE, + bar_win->height); + break; + case GUI_BAR_POSITION_RIGHT: + gui_window_set_weechat_color (bar_win->win_separator, + GUI_COLOR_SEPARATOR); + mvwvline (bar_win->win_separator, 0, 0, ACS_VLINE, + bar_win->height); + break; + } + wnoutrefresh (bar_win->win_separator); + } + + refresh (); +} + +/* + * gui_bar_draw: draw a bar + */ + +void +gui_bar_draw (struct t_gui_bar *bar) +{ + struct t_gui_window *ptr_win; + struct t_gui_bar_window *ptr_bar_win; + + if (bar->bar_window) + { + /* root bar */ + gui_bar_window_draw (NULL, bar->bar_window); + } + else + { + /* bar on each window */ + for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) + { + for (ptr_bar_win = GUI_CURSES(ptr_win)->bar_windows; ptr_bar_win; + ptr_bar_win = ptr_bar_win->next_bar_window) + { + if (ptr_bar_win->bar == bar) + { + gui_bar_window_draw (ptr_win, ptr_bar_win); + } + } + } + } +} + +/* + * gui_bar_window_free: delete a bar window + */ + +void +gui_bar_window_free (struct t_gui_bar_window *bar_window) +{ + /* delete Curses windows */ + if (bar_window->win_bar) + delwin (bar_window->win_bar); + if (bar_window->win_separator) + delwin (bar_window->win_separator); + + /* free bar window */ + free (bar_window); +} + +/* + * gui_bar_window_print_log: print bar window infos in log (usually for crash dump) + */ + +void +gui_bar_window_print_log (struct t_gui_bar_window *bar_window) +{ + log_printf (""); + log_printf (" [window bar (addr:0x%x)]", bar_window); + log_printf (" bar . . . . . . . : 0x%x", bar_window->bar); + log_printf (" x . . . . . . . . : %d", bar_window->x); + log_printf (" y . . . . . . . . : %d", bar_window->y); + log_printf (" width . . . . . . : %d", bar_window->width); + log_printf (" height. . . . . . : %d", bar_window->height); + log_printf (" win_bar . . . . . : 0x%x", bar_window->win_bar); + log_printf (" win_separator . . : 0x%x", bar_window->win_separator); +} diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c index 2aafcb706..081bb7ffa 100644 --- a/src/gui/curses/gui-curses-chat.c +++ b/src/gui/curses/gui-curses-chat.c @@ -29,8 +29,10 @@ #include "../../core/weechat.h" #include "../../core/wee-config.h" +#include "../../core/wee-hook.h" #include "../../core/wee-string.h" #include "../../core/wee-utf8.h" +#include "../../plugins/plugin.h" #include "../gui-buffer.h" #include "../gui-chat.h" #include "../gui-color.h" @@ -963,7 +965,7 @@ gui_chat_draw (struct t_gui_buffer *buffer, int erase) struct t_gui_line *ptr_line; /*t_irc_dcc *dcc_first, *dcc_selected, *ptr_dcc;*/ char format_empty[32]; - int i, line_pos, count; + int i, line_pos, count, old_scroll; /*int j, num_bars; unsigned long pct_complete; char *unit_name[] = { N_("bytes"), N_("KB"), N_("MB"), N_("GB") }; @@ -1173,6 +1175,8 @@ gui_chat_draw (struct t_gui_buffer *buffer, int erase) ptr_line = ptr_line->next_line; } + old_scroll = ptr_win->scroll; + ptr_win->scroll = (ptr_win->win_chat_cursor_y > ptr_win->win_chat_height - 1); /* check if last line of buffer is entirely displayed and scrolling */ @@ -1183,6 +1187,12 @@ gui_chat_draw (struct t_gui_buffer *buffer, int erase) ptr_win->scroll = 0; } + if (ptr_win->scroll != old_scroll) + { + hook_signal_send ("window_scrolled", + WEECHAT_HOOK_SIGNAL_POINTER, ptr_win); + } + if (!ptr_win->scroll && (ptr_win->start_line == ptr_win->buffer->lines)) { ptr_win->start_line = NULL; diff --git a/src/gui/curses/gui-curses-color.c b/src/gui/curses/gui-curses-color.c index 325255c67..a642cfebf 100644 --- a/src/gui/curses/gui-curses-color.c +++ b/src/gui/curses/gui-curses-color.c @@ -345,7 +345,7 @@ gui_color_init_weechat () { int i; - gui_color[GUI_COLOR_SEPARATOR] = gui_color_build (GUI_COLOR_SEPARATOR, CONFIG_COLOR(config_color_separator), CONFIG_COLOR(config_color_separator)); + gui_color[GUI_COLOR_SEPARATOR] = gui_color_build (GUI_COLOR_SEPARATOR, CONFIG_COLOR(config_color_separator), CONFIG_COLOR(config_color_chat_bg)); gui_color[GUI_COLOR_TITLE] = gui_color_build (GUI_COLOR_TITLE, CONFIG_COLOR(config_color_title), CONFIG_COLOR(config_color_title_bg)); gui_color[GUI_COLOR_TITLE_MORE] = gui_color_build (GUI_COLOR_TITLE_MORE, CONFIG_COLOR(config_color_title_more), CONFIG_COLOR(config_color_title_bg)); @@ -378,8 +378,8 @@ gui_color_init_weechat () gui_color[GUI_COLOR_STATUS] = gui_color_build (GUI_COLOR_STATUS, CONFIG_COLOR(config_color_status), CONFIG_COLOR(config_color_status_bg)); gui_color[GUI_COLOR_STATUS_DELIMITERS] = gui_color_build (GUI_COLOR_STATUS_DELIMITERS, CONFIG_COLOR(config_color_status_delimiters), CONFIG_COLOR(config_color_status_bg)); - gui_color[GUI_COLOR_STATUS_NUMBER] = gui_color_build (GUI_COLOR_STATUS_NAME, CONFIG_COLOR(config_color_status_number), CONFIG_COLOR(config_color_status_bg)); - gui_color[GUI_COLOR_STATUS_CATEGORY] = gui_color_build (GUI_COLOR_STATUS_NAME, CONFIG_COLOR(config_color_status_category), CONFIG_COLOR(config_color_status_bg)); + gui_color[GUI_COLOR_STATUS_NUMBER] = gui_color_build (GUI_COLOR_STATUS_NUMBER, CONFIG_COLOR(config_color_status_number), CONFIG_COLOR(config_color_status_bg)); + gui_color[GUI_COLOR_STATUS_CATEGORY] = gui_color_build (GUI_COLOR_STATUS_CATEGORY, CONFIG_COLOR(config_color_status_category), CONFIG_COLOR(config_color_status_bg)); gui_color[GUI_COLOR_STATUS_NAME] = gui_color_build (GUI_COLOR_STATUS_NAME, CONFIG_COLOR(config_color_status_name), CONFIG_COLOR(config_color_status_bg)); gui_color[GUI_COLOR_STATUS_DATA_MSG] = gui_color_build (GUI_COLOR_STATUS_DATA_MSG, CONFIG_COLOR(config_color_status_data_msg), CONFIG_COLOR(config_color_status_bg)); gui_color[GUI_COLOR_STATUS_DATA_PRIVATE] = gui_color_build (GUI_COLOR_STATUS_DATA_PRIVATE, CONFIG_COLOR(config_color_status_data_private), CONFIG_COLOR(config_color_status_bg)); diff --git a/src/gui/curses/gui-curses-main.c b/src/gui/curses/gui-curses-main.c index d2230e3dd..62ca654fa 100644 --- a/src/gui/curses/gui-curses-main.c +++ b/src/gui/curses/gui-curses-main.c @@ -38,6 +38,7 @@ #include "../../core/wee-util.h" #include "../../plugins/plugin.h" #include "../gui-main.h" +#include "../gui-bar-item.h" #include "../gui-buffer.h" #include "../gui-chat.h" #include "../gui-color.h" @@ -97,7 +98,10 @@ gui_main_init () /* get time length */ gui_chat_time_length = util_get_time_length (CONFIG_STRING(config_look_buffer_time_format)); - + + /* init bar items */ + gui_bar_item_init (); + /* create new window/buffer */ if (gui_window_new (NULL, 0, 0, COLS, LINES, 100, 100)) { @@ -243,6 +247,9 @@ gui_main_loop () void gui_main_end () { + /* remove bar items */ + gui_bar_item_end (); + /* free clipboard buffer */ if (gui_input_clipboard) free (gui_input_clipboard); diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c index 2fe2036ec..89f6a3087 100644 --- a/src/gui/curses/gui-curses-window.c +++ b/src/gui/curses/gui-curses-window.c @@ -31,6 +31,7 @@ #include "../../core/wee-log.h" #include "../../core/wee-string.h" #include "../gui-window.h" +#include "../gui-bar.h" #include "../gui-buffer.h" #include "../gui-chat.h" #include "../gui-color.h" @@ -82,6 +83,7 @@ gui_window_objects_init (struct t_gui_window *window) GUI_CURSES(window)->win_infobar = NULL; GUI_CURSES(window)->win_input = NULL; GUI_CURSES(window)->win_separator = NULL; + GUI_CURSES(window)->bar_windows = NULL; return 1; } else @@ -192,10 +194,16 @@ int gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) { int max_length, max_height, lines, width_used; + int add_top, add_bottom, add_left, add_right; if (!gui_ok) return 0; + add_bottom = gui_bar_window_get_size (NULL, window, GUI_BAR_POSITION_BOTTOM); + add_top = gui_bar_window_get_size (NULL, window, GUI_BAR_POSITION_TOP); + add_left = gui_bar_window_get_size (NULL, window, GUI_BAR_POSITION_LEFT); + add_right = gui_bar_window_get_size (NULL, window, GUI_BAR_POSITION_RIGHT); + /* init chat & nicklist settings */ if (window->buffer->nicklist) { @@ -219,7 +227,8 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) } else { - width_used = window->win_width - (window->win_width % (max_length + 2)); + width_used = (window->win_width - add_left - add_right) + - ((window->win_width - add_left - add_right) % (max_length + 2)); if (((max_length + 2) * window->buffer->nicklist_visible_count) % width_used == 0) lines = ((max_length + 2) * window->buffer->nicklist_visible_count) / width_used; else @@ -231,8 +240,8 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) && (lines < CONFIG_INTEGER(config_look_nicklist_min_size))) lines = CONFIG_INTEGER(config_look_nicklist_min_size); max_height = (CONFIG_BOOLEAN(config_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 @@ -244,85 +253,84 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) switch (CONFIG_INTEGER(config_look_nicklist_position)) { case CONFIG_LOOK_NICKLIST_LEFT: - window->win_chat_x = window->win_x + max_length + + window->win_chat_x = window->win_x + add_left + max_length + ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); - window->win_chat_y = window->win_y + 1; + window->win_chat_y = window->win_y + add_top + 1; window->win_chat_width = window->win_width - max_length - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); - window->win_nick_x = window->win_x + 0; - window->win_nick_y = window->win_y + 1; + 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 + ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); if (CONFIG_BOOLEAN(config_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 CONFIG_LOOK_NICKLIST_RIGHT: - window->win_chat_x = window->win_x; - window->win_chat_y = window->win_y + 1; - window->win_chat_width = window->win_width - max_length - + window->win_chat_x = window->win_x + add_left; + window->win_chat_y = window->win_y + add_top + 1; + window->win_chat_width = window->win_width - add_left - add_right - max_length - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); - window->win_nick_x = window->win_x + window->win_width - - max_length - + window->win_nick_x = window->win_x + window->win_width - add_right - max_length - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); - window->win_nick_y = window->win_y + 1; + window->win_nick_y = window->win_y + add_top + 1; window->win_nick_width = max_length + ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); if (CONFIG_BOOLEAN(config_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 CONFIG_LOOK_NICKLIST_TOP: - window->win_chat_x = window->win_x; - window->win_chat_y = window->win_y + 1 + lines + + window->win_chat_x = window->win_x + add_left; + window->win_chat_y = window->win_y + add_top + 1 + lines + ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); - window->win_chat_width = window->win_width; + window->win_chat_width = window->win_width - add_left - add_right; if (CONFIG_BOOLEAN(config_look_infobar)) - window->win_chat_height = window->win_height - 3 - lines - + window->win_chat_height = window->win_height - add_top - add_bottom - 3 - lines - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0) - 1; else - window->win_chat_height = window->win_height - 3 - lines - + window->win_chat_height = window->win_height - add_top - add_bottom - 3 - lines - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); - window->win_nick_x = window->win_x; - window->win_nick_y = window->win_y + 1; - window->win_nick_width = window->win_width; + 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 + ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); window->win_nick_num_max = lines * (window->win_nick_width / (max_length + 1)); break; case CONFIG_LOOK_NICKLIST_BOTTOM: - window->win_chat_x = window->win_x; - window->win_chat_y = window->win_y + 1; - window->win_chat_width = window->win_width; + window->win_chat_x = window->win_x + add_left; + window->win_chat_y = window->win_y + add_top + 1; + window->win_chat_width = window->win_width - add_left - add_right; if (CONFIG_BOOLEAN(config_look_infobar)) - window->win_chat_height = window->win_height - 3 - lines - + window->win_chat_height = window->win_height - add_top - add_bottom - 3 - lines - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0) - 1; else - window->win_chat_height = window->win_height - 3 - lines - + window->win_chat_height = window->win_height - add_top - add_bottom - 3 - lines - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); window->win_nick_x = window->win_x; if (CONFIG_BOOLEAN(config_look_infobar)) - window->win_nick_y = window->win_y + window->win_height - + window->win_nick_y = window->win_y + window->win_height - add_bottom - 2 - lines - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0) - 1; else - window->win_nick_y = window->win_y + window->win_height - + window->win_nick_y = window->win_y + window->win_height - add_bottom - 2 - lines - ((CONFIG_BOOLEAN(config_look_nicklist_separator)) ? 1 : 0); window->win_nick_width = window->win_width; @@ -332,20 +340,20 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) 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; - window->win_chat_y = window->win_y + 1; - window->win_chat_width = window->win_width; + window->win_chat_x = window->win_x + add_left; + window->win_chat_y = window->win_y + add_top + 1; + window->win_chat_width = window->win_width - add_left - add_right; if (CONFIG_BOOLEAN(config_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_cursor_x = window->win_x; - window->win_chat_cursor_y = window->win_y; + 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 + add_top; window->win_nick_x = -1; window->win_nick_y = -1; window->win_nick_width = -1; @@ -354,26 +362,26 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) } /* 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_x = window->win_x + add_left; + window->win_title_y = window->win_y + add_top; + window->win_title_width = window->win_width - add_left - add_right; window->win_title_height = 1; /* status window */ - window->win_status_x = window->win_x; + window->win_status_x = window->win_x + add_left; if (CONFIG_BOOLEAN(config_look_infobar)) - window->win_status_y = window->win_y + window->win_height - 3; + window->win_status_y = window->win_y + window->win_height - add_bottom - 3; else - window->win_status_y = window->win_y + window->win_height - 2; - window->win_status_width = window->win_width; + window->win_status_y = window->win_y + window->win_height - add_bottom - 2; + window->win_status_width = window->win_width - add_left - add_right; window->win_status_height = 1; /* infobar window */ if (CONFIG_BOOLEAN(config_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_x = window->win_x + add_left; + window->win_infobar_y = window->win_y + window->win_height - add_bottom - 2; + window->win_infobar_width = window->win_width - add_left - add_right; window->win_infobar_height = 1; } else @@ -385,9 +393,9 @@ gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate) } /* 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_x = window->win_x + add_left; + window->win_input_y = window->win_y + window->win_height - add_bottom - 1; + window->win_input_width = window->win_width - add_left - add_right; window->win_input_height = 1; return 1; @@ -403,7 +411,7 @@ gui_window_draw_separator (struct t_gui_window *window) if (GUI_CURSES(window)->win_separator) delwin (GUI_CURSES(window)->win_separator); - if (window->win_x > 0) + if (window->win_x > gui_bar_root_get_size (NULL, GUI_BAR_POSITION_LEFT)) { GUI_CURSES(window)->win_separator = newwin (window->win_height, 1, @@ -411,8 +419,8 @@ gui_window_draw_separator (struct t_gui_window *window) window->win_x - 1); gui_window_set_weechat_color (GUI_CURSES(window)->win_separator, GUI_COLOR_SEPARATOR); - wborder (GUI_CURSES(window)->win_separator, - ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '); + mvwvline (GUI_CURSES(window)->win_separator, 0, 0, ACS_VLINE, + window->win_height); wnoutrefresh (GUI_CURSES(window)->win_separator); refresh (); } @@ -928,15 +936,32 @@ gui_window_refresh_windows () { struct t_gui_window *ptr_win, *old_current_window; struct t_gui_buffer *ptr_buffer; + struct t_gui_bar *ptr_bar; + int add_bottom, add_top, add_left, add_right; if (!gui_ok) return; old_current_window = gui_current_window; + + for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) + { + if (ptr_bar->type == GUI_BAR_TYPE_ROOT) + { + gui_bar_window_calculate_pos_size (ptr_bar->bar_window, NULL); + gui_bar_draw (ptr_bar); + } + } + + add_bottom = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_BOTTOM); + add_top = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_TOP); + add_left = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_LEFT); + add_right = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_RIGHT); - if (gui_window_auto_resize (gui_windows_tree, 0, 0, - gui_window_get_width (), - gui_window_get_height (), 0) < 0) + if (gui_window_auto_resize (gui_windows_tree, add_left, add_top, + gui_window_get_width () - add_left - add_right, + gui_window_get_height () - add_top - add_bottom, + 0) < 0) gui_window_merge_all (gui_current_window); for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) @@ -1048,7 +1073,7 @@ void gui_window_resize (struct t_gui_window *window, int pourcentage) { struct t_gui_window_tree *parent; - int old_split_pct; + int old_split_pct, add_bottom, add_top, add_left, add_right; if (!gui_ok) return; @@ -1062,9 +1087,16 @@ gui_window_resize (struct t_gui_window *window, int pourcentage) parent->split_pct = pourcentage; else parent->split_pct = 100 - pourcentage; - if (gui_window_auto_resize (gui_windows_tree, 0, 0, - gui_window_get_width (), - gui_window_get_height (), 1) < 0) + + add_bottom = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_BOTTOM); + add_top = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_TOP); + add_left = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_LEFT); + add_right = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_RIGHT); + + if (gui_window_auto_resize (gui_windows_tree, add_left, add_top, + gui_window_get_width () - add_left - add_right, + gui_window_get_height () - add_top - add_bottom, + 1) < 0) parent->split_pct = old_split_pct; else gui_window_refresh_windows (); @@ -1126,7 +1158,7 @@ gui_window_merge (struct t_gui_window *window) void gui_window_merge_all (struct t_gui_window *window) { - int num_deleted; + int num_deleted, add_bottom, add_top, add_left, add_right; if (!gui_ok) return; @@ -1143,12 +1175,19 @@ gui_window_merge_all (struct t_gui_window *window) gui_window_tree_free (&gui_windows_tree); gui_window_tree_init (window); window->ptr_tree = gui_windows_tree; - window->win_x = 0; - window->win_y = 0; - window->win_width = gui_window_get_width (); - window->win_height = gui_window_get_height (); + + add_bottom = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_BOTTOM); + add_top = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_TOP); + add_left = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_LEFT); + add_right = gui_bar_root_get_size (NULL, GUI_BAR_POSITION_RIGHT); + window->win_x = add_left; + window->win_y = add_top; + window->win_width = gui_window_get_width () - add_left - add_right; + window->win_height = gui_window_get_height () - add_top - add_bottom; + window->win_width_pct = 100; window->win_height_pct = 100; + gui_current_window = window; gui_window_switch_to_buffer (window, window->buffer); gui_window_redraw_buffer (window->buffer); @@ -1450,6 +1489,9 @@ gui_window_title_reset () void gui_window_objects_print_log (struct t_gui_window *window) { + struct t_gui_bar_window *ptr_bar_win; + + log_printf (""); log_printf (" win_title . . . . . : 0x%x", GUI_CURSES(window)->win_title); log_printf (" win_chat. . . . . . : 0x%x", GUI_CURSES(window)->win_chat); log_printf (" win_nick. . . . . . : 0x%x", GUI_CURSES(window)->win_nick); @@ -1457,4 +1499,10 @@ gui_window_objects_print_log (struct t_gui_window *window) log_printf (" win_infobar . . . . : 0x%x", GUI_CURSES(window)->win_infobar); log_printf (" win_input . . . . . : 0x%x", GUI_CURSES(window)->win_input); log_printf (" win_separator . . . : 0x%x", GUI_CURSES(window)->win_separator); + + for (ptr_bar_win = GUI_CURSES(window)->bar_windows; ptr_bar_win; + ptr_bar_win = ptr_bar_win->next_bar_window) + { + gui_bar_window_print_log (ptr_bar_win); + } } diff --git a/src/gui/curses/gui-curses.h b/src/gui/curses/gui-curses.h index 2dc52e34c..5a194f88a 100644 --- a/src/gui/curses/gui-curses.h +++ b/src/gui/curses/gui-curses.h @@ -33,6 +33,18 @@ #define GUI_CURSES(window) ((t_gui_curses_objects *)(window->gui_objects)) +struct t_gui_bar_window +{ + struct t_gui_bar *bar; /* pointer to bar */ + int x, y; /* position of window */ + int width, height; /* window size */ + WINDOW *win_bar; /* bar Curses window */ + WINDOW *win_separator; /* separator (optional) */ + struct t_gui_bar_window *next_bar_window; + /* link to next bar window */ + /* (only used if bar is in windows) */ +}; + typedef struct t_gui_curses_objects t_gui_curses_objects; struct t_gui_curses_objects @@ -44,6 +56,7 @@ struct t_gui_curses_objects WINDOW *win_infobar; /* info bar window */ WINDOW *win_input; /* input window */ WINDOW *win_separator; /* separation between 2 splited (V) win */ + struct t_gui_bar_window *bar_windows; /* bar windows */ }; extern struct t_gui_color gui_weechat_colors[]; @@ -52,6 +65,10 @@ extern struct t_gui_color gui_weechat_colors[]; extern int gui_color_get_pair (int num_color); extern void gui_color_init (); +/* bar functions */ +extern void gui_bar_window_calculate_pos_size (struct t_gui_bar_window *bar_window, + struct t_gui_window *window); + /* chat functions */ extern void gui_chat_calculate_line_diff (struct t_gui_window *window, struct t_gui_line **line, diff --git a/src/gui/gtk/CMakeLists.txt b/src/gui/gtk/CMakeLists.txt index 9bb081098..5d5ec2315 100644 --- a/src/gui/gtk/CMakeLists.txt +++ b/src/gui/gtk/CMakeLists.txt @@ -14,9 +14,9 @@ # along with this program. If not, see <http://www.gnu.org/licenses/>. # -SET(WEECHAT_GTK_SRC gui-gtk-chat.c gui-gtk-color.c gui-gtk-infobar.c -gui-gtk-input.c gui-gtk-keyboard.c gui-gtk-main.c gui-gtk-nicklist.c -gui-gtk-status.c gui-gtk-window.c gui-gtk.h) +SET(WEECHAT_GTK_SRC gui-gtk-bar.c gui-gtk-chat.c gui-gtk-color.c +gui-gtk-infobar.c gui-gtk-input.c gui-gtk-keyboard.c gui-gtk-main.c +gui-gtk-nicklist.c gui-gtk-status.c gui-gtk-window.c gui-gtk.h) SET(EXECUTABLE weechat-gtk) diff --git a/src/gui/gtk/Makefile.am b/src/gui/gtk/Makefile.am index 6d58071c3..4fcc6424c 100644 --- a/src/gui/gtk/Makefile.am +++ b/src/gui/gtk/Makefile.am @@ -37,7 +37,8 @@ weechat_gtk_LDADD = ../../core/weechat.o \ $(PLUGINS_LFLAGS) \ $(GTK_LFLAGS) -weechat_gtk_SOURCES = gui-gtk-chat.c \ +weechat_gtk_SOURCES = gui-gtk-bar.c \ + gui-gtk-chat.c \ gui-gtk-color.c \ gui-gtk-infobar.c \ gui-gtk-input.c \ diff --git a/src/gui/gtk/gui-gtk-bar.c b/src/gui/gtk/gui-gtk-bar.c new file mode 100644 index 000000000..6c726bc8a --- /dev/null +++ b/src/gui/gtk/gui-gtk-bar.c @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* gui-gtk-bar.c: bar functions for Gtk GUI */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> + +#include "../../core/weechat.h" +#include "../../core/wee-log.h" +#include "../gui-bar.h" +#include "../gui-chat.h" +#include "../gui-color.h" +#include "../gui-window.h" +#include "gui-gtk.h" + + +/* + * gui_bar_windows_get_size: get total bar size (window bars) for a position + * bar is optional, if not NULL, size is computed + * from bar 1 to bar # - 1 + */ + +int +gui_bar_window_get_size (struct t_gui_bar *bar, struct t_gui_window *window, + int position) +{ + (void) bar; + (void) window; + (void) position; + + /* TODO: write this function for Gtk */ + return 0; +} + +/* + * gui_bar_window_new: create a new "window bar" for a bar, in screen or a window + * if window is not NULL, bar window will be in this window + */ + +int +gui_bar_window_new (struct t_gui_bar *bar, struct t_gui_window *window) +{ + (void) bar; + (void) window; + + /* TODO: write this function for Gtk */ + return 0; +} + +/* + * gui_bar_draw: draw a bar + */ + +void +gui_bar_draw (struct t_gui_bar *bar) +{ + (void) bar; + + /* TODO: write this function for Gtk */ +} + +/* + * gui_bar_window_free: delete an bar window + */ + +void +gui_bar_window_free (struct t_gui_bar_window *bar_window) +{ + /* TODO: complete this function for Gtk */ + + /* free bar window */ + free (bar_window); +} + +/* + * gui_bar_window_print_log: print bar window infos in log (usually for crash dump) + */ + +void +gui_bar_window_print_log (struct t_gui_bar_window *bar_window) +{ + log_printf (""); + log_printf (" [window bar (addr:0x%x)]", bar_window); + log_printf (" bar . . . . . . . : 0x%x", bar_window->bar); + log_printf (" x . . . . . . . . : %d", bar_window->x); + log_printf (" y . . . . . . . . : %d", bar_window->y); + log_printf (" width . . . . . . : %d", bar_window->width); + log_printf (" height. . . . . . : %d", bar_window->height); +} diff --git a/src/gui/gtk/gui-gtk-window.c b/src/gui/gtk/gui-gtk-window.c index 12526333c..8f22655a8 100644 --- a/src/gui/gtk/gui-gtk-window.c +++ b/src/gui/gtk/gui-gtk-window.c @@ -76,6 +76,7 @@ gui_window_objects_init (struct t_gui_window *window) GUI_GTK(window)->texttag_chat = NULL; GUI_GTK(window)->textview_nicklist = NULL; GUI_GTK(window)->textbuffer_nicklist = NULL; + GUI_GTK(window)->bar_windows = NULL; return 1; } else @@ -919,9 +920,23 @@ gui_window_title_reset () void gui_window_objects_print_log (struct t_gui_window *window) { + struct t_gui_bar_window *ptr_bar_win; + log_printf (" textview_chat . . . : 0x%x", GUI_GTK(window)->textview_chat); log_printf (" textbuffer_chat . . : 0x%x", GUI_GTK(window)->textbuffer_chat); log_printf (" texttag_chat. . . . : 0x%x", GUI_GTK(window)->texttag_chat); log_printf (" textview_nicklist . : 0x%x", GUI_GTK(window)->textview_nicklist); log_printf (" textbuffer_nicklist : 0x%x", GUI_GTK(window)->textbuffer_nicklist); + + for (ptr_bar_win = GUI_GTK(window)->bar_windows; ptr_bar_win; + ptr_bar_win = ptr_bar_win->next_bar_window) + { + log_printf (""); + log_printf (" [window bar (addr:0x%x)]", ptr_bar_win); + log_printf (" bar . . . . . . . : 0x%x", ptr_bar_win->bar); + log_printf (" x . . . . . . . . : %d", ptr_bar_win->x); + log_printf (" y . . . . . . . . : %d", ptr_bar_win->y); + log_printf (" width . . . . . . : %d", ptr_bar_win->width); + log_printf (" height. . . . . . : %d", ptr_bar_win->height); + } } diff --git a/src/gui/gtk/gui-gtk.h b/src/gui/gtk/gui-gtk.h index 6b6189ba0..8bedd73cf 100644 --- a/src/gui/gtk/gui-gtk.h +++ b/src/gui/gtk/gui-gtk.h @@ -54,6 +54,16 @@ struct t_gui_line; #define GUI_GTK(window) ((t_gui_gtk_objects *)(window->gui_objects)) +struct t_gui_bar_window +{ + struct t_gui_bar *bar; /* pointer to bar */ + int x, y; /* position of window */ + int width, height; /* window size */ + struct t_gui_bar_window *next_bar_window; + /* link to next bar window */ + /* (only used if bar is in windows) */ +}; + typedef struct t_gui_gtk_objects t_gui_gtk_objects; struct t_gui_gtk_objects @@ -63,6 +73,7 @@ struct t_gui_gtk_objects GtkTextTag *texttag_chat; /* texttag widget for chat */ GtkWidget *textview_nicklist; /* textview widget for nicklist */ GtkTextBuffer *textbuffer_nicklist; /* textbuffer widget for nicklist */ + struct t_gui_bar_window *bar_windows; /* bar windows */ }; //extern t_gui_color gui_weechat_colors[]; diff --git a/src/gui/gui-bar-item.c b/src/gui/gui-bar-item.c new file mode 100644 index 000000000..2239486ed --- /dev/null +++ b/src/gui/gui-bar-item.c @@ -0,0 +1,592 @@ +/* + * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* gui-bar-item.c: bar item functions, used by all GUI */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <string.h> + +#include "../core/weechat.h" +#include "../core/wee-config.h" +#include "../core/wee-hook.h" +#include "../core/wee-log.h" +#include "../core/wee-string.h" +#include "../plugins/plugin.h" +#include "gui-bar-item.h" +#include "gui-bar.h" +#include "gui-buffer.h" +#include "gui-color.h" +#include "gui-hotlist.h" +#include "gui-window.h" + + +struct t_gui_bar_item *gui_bar_items = NULL; /* first bar item */ +struct t_gui_bar_item *last_gui_bar_item = NULL; /* last bar item */ +char *gui_bar_item_names[GUI_BAR_NUM_ITEMS] = +{ "buffer_count", "buffer_plugin", "buffer_name", "nicklist_count", "scroll", + "hotlist" +}; +struct t_hook *gui_bar_item_hook1 = NULL; +struct t_hook *gui_bar_item_hook2 = NULL; +struct t_hook *gui_bar_item_hook3 = NULL; +struct t_hook *gui_bar_item_hook4 = NULL; +struct t_hook *gui_bar_item_hook5 = NULL; +struct t_hook *gui_bar_item_hook6 = NULL; +struct t_hook *gui_bar_item_hook7 = NULL; + + +/* + * gui_bar_item_search: search a bar item + */ + +struct t_gui_bar_item * +gui_bar_item_search (char *name) +{ + struct t_gui_bar_item *ptr_item; + + if (!name || !name[0]) + return NULL; + + for (ptr_item = gui_bar_items; ptr_item; ptr_item = ptr_item->next_item) + { + if (strcmp (ptr_item->name, name) == 0) + return ptr_item; + } + + /* bar item not found */ + return NULL; +} + +/* + * gui_bar_item_search_with_plugin: search a bar item for a plugin + */ + +struct t_gui_bar_item * +gui_bar_item_search_with_plugin (struct t_weechat_plugin *plugin, char *name) +{ + struct t_gui_bar_item *ptr_item; + + if (!name || !name[0]) + return NULL; + + for (ptr_item = gui_bar_items; ptr_item; ptr_item = ptr_item->next_item) + { + if ((ptr_item->plugin == plugin) + && (strcmp (ptr_item->name, name) == 0)) + return ptr_item; + } + + /* bar item not found */ + return NULL; +} + +/* + * gui_bar_item_new: create a new bar item + */ + +struct t_gui_bar_item * +gui_bar_item_new (struct t_weechat_plugin *plugin, char *name, + char *(*build_callback)(void *data, + struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width), + void *build_callback_data) +{ + struct t_gui_bar_item *new_bar_item; + + if (!name || !name[0]) + return NULL; + + /* it's not possible to create 2 bar items with same name for same plugin*/ + if (gui_bar_item_search_with_plugin (plugin, name)) + return NULL; + + /* create bar item */ + new_bar_item = (struct t_gui_bar_item *) malloc (sizeof (struct t_gui_bar_item)); + if (new_bar_item) + { + new_bar_item->plugin = plugin; + new_bar_item->name = strdup (name); + new_bar_item->build_callback = build_callback; + new_bar_item->build_callback_data = build_callback_data; + + /* add bar item to bar items queue */ + new_bar_item->prev_item = last_gui_bar_item; + if (gui_bar_items) + last_gui_bar_item->next_item = new_bar_item; + else + gui_bar_items = new_bar_item; + last_gui_bar_item = new_bar_item; + new_bar_item->next_item = NULL; + + return new_bar_item; + } + + /* failed to create bar item */ + return NULL; +} + +/* + * gui_bar_contains_item: return 1 if a bar contains item, O otherwise + */ + +int +gui_bar_contains_item (struct t_gui_bar *bar, char *name) +{ + int i; + + if (!bar || !name || !name[0]) + return 0; + + for (i = 0; i < bar->items_count; i++) + { + if (strcmp (bar->items_array[i], name) == 0) + return 1; + } + + /* item is not in bar */ + return 0; +} + +/* + * gui_bar_item_update: update an item on all bars displayed on screen + */ + +void +gui_bar_item_update (char *name) +{ + struct t_gui_bar *ptr_bar; + + for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) + { + if (gui_bar_contains_item (ptr_bar, name)) + gui_bar_draw (ptr_bar); + } +} + +/* + * gui_bar_item_free: delete a bar item + */ + +void +gui_bar_item_free (struct t_gui_bar_item *item) +{ + /* remove bar item from bar items list */ + if (item->prev_item) + item->prev_item->next_item = item->next_item; + if (item->next_item) + item->next_item->prev_item = item->prev_item; + if (gui_bar_items == item) + gui_bar_items = item->next_item; + if (last_gui_bar_item == item) + last_gui_bar_item = item->prev_item; + + /* free data */ + if (item->name) + free (item->name); + + free (item); +} + +/* + * gui_bar_item_free_all: delete all bar items + */ + +void +gui_bar_item_free_all () +{ + while (gui_bar_items) + { + gui_bar_item_free (gui_bar_items); + } +} + +/* + * gui_bar_item_free_all_plugin: delete all bar items for a plugin + */ + +void +gui_bar_item_free_all_plugin (struct t_weechat_plugin *plugin) +{ + struct t_gui_bar_item *ptr_item, *next_item; + + ptr_item = gui_bar_items; + while (ptr_item) + { + next_item = ptr_item->next_item; + + if (ptr_item->plugin == plugin) + gui_bar_item_free (ptr_item); + + ptr_item = next_item; + } +} + +/* + * gui_bar_item_default_buffer_count: default item for number of buffers + */ + +char * +gui_bar_item_default_buffer_count (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width) +{ + char buf[64]; + + /* make C compiler happy */ + (void) data; + (void) item; + (void) window; + (void) max_width; + + snprintf (buf, sizeof (buf), "%s[%s%d%s] ", + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS), + GUI_COLOR(GUI_COLOR_STATUS), + (last_gui_buffer) ? last_gui_buffer->number : 0, + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS)); + + return strdup (buf); +} + +/* + * gui_bar_item_default_buffer_plugin: default item for name of buffer plugin + */ + +char * +gui_bar_item_default_buffer_plugin (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width) +{ + char buf[64]; + + /* make C compiler happy */ + (void) data; + (void) item; + (void) max_width; + + if (!window) + return NULL; + + snprintf (buf, sizeof (buf), "%s[%s%s%s] ", + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS), + GUI_COLOR(GUI_COLOR_STATUS), + (window->buffer->plugin) ? window->buffer->plugin->name : "core", + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS)); + + return strdup (buf); +} + +/* + * gui_bar_item_default_buffer_name: default item for name of buffer + */ + +char * +gui_bar_item_default_buffer_name (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width) +{ + char buf[256]; + + /* make C compiler happy */ + (void) data; + (void) item; + (void) max_width; + + if (!window) + return NULL; + + snprintf (buf, sizeof (buf), "%s%d%s:%s%s%s/%s%s ", + GUI_COLOR(GUI_COLOR_STATUS_NUMBER), + window->buffer->number, + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS), + GUI_COLOR(GUI_COLOR_STATUS_CATEGORY), + window->buffer->category, + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS), + GUI_COLOR(GUI_COLOR_STATUS_NAME), + window->buffer->name); + + return strdup (buf); +} + +/* + * gui_bar_item_default_nicklist_count: default item for number of nicks in + * buffer nicklist + */ + +char * +gui_bar_item_default_nicklist_count (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width) +{ + char buf[64]; + + /* make C compiler happy */ + (void) data; + (void) item; + (void) max_width; + + if (!window || !window->buffer->nicklist) + return NULL; + + snprintf (buf, sizeof (buf), "%s[%s%d%s] ", + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS), + GUI_COLOR(GUI_COLOR_STATUS), + window->buffer->nicklist_visible_count, + GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS)); + + return strdup (buf); +} + +/* + * gui_bar_item_default_scroll: default item for scrolling indicator + */ + +char * +gui_bar_item_default_scroll (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width) +{ + char buf[64]; + + /* make C compiler happy */ + (void) data; + (void) item; + (void) max_width; + + if (!window || !window->scroll) + return NULL; + + snprintf (buf, sizeof (buf), "%s%s ", + GUI_COLOR(GUI_COLOR_STATUS_MORE), + _("(MORE)")); + + return strdup (buf); +} + +/* + * gui_bar_item_default_hotlist: default item for hotlist + */ + +char * +gui_bar_item_default_hotlist (void *data, struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width) +{ + char buf[1024], format[32]; + struct t_gui_hotlist *ptr_hotlist; + int names_count, display_name; + + /* make C compiler happy */ + (void) data; + (void) item; + (void) window; + (void) max_width; + + if (!gui_hotlist) + return NULL; + + buf[0] = '\0'; + + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS)); + strcat (buf, "["); + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS)); + strcat (buf, _("Act: ")); + + names_count = 0; + for (ptr_hotlist = gui_hotlist; ptr_hotlist; + ptr_hotlist = ptr_hotlist->next_hotlist) + { + switch (ptr_hotlist->priority) + { + case GUI_HOTLIST_LOW: + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_OTHER)); + display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 1) != 0); + break; + case GUI_HOTLIST_MESSAGE: + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_MSG)); + display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 2) != 0); + break; + case GUI_HOTLIST_PRIVATE: + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_PRIVATE)); + display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 4) != 0); + break; + case GUI_HOTLIST_HIGHLIGHT: + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DATA_HIGHLIGHT)); + display_name = ((CONFIG_INTEGER(config_look_hotlist_names_level) & 8) != 0); + break; + default: + display_name = 0; + break; + } + + sprintf (buf + strlen (buf), "%d", ptr_hotlist->buffer->number); + + if (display_name + && (CONFIG_INTEGER(config_look_hotlist_names_count) != 0) + && (names_count < CONFIG_INTEGER(config_look_hotlist_names_count))) + { + names_count++; + + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS)); + strcat (buf, ":"); + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS)); + if (CONFIG_INTEGER(config_look_hotlist_names_length) == 0) + snprintf (format, sizeof (format) - 1, "%%s"); + else + snprintf (format, sizeof (format) - 1, + "%%.%ds", + CONFIG_INTEGER(config_look_hotlist_names_length)); + sprintf (buf + strlen (buf), format, ptr_hotlist->buffer->name); + } + + if (ptr_hotlist->next_hotlist) + strcat (buf, ","); + + if (strlen (buf) > sizeof (buf) - 32) + break; + } + strcat (buf, GUI_COLOR(GUI_COLOR_STATUS_DELIMITERS)); + strcat (buf, "] "); + + return strdup (buf); +} + +/* + * gui_bar_item_signal_cb: callback when a signal is received, for rebuilding + * an item + */ + +int +gui_bar_item_signal_cb (void *data, char *signal, + char *type_data, void *signal_data) +{ + /* make C compiler happy */ + (void) signal; + (void) type_data; + (void) signal_data; + + gui_bar_item_update ((char *)data); + + return WEECHAT_RC_OK; +} + +/* + * gui_bar_item_init: init default items in WeeChat + */ + +void +gui_bar_item_init () +{ + /* buffer count */ + gui_bar_item_new (NULL, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT], + &gui_bar_item_default_buffer_count, NULL); + gui_bar_item_hook1 = hook_signal (NULL, "buffer_open", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT]); + gui_bar_item_hook2 = hook_signal (NULL, "buffer_closed", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT]); + + /* buffer plugin */ + gui_bar_item_new (NULL, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_PLUGIN], + &gui_bar_item_default_buffer_plugin, NULL); + + /* buffer name */ + gui_bar_item_new (NULL, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_NAME], + &gui_bar_item_default_buffer_name, NULL); + gui_bar_item_hook3 = hook_signal (NULL, "buffer_renamed", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_NAME]); + gui_bar_item_hook4 = hook_signal (NULL, "buffer_moved", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_BUFFER_NAME]); + + /* nicklist count */ + gui_bar_item_new (NULL, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_NICKLIST_COUNT], + &gui_bar_item_default_nicklist_count, NULL); + gui_bar_item_hook5 = hook_signal (NULL, "nicklist_changed", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_NICKLIST_COUNT]); + + /* scroll indicator */ + gui_bar_item_new (NULL, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_SCROLL], + &gui_bar_item_default_scroll, NULL); + gui_bar_item_hook6 = hook_signal (NULL, "window_scrolled", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_SCROLL]); + + /* hotlist */ + gui_bar_item_new (NULL, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_HOTLIST], + &gui_bar_item_default_hotlist, NULL); + gui_bar_item_hook7 = hook_signal (NULL, "hotlist_changed", + &gui_bar_item_signal_cb, + gui_bar_item_names[GUI_BAR_ITEM_WEECHAT_HOTLIST]); +} + +/* + * gui_bar_item_end: remove bar items and hooks + */ + +void +gui_bar_item_end () +{ + /* remove hooks */ + unhook (gui_bar_item_hook1); + unhook (gui_bar_item_hook2); + unhook (gui_bar_item_hook3); + unhook (gui_bar_item_hook4); + unhook (gui_bar_item_hook5); + unhook (gui_bar_item_hook6); + unhook (gui_bar_item_hook7); + + /* remove bar items */ + gui_bar_item_free_all (); +} + +/* + * gui_bar_item_print_log: print bar items infos in log (usually for crash dump) + */ + +void +gui_bar_item_print_log () +{ + struct t_gui_bar_item *ptr_item; + + for (ptr_item = gui_bar_items; ptr_item; ptr_item = ptr_item->next_item) + { + log_printf (""); + log_printf ("[bar item (addr:0x%x)]", ptr_item); + log_printf (" plugin . . . . . . . . : 0x%x", ptr_item->plugin); + log_printf (" name . . . . . . . . . : '%s'", ptr_item->name); + log_printf (" build_callback . . . . : 0x%x", ptr_item->build_callback); + log_printf (" build_callback_data. . : 0x%x", ptr_item->build_callback_data); + log_printf (" prev_item. . . . . . . : 0x%x", ptr_item->prev_item); + log_printf (" next_item. . . . . . . : 0x%x", ptr_item->next_item); + } +} diff --git a/src/gui/gui-bar-item.h b/src/gui/gui-bar-item.h new file mode 100644 index 000000000..5f5dfec7c --- /dev/null +++ b/src/gui/gui-bar-item.h @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef __WEECHAT_GUI_BAR_ITEM_H +#define __WEECHAT_GUI_BAR_ITEM_H 1 + +enum t_gui_bar_item_weechat +{ + GUI_BAR_ITEM_WEECHAT_BUFFER_COUNT = 0, + GUI_BAR_ITEM_WEECHAT_BUFFER_PLUGIN, + GUI_BAR_ITEM_WEECHAT_BUFFER_NAME, + GUI_BAR_ITEM_WEECHAT_NICKLIST_COUNT, + GUI_BAR_ITEM_WEECHAT_SCROLL, + GUI_BAR_ITEM_WEECHAT_HOTLIST, + /* number of bar items */ + GUI_BAR_NUM_ITEMS, +}; + +struct t_gui_window; + +struct t_gui_bar_item +{ + struct t_weechat_plugin *plugin; /* plugin */ + char *name; /* bar item name */ + char *(*build_callback)(void *data, + struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width); + /* callback called for building item */ + void *build_callback_data; /* data for callback */ + struct t_gui_bar_item *prev_item; /* link to previous bar item */ + struct t_gui_bar_item *next_item; /* link to next bar item */ +}; + +/* variables */ + +extern struct t_gui_bar_item *gui_bar_items; +extern struct t_gui_bar_item *last_gui_bar_item; + +/* functions */ + +extern struct t_gui_bar_item *gui_bar_item_search (char *name); +extern struct t_gui_bar_item *gui_bar_item_new (struct t_weechat_plugin *plugin, + char *name, + char *(*build_callback)(void *data, + struct t_gui_bar_item *item, + struct t_gui_window *window, + int max_width), + void *build_callback_data); +extern void gui_bar_item_update (char *name); +extern void gui_bar_item_free (struct t_gui_bar_item *item); +extern void gui_bar_item_free_all (); +extern void gui_bar_item_free_all_plugin (struct t_weechat_plugin *plugin); +extern void gui_bar_item_init (); +extern void gui_bar_item_end (); +extern void gui_bar_item_print_log (); + +#endif /* gui-bar-item.h */ diff --git a/src/gui/gui-bar.c b/src/gui/gui-bar.c new file mode 100644 index 000000000..0cfa99798 --- /dev/null +++ b/src/gui/gui-bar.c @@ -0,0 +1,312 @@ +/* + * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +/* gui-bar.c: bar functions, used by all GUI */ + + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <string.h> + +#include "../core/weechat.h" +#include "../core/wee-log.h" +#include "../core/wee-string.h" +#include "gui-bar.h" +#include "gui-window.h" + + +char *gui_bar_type_str[GUI_BAR_NUM_TYPES] = +{ "root", "window_active", "window_inactive" }; +char *gui_bar_position_str[GUI_BAR_NUM_POSITIONS] = +{ "bottom", "top", "left", "right" }; + +struct t_gui_bar *gui_bars = NULL; /* first bar */ +struct t_gui_bar *last_gui_bar = NULL; /* last bar */ + + +/* + * gui_bar_root_get_size: get total bar size ("root" type) for a position + */ + +int +gui_bar_root_get_size (struct t_gui_bar *bar, int position) +{ + struct t_gui_bar *ptr_bar; + int total_size; + + total_size = 0; + for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) + { + if (bar && (ptr_bar == bar)) + return total_size; + + if ((ptr_bar->type == GUI_BAR_TYPE_ROOT) + && (ptr_bar->position == position)) + { + total_size += ptr_bar->size; + if (ptr_bar->separator) + total_size++; + } + } + return total_size; +} + +/* + * gui_bar_search: search a bar by name + */ + +struct t_gui_bar * +gui_bar_search (char *name) +{ + struct t_gui_bar *ptr_bar; + + if (!name || !name[0]) + return NULL; + + for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) + { + if (strcmp (ptr_bar->name, name) == 0) + return ptr_bar; + } + + /* bar not found */ + return NULL; +} + +/* + * gui_bar_new: create a new bar + */ + +struct t_gui_bar * +gui_bar_new (struct t_weechat_plugin *plugin, char *name, char *type, + char *position, int size, int separator, char *items) +{ + struct t_gui_bar *new_bar; + struct t_gui_window *ptr_win; + int i, type_value, position_value; + + if (!name || !name[0]) + return NULL; + + /* it's not possible to create 2 bars with same name */ + if (gui_bar_search (name)) + return NULL; + + /* look for type */ + type_value = -1; + for (i = 0; i < GUI_BAR_NUM_TYPES; i++) + { + if (string_strcasecmp (type, gui_bar_type_str[i]) == 0) + { + type_value = i; + break; + } + } + if (type_value < 0) + return NULL; + + /* look for position */ + position_value = -1; + for (i = 0; i < GUI_BAR_NUM_POSITIONS; i++) + { + if (string_strcasecmp (position, gui_bar_position_str[i]) == 0) + { + position_value = i; + break; + } + } + if (position_value < 0) + return NULL; + + /* create bar */ + new_bar = (struct t_gui_bar *) malloc (sizeof (struct t_gui_bar)); + if (new_bar) + { + new_bar->plugin = plugin; + new_bar->number = (last_gui_bar) ? last_gui_bar->number + 1 : 1; + new_bar->name = strdup (name); + new_bar->type = type_value; + new_bar->position = position_value; + new_bar->size = size; + new_bar->separator = separator; + if (items && items[0]) + { + new_bar->items = strdup (items); + new_bar->items_array = string_explode (items, ",", 0, 0, + &new_bar->items_count); + } + else + { + new_bar->items = NULL; + new_bar->items_count = 0; + new_bar->items_array = NULL; + } + + if (type_value == GUI_BAR_TYPE_ROOT) + { + /* create only one window for bar */ + gui_bar_window_new (new_bar, NULL); + } + else + { + /* create bar window for all opened windows */ + for (ptr_win = gui_windows; ptr_win; + ptr_win = ptr_win->next_window) + { + gui_bar_window_new (new_bar, ptr_win); + } + } + + /* add bar to bars queue */ + new_bar->prev_bar = last_gui_bar; + if (gui_bars) + last_gui_bar->next_bar = new_bar; + else + gui_bars = new_bar; + last_gui_bar = new_bar; + new_bar->next_bar = NULL; + + gui_window_refresh_needed = 1; + + return new_bar; + } + + /* failed to create bar */ + return NULL; +} + +/* + * gui_bar_update: update a bar on screen + */ + +void +gui_bar_update (char *name) +{ + struct t_gui_bar *ptr_bar; + + for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) + { + if (strcmp (ptr_bar->name, name) == 0) + gui_bar_draw (ptr_bar); + } +} + +/* + * gui_bar_free: delete a bar + */ + +void +gui_bar_free (struct t_gui_bar *bar) +{ + /* remove bar from bars list */ + if (bar->prev_bar) + bar->prev_bar->next_bar = bar->next_bar; + if (bar->next_bar) + bar->next_bar->prev_bar = bar->prev_bar; + if (gui_bars == bar) + gui_bars = bar->next_bar; + if (last_gui_bar == bar) + last_gui_bar = bar->prev_bar; + + /* free data */ + if (bar->name) + free (bar->name); + if (bar->bar_window) + gui_bar_window_free (bar->bar_window); + if (bar->items) + free (bar->items); + if (bar->items_array) + string_free_exploded (bar->items_array); + + free (bar); + + gui_window_refresh_needed = 1; +} + +/* + * gui_bar_free_all: delete all bars + */ + +void +gui_bar_free_all () +{ + while (gui_bars) + { + gui_bar_free (gui_bars); + } +} + +/* + * gui_bar_free_all_plugin: delete all bars for a plugin + */ + +void +gui_bar_free_all_plugin (struct t_weechat_plugin *plugin) +{ + struct t_gui_bar *ptr_bar, *next_bar; + + ptr_bar = gui_bars; + while (ptr_bar) + { + next_bar = ptr_bar->next_bar; + + if (ptr_bar->plugin == plugin) + gui_bar_free (ptr_bar); + + ptr_bar = next_bar; + } +} + +/* + * gui_bar_print_log: print bar infos in log (usually for crash dump) + */ + +void +gui_bar_print_log () +{ + struct t_gui_bar *ptr_bar; + + for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) + { + log_printf (""); + log_printf ("[bar (addr:0x%x)]", ptr_bar); + log_printf (" plugin . . . . . . . . : 0x%x", ptr_bar->plugin); + log_printf (" number . . . . . . . . : %d", ptr_bar->number); + log_printf (" name . . . . . . . . . : '%s'", ptr_bar->name); + log_printf (" type . . . . . . . . . : %d (%s)", + ptr_bar->type, + gui_bar_type_str[ptr_bar->type]); + log_printf (" position . . . . . . . : %d (%s)", + ptr_bar->position, + gui_bar_position_str[ptr_bar->position]); + log_printf (" size . . . . . . . . . : %d", ptr_bar->size); + log_printf (" separator. . . . . . . : %d", ptr_bar->separator); + log_printf (" items. . . . . . . . . : '%s'", ptr_bar->items); + log_printf (" items_count. . . . . . : %d", ptr_bar->items_count); + log_printf (" items_array. . . . . . : 0x%x", ptr_bar->items_array); + log_printf (" bar_window . . . . . . : 0x%x", ptr_bar->bar_window); + log_printf (" prev_bar . . . . . . . : 0x%x", ptr_bar->prev_bar); + log_printf (" next_bar . . . . . . . : 0x%x", ptr_bar->next_bar); + + if (ptr_bar->bar_window) + gui_bar_window_print_log (ptr_bar->bar_window); + } +} diff --git a/src/gui/gui-bar.h b/src/gui/gui-bar.h new file mode 100644 index 000000000..3844bd184 --- /dev/null +++ b/src/gui/gui-bar.h @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2003-2008 by FlashCode <flashcode@flashtux.org> + * See README for License detail, AUTHORS for developers list. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef __WEECHAT_GUI_BAR_H +#define __WEECHAT_GUI_BAR_H 1 + +struct t_weechat_plugin; +struct t_gui_window; + +enum t_gui_bar_type +{ + GUI_BAR_TYPE_ROOT = 0, + GUI_BAR_TYPE_WINDOW_ACTIVE, + GUI_BAR_TYPE_WINDOW_INACTIVE, + /* number of bar types */ + GUI_BAR_NUM_TYPES, +}; + +enum t_gui_bar_position +{ + GUI_BAR_POSITION_BOTTOM = 0, + GUI_BAR_POSITION_TOP, + GUI_BAR_POSITION_LEFT, + GUI_BAR_POSITION_RIGHT, + /* number of bar positions */ + GUI_BAR_NUM_POSITIONS, +}; + +struct t_gui_bar +{ + /* user choices */ + struct t_weechat_plugin *plugin; /* plugin */ + int number; /* bar number */ + char *name; /* bar name */ + int type; /* type (root or window) */ + int position; /* position (bottom, top, left, right) */ + int size; /* size of bar (in chars) */ + int separator; /* 1 if separator (line) displayed */ + char *items; /* bar items */ + + /* internal vars */ + int items_count; /* number of bar items */ + char **items_array; /* exploded bar items */ + struct t_gui_bar_window *bar_window; /* pointer to bar window */ + /* (for type root only) */ + struct t_gui_bar *prev_bar; /* link to previous bar */ + struct t_gui_bar *next_bar; /* link to next bar */ +}; + +/* variables */ + +extern char *gui_bar_type_str[]; +extern char *gui_bar_position_str[]; +extern struct t_gui_bar *gui_bars; +extern struct t_gui_bar *last_gui_bar; + +/* functions */ + +extern int gui_bar_root_get_size (struct t_gui_bar *bar, int position); +extern struct t_gui_bar *gui_bar_search (char *name); +extern struct t_gui_bar *gui_bar_new (struct t_weechat_plugin *plugin, + char *name, char *type, char *position, + int size, int separator, char *items); +extern void gui_bar_update (char *name); +extern void gui_bar_free (struct t_gui_bar *bar); +extern void gui_bar_free_all (); +extern void gui_bar_free_all_plugin (struct t_weechat_plugin *plugin); +extern void gui_bar_print_log (); + +/* functions (GUI dependent) */ + +extern int gui_bar_window_get_size (struct t_gui_bar *bar, + struct t_gui_window *window, int position); +extern int gui_bar_window_new (struct t_gui_bar *bar, + struct t_gui_window *window); +extern void gui_bar_window_free (struct t_gui_bar_window *bar_window); +extern void gui_bar_draw (struct t_gui_bar *bar); +extern void gui_bar_window_print_log (struct t_gui_bar_window *bar_window); + +#endif /* gui-bar.h */ diff --git a/src/gui/gui-buffer.c b/src/gui/gui-buffer.c index 732d13f4d..0948439bd 100644 --- a/src/gui/gui-buffer.c +++ b/src/gui/gui-buffer.c @@ -253,6 +253,9 @@ gui_buffer_set_category (struct t_gui_buffer *buffer, char *category) buffer->category = strdup (category); } gui_status_refresh_needed = 1; + + hook_signal_send ("buffer_renamed", + WEECHAT_HOOK_SIGNAL_POINTER, buffer); } /* @@ -269,6 +272,9 @@ gui_buffer_set_name (struct t_gui_buffer *buffer, char *name) buffer->name = strdup (name); } gui_status_refresh_needed = 1; + + hook_signal_send ("buffer_renamed", + WEECHAT_HOOK_SIGNAL_POINTER, buffer); } /* @@ -625,7 +631,7 @@ gui_buffer_close (struct t_gui_buffer *buffer, int switch_to_another) struct t_gui_buffer *ptr_buffer; struct t_gui_line *ptr_line; - hook_signal_send ("buffer_close", + hook_signal_send ("buffer_closing", WEECHAT_HOOK_SIGNAL_POINTER, buffer); if (buffer->close_callback) @@ -708,6 +714,8 @@ gui_buffer_close (struct t_gui_buffer *buffer, int switch_to_another) if (gui_windows && gui_current_window && gui_current_window->buffer) gui_status_refresh_needed = 1; + + hook_signal_send ("buffer_closed", WEECHAT_HOOK_SIGNAL_STRING, NULL); } /* @@ -903,8 +911,9 @@ gui_buffer_move_to_number (struct t_gui_buffer *buffer, int number) snprintf (buf1_str, sizeof (buf1_str) - 1, "%d", buffer->number); argv[0] = buf1_str; argv[1] = buf2_str; - /* TODO: send buffer_move event */ - /*plugin_event_handler_exec ("buffer_move", 2, argv);*/ + + hook_signal_send ("buffer_moved", + WEECHAT_HOOK_SIGNAL_POINTER, buffer); } /* diff --git a/src/gui/gui-hotlist.c b/src/gui/gui-hotlist.c index a24adec88..122652e35 100644 --- a/src/gui/gui-hotlist.c +++ b/src/gui/gui-hotlist.c @@ -28,8 +28,10 @@ #include "../core/weechat.h" #include "../core/wee-config.h" +#include "../core/wee-hook.h" #include "../core/wee-log.h" #include "../core/wee-util.h" +#include "../plugins/plugin.h" #include "gui-hotlist.h" #include "gui-buffer.h" #include "gui-status.h" @@ -178,6 +180,8 @@ gui_hotlist_add_hotlist (struct t_gui_hotlist **hotlist, *hotlist = new_hotlist; *last_hotlist = new_hotlist; } + + hook_signal_send ("hotlist_changed", WEECHAT_HOOK_SIGNAL_STRING, NULL); } /* @@ -312,6 +316,8 @@ gui_hotlist_free (struct t_gui_hotlist **hotlist, free (ptr_hotlist); *hotlist = new_hotlist; + + hook_signal_send ("hotlist_changed", WEECHAT_HOOK_SIGNAL_STRING, NULL); } /* |