X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=parser%2Fparse.c;h=85ffc15168e2b2b2b57d558b325ce2205b0ae230;hb=4940d007cce43a135f1b448902f5a3571dbce62a;hp=9db02fb067adf3139a1f1722faa54473e098452e;hpb=ec304c9e433e4b1cedf924ca64d783f05db7d42d;p=chaz%2Fopenbox diff --git a/parser/parse.c b/parser/parse.c index 9db02fb0..85ffc151 100644 --- a/parser/parse.c +++ b/parser/parse.c @@ -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,19 +79,26 @@ void parse_register(ObParseInst *i, const gchar *tag, g_hash_table_insert(i->callbacks, c->tag, c); } -gboolean parse_load_rc(xmlDocPtr *doc, xmlNodePtr *root) +gboolean parse_load_rc(const gchar *type, xmlDocPtr *doc, xmlNodePtr *root) { GSList *it; - gchar *path; gboolean r = FALSE; + gchar *fname; + + if (type == NULL) + fname = g_strdup("rc.xml"); + else + fname = g_strdup_printf("rc-%s.xml", type); for (it = xdg_config_dir_paths; !r && it; it = g_slist_next(it)) { - path = g_build_filename(it->data, "openbox", "rc.xml", NULL); + gchar *path; + + path = g_build_filename(it->data, "openbox", fname, 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"); + g_free(fname); + return r; } @@ -101,25 +108,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; } @@ -138,8 +158,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; } @@ -152,18 +170,19 @@ gboolean parse_load(const gchar *path, const gchar *rootname, /* XML_PARSE_BLANKS is needed apparently. When it loads a theme file, without this option, the tree is weird and has extra nodes in it. */ - if ((*doc = xmlReadFile(path, NULL, XML_PARSE_NOBLANKS))) { + if ((*doc = xmlReadFile(path, NULL, + XML_PARSE_NOBLANKS | XML_PARSE_RECOVER))) { *root = xmlDocGetRootElement(*doc); if (!*root) { xmlFreeDoc(*doc); *doc = NULL; - g_warning("%s is an empty document", path); + g_message("%s is an empty document", path); } else { - if (xmlStrcasecmp((*root)->name, (const xmlChar*)rootname)) { + 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); } } } @@ -180,13 +199,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 (xmlStrcasecmp((*root)->name, (const xmlChar*)rootname)) { + 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); } } } @@ -254,7 +273,7 @@ gboolean parse_contains(const gchar *val, xmlDocPtr doc, xmlNodePtr node) xmlNodePtr parse_find_node(const gchar *tag, xmlNodePtr node) { while (node) { - if (!xmlStrcasecmp(node->name, (const xmlChar*) tag)) + if (!xmlStrcmp(node->name, (const xmlChar*) tag)) return node; node = node->next; } @@ -334,6 +353,8 @@ static GSList* slist_path_add(GSList *list, gpointer data, GSListFunc func) if (!g_slist_find_custom(list, data, (GCompareFunc) slist_path_cmp)) list = func(list, data); + else + g_free(data); return list; } @@ -378,23 +399,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, - xdg_config_home_path, + 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, @@ -405,12 +429,9 @@ 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, - xdg_data_home_path, + g_strdup(xdg_data_home_path), (GSListFunc) g_slist_prepend); }