static void sig_layout_restore(void) { WINDOW_REC *window; CONFIG_NODE *node; GSList *tmp; node = iconfig_node_traverse("windows", FALSE); if (node == NULL) return; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { CONFIG_NODE *node = tmp->data; window = window_find_refnum(atoi(node->key)); if (window == NULL) window = window_create(NULL, TRUE); window_set_refnum(window, atoi(node->key)); window->sticky_refnum = config_node_get_bool(node, "sticky_refnum", FALSE); window->immortal = config_node_get_bool(node, "immortal", FALSE); window_set_name(window, config_node_get_str(node, "name", NULL)); window_set_history(window, config_node_get_str(node, "history_name", NULL)); window_set_level(window, level2bits(config_node_get_str(node, "level", ""))); window->servertag = g_strdup(config_node_get_str(node, "servertag", NULL)); window->theme_name = g_strdup(config_node_get_str(node, "theme", NULL)); if (window->theme_name != NULL) window->theme = theme_load(window->theme_name); window_add_items(window, config_node_section(node, "items", -1)); signal_emit("layout restore window", 2, window, node); } }
static void read_keyboard_config(void) { CONFIG_NODE *node; GSList *tmp; key_configure_freeze(); keyboard_reset_defaults(); node = iconfig_node_traverse("keyboard", FALSE); if (node == NULL) { key_configure_thaw(); return; } /* FIXME: backward "compatibility" - remove after irssi .99 */ if (node->type != NODE_TYPE_LIST) { iconfig_node_remove(NULL, node); key_configure_thaw(); return; } tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) key_config_read(tmp->data); key_configure_thaw(); /* any positive value other than 0 enables the timeout (in ms). */ key_timeout = settings_get_int("key_timeout"); }
static void log_items_read_config(CONFIG_NODE *node, LOG_REC *log) { LOG_ITEM_REC *rec; GSList *tmp; char *item; int type; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; item = config_node_get_str(node, "name", NULL); type = log_item_str2type(config_node_get_str(node, "type", NULL)); if (item == NULL || type == -1) continue; rec = g_new0(LOG_ITEM_REC, 1); rec->type = type; rec->name = g_strdup(item); rec->servertag = g_strdup(config_node_get_str(node, "server", NULL)); log->items = g_slist_append(log->items, rec); } }
static GList *completion_get_aliases(const char *alias, char cmdchar) { CONFIG_NODE *node; GList *complist; GSList *tmp; char *word; int len; g_return_val_if_fail(alias != NULL, NULL); /* get list of aliases from mainconfig */ node = iconfig_node_traverse("aliases", FALSE); tmp = node == NULL ? NULL : config_node_first(node->value); len = strlen(alias); complist = NULL; for (; tmp != NULL; tmp = config_node_next(tmp)) { CONFIG_NODE *node = tmp->data; if (node->type != NODE_TYPE_KEY) continue; if (g_strncasecmp(node->key, alias, len) == 0) { word = g_strdup_printf("%c%s", cmdchar, node->key); /* add matching alias to completion list, aliases will be appended after command completions and kept in uppercase to show it's an alias */ if (glist_find_icase_string(complist, word) == NULL) complist = g_list_insert_sorted(complist, word, (GCompareFunc) g_istr_cmp); else g_free(word); } } return complist; }
GList *completion_get_targets(const char *word) { CONFIG_NODE *node; GList *list; GSList *tmp; int len; g_return_val_if_fail(word != NULL, NULL); len = strlen(word); list = NULL; /* get the list of all conversion targets */ node = iconfig_node_traverse("conversions", FALSE); tmp = node == NULL ? NULL : config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_KEY) continue; if (len != 0 && g_strncasecmp(node->key, word, len) != 0) continue; list = g_list_append(list, g_strdup(node->key)); } return list; }
static void read_keyboard_config(void) { CONFIG_NODE *node; GSList *tmp; key_configure_freeze(); keyboard_reset_defaults(); node = iconfig_node_traverse("keyboard", FALSE); if (node == NULL) { key_configure_thaw(); return; } /* FIXME: backward "compatibility" - remove after irssi .99 */ if (node->type != NODE_TYPE_LIST) { iconfig_node_remove(NULL, node); key_configure_thaw(); return; } tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) key_config_read(tmp->data); key_configure_thaw(); }
static CONFIG_NODE *statusbar_copy_config(CONFIG_REC *config, CONFIG_NODE *source, CONFIG_NODE *parent) { GSList *tmp; g_return_val_if_fail(parent != NULL, NULL); parent = iconfig_sbar_items_section(parent, TRUE); /* since items list in config file overrides defaults, we'll need to copy the whole list. */ for (tmp = config_node_first(source->value); tmp != NULL; tmp = config_node_next(tmp)) { int priority, right_alignment; CONFIG_NODE *node, *snode; snode = tmp->data; priority = config_node_get_int(snode, "priority", 0); right_alignment = g_strcmp0(config_node_get_str(snode, "alignment", ""), "right") == 0; /* create new item */ node = iconfig_node_section(parent, snode->key, NODE_TYPE_BLOCK); if (priority != 0) iconfig_node_set_int(node, "priority", priority); if (right_alignment) iconfig_node_set_str(node, "alignment", "right"); } return parent; }
static void read_hilight_config(void) { CONFIG_NODE *node; HILIGHT_REC *rec; GSList *tmp; char *text, *color; hilights_destroy_all(); node = iconfig_node_traverse("hilights", FALSE); if (node == NULL) { reset_cache(); return; } tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; text = config_node_get_str(node, "text", NULL); if (text == NULL || *text == '\0') continue; rec = g_new0(HILIGHT_REC, 1); hilights = g_slist_append(hilights, rec); rec->text = g_strdup(text); color = config_node_get_str(node, "color", NULL); rec->color = color == NULL || *color == '\0' ? NULL : g_strdup(color); color = config_node_get_str(node, "act_color", NULL); rec->act_color = color == NULL || *color == '\0' ? NULL : g_strdup(color); rec->level = config_node_get_int(node, "level", 0); rec->priority = config_node_get_int(node, "priority", 0); rec->nick = config_node_get_bool(node, "nick", TRUE); rec->word = config_node_get_bool(node, "word", TRUE); rec->case_sensitive = config_node_get_bool(node, "matchcase", FALSE); rec->nickmask = config_node_get_bool(node, "mask", FALSE); rec->fullword = config_node_get_bool(node, "fullword", FALSE); rec->regexp = config_node_get_bool(node, "regexp", FALSE); rec->servertag = config_node_get_str(node, "servertag", NULL); hilight_init_rec(rec); node = iconfig_node_section(node, "channels", -1); if (node != NULL) rec->channels = config_node_get_list(node); } reset_cache(); }
/* verify that all settings in config file for `module' are actually found from /SET list */ void settings_check_module(const char *module) { SETTINGS_REC *set; CONFIG_NODE *node, *parent; GString *errors; GSList *tmp, *next; int count; g_return_if_fail(module != NULL); node = iconfig_node_traverse("settings", FALSE); node = node == NULL ? NULL : iconfig_node_section(node, module, -1); if (node == NULL) return; errors = g_string_new(NULL); g_string_printf(errors, "Unknown settings in configuration " "file for module %s:", module); count = 0; parent = node; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = next) { node = tmp->data; next = config_node_next(tmp); if (node->key == NULL) continue; set = g_hash_table_lookup(settings, node->key); if (backwards_compatibility(module, node, parent)) continue; if (set == NULL || g_strcmp0(set->module, module) != 0) { g_string_append_printf(errors, " %s", node->key); count++; } } if (count > 0) { if (gslist_find_icase_string(last_invalid_modules, module) == NULL) { /* mark this module having invalid settings */ last_invalid_modules = g_slist_append(last_invalid_modules, g_strdup(module)); } if (fe_initialized) signal_emit("settings errors", 1, errors->str); else { if (last_errors == NULL) last_errors = g_string_new(NULL); else g_string_append_c(last_errors, '\n'); g_string_append(last_errors, errors->str); } } g_string_free(errors, TRUE); }
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 session_restore_server_channels(SERVER_REC *server, CONFIG_NODE *node) { GSList *tmp; /* restore channels */ node = config_node_section(NULL, node, "channels", -1); if (node != NULL && node->type == NODE_TYPE_LIST) { tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) session_restore_channel(server, tmp->data); } }
static void log_read_config(void) { CONFIG_NODE *node; LOG_REC *log; GSList *tmp, *next, *fnames; /* close old logs, save list of open logs */ fnames = NULL; for (tmp = logs; tmp != NULL; tmp = next) { log = tmp->data; next = tmp->next; if (log->temp) continue; if (log->handle != -1) fnames = g_slist_append(fnames, g_strdup(log->fname)); log_destroy(log); } node = iconfig_node_traverse("logs", FALSE); if (node == NULL) return; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; log = g_new0(LOG_REC, 1); logs = g_slist_append(logs, log); log->handle = -1; log->fname = g_strdup(node->key); log->autoopen = config_node_get_bool(node, "auto_open", FALSE); log->level = level2bits(config_node_get_str(node, "level", 0)); signal_emit("log config read", 2, log, node); node = config_node_section(node, "items", -1); if (node != NULL) log_items_read_config(node, log); if (log->autoopen || gslist_find_string(fnames, log->fname)) log_start_logging(log); } g_slist_foreach(fnames, (GFunc) g_free, NULL); g_slist_free(fnames); }
static void statusbar_read(STATUSBAR_GROUP_REC *group, CONFIG_NODE *node) { STATUSBAR_CONFIG_REC *bar; GSList *tmp; const char *visible_str; g_return_if_fail(is_node_list(node)); g_return_if_fail(node->key != NULL); bar = statusbar_config_find(group, node->key); if (config_node_get_bool(node, "disabled", FALSE)) { /* disabled, destroy it if it already exists */ if (bar != NULL) statusbar_config_destroy(group, bar); return; } if (bar == NULL) { bar = statusbar_config_create(group, node->key); bar->type = STATUSBAR_TYPE_ROOT; bar->placement = STATUSBAR_BOTTOM; bar->position = 0; } visible_str = config_node_get_str(node, "visible", ""); if (g_ascii_strcasecmp(visible_str, "active") == 0) bar->visible = STATUSBAR_VISIBLE_ACTIVE; else if (g_ascii_strcasecmp(visible_str, "inactive") == 0) bar->visible = STATUSBAR_VISIBLE_INACTIVE; else bar->visible = STATUSBAR_VISIBLE_ALWAYS; if (g_ascii_strcasecmp(config_node_get_str(node, "type", ""), "window") == 0) bar->type = STATUSBAR_TYPE_WINDOW; if (g_ascii_strcasecmp(config_node_get_str(node, "placement", ""), "top") == 0) bar->placement = STATUSBAR_TOP; bar->position = config_node_get_int(node, "position", 0); node = iconfig_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 read_chatnets(void) { CONFIG_NODE *node; GSList *tmp; while (chatnets != NULL) chatnet_destroy(chatnets->data); node = iconfig_node_traverse("chatnets", FALSE); if (node != NULL) { tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) chatnet_read(tmp->data); } }
static void session_restore_channel_nicks(CHANNEL_REC *channel, CONFIG_NODE *node) { GSList *tmp; /* restore nicks */ node = config_node_section(NULL, node, "nicks", -1); if (node != NULL && node->type == NODE_TYPE_LIST) { tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { signal_emit("session restore nick", 2, channel, tmp->data); } } }
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 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 read_servers(void) { CONFIG_NODE *node; GSList *tmp; while (setupservers != NULL) server_setup_destroy(setupservers->data); /* Read servers */ node = iconfig_node_traverse("servers", FALSE); if (node != NULL) { tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) server_setup_read(tmp->data); } }
static void read_statusbar_config_from_node(CONFIG_NODE *node) { CONFIG_NODE *items, *group; GSList *tmp; int i; items = iconfig_node_section(node, "items", -1); if (items != NULL) statusbar_read_items(items); for (tmp = config_node_first(node->value), i = 0; tmp != NULL; tmp = config_node_next(tmp), i++) { group = tmp->data; if (group != items) { skip_corrupt_config(node, group, i, ""); statusbar_read_group(group); } } }
static CONFIG_NODE *key_config_find(const char *key) { CONFIG_NODE *node; GSList *tmp; /* remove old keyboard settings */ node = iconfig_node_traverse("(keyboard", TRUE); tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (g_strcmp0(config_node_get_str(node, "key", ""), key) == 0) return node; } return NULL; }
static void read_ignores(void) { IGNORE_REC *rec; CONFIG_NODE *node; GSList *tmp; while (ignores != NULL) ignore_destroy(ignores->data, FALSE); node = iconfig_node_traverse("ignores", FALSE); if (node == NULL) { nickmatch_rebuild(nickmatch); return; } tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { node = tmp->data; if (node->type != NODE_TYPE_BLOCK) continue; rec = g_new0(IGNORE_REC, 1); ignores = g_slist_append(ignores, rec); rec->mask = g_strdup(config_node_get_str(node, "mask", NULL)); rec->pattern = g_strdup(config_node_get_str(node, "pattern", NULL)); rec->level = level2bits(config_node_get_str(node, "level", ""), NULL); rec->exception = config_node_get_bool(node, "exception", FALSE); rec->regexp = config_node_get_bool(node, "regexp", FALSE); rec->fullword = config_node_get_bool(node, "fullword", FALSE); rec->replies = config_node_get_bool(node, "replies", FALSE); rec->unignore_time = config_node_get_int(node, "unignore_time", 0); rec->servertag = g_strdup(config_node_get_str(node, "servertag", 0)); node = iconfig_node_section(node, "channels", -1); if (node != NULL) rec->channels = config_node_get_list(node); ignore_init_rec(rec); } nickmatch_rebuild(nickmatch); }
static void window_add_items(WINDOW_REC *window, CONFIG_NODE *node) { GSList *tmp; char *type; if (node == NULL) return; tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) { CONFIG_NODE *node = tmp->data; type = config_node_get_str(node, "type", NULL); if (type != NULL) { signal_emit("layout restore item", 3, window, type, node); } } }
static void sig_session_restore(CONFIG_REC *config) { CONFIG_NODE *node; GSList *tmp; char **pids, **pid; /* restore servers */ node = config_node_traverse(config, "(servers", FALSE); if (node != NULL) { tmp = config_node_first(node->value); for (; tmp != NULL; tmp = config_node_next(tmp)) session_restore_server(tmp->data); } /* restore pids (so we don't leave zombies) */ pids = g_strsplit(config_node_get_str(config->mainnode, "pids", ""), " ", -1); for (pid = pids; *pid != NULL; pid++) pidwait_add(atoi(*pid)); g_strfreev(pids); }
static void settings_clean_invalid_module(const char *module) { CONFIG_NODE *node; SETTINGS_REC *set; GSList *tmp, *next; node = iconfig_node_traverse("settings", FALSE); if (node == NULL) return; node = iconfig_node_section(node, module, -1); if (node == NULL) return; for (tmp = config_node_first(node->value); tmp != NULL; tmp = next) { CONFIG_NODE *subnode = tmp->data; next = config_node_next(tmp); set = g_hash_table_lookup(settings, subnode->key); if (set == NULL || g_strcmp0(set->module, module) != 0) iconfig_node_remove(node, subnode); } }
static void statusbar_read_group(CONFIG_NODE *node) { STATUSBAR_GROUP_REC *group; GSList *tmp; int i; g_return_if_fail(is_node_list(node)); group = statusbar_group_find(node->key); if (group == NULL) { group = statusbar_group_create(node->key); if (active_statusbar_group == NULL) active_statusbar_group = group; } for (tmp = config_node_first(node->value), i = 0; tmp != NULL; tmp = config_node_next(tmp), i++) { CONFIG_NODE *value = tmp->data; skip_corrupt_config(node, value, i, "statusbar"); statusbar_read(group, value); } }
static void show_aliases(const char *alias) { CONFIG_NODE *node; GSList *tmp, *list; int aliaslen; printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_ALIASLIST_HEADER); node = iconfig_node_traverse("aliases", FALSE); tmp = node == NULL ? NULL : config_node_first(node->value); /* first get the list of aliases sorted */ list = NULL; aliaslen = strlen(alias); for (; tmp != NULL; tmp = config_node_next(tmp)) { CONFIG_NODE *node = tmp->data; if (node->type != NODE_TYPE_KEY) continue; if (aliaslen != 0 && g_strncasecmp(node->key, alias, aliaslen) != 0) continue; list = g_slist_insert_sorted(list, node, (GCompareFunc) config_key_compare); } /* print the aliases */ for (tmp = list; tmp != NULL; tmp = tmp->next) { CONFIG_NODE *node = tmp->data; printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_ALIASLIST_LINE, node->key, node->value); } g_slist_free(list); printformat(NULL, NULL, MSGLEVEL_CLIENTCRAP, TXT_ALIASLIST_FOOTER); }
/* Returns the next non-comment node in list */ GSList *config_node_next(GSList *list) { list = list->next; return config_node_first(list); }