all repos — openbox @ 07d5674d3984d008de1ecc768a296afbed731e4e

openbox fork - make it a bit more like ryudo

move the xdg path stuff into obt/paths.[ch], and make render and openbox use it
Dana Jansens danakj@orodu.net
commit

07d5674d3984d008de1ecc768a296afbed731e4e

parent

1a0a1626b699c2e272ea6823b59aa7387242880e

M Makefile.amMakefile.am

@@ -125,6 +125,8 @@ obt/mainloop.h \

obt/mainloop.c \ obt/parse.h \ obt/parse.c \ + obt/paths.h \ + obt/paths.c \ obt/prop.h \ obt/prop.c \ obt/util.h

@@ -386,6 +388,8 @@ obt/mainloop.h \

obt/mainloop.c \ obt/parse.h \ obt/parse.c \ + obt/paths.h \ + obt/paths.c \ obt/prop.h \ obt/prop.c \ obt/util.h
M obt/parse.cobt/parse.c

@@ -17,14 +17,12 @@ See the COPYING file for a copy of the GNU General Public License.

*/ #include "obt/parse.h" +#include "obt/paths.h" #include <glib.h> -#ifdef HAVE_STRING_H -# include <string.h> -#endif -#ifdef HAVE_ERRNO_H -# include <errno.h> +#ifdef HAVE_STDLIB_H +# include <stdlib.h> #endif #ifdef HAVE_SYS_STAT_H # include <sys/stat.h>

@@ -35,12 +33,6 @@ #endif

#ifdef HAVE_UNISTD_H # include <unistd.h> #endif - -static gboolean xdg_start; -static gchar *xdg_config_home_path; -static gchar *xdg_data_home_path; -static GSList *xdg_config_dir_paths; -static GSList *xdg_data_dir_paths; struct Callback { gchar *tag;

@@ -50,6 +42,7 @@ };

struct _ObtParseInst { gint ref; + ObtPaths *xdg_paths; GHashTable *callbacks; xmlDocPtr doc; xmlNodePtr root;

@@ -66,6 +59,7 @@ ObtParseInst* obt_parse_instance_new(void)

{ ObtParseInst *i = g_new(ObtParseInst, 1); i->ref = 1; + i->xdg_paths = obt_paths_new(); i->callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)destfunc); i->doc = NULL;

@@ -82,6 +76,7 @@

void obt_parse_instance_unref(ObtParseInst *i) { if (i && --i->ref == 0) { + obt_paths_unref(i->xdg_paths); g_hash_table_destroy(i->callbacks); g_free(i); }

@@ -195,7 +190,7 @@ {

GSList *it, *paths = NULL; gboolean r; - for (it = xdg_config_dir_paths; it; it = g_slist_next(it)) + for (it = obt_paths_config_dirs(i->xdg_paths); it; it = g_slist_next(it)) paths = g_slist_append(paths, g_strdup(it->data)); r = load_file(i, domain, filename, root_node, paths);

@@ -215,7 +210,7 @@ {

GSList *it, *paths = NULL; gboolean r; - for (it = xdg_data_dir_paths; it; it = g_slist_next(it)) + for (it = obt_paths_data_dirs(i->xdg_paths); it; it = g_slist_next(it)) paths = g_slist_append(paths, g_strdup(it->data)); r = load_file(i, domain, filename, root_node, paths);

@@ -240,7 +235,7 @@ /* use ~/.themes for backwards compatibility */

paths = g_slist_append (paths, g_build_filename(g_get_home_dir(), ".themes", theme, NULL)); - for (it = xdg_data_dir_paths; it; it = g_slist_next(it)) + for (it = obt_paths_data_dirs(i->xdg_paths); it; it = g_slist_next(it)) paths = g_slist_append (paths, g_build_filename(it->data, "themes", theme, NULL));

@@ -416,197 +411,3 @@ r = !xmlStrcasecmp(c, (const xmlChar*) val);

xmlFree(c); return r; } - -static gint slist_path_cmp(const gchar *a, const gchar *b) -{ - return strcmp(a, b); -} - -typedef GSList* (*GSListFunc) (gpointer list, gconstpointer data); - -static GSList* slist_path_add(GSList *list, gpointer data, GSListFunc func) -{ - g_assert(func); - - if (!data) - return list; - - if (!g_slist_find_custom(list, data, (GCompareFunc) slist_path_cmp)) - list = func(list, data); - else - g_free(data); - - return list; -} - -static GSList* split_paths(const gchar *paths) -{ - GSList *list = NULL; - gchar **spl, **it; - - if (!paths) - return NULL; - spl = g_strsplit(paths, ":", -1); - for (it = spl; *it; ++it) - list = slist_path_add(list, *it, (GSListFunc) g_slist_append); - g_free(spl); - return list; -} - -void parse_paths_startup(void) -{ - const gchar *path; - - if (xdg_start) - return; - xdg_start = TRUE; - - path = g_getenv("XDG_CONFIG_HOME"); - if (path && path[0] != '\0') /* not unset or empty */ - xdg_config_home_path = g_build_filename(path, NULL); - else - xdg_config_home_path = g_build_filename(g_get_home_dir(), ".config", - NULL); - - path = g_getenv("XDG_DATA_HOME"); - if (path && path[0] != '\0') /* not unset or empty */ - xdg_data_home_path = g_build_filename(path, NULL); - else - xdg_data_home_path = g_build_filename(g_get_home_dir(), ".local", - "share", NULL); - - path = g_getenv("XDG_CONFIG_DIRS"); - 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(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, - "usr", "local", "share", NULL), - (GSListFunc) g_slist_append); - xdg_data_dir_paths = slist_path_add(xdg_data_dir_paths, - g_build_filename - (G_DIR_SEPARATOR_S, - "usr", "share", NULL), - (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) -{ - GSList *it; - - if (!xdg_start) - return; - xdg_start = FALSE; - - for (it = xdg_config_dir_paths; it; it = g_slist_next(it)) - g_free(it->data); - g_slist_free(xdg_config_dir_paths); - xdg_config_dir_paths = NULL; - for (it = xdg_data_dir_paths; it; it = g_slist_next(it)) - g_free(it->data); - g_slist_free(xdg_data_dir_paths); - xdg_data_dir_paths = NULL; - g_free(xdg_config_home_path); - xdg_config_home_path = NULL; - g_free(xdg_data_home_path); - xdg_data_home_path = NULL; -} - -gchar *parse_expand_tilde(const gchar *f) -{ - gchar **spl; - gchar *ret; - - if (!f) - return NULL; - spl = g_strsplit(f, "~", 0); - ret = g_strjoinv(g_get_home_dir(), spl); - g_strfreev(spl); - return ret; -} - -gboolean parse_mkdir(const gchar *path, gint mode) -{ - gboolean ret = TRUE; - - g_return_val_if_fail(path != NULL, FALSE); - g_return_val_if_fail(path[0] != '\0', FALSE); - - if (!g_file_test(path, G_FILE_TEST_IS_DIR)) - if (mkdir(path, mode) == -1) - ret = FALSE; - - return ret; -} - -gboolean parse_mkdir_path(const gchar *path, gint mode) -{ - gboolean ret = TRUE; - - g_return_val_if_fail(path != NULL, FALSE); - g_return_val_if_fail(path[0] == '/', FALSE); - - if (!g_file_test(path, G_FILE_TEST_IS_DIR)) { - gchar *c, *e; - - c = g_strdup(path); - e = c; - while ((e = strchr(e + 1, '/'))) { - *e = '\0'; - if (!(ret = parse_mkdir(c, mode))) - goto parse_mkdir_path_end; - *e = '/'; - } - ret = parse_mkdir(c, mode); - - parse_mkdir_path_end: - g_free(c); - } - - return ret; -} - -const gchar* parse_xdg_config_home_path(void) -{ - return xdg_config_home_path; -} - -const gchar* parse_xdg_data_home_path(void) -{ - return xdg_data_home_path; -} - -GSList* parse_xdg_config_dir_paths(void) -{ - return xdg_config_dir_paths; -} - -GSList* parse_xdg_data_dir_paths(void) -{ - return xdg_data_dir_paths; -}
M obt/parse.hobt/parse.h

@@ -82,24 +82,6 @@ gint *value);

gboolean obt_parse_attr_bool (xmlNodePtr node, const gchar *name, gboolean *value); -/* paths */ - -void parse_paths_startup(); -void parse_paths_shutdown(); - -const gchar* parse_xdg_config_home_path(); -const gchar* parse_xdg_data_home_path(); -GSList* parse_xdg_config_dir_paths(); -GSList* parse_xdg_data_dir_paths(); - -/*! Expands the ~ character to the home directory throughout the given - string */ -gchar *parse_expand_tilde(const gchar *f); -/*! Makes a directory */ -gboolean parse_mkdir(const gchar *path, gint mode); -/*! Makes a directory and all its parents */ -gboolean parse_mkdir_path(const gchar *path, gint mode); - G_END_DECLS #endif
A obt/paths.c

@@ -0,0 +1,234 @@

+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- + + obt/paths.c for the Openbox window manager + Copyright (c) 2003-2007 Dana Jansens + + 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. + + See the COPYING file for a copy of the GNU General Public License. +*/ + +#include "obt/paths.h" +#include "obt/util.h" + +#ifdef HAVE_SYS_STAT_H +# include <sys/stat.h> +#endif +#ifdef HAVE_SYS_TYPES_H +# include <sys/types.h> +#endif +#ifdef HAVE_STRING_H +# include <string.h> +#endif + +struct _ObtPaths +{ + gint ref; + gchar *config_home; + gchar *data_home; + GSList *config_dirs; + GSList *data_dirs; +}; + +static gint slist_path_cmp(const gchar *a, const gchar *b) +{ + return strcmp(a, b); +} + +typedef GSList* (*GSListFunc) (gpointer list, gconstpointer data); + +static GSList* slist_path_add(GSList *list, gpointer data, GSListFunc func) +{ + g_assert(func); + + if (!data) + return list; + + if (!g_slist_find_custom(list, data, (GCompareFunc) slist_path_cmp)) + list = func(list, data); + else + g_free(data); + + return list; +} + +static GSList* split_paths(const gchar *paths) +{ + GSList *list = NULL; + gchar **spl, **it; + + if (!paths) + return NULL; + spl = g_strsplit(paths, ":", -1); + for (it = spl; *it; ++it) + list = slist_path_add(list, *it, (GSListFunc) g_slist_append); + g_free(spl); + return list; +} + +ObtPaths* obt_paths_new(void) +{ + ObtPaths *p; + const gchar *path; + + p = g_new(ObtPaths, 1); + p->ref = 1; + + path = g_getenv("XDG_CONFIG_HOME"); + if (path && path[0] != '\0') /* not unset or empty */ + p->config_home = g_build_filename(path, NULL); + else + p->config_home = g_build_filename(g_get_home_dir(), ".config", NULL); + + path = g_getenv("XDG_DATA_HOME"); + if (path && path[0] != '\0') /* not unset or empty */ + p->data_home = g_build_filename(path, NULL); + else + p->data_home = g_build_filename(g_get_home_dir(), ".local", + "share", NULL); + + path = g_getenv("XDG_CONFIG_DIRS"); + if (path && path[0] != '\0') /* not unset or empty */ + p->config_dirs = split_paths(path); + else { + p->config_dirs = slist_path_add(p->config_dirs, + g_strdup(CONFIGDIR), + (GSListFunc) g_slist_append); + p->config_dirs = slist_path_add(p->config_dirs, + g_build_filename + (G_DIR_SEPARATOR_S, + "etc", "xdg", NULL), + (GSListFunc) g_slist_append); + } + p->config_dirs = slist_path_add(p->config_dirs, + g_strdup(p->config_home), + (GSListFunc) g_slist_prepend); + + path = g_getenv("XDG_DATA_DIRS"); + if (path && path[0] != '\0') /* not unset or empty */ + p->data_dirs = split_paths(path); + else { + p->data_dirs = slist_path_add(p->data_dirs, + g_strdup(DATADIR), + (GSListFunc) g_slist_append); + p->data_dirs = slist_path_add(p->data_dirs, + g_build_filename + (G_DIR_SEPARATOR_S, + "usr", "local", "share", NULL), + (GSListFunc) g_slist_append); + p->data_dirs = slist_path_add(p->data_dirs, + g_build_filename + (G_DIR_SEPARATOR_S, + "usr", "share", NULL), + (GSListFunc) g_slist_append); + } + p->data_dirs = slist_path_add(p->data_dirs, + g_strdup(p->data_home), + (GSListFunc) g_slist_prepend); + return p; +} + +void obt_paths_ref(ObtPaths *p) +{ + ++p->ref; +} + +void obt_paths_unref(ObtPaths *p) +{ + if (p && --p->ref == 0) { + GSList *it; + + for (it = p->config_dirs; it; it = g_slist_next(it)) + g_free(it->data); + g_slist_free(p->config_dirs); + for (it = p->data_dirs; it; it = g_slist_next(it)) + g_free(it->data); + g_slist_free(p->data_dirs); + g_free(p->config_home); + g_free(p->data_home); + + obt_free0(p, ObtPaths, 1); + } +} + +gchar *obt_paths_expand_tilde(const gchar *f) +{ + gchar **spl; + gchar *ret; + + if (!f) + return NULL; + spl = g_strsplit(f, "~", 0); + ret = g_strjoinv(g_get_home_dir(), spl); + g_strfreev(spl); + return ret; +} + +gboolean obt_paths_mkdir(const gchar *path, gint mode) +{ + gboolean ret = TRUE; + + g_return_val_if_fail(path != NULL, FALSE); + g_return_val_if_fail(path[0] != '\0', FALSE); + + if (!g_file_test(path, G_FILE_TEST_IS_DIR)) + if (mkdir(path, mode) == -1) + ret = FALSE; + + return ret; +} + +gboolean obt_paths_mkdir_path(const gchar *path, gint mode) +{ + gboolean ret = TRUE; + + g_return_val_if_fail(path != NULL, FALSE); + g_return_val_if_fail(path[0] == '/', FALSE); + + if (!g_file_test(path, G_FILE_TEST_IS_DIR)) { + gchar *c, *e; + + c = g_strdup(path); + e = c; + while ((e = strchr(e + 1, '/'))) { + *e = '\0'; + if (!(ret = obt_paths_mkdir(c, mode))) + goto parse_mkdir_path_end; + *e = '/'; + } + ret = obt_paths_mkdir(c, mode); + + parse_mkdir_path_end: + g_free(c); + } + + return ret; +} + +const gchar* obt_paths_config_home(ObtPaths *p) +{ + return p->config_home; +} + +const gchar* obt_paths_data_home(ObtPaths *p) +{ + return p->data_home; +} + +GSList* obt_paths_config_dirs(ObtPaths *p) +{ + return p->config_dirs; +} + +GSList* obt_paths_data_dirs(ObtPaths *p) +{ + return p->data_dirs; +}
A obt/paths.h

@@ -0,0 +1,43 @@

+/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*- + + obt/paths.h for the Openbox window manager + Copyright (c) 2003-2007 Dana Jansens + + 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. + + See the COPYING file for a copy of the GNU General Public License. +*/ + +#ifndef __obt_paths_h +#define __obt_paths_h + +#include <glib.h> + +G_BEGIN_DECLS + +typedef struct _ObtPaths ObtPaths; + +ObtPaths* obt_paths_new(); +void obt_paths_ref(ObtPaths *p); +void obt_paths_unref(ObtPaths *p); + +const gchar* obt_paths_config_home(ObtPaths *p); +const gchar* obt_paths_data_home(ObtPaths *p); +GSList* obt_paths_config_dirs(ObtPaths *p); +GSList* obt_paths_data_dirs(ObtPaths *p); + +gchar *obt_paths_expand_tilde(const gchar *f); +gboolean obt_paths_mkdir(const gchar *path, gint mode); +gboolean obt_paths_mkdir_path(const gchar *path, gint mode); + +G_END_DECLS + +#endif
M openbox/actions/execute.copenbox/actions/execute.c

@@ -2,6 +2,7 @@ #include "openbox/actions.h"

#include "openbox/event.h" #include "openbox/startupnotify.h" #include "openbox/screen.h" +#include "obt/paths.h" #include "gettext.h" typedef struct {

@@ -39,7 +40,7 @@ if ((n = obt_parse_find_node(node, "command")) ||

(n = obt_parse_find_node(node, "execute"))) { gchar *s = obt_parse_node_string(n); - o->cmd = parse_expand_tilde(s); + o->cmd = obt_paths_expand_tilde(s); g_free(s); }
M openbox/actions/restart.copenbox/actions/restart.c

@@ -1,5 +1,6 @@

#include "openbox/actions.h" #include "openbox/openbox.h" +#include "obt/paths.h" typedef struct { gchar *cmd;

@@ -25,7 +26,7 @@ if ((n = obt_parse_find_node(node, "command")) ||

(n = obt_parse_find_node(node, "execute"))) { gchar *s = obt_parse_node_string(n); - o->cmd = parse_expand_tilde(s); + o->cmd = obt_paths_expand_tilde(s); g_free(s); } return o;
M openbox/config.copenbox/config.c

@@ -26,6 +26,7 @@ #include "client.h"

#include "screen.h" #include "openbox.h" #include "gettext.h" +#include "obt/paths.h" gboolean config_focus_new; gboolean config_focus_follow;

@@ -511,7 +512,7 @@ gchar *c;

g_free(config_theme); c = obt_parse_node_string(n); - config_theme = parse_expand_tilde(c); + config_theme = obt_paths_expand_tilde(c); g_free(c); } if ((n = obt_parse_find_node(node, "titleLayout"))) {

@@ -743,7 +744,7 @@ gchar *c;

c = obt_parse_node_string(node); config_menu_files = g_slist_append(config_menu_files, - parse_expand_tilde(c)); + obt_paths_expand_tilde(c)); g_free(c); } if ((n = obt_parse_find_node(node, "hideDelay")))
M openbox/menu.copenbox/menu.c

@@ -35,6 +35,7 @@ #include "client_list_menu.h"

#include "client_list_combined_menu.h" #include "gettext.h" #include "obt/parse.h" +#include "obt/paths.h" typedef struct _ObMenuParseState ObMenuParseState;

@@ -314,7 +315,7 @@

if ((menu = menu_new(name, title, TRUE, NULL))) { menu->pipe_creator = state->pipe_creator; if (obt_parse_attr_string(node, "execute", &script)) { - menu->execute = parse_expand_tilde(script); + menu->execute = obt_paths_expand_tilde(script); } else { ObMenu *old;
M openbox/menu.hopenbox/menu.h

@@ -22,7 +22,6 @@

#include "window.h" #include "geom.h" #include "render/render.h" -#include "obt/parse.h" #include <glib.h>
M openbox/openbox.copenbox/openbox.c

@@ -135,11 +135,8 @@

program_name = g_path_get_basename(argv[0]); g_set_prgname(program_name); - if (!remote_control) { - parse_paths_startup(); - + if (!remote_control) session_startup(argc, argv); - } if (!obt_display_open(NULL)) ob_exit_with_error(_("Failed to open the display from the DISPLAY environment variable."));

@@ -370,8 +367,6 @@

session_shutdown(being_replaced); obt_display_close(obt_display); - - parse_paths_shutdown(); if (restart) { if (restart_path != NULL) {
M openbox/session.copenbox/session.c

@@ -41,6 +41,7 @@ #include "client.h"

#include "focus.h" #include "gettext.h" #include "obt/parse.h" +#include "obt/paths.h" #include <time.h> #include <errno.h>

@@ -90,15 +91,18 @@

void session_startup(gint argc, gchar **argv) { gchar *dir; + ObtPaths *p; if (!ob_sm_use) return; sm_argc = argc; sm_argv = argv; - dir = g_build_filename(parse_xdg_data_home_path(), - "openbox", "sessions", NULL); - if (!parse_mkdir_path(dir, 0700)) { + p = obt_paths_new(); + dir = g_build_filename(obt_paths_data_home(p), "openbox", "sessions",NULL); + obt_paths_unref(p), p = NULL; + + if (!obt_paths_mkdir_path(dir, 0700)) { g_message(_("Unable to make directory '%s': %s"), dir, g_strerror(errno)); }
M render/theme.crender/theme.c

@@ -23,7 +23,7 @@ #include "font.h"

#include "mask.h" #include "theme.h" #include "icon.h" -#include "obt/parse.h" +#include "obt/paths.h" #include <X11/Xlib.h> #include <X11/Xresource.h>

@@ -1559,6 +1559,10 @@ if ((db = XrmGetFileDatabase(s)))

*path = g_path_get_dirname(s); g_free(s); } else { + ObtPaths *p; + + p = obt_paths_new(); + /* XXX backwards compatibility, remove me sometime later */ s = g_build_filename(g_get_home_dir(), ".themes", name, "openbox-3", "themerc", NULL);

@@ -1566,8 +1570,7 @@ if ((db = XrmGetFileDatabase(s)))

*path = g_path_get_dirname(s); g_free(s); - for (it = parse_xdg_data_dir_paths(); !db && it; - it = g_slist_next(it)) + for (it = obt_paths_data_dirs(p); !db && it; it = g_slist_next(it)) { s = g_build_filename(it->data, "themes", name, "openbox-3", "themerc", NULL);

@@ -1575,6 +1578,8 @@ if ((db = XrmGetFileDatabase(s)))

*path = g_path_get_dirname(s); g_free(s); } + + obt_paths_unref(p); } if (db == NULL) {