diff options
author | Sebastien Helleu <flashcode@flashtux.org> | 2008-04-22 18:11:33 +0200 |
---|---|---|
committer | Sebastien Helleu <flashcode@flashtux.org> | 2008-04-22 18:11:33 +0200 |
commit | 06fd80e21079f80e7ff61537de42431205bd911a (patch) | |
tree | 53a29b06c89ed0772c88b6458f7cb113f2268d5b /src/gui | |
parent | 9d49beabf1fe1a6e9347afe6a25db4744df28abe (diff) | |
download | weechat-06fd80e21079f80e7ff61537de42431205bd911a.zip |
Added conditions for bar display and bar max size
Diffstat (limited to 'src/gui')
-rw-r--r-- | src/gui/curses/gui-curses-bar.c | 23 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-chat.c | 4 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-input.c | 2 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-main.c | 18 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-nicklist.c | 2 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-status.c | 2 | ||||
-rw-r--r-- | src/gui/curses/gui-curses-window.c | 112 | ||||
-rw-r--r-- | src/gui/gtk/gui-gtk-bar.c | 14 | ||||
-rw-r--r-- | src/gui/gui-bar.c | 285 | ||||
-rw-r--r-- | src/gui/gui-bar.h | 34 | ||||
-rw-r--r-- | src/gui/gui-window.h | 2 |
11 files changed, 363 insertions, 135 deletions
diff --git a/src/gui/curses/gui-curses-bar.c b/src/gui/curses/gui-curses-bar.c index dfdeee58b..bc8eeb052 100644 --- a/src/gui/curses/gui-curses-bar.c +++ b/src/gui/curses/gui-curses-bar.c @@ -304,15 +304,8 @@ gui_bar_window_new (struct t_gui_bar *bar, struct t_gui_window *window) if (window) { - /* bar is type "window_active" and window is not active */ - if ((CONFIG_INTEGER(bar->type) == GUI_BAR_TYPE_WINDOW_ACTIVE) - && gui_current_window - && (gui_current_window != window)) - return 1; - - /* bar is type "window_inactive" and window is active */ - if ((CONFIG_INTEGER(bar->type) == GUI_BAR_TYPE_WINDOW_INACTIVE) - && (!gui_current_window || (gui_current_window == window))) + if ((CONFIG_INTEGER(bar->type) == GUI_BAR_TYPE_WINDOW) + && (!gui_bar_check_conditions_for_window (bar, window))) return 1; } @@ -488,10 +481,8 @@ gui_bar_window_remove_unused_bars (struct t_gui_window *window) { next_bar_win = ptr_bar_win->next_bar_window; - if (((CONFIG_INTEGER(ptr_bar_win->bar->type) == GUI_BAR_TYPE_WINDOW_ACTIVE) - && (window != gui_current_window)) - || ((CONFIG_INTEGER(ptr_bar_win->bar->type) == GUI_BAR_TYPE_WINDOW_INACTIVE) - && (window == gui_current_window))) + if ((CONFIG_INTEGER(ptr_bar_win->bar->type) == GUI_BAR_TYPE_WINDOW) + && (!gui_bar_check_conditions_for_window (ptr_bar_win->bar, window))) { gui_bar_window_free (ptr_bar_win, window); rc = 1; @@ -519,10 +510,8 @@ gui_bar_window_add_missing_bars (struct t_gui_window *window) for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) { - if (((CONFIG_INTEGER(ptr_bar->type) == GUI_BAR_TYPE_WINDOW_ACTIVE) - && (window == gui_current_window)) - || ((CONFIG_INTEGER(ptr_bar->type) == GUI_BAR_TYPE_WINDOW_INACTIVE) - && (window != gui_current_window))) + if ((CONFIG_INTEGER(ptr_bar->type) == GUI_BAR_TYPE_WINDOW) + && gui_bar_check_conditions_for_window (ptr_bar, window)) { if (!gui_bar_window_search_bar (window, ptr_bar)) { diff --git a/src/gui/curses/gui-curses-chat.c b/src/gui/curses/gui-curses-chat.c index 02fcb8fe9..98ea32fd1 100644 --- a/src/gui/curses/gui-curses-chat.c +++ b/src/gui/curses/gui-curses-chat.c @@ -317,6 +317,8 @@ gui_chat_draw_title (struct t_gui_buffer *buffer, int erase) if (title_decoded) free (title_decoded); + + buffer->title_refresh_needed = 0; } /* @@ -1276,6 +1278,8 @@ gui_chat_draw (struct t_gui_buffer *buffer, int erase) ptr_line->refresh_needed = 0; } } + + buffer->chat_refresh_needed = 0; } /* diff --git a/src/gui/curses/gui-curses-input.c b/src/gui/curses/gui-curses-input.c index 9787f4cb8..8a871e19a 100644 --- a/src/gui/curses/gui-curses-input.c +++ b/src/gui/curses/gui-curses-input.c @@ -423,4 +423,6 @@ gui_input_draw (struct t_gui_buffer *buffer, int erase) refresh (); } } + + buffer->input_refresh_needed = 0; } diff --git a/src/gui/curses/gui-curses-main.c b/src/gui/curses/gui-curses-main.c index 282a482ba..915d6388f 100644 --- a/src/gui/curses/gui-curses-main.c +++ b/src/gui/curses/gui-curses-main.c @@ -206,14 +206,11 @@ gui_main_loop () /* refresh window if needed */ if (gui_window_refresh_needed) - gui_window_refresh_screen (0); + gui_window_refresh_screen (); /* refresh status bar if needed */ if (gui_status_refresh_needed) - { gui_status_draw (1); - gui_status_refresh_needed = 0; - } for (ptr_win = gui_windows; ptr_win; ptr_win = ptr_win->next_window) { @@ -230,29 +227,22 @@ gui_main_loop () { /* refresh title if needed */ if (ptr_buffer->title_refresh_needed) - { gui_chat_draw_title (ptr_buffer, 1); - ptr_buffer->title_refresh_needed = 0; - } + /* refresh chat if needed */ if (ptr_buffer->chat_refresh_needed) { gui_chat_draw (ptr_buffer, (ptr_buffer->chat_refresh_needed) > 1 ? 1 : 0); - ptr_buffer->chat_refresh_needed = 0; } + /* refresh nicklist if needed */ if (ptr_buffer->nicklist_refresh_needed) - { gui_nicklist_draw (ptr_buffer, 1); - ptr_buffer->nicklist_refresh_needed = 0; - } + /* refresh input if needed */ if (ptr_buffer->input_refresh_needed) - { gui_input_draw (ptr_buffer, 1); - ptr_buffer->input_refresh_needed = 0; - } } /* wait for keyboard or network activity */ diff --git a/src/gui/curses/gui-curses-nicklist.c b/src/gui/curses/gui-curses-nicklist.c index e56c07336..1ac90ae6a 100644 --- a/src/gui/curses/gui-curses-nicklist.c +++ b/src/gui/curses/gui-curses-nicklist.c @@ -316,4 +316,6 @@ gui_nicklist_draw (struct t_gui_buffer *buffer, int erase) refresh (); } } + + buffer->nicklist_refresh_needed = 0; } diff --git a/src/gui/curses/gui-curses-status.c b/src/gui/curses/gui-curses-status.c index 87cbb7805..93125d639 100644 --- a/src/gui/curses/gui-curses-status.c +++ b/src/gui/curses/gui-curses-status.c @@ -249,4 +249,6 @@ gui_status_draw (int erase) wnoutrefresh (GUI_CURSES(ptr_win)->win_status); refresh (); } + + gui_status_refresh_needed = 0; } diff --git a/src/gui/curses/gui-curses-window.c b/src/gui/curses/gui-curses-window.c index 0b56b7b1a..68207c6d5 100644 --- a/src/gui/curses/gui-curses-window.c +++ b/src/gui/curses/gui-curses-window.c @@ -502,40 +502,6 @@ gui_window_redraw_all_buffers () } /* - * gui_window_switch: switch to another window - */ - -void -gui_window_switch (struct t_gui_window *window) -{ - struct t_gui_window *old_window; - int changes; - - if (gui_current_window == window) - return; - - old_window = gui_current_window; - - gui_current_window = window; - changes = gui_bar_window_remove_unused_bars (old_window) - || gui_bar_window_add_missing_bars (old_window); - if (changes) - { - gui_current_window = old_window; - gui_window_switch_to_buffer (gui_current_window, - gui_current_window->buffer); - gui_current_window = window; - } - - gui_bar_window_remove_unused_bars (gui_current_window); - gui_bar_window_add_missing_bars (gui_current_window); - gui_window_switch_to_buffer (gui_current_window, - gui_current_window->buffer); - - gui_window_redraw_buffer (gui_current_window->buffer); -} - -/* * gui_window_switch_to_buffer: switch to another buffer in a window */ @@ -544,6 +510,7 @@ gui_window_switch_to_buffer (struct t_gui_window *window, struct t_gui_buffer *buffer) { struct t_gui_bar_window *ptr_bar_win; + struct t_gui_buffer *old_buffer; if (!gui_ok) return; @@ -551,6 +518,8 @@ gui_window_switch_to_buffer (struct t_gui_window *window, if (window->buffer->num_displayed > 0) window->buffer->num_displayed--; + old_buffer = window->buffer; + if (window->buffer != buffer) { window->start_line = NULL; @@ -565,8 +534,14 @@ gui_window_switch_to_buffer (struct t_gui_window *window, window->win_title_start = 0; window->win_nick_start = 0; + if (old_buffer == buffer) + { + gui_bar_window_remove_unused_bars (window); + gui_bar_window_add_missing_bars (window); + } + gui_window_calculate_pos_size (window, 1); - + /* create bar windows */ for (ptr_bar_win = GUI_CURSES(window)->bar_windows; ptr_bar_win; ptr_bar_win = ptr_bar_win->next_bar_window) @@ -624,6 +599,12 @@ gui_window_switch_to_buffer (struct t_gui_window *window, buffer->num_displayed++; gui_hotlist_remove_buffer (buffer); + + if (buffer != old_buffer) + { + gui_bar_window_remove_unused_bars (window); + gui_bar_window_add_missing_bars (window); + } /* redraw bars in window */ for (ptr_bar_win = GUI_CURSES(window)->bar_windows; ptr_bar_win; @@ -637,6 +618,38 @@ gui_window_switch_to_buffer (struct t_gui_window *window, } /* + * gui_window_switch: switch to another window + */ + +void +gui_window_switch (struct t_gui_window *window) +{ + struct t_gui_window *old_window; + int changes; + + if (gui_current_window == window) + return; + + old_window = gui_current_window; + + gui_current_window = window; + changes = gui_bar_window_remove_unused_bars (old_window) + || gui_bar_window_add_missing_bars (old_window); + if (changes) + { + gui_current_window = old_window; + gui_window_switch_to_buffer (gui_current_window, + gui_current_window->buffer); + gui_current_window = window; + } + + gui_window_switch_to_buffer (gui_current_window, + gui_current_window->buffer); + + gui_window_redraw_buffer (gui_current_window->buffer); +} + +/* * gui_window_page_up: display previous page on buffer */ @@ -1548,29 +1561,25 @@ gui_window_switch_right (struct t_gui_window *window) */ void -gui_window_refresh_screen (int force) +gui_window_refresh_screen () { int new_height, new_width; - if (force || (gui_window_refresh_needed == 1)) + endwin (); + refresh (); + + getmaxyx (stdscr, new_height, new_width); + + gui_ok = ((new_width >= GUI_WINDOW_MIN_WIDTH) + && (new_height >= GUI_WINDOW_MIN_HEIGHT)); + + if (gui_ok) { - endwin (); refresh (); - - getmaxyx (stdscr, new_height, new_width); - - gui_ok = ((new_width >= GUI_WINDOW_MIN_WIDTH) - && (new_height >= GUI_WINDOW_MIN_HEIGHT)); - - if (gui_ok) - { - refresh (); - gui_window_refresh_windows (); - } + gui_window_refresh_windows (); } - if (gui_window_refresh_needed > 0) - gui_window_refresh_needed = 0; + gui_window_refresh_needed = 0; } /* @@ -1581,7 +1590,6 @@ void gui_window_refresh_screen_sigwinch () { gui_window_refresh_needed = 1; - //gui_window_refresh_screen (0); } /* diff --git a/src/gui/gtk/gui-gtk-bar.c b/src/gui/gtk/gui-gtk-bar.c index 59b5a5b58..7425401a9 100644 --- a/src/gui/gtk/gui-gtk-bar.c +++ b/src/gui/gtk/gui-gtk-bar.c @@ -208,11 +208,9 @@ gui_bar_window_remove_unused_bars (struct t_gui_window *window) while (ptr_bar_win) { next_bar_win = ptr_bar_win->next_bar_window; - - if (((CONFIG_INTEGER(ptr_bar_win->bar->type) == GUI_BAR_TYPE_WINDOW_ACTIVE) - && (window != gui_current_window)) - || ((CONFIG_INTEGER(ptr_bar_win->bar->type) == GUI_BAR_TYPE_WINDOW_INACTIVE) - && (window == gui_current_window))) + + if ((CONFIG_INTEGER(ptr_bar_win->bar->type) == GUI_BAR_TYPE_WINDOW) + && (!gui_bar_check_conditions_for_window (ptr_bar_win->bar, window))) { gui_bar_window_free (ptr_bar_win, window); rc = 1; @@ -240,10 +238,8 @@ gui_bar_window_add_missing_bars (struct t_gui_window *window) for (ptr_bar = gui_bars; ptr_bar; ptr_bar = ptr_bar->next_bar) { - if (((CONFIG_INTEGER(ptr_bar->type) == GUI_BAR_TYPE_WINDOW_ACTIVE) - && (window == gui_current_window)) - || ((CONFIG_INTEGER(ptr_bar->type) == GUI_BAR_TYPE_WINDOW_INACTIVE) - && (window != gui_current_window))) + if ((CONFIG_INTEGER(ptr_bar->type) == GUI_BAR_TYPE_WINDOW) + && gui_bar_check_conditions_for_window (ptr_bar, window)) { if (!gui_bar_window_search_bar (window, ptr_bar)) { diff --git a/src/gui/gui-bar.c b/src/gui/gui-bar.c index cfb0d78ae..5f995a213 100644 --- a/src/gui/gui-bar.c +++ b/src/gui/gui-bar.c @@ -32,14 +32,15 @@ #include "../core/wee-log.h" #include "../core/wee-string.h" #include "gui-bar.h" +#include "gui-buffer.h" #include "gui-chat.h" #include "gui-window.h" char *gui_bar_option_str[GUI_BAR_NUM_OPTIONS] = -{ "type", "position", "size", "separator", "items" }; +{ "type", "conditions", "position", "size", "size_max", "separator", "items" }; char *gui_bar_type_str[GUI_BAR_NUM_TYPES] = -{ "root", "window", "window_active", "window_inactive" }; +{ "root", "window" }; char *gui_bar_position_str[GUI_BAR_NUM_POSITIONS] = { "bottom", "top", "left", "right" }; @@ -115,6 +116,40 @@ gui_bar_search_position (char *position) } /* + * gui_bar_check_conditions_for_window: return 1 if bar should be displayed in + * this window, according to condition(s) + * on bar + */ + +int +gui_bar_check_conditions_for_window (struct t_gui_bar *bar, + struct t_gui_window *window) +{ + int i; + + for (i = 0; i < bar->conditions_count; i++) + { + if (string_strcasecmp (bar->conditions_array[i], "active") == 0) + { + if (gui_current_window && (gui_current_window != window)) + return 0; + } + else if (string_strcasecmp (bar->conditions_array[i], "inactive") == 0) + { + if (!gui_current_window || (gui_current_window == window)) + return 0; + } + else if (string_strcasecmp (bar->conditions_array[i], "nicklist") == 0) + { + if (window->buffer && !window->buffer->nicklist) + return 0; + } + } + + return 1; +} + +/* * gui_bar_root_get_size: get total bar size ("root" type) for a position */ @@ -255,6 +290,40 @@ gui_bar_config_check_type (void *data, struct t_config_option *option, } /* + * gui_bar_config_change_conditions: callback when conditions is changed + */ + +void +gui_bar_config_change_conditions (void *data, struct t_config_option *option) +{ + struct t_gui_bar *ptr_bar; + + /* make C compiler happy */ + (void) data; + + ptr_bar = gui_bar_search_with_option_name (option->name); + if (ptr_bar) + { + if (ptr_bar->conditions_array) + string_free_exploded (ptr_bar->conditions_array); + + if (CONFIG_STRING(ptr_bar->conditions) && CONFIG_STRING(ptr_bar->conditions)[0]) + { + ptr_bar->conditions_array = string_explode (CONFIG_STRING(ptr_bar->conditions), + ",", 0, 0, + &ptr_bar->conditions_count); + } + else + { + ptr_bar->conditions_count = 0; + ptr_bar->conditions_array = NULL; + } + } + + gui_window_refresh_needed = 1; +} + +/* * gui_bar_config_change_position: callback when position is changed */ @@ -306,7 +375,6 @@ gui_bar_config_check_size (void *data, struct t_config_option *option, return 0; } - /* * gui_bar_config_change_size: callback when size is changed */ @@ -329,6 +397,31 @@ gui_bar_config_change_size (void *data, struct t_config_option *option) } /* + * gui_bar_config_change_size_max: callback when max size is changed + */ + +void +gui_bar_config_change_size_max (void *data, struct t_config_option *option) +{ + struct t_gui_bar *ptr_bar; + + /* make C compiler happy */ + (void) data; + + ptr_bar = gui_bar_search_with_option_name (option->name); + if (ptr_bar) + { + if ((CONFIG_INTEGER(ptr_bar->size_max) > 0) + && (ptr_bar->current_size > CONFIG_INTEGER(ptr_bar->size_max))) + { + gui_bar_set_current_size (ptr_bar, + CONFIG_INTEGER(ptr_bar->size_max)); + } + gui_window_refresh_needed = 1; + } +} + +/* * gui_bar_config_change_separator: callback when separator is changed */ @@ -398,10 +491,14 @@ gui_bar_set_name (struct t_gui_bar *bar, char *name) { snprintf (option_name, length, "%s.type", name); config_file_option_rename (bar->type, option_name); + snprintf (option_name, length, "%s.conditions", name); + config_file_option_rename (bar->conditions, option_name); snprintf (option_name, length, "%s.position", name); config_file_option_rename (bar->position, option_name); snprintf (option_name, length, "%s.size", name); config_file_option_rename (bar->size, option_name); + snprintf (option_name, length, "%s.size_max", name); + config_file_option_rename (bar->size_max, option_name); snprintf (option_name, length, "%s.separator", name); config_file_option_rename (bar->separator, option_name); snprintf (option_name, length, "%s.items", name); @@ -535,6 +632,10 @@ gui_bar_set_current_size (struct t_gui_bar *bar, int current_size) if (current_size == 0) current_size = 1; + if ((CONFIG_INTEGER(bar->size_max) > 0) + && (current_size > CONFIG_INTEGER(bar->size_max))) + current_size = CONFIG_INTEGER(bar->size_max); + /* check if new size is ok if it's more than before */ if (current_size > bar->current_size && !gui_bar_check_size_add (bar, current_size - bar->current_size)) @@ -584,48 +685,50 @@ gui_bar_set_size (struct t_gui_bar *bar, char *size) } /* - * gui_bar_set_items: set items for a bar + * gui_bar_set_size_max: set max size for a bar */ void -gui_bar_set_items (struct t_gui_bar *bar, char *items) +gui_bar_set_size_max (struct t_gui_bar *bar, char *size) { - config_file_option_set (bar->items, items, 1); - - if (bar->items_array) - string_free_exploded (bar->items_array); + long number; + char *error, value[32]; - if (CONFIG_STRING(bar->items) && CONFIG_STRING(bar->items)[0]) - { - bar->items_array = string_explode (CONFIG_STRING(bar->items), - ",", 0, 0, - &bar->items_count); - } - else + error = NULL; + number = strtol (size, &error, 10); + if (error && !error[0]) { - bar->items_count = 0; - bar->items_array = NULL; + if (number < 0) + return; + + snprintf (value, sizeof (value), "%ld", number); + config_file_option_set (bar->size_max, value, 1); + + if ((number > 0) && (number < bar->current_size)) + gui_bar_set_size (bar, value); } } /* * gui_bar_set: set a property for bar + * return: 1 if ok, 0 if error */ -void +int gui_bar_set (struct t_gui_bar *bar, char *property, char *value) { long number; char *error; if (!bar || !property || !value) - return; + return 0; if (string_strcasecmp (property, "name") == 0) { gui_bar_set_name (bar, value); + return 1; } - if (string_strcasecmp (property, "number") == 0) + else if (string_strcasecmp (property, "number") == 0) { error = NULL; number = strtol (value, &error, 10); @@ -634,16 +737,31 @@ gui_bar_set (struct t_gui_bar *bar, char *property, char *value) gui_bar_set_number (bar, number); gui_window_refresh_needed = 1; } + return 1; + } + else if (string_strcasecmp (property, "conditions") == 0) + { + config_file_option_set (bar->conditions, value, 1); + gui_window_refresh_needed = 1; + return 1; } else if (string_strcasecmp (property, "position") == 0) { gui_bar_set_position (bar, value); gui_bar_refresh (bar); + return 1; } else if (string_strcasecmp (property, "size") == 0) { gui_bar_set_size (bar, value); gui_bar_refresh (bar); + return 1; + } + else if (string_strcasecmp (property, "size_max") == 0) + { + gui_bar_set_size_max (bar, value); + gui_bar_refresh (bar); + return 1; } else if (string_strcasecmp (property, "separator") == 0) { @@ -651,12 +769,16 @@ gui_bar_set (struct t_gui_bar *bar, char *property, char *value) (strcmp (value, "1") == 0) ? "on" : "off", 1); gui_bar_refresh (bar); + return 1; } else if (string_strcasecmp (property, "items") == 0) { - gui_bar_set_items (bar, value); + config_file_option_set (bar->items, value, 1); gui_bar_draw (bar); + return 1; } + + return 0; } /* @@ -675,11 +797,15 @@ gui_bar_alloc (char *name) new_bar->number = 0; new_bar->name = strdup (name); new_bar->type = NULL; + new_bar->conditions = NULL; new_bar->position = NULL; new_bar->size = NULL; + new_bar->size_max = NULL; new_bar->separator = NULL; new_bar->items = NULL; new_bar->current_size = 1; + new_bar->conditions_count = 0; + new_bar->conditions_array = NULL; new_bar->items_count = 0; new_bar->items_array = NULL; new_bar->bar_window = NULL; @@ -720,6 +846,15 @@ gui_bar_create_option (char *bar_name, int index_option, char *value) "root|window|window_active|window_inactive", 0, 0, value, &gui_bar_config_check_type, NULL, NULL, NULL, NULL, NULL); break; + case GUI_BAR_OPTION_CONDITIONS: + ptr_option = config_file_new_option ( + weechat_config_file, weechat_config_section_bar, + option_name, "string", + N_("condition(s) for displaying bar (for bars of type " + "\"window\")"), + NULL, 0, 0, value, + NULL, NULL, &gui_bar_config_change_conditions, NULL, NULL, NULL); + break; case GUI_BAR_OPTION_POSITION: ptr_option = config_file_new_option ( weechat_config_file, weechat_config_section_bar, @@ -738,6 +873,16 @@ gui_bar_create_option (char *bar_name, int index_option, char *value) &gui_bar_config_change_size, NULL, NULL, NULL); break; + case GUI_BAR_OPTION_SIZE_MAX: + ptr_option = config_file_new_option ( + weechat_config_file, weechat_config_section_bar, + option_name, "integer", + N_("max bar size in chars (0 = no limit)"), + NULL, 0, INT_MAX, value, + NULL, NULL, + &gui_bar_config_change_size_max, NULL, + NULL, NULL); + break; case GUI_BAR_OPTION_SEPARATOR: ptr_option = config_file_new_option ( weechat_config_file, weechat_config_section_bar, @@ -769,8 +914,10 @@ gui_bar_create_option (char *bar_name, int index_option, char *value) struct t_gui_bar * gui_bar_new_with_options (struct t_weechat_plugin *plugin, char *name, struct t_config_option *type, + struct t_config_option *conditions, struct t_config_option *position, struct t_config_option *size, + struct t_config_option *size_max, struct t_config_option *separator, struct t_config_option *items) { @@ -784,10 +931,23 @@ gui_bar_new_with_options (struct t_weechat_plugin *plugin, char *name, new_bar->plugin = plugin; new_bar->number = (last_gui_bar) ? last_gui_bar->number + 1 : 1; new_bar->type = type; + new_bar->conditions = conditions; + if (CONFIG_STRING(conditions) && CONFIG_STRING(conditions)[0]) + { + new_bar->conditions_array = string_explode (CONFIG_STRING(conditions), + ",", 0, 0, + &new_bar->conditions_count); + } + else + { + new_bar->conditions_count = 0; + new_bar->conditions_array = NULL; + } new_bar->position = position; new_bar->size = size; new_bar->current_size = (CONFIG_INTEGER(size) == 0) ? 1 : CONFIG_INTEGER(size); + new_bar->size_max = size_max; new_bar->separator = separator; new_bar->items = items; if (CONFIG_STRING(items) && CONFIG_STRING(items)[0]) @@ -839,11 +999,12 @@ gui_bar_new_with_options (struct t_weechat_plugin *plugin, char *name, struct t_gui_bar * gui_bar_new (struct t_weechat_plugin *plugin, char *name, - char *type, char *position, char *size, char *separators, - char *items) + char *type, char *conditions, char *position, char *size, + char *size_max, char *separators, char *items) { - struct t_config_option *option_type, *option_position, *option_size; - struct t_config_option *option_separator, *option_items; + struct t_config_option *option_type, *option_conditions, *option_position; + struct t_config_option *option_size, *option_size_max, *option_separator; + struct t_config_option *option_items; struct t_gui_bar *new_bar; if (!name || !name[0]) @@ -863,26 +1024,35 @@ gui_bar_new (struct t_weechat_plugin *plugin, char *name, option_type = gui_bar_create_option (name, GUI_BAR_OPTION_TYPE, type); + option_conditions = gui_bar_create_option (name, GUI_BAR_OPTION_CONDITIONS, + conditions); option_position = gui_bar_create_option (name, GUI_BAR_OPTION_POSITION, position); option_size = gui_bar_create_option (name, GUI_BAR_OPTION_SIZE, size); + option_size_max = gui_bar_create_option (name, GUI_BAR_OPTION_SIZE_MAX, + size_max); option_separator = gui_bar_create_option (name, GUI_BAR_OPTION_SEPARATOR, (config_file_string_to_boolean (separators)) ? "on" : "off"); option_items = gui_bar_create_option (name, GUI_BAR_OPTION_ITEMS, items); new_bar = gui_bar_new_with_options (plugin, name, option_type, - option_position, option_size, + option_conditions, option_position, + option_size, option_size_max, option_separator, option_items); if (!new_bar) { if (option_type) config_file_option_free (option_type); + if (option_conditions) + config_file_option_free (option_conditions); if (option_position) config_file_option_free (option_position); if (option_size) config_file_option_free (option_size); + if (option_size_max) + config_file_option_free (option_size_max); if (option_separator) config_file_option_free (option_separator); if (option_items) @@ -904,14 +1074,51 @@ gui_bar_use_temp_bars () for (ptr_temp_bar = gui_temp_bars; ptr_temp_bar; ptr_temp_bar = ptr_temp_bar->next_bar) { - if (ptr_temp_bar->type && ptr_temp_bar->position - && ptr_temp_bar->size && ptr_temp_bar->separator + if (!ptr_temp_bar->type) + ptr_temp_bar->type = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_TYPE, + "0"); + if (!ptr_temp_bar->conditions) + ptr_temp_bar->conditions = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_CONDITIONS, + ""); + + if (!ptr_temp_bar->position) + ptr_temp_bar->position = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_POSITION, + "top"); + + if (!ptr_temp_bar->size) + ptr_temp_bar->size = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_SIZE, + "0"); + + if (!ptr_temp_bar->size_max) + ptr_temp_bar->size_max = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_SIZE_MAX, + "0"); + + if (!ptr_temp_bar->separator) + ptr_temp_bar->separator = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_SEPARATOR, + "off"); + + if (!ptr_temp_bar->items) + ptr_temp_bar->items = gui_bar_create_option (ptr_temp_bar->name, + GUI_BAR_OPTION_ITEMS, + ""); + + if (ptr_temp_bar->type && ptr_temp_bar->conditions + && ptr_temp_bar->position && ptr_temp_bar->size + && ptr_temp_bar->size_max && ptr_temp_bar->separator && ptr_temp_bar->items) { gui_bar_new_with_options (NULL, ptr_temp_bar->name, ptr_temp_bar->type, + ptr_temp_bar->conditions, ptr_temp_bar->position, ptr_temp_bar->size, + ptr_temp_bar->size_max, ptr_temp_bar->separator, ptr_temp_bar->items); } @@ -922,6 +1129,11 @@ gui_bar_use_temp_bars () config_file_option_free (ptr_temp_bar->type); ptr_temp_bar->type = NULL; } + if (ptr_temp_bar->conditions) + { + config_file_option_free (ptr_temp_bar->conditions); + ptr_temp_bar->conditions = NULL; + } if (ptr_temp_bar->position) { config_file_option_free (ptr_temp_bar->position); @@ -932,6 +1144,11 @@ gui_bar_use_temp_bars () config_file_option_free (ptr_temp_bar->size); ptr_temp_bar->size = NULL; } + if (ptr_temp_bar->size_max) + { + config_file_option_free (ptr_temp_bar->size_max); + ptr_temp_bar->size_max = NULL; + } if (ptr_temp_bar->separator) { config_file_option_free (ptr_temp_bar->separator); @@ -1006,14 +1223,20 @@ gui_bar_free (struct t_gui_bar *bar) free (bar->name); if (bar->type) config_file_option_free (bar->type); + if (bar->conditions) + config_file_option_free (bar->conditions); if (bar->position) config_file_option_free (bar->position); if (bar->size) config_file_option_free (bar->size); + if (bar->size_max) + config_file_option_free (bar->size_max); if (bar->separator) config_file_option_free (bar->separator); if (bar->items) config_file_option_free (bar->items); + if (bar->conditions_array) + string_free_exploded (bar->conditions_array); if (bar->items_array) string_free_exploded (bar->items_array); @@ -1073,10 +1296,14 @@ gui_bar_print_log () log_printf (" type . . . . . . . . . : %d (%s)", CONFIG_INTEGER(ptr_bar->type), gui_bar_type_str[CONFIG_INTEGER(ptr_bar->type)]); + log_printf (" conditions . . . . . . : '%s'", CONFIG_STRING(ptr_bar->conditions)); + log_printf (" conditions_count . . . : %d", ptr_bar->conditions_count); + log_printf (" conditions_array . . . : 0x%x", ptr_bar->conditions_array); log_printf (" position . . . . . . . : %d (%s)", CONFIG_INTEGER(ptr_bar->position), gui_bar_position_str[CONFIG_INTEGER(ptr_bar->position)]); log_printf (" size . . . . . . . . . : %d", CONFIG_INTEGER(ptr_bar->size)); + log_printf (" size_max . . . . . . . : %d", CONFIG_INTEGER(ptr_bar->size_max)); log_printf (" current_size . . . . . : %d", ptr_bar->current_size); log_printf (" separator. . . . . . . : %d", CONFIG_INTEGER(ptr_bar->separator)); log_printf (" items. . . . . . . . . : '%s'", CONFIG_STRING(ptr_bar->items)); diff --git a/src/gui/gui-bar.h b/src/gui/gui-bar.h index 5397961c5..4cdc91c07 100644 --- a/src/gui/gui-bar.h +++ b/src/gui/gui-bar.h @@ -26,8 +26,10 @@ struct t_gui_window; enum t_gui_bar_option { GUI_BAR_OPTION_TYPE = 0, + GUI_BAR_OPTION_CONDITIONS, GUI_BAR_OPTION_POSITION, GUI_BAR_OPTION_SIZE, + GUI_BAR_OPTION_SIZE_MAX, GUI_BAR_OPTION_SEPARATOR, GUI_BAR_OPTION_ITEMS, /* number of bar types */ @@ -38,8 +40,6 @@ enum t_gui_bar_type { GUI_BAR_TYPE_ROOT = 0, GUI_BAR_TYPE_WINDOW, - GUI_BAR_TYPE_WINDOW_ACTIVE, - GUI_BAR_TYPE_WINDOW_INACTIVE, /* number of bar types */ GUI_BAR_NUM_TYPES, }; @@ -57,17 +57,21 @@ enum t_gui_bar_position struct t_gui_bar { /* user choices */ - struct t_weechat_plugin *plugin; /* plugin */ - int number; /* bar number */ - char *name; /* bar name */ - struct t_config_option *type; /* type (root or window) */ - struct t_config_option *position; /* bottom, top, left, right */ - struct t_config_option *size; /* size of bar (in chars, 0 = auto) */ - struct t_config_option *separator; /* true if separator line displayed */ - struct t_config_option *items; /* bar items */ + struct t_weechat_plugin *plugin; /* plugin */ + int number; /* bar number */ + char *name; /* bar name */ + struct t_config_option *type; /* type (root or window) */ + struct t_config_option *conditions; /* conditions for display */ + struct t_config_option *position; /* bottom, top, left, right */ + struct t_config_option *size; /* size of bar (in chars, 0 = auto) */ + struct t_config_option *size_max; /* max size of bar (0 = no limit) */ + struct t_config_option *separator; /* true if separator line displayed */ + struct t_config_option *items; /* bar items */ /* internal vars */ int current_size; /* current bar size (strictly > 0) */ + int conditions_count; /* number of conditions */ + char **conditions_array; /* exploded bar conditions */ int items_count; /* number of bar items */ char **items_array; /* exploded bar items */ struct t_gui_bar_window *bar_window; /* pointer to bar window */ @@ -90,18 +94,22 @@ extern struct t_gui_bar *last_gui_temp_bar; extern int gui_bar_search_option (char *option_name); extern int gui_bar_search_type (char *type); extern int gui_bar_search_position (char *position); +extern int gui_bar_check_conditions_for_window (struct t_gui_bar *bar, + struct t_gui_window *window); extern int gui_bar_root_get_size (struct t_gui_bar *bar, enum t_gui_bar_position position); extern struct t_gui_bar *gui_bar_search (char *name); extern void gui_bar_set_current_size (struct t_gui_bar *bar, int current_size); -extern void gui_bar_set (struct t_gui_bar *bar, char *property, char *value); +extern int gui_bar_set (struct t_gui_bar *bar, char *property, char *value); extern struct t_gui_bar *gui_bar_alloc (char *name); extern struct t_config_option *gui_bar_create_option (char *bar_name, int index_option, char *value); extern struct t_gui_bar *gui_bar_new (struct t_weechat_plugin *plugin, - char *name, char *type, char *position, - char *size, char *separator, char *items); + char *name, char *type, char *conditions, + char *position, char *size, + char *size_max, char *separator, + char *items); extern void gui_bar_use_temp_bars (); extern void gui_bar_update (char *name); extern void gui_bar_free (struct t_gui_bar *bar); diff --git a/src/gui/gui-window.h b/src/gui/gui-window.h index 23dc4cebf..9215f748b 100644 --- a/src/gui/gui-window.h +++ b/src/gui/gui-window.h @@ -158,9 +158,9 @@ extern int gui_window_calculate_pos_size (struct t_gui_window *window, int force_calculate); extern void gui_window_redraw_buffer (struct t_gui_buffer *buffer); extern void gui_window_redraw_all_buffers (); -extern void gui_window_switch (struct t_gui_window *window); extern void gui_window_switch_to_buffer (struct t_gui_window *window, struct t_gui_buffer *buffer); +extern void gui_window_switch (struct t_gui_window *window); extern void gui_window_page_up (struct t_gui_window *window); extern void gui_window_page_down (struct t_gui_window *window); extern void gui_window_scroll_up (struct t_gui_window *window); |