X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=parser%2Fparse.c;h=636b451f2b5d3a937b76279ebdf971bc3b767655;hb=6253283a06f062657a5b12cb68b7321f966971ad;hp=63d53ce7990ffb8851e75c3a72d74538463b0b29;hpb=da04050c9a539ba93e29ad8e4c5d104386b27989;p=chaz%2Fopenbox diff --git a/parser/parse.c b/parser/parse.c index 63d53ce7..636b451f 100644 --- a/parser/parse.c +++ b/parser/parse.c @@ -46,7 +46,7 @@ static void destfunc(struct Callback *c) g_free(c); } -ObParseInst* parse_startup() +ObParseInst* parse_startup(void) { ObParseInst *i = g_new(ObParseInst, 1); i->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, @@ -68,7 +68,7 @@ void parse_register(ObParseInst *i, const gchar *tag, struct Callback *c; if ((c = g_hash_table_lookup(i->callbacks, tag))) { - g_warning("Tag '%s' already registered", tag); + g_error("Tag '%s' already registered", tag); return; } @@ -79,31 +79,22 @@ void parse_register(ObParseInst *i, const gchar *tag, g_hash_table_insert(i->callbacks, c->tag, c); } -gboolean parse_load_rc(const gchar *file, xmlDocPtr *doc, xmlNodePtr *root, - gchar **fileused) +gboolean parse_load_rc(const gchar *file, xmlDocPtr *doc, xmlNodePtr *root) { GSList *it; gboolean r = FALSE; - *fileused = NULL; + if (file && parse_load(file, "openbox_config", doc, root)) + return TRUE; - if (file) { - if ((r = parse_load(file, "openbox_config", doc, root))) - *fileused = g_strdup(file); - } else { - /* this won't run if the above code loaded a config */ - for (it = xdg_config_dir_paths; !r && it; it = g_slist_next(it)) { - gchar *path; + for (it = xdg_config_dir_paths; !r && it; it = g_slist_next(it)) { + gchar *path; - path = g_build_filename(it->data, "openbox", "rc.xml", NULL); - if ((r = parse_load(path, "openbox_config", doc, root))) - *fileused = path; - else - g_free(path); - } + path = g_build_filename(it->data, "openbox", "rc.xml", NULL); + r = parse_load(path, "openbox_config", doc, root); + g_free(path); } - if (!r) - g_warning("Unable to find a valid config file, using defaults"); + return r; } @@ -113,25 +104,38 @@ gboolean parse_load_theme(const gchar *name, xmlDocPtr *doc, xmlNodePtr *root, GSList *it; gchar *path; gboolean r = FALSE; + gchar *eng; /* backward compatibility.. */ path = g_build_filename(g_get_home_dir(), ".themes", name, "openbox-3", "themerc.xml", NULL); - if ((r = parse_load(path, "openbox_theme", doc, root))) - *retpath = g_path_get_dirname(path); + if (parse_load(path, "openbox_theme", doc, root) && + parse_attr_string("engine", *root, &eng)) + { + if (!strcmp(eng, "box")) { + *retpath = g_path_get_dirname(path); + r = TRUE; + } + g_free(eng); + } g_free(path); if (!r) { for (it = xdg_data_dir_paths; !r && it; it = g_slist_next(it)) { path = g_build_filename(it->data, "themes", name, "openbox-3", "themerc.xml", NULL); - if ((r = parse_load(path, "openbox_theme", doc, root))) - *retpath = g_path_get_dirname(path); + if (parse_load(path, "openbox_theme", doc, root) && + parse_attr_string("engine", *root, &eng)) + { + if (!strcmp(eng, "box")) { + *retpath = g_path_get_dirname(path); + r = TRUE; + } + g_free(eng); + } g_free(path); } } - if (!r) - g_warning("Unable to load the theme %s", name); return r; } @@ -150,8 +154,6 @@ gboolean parse_load_menu(const gchar *file, xmlDocPtr *doc, xmlNodePtr *root) g_free(path); } } - if (!r) - g_warning("Unable to find a valid menu file '%s'", file); return r; } @@ -159,6 +161,7 @@ gboolean parse_load(const gchar *path, const gchar *rootname, xmlDocPtr *doc, xmlNodePtr *root) { struct stat s; + if (stat(path, &s) < 0) return FALSE; @@ -170,13 +173,13 @@ gboolean parse_load(const gchar *path, const gchar *rootname, if (!*root) { xmlFreeDoc(*doc); *doc = NULL; - g_warning("%s is an empty document", path); + g_message("%s is an empty document", path); } else { if (xmlStrcmp((*root)->name, (const xmlChar*)rootname)) { xmlFreeDoc(*doc); *doc = NULL; - g_warning("Document %s is of wrong type. root node is " - "not '%s'", path, rootname); + g_message("XML Document %s is of wrong type. Root " + "node is not '%s'", path, rootname); } } } @@ -193,13 +196,13 @@ gboolean parse_load_mem(gpointer data, guint len, const gchar *rootname, if (!*root) { xmlFreeDoc(*doc); *doc = NULL; - g_warning("Given memory is an empty document"); + g_message("Given memory is an empty document"); } else { if (xmlStrcmp((*root)->name, (const xmlChar*)rootname)) { xmlFreeDoc(*doc); *doc = NULL; - g_warning("Document in given memory is of wrong type. root " - "node is not '%s'", rootname); + g_message("XML Document in given memory is of wrong " + "type. Root node is not '%s'\n", rootname); } } } @@ -236,7 +239,7 @@ gchar *parse_string(xmlDocPtr doc, xmlNodePtr node) gint parse_int(xmlDocPtr doc, xmlNodePtr node) { xmlChar *c = xmlNodeListGetString(doc, node->children, TRUE); - gint i = atoi((gchar*)c); + gint i = c ? atoi((gchar*)c) : 0; xmlFree(c); return i; } @@ -245,11 +248,11 @@ gboolean parse_bool(xmlDocPtr doc, xmlNodePtr node) { xmlChar *c = xmlNodeListGetString(doc, node->children, TRUE); gboolean b = FALSE; - if (!xmlStrcasecmp(c, (const xmlChar*) "true")) + if (c && !xmlStrcasecmp(c, (const xmlChar*) "true")) b = TRUE; - else if (!xmlStrcasecmp(c, (const xmlChar*) "yes")) + else if (c && !xmlStrcasecmp(c, (const xmlChar*) "yes")) b = TRUE; - else if (!xmlStrcasecmp(c, (const xmlChar*) "on")) + else if (c && !xmlStrcasecmp(c, (const xmlChar*) "on")) b = TRUE; xmlFree(c); return b; @@ -367,7 +370,7 @@ static GSList* split_paths(const gchar *paths) return list; } -void parse_paths_startup() +void parse_paths_startup(void) { const gchar *path; @@ -393,23 +396,26 @@ void parse_paths_startup() if (path && path[0] != '\0') /* not unset or empty */ xdg_config_dir_paths = split_paths(path); else { + xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths, + g_strdup(CONFIGDIR), + (GSListFunc) g_slist_append); xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths, g_build_filename (G_DIR_SEPARATOR_S, "etc", "xdg", NULL), (GSListFunc) g_slist_append); - xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths, - g_strdup(CONFIGDIR), - (GSListFunc) g_slist_append); } xdg_config_dir_paths = slist_path_add(xdg_config_dir_paths, g_strdup(xdg_config_home_path), (GSListFunc) g_slist_prepend); - + path = g_getenv("XDG_DATA_DIRS"); if (path && path[0] != '\0') /* not unset or empty */ xdg_data_dir_paths = split_paths(path); else { + xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths, + g_strdup(DATADIR), + (GSListFunc) g_slist_append); xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths, g_build_filename (G_DIR_SEPARATOR_S, @@ -420,16 +426,13 @@ void parse_paths_startup() (G_DIR_SEPARATOR_S, "usr", "share", NULL), (GSListFunc) g_slist_append); - xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths, - g_strdup(DATADIR), - (GSListFunc) g_slist_append); } xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths, g_strdup(xdg_data_home_path), (GSListFunc) g_slist_prepend); } -void parse_paths_shutdown() +void parse_paths_shutdown(void) { GSList *it; @@ -505,22 +508,22 @@ gboolean parse_mkdir_path(const gchar *path, gint mode) return ret; } -const gchar* parse_xdg_config_home_path() +const gchar* parse_xdg_config_home_path(void) { return xdg_config_home_path; } -const gchar* parse_xdg_data_home_path() +const gchar* parse_xdg_data_home_path(void) { return xdg_data_home_path; } -GSList* parse_xdg_config_dir_paths() +GSList* parse_xdg_config_dir_paths(void) { return xdg_config_dir_paths; } -GSList* parse_xdg_data_dir_paths() +GSList* parse_xdg_data_dir_paths(void) { return xdg_data_dir_paths; }