X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fconfig.c;h=db8856e69c71ee9172a9057079bfff06998424be;hb=75d4428403712469e069c460aea1ea282336a099;hp=2ec6d5f7b91b51a051c77b7b76db128257f5d15f;hpb=56dc0446cd8a9a2685e1ffadb58b781e52e1a95a;p=chaz%2Fopenbox diff --git a/openbox/config.c b/openbox/config.c index 2ec6d5f7..db8856e6 100644 --- a/openbox/config.c +++ b/openbox/config.c @@ -1,37 +1,120 @@ #include "config.h" +#include "parse.h" -#ifdef HAVE_STDIO_H -# include -#endif +gboolean config_focus_new; +gboolean config_focus_follow; +gboolean config_focus_last; +gboolean config_focus_last_on_desktop; -static GSList *config = NULL; +char *config_theme; -/* provided by cparse.l */ -void cparse_go(FILE *); +int config_desktops_num; +GSList *config_desktops_names; +static void parse_focus(char *name, ParseToken *value) +{ + if (!g_ascii_strcasecmp(name, "focusnew")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + config_focus_new = value->data.bool; + } + } else if (!g_ascii_strcasecmp(name, "followmouse")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + config_focus_follow = value->data.bool; + } + } else if (!g_ascii_strcasecmp(name, "focuslast")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + config_focus_last = value->data.bool; + } + } else if (!g_ascii_strcasecmp(name, "focuslastondesktop")) { + if (value->type != TOKEN_BOOL) + yyerror("invalid value"); + else { + config_focus_last_on_desktop = value->data.bool; + } + } else + yyerror("invalid option"); + parse_free_token(value); +} -void config_startup() +static void parse_theme(char *name, ParseToken *value) { + if (!g_ascii_strcasecmp(name, "theme")) { + if (value->type != TOKEN_STRING) + yyerror("invalid value"); + else { + g_free(config_theme); + config_theme = g_strdup(value->data.string); + } + } else + yyerror("invalid option"); + parse_free_token(value); } -void config_shutdown() +static void parse_desktops(char *name, ParseToken *value) { + GList *it; + + if (!g_ascii_strcasecmp(name, "number")) { + if (value->type != TOKEN_INTEGER) + yyerror("invalid value"); + else { + config_desktops_num = value->data.integer; + } + } else if (!g_ascii_strcasecmp(name, "names")) { + if (value->type == TOKEN_LIST) { + for (it = value->data.list; it; it = it->next) + if (((ParseToken*)it->data)->type != TOKEN_STRING) break; + if (it == NULL) { + /* build a string list */ + g_free(config_desktops_names); + for (it = value->data.list; it; it = it->next) + config_desktops_names = + g_slist_append(config_desktops_names, + g_strdup + (((ParseToken*)it->data)->data.string)); + } else { + yyerror("invalid string in names list"); + } + } else { + yyerror("syntax error (expected list of strings)"); + } + } else + yyerror("invalid option"); + parse_free_token(value); } -void config_parse() +void config_startup() { - FILE *file; - char *path; - - path = g_build_filename(g_get_home_dir(), ".openbox", "rc3", NULL); - if ((file = fopen(path, "r")) != NULL) { - cparse_go(file); - fclose(file); - } + config_focus_new = TRUE; + config_focus_follow = FALSE; + config_focus_last = TRUE; + config_focus_last_on_desktop = TRUE; + + parse_reg_section("focus", NULL, parse_focus); + + config_theme = NULL; + + parse_reg_section("theme", NULL, parse_theme); + + config_desktops_num = 4; + config_desktops_names = NULL; + + parse_reg_section("desktops", NULL, parse_desktops); } -gboolean config_set(char *name, ConfigValueType type, ConfigValue value) +void config_shutdown() { - g_message("Setting %s\n", name); - return TRUE; + GSList *it; + + g_free(config_theme); + + for (it = config_desktops_names; it; it = it->next) + g_free(it->data); + g_slist_free(config_desktops_names); }