summaryrefslogtreecommitdiff
path: root/src/fe-text/statusbar-config.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fe-text/statusbar-config.c')
-rw-r--r--src/fe-text/statusbar-config.c263
1 files changed, 263 insertions, 0 deletions
diff --git a/src/fe-text/statusbar-config.c b/src/fe-text/statusbar-config.c
new file mode 100644
index 00000000..cc14b886
--- /dev/null
+++ b/src/fe-text/statusbar-config.c
@@ -0,0 +1,263 @@
+/*
+ statusbar-config.c : irssi
+
+ Copyright (C) 2001 Timo Sirainen
+
+ 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 2 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, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+#include "module.h"
+#include "signals.h"
+#include "settings.h"
+#include "lib-config/iconfig.h"
+
+#include "statusbar.h"
+
+static void read_statusbar_config_from_node(CONFIG_NODE *node);
+
+static STATUSBAR_CONFIG_REC *
+statusbar_config_create(STATUSBAR_GROUP_REC *group, const char *name)
+{
+ STATUSBAR_CONFIG_REC *bar;
+
+ g_return_val_if_fail(group != NULL, NULL);
+ g_return_val_if_fail(name != NULL, NULL);
+
+ bar = g_new0(STATUSBAR_CONFIG_REC, 1);
+ group->config_bars = g_slist_append(group->config_bars, bar);
+
+ bar->name = g_strdup(name);
+ return bar;
+}
+
+static SBAR_ITEM_CONFIG_REC *
+statusbar_item_config_create(STATUSBAR_CONFIG_REC *bar, const char *name,
+ int priority, int right_alignment)
+{
+ SBAR_ITEM_CONFIG_REC *rec;
+
+ g_return_val_if_fail(bar != NULL, NULL);
+ g_return_val_if_fail(name != NULL, NULL);
+
+ rec = g_new0(SBAR_ITEM_CONFIG_REC, 1);
+ bar->items = g_slist_append(bar->items, rec);
+
+ rec->name = g_strdup(name);
+ rec->priority = priority;
+ rec->right_alignment = right_alignment;
+
+ return rec;
+}
+
+static void statusbar_config_item_destroy(STATUSBAR_CONFIG_REC *barconfig,
+ SBAR_ITEM_CONFIG_REC *itemconfig)
+{
+ barconfig->items = g_slist_remove(barconfig->items, itemconfig);
+
+ g_free(itemconfig->name);
+ g_free(itemconfig);
+}
+
+void statusbar_config_destroy(STATUSBAR_GROUP_REC *group,
+ STATUSBAR_CONFIG_REC *config)
+{
+ group->config_bars = g_slist_remove(group->config_bars, config);
+
+ while (config->items != NULL)
+ statusbar_config_item_destroy(config, config->items->data);
+
+ g_free(config->name);
+ g_free(config);
+}
+
+static STATUSBAR_CONFIG_REC *
+statusbar_config_find(STATUSBAR_GROUP_REC *group, const char *name)
+{
+ GSList *tmp;
+
+ for (tmp = group->config_bars; tmp != NULL; tmp = tmp->next) {
+ STATUSBAR_CONFIG_REC *config = tmp->data;
+
+ if (strcmp(config->name, name) == 0)
+ return config;
+ }
+
+ return NULL;
+}
+
+static void statusbar_reset_defaults(void)
+{
+ CONFIG_REC *config;
+ CONFIG_NODE *node;
+
+ while (statusbar_groups != NULL)
+ statusbar_group_destroy(statusbar_groups->data);
+ active_statusbar_group = NULL;
+
+ /* read the default statusbar settings from internal config */
+ config = config_open(NULL, -1);
+ config_parse_data(config, default_config, "internal");
+ node = config_node_traverse(config, "statusbar", FALSE);
+ if (node != NULL)
+ read_statusbar_config_from_node(node);
+ config_close(config);
+}
+
+static void statusbar_read_items(CONFIG_NODE *items)
+{
+ GSList *tmp;
+
+ tmp = config_node_first(items->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp)) {
+ CONFIG_NODE *node = tmp->data;
+
+ statusbar_item_register(node->key, node->value, NULL);
+ }
+}
+
+static void statusbar_read_item(STATUSBAR_CONFIG_REC *bar, CONFIG_NODE *node)
+{
+ int priority, right_alignment;
+
+ priority = config_node_get_int(node, "priority", 0);
+ right_alignment = strcmp(config_node_get_str(node, "alignment", ""), "right") == 0;
+ statusbar_item_config_create(bar, node->key,
+ priority, right_alignment);
+}
+
+static void statusbar_read(STATUSBAR_GROUP_REC *group, CONFIG_NODE *node)
+{
+ STATUSBAR_CONFIG_REC *bar;
+ GSList *tmp;
+ int type, placement, position, visible;
+ const char *visible_str;
+
+ bar = statusbar_config_find(group, node->key);
+
+ type = STATUSBAR_TYPE_ROOT;
+ placement = STATUSBAR_BOTTOM;
+ position = 0;
+ visible = STATUSBAR_VISIBLE_ALWAYS;
+
+ visible_str = config_node_get_str(node, "visible", "");
+ if (strcmp(visible_str, "active") == 0)
+ visible = STATUSBAR_VISIBLE_ACTIVE;
+ else if (strcmp(visible_str, "inactive") == 0)
+ visible = STATUSBAR_VISIBLE_INACTIVE;
+ else if (strcmp(visible_str, "never") == 0) {
+ /* we don't want this statusbar -
+ destroy it if it already exists */
+ if (bar != NULL)
+ statusbar_config_destroy(group, bar);
+ return;
+ }
+
+ if (strcmp(config_node_get_str(node, "type", ""), "window") == 0)
+ type = STATUSBAR_TYPE_WINDOW;
+ if (strcmp(config_node_get_str(node, "placement", ""), "top") == 0)
+ placement = STATUSBAR_TOP;
+ position = config_node_get_int(node, "position", 0);
+
+ if (bar == NULL)
+ bar = statusbar_config_create(group, node->key);
+
+ bar->type = type;
+ bar->placement = placement;
+ bar->position = position;
+ bar->visible = visible;
+
+ node = config_node_section(node, "items", -1);
+ if (node != NULL) {
+ /* we're overriding the items - destroy the old */
+ while (bar->items != NULL)
+ statusbar_config_item_destroy(bar, bar->items->data);
+
+ tmp = config_node_first(node->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp))
+ statusbar_read_item(bar, tmp->data);
+ }
+}
+
+static void statusbar_read_group(CONFIG_NODE *node)
+{
+ STATUSBAR_GROUP_REC *group;
+ GSList *tmp;
+
+ group = statusbar_group_find(node->key);
+ if (group == NULL) {
+ group = statusbar_group_create(node->key);
+ if (active_statusbar_group == NULL)
+ active_statusbar_group = group;
+ }
+
+ tmp = config_node_first(node->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp))
+ statusbar_read(group, tmp->data);
+}
+
+static void create_root_statusbars(void)
+{
+ STATUSBAR_REC *bar;
+ GSList *tmp;
+
+ tmp = active_statusbar_group->config_bars;
+ for (; tmp != NULL; tmp = tmp->next) {
+ STATUSBAR_CONFIG_REC *rec = tmp->data;
+
+ if (rec->type == STATUSBAR_TYPE_ROOT) {
+ bar = statusbar_create(active_statusbar_group, rec, NULL);
+ statusbar_redraw(bar);
+ }
+ }
+}
+
+static void read_statusbar_config_from_node(CONFIG_NODE *node)
+{
+ CONFIG_NODE *items;
+ GSList *tmp;
+
+ items = config_node_section(node, "items", -1);
+ if (items != NULL)
+ statusbar_read_items(items);
+
+ tmp = config_node_first(node->value);
+ for (; tmp != NULL; tmp = config_node_next(tmp)) {
+ if (tmp->data != items)
+ statusbar_read_group(tmp->data);
+ }
+}
+
+static void read_statusbar_config(void)
+{
+ CONFIG_NODE *node;
+
+ statusbar_reset_defaults();
+
+ node = iconfig_node_traverse("statusbar", FALSE);
+ if (node != NULL)
+ read_statusbar_config_from_node(node);
+
+ create_root_statusbars();
+}
+
+void statusbar_config_init(void)
+{
+ read_statusbar_config();
+ signal_add("setup reread", (SIGNAL_FUNC) read_statusbar_config);
+}
+
+void statusbar_config_deinit(void)
+{
+}