From 668dd56918f47c5753ab51b151ea8237647171bb Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Tue, 15 Nov 2011 11:45:40 +0200 Subject: [PATCH] window: add a helper for config file paths Add a helper function, that constructs a path to a config file from XDG_CONFIG_HOME environment variable, by the rules of http://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html Make desktop-shell find its config file from XDG_CONFIG_HOME. This allows to have a personal config file without continuously fighting with git about wayland-desktop-shell.ini. Signed-off-by: Pekka Paalanen --- clients/config.c | 38 ++++++++++++++++++++++++++++++++++++++ clients/desktop-shell.c | 5 ++++- clients/window.h | 3 +++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/clients/config.c b/clients/config.c index f389b69a..42acee76 100644 --- a/clients/config.c +++ b/clients/config.c @@ -135,3 +135,41 @@ parse_config_file(const char *path, return 0; } + +char * +config_file_path(const char *name) +{ + const char dotconf[] = "/.config/"; + const char *config_dir; + const char *home_dir; + char *path; + size_t size; + + config_dir = getenv("XDG_CONFIG_HOME"); + if (!config_dir) { + fprintf(stderr, "XDG_CONFIG_HOME is not set," + " falling back to $HOME/.config\n"); + + home_dir = getenv("HOME"); + if (!home_dir) { + fprintf(stderr, "HOME is not set, using cwd.\n"); + return strdup(name); + } + + size = strlen(home_dir) + sizeof dotconf + strlen(name); + path = malloc(size); + if (!path) + return NULL; + + snprintf(path, size, "%s%s%s", home_dir, dotconf, name); + return path; + } + + size = strlen(config_dir) + 1 + strlen(name) + 1; + path = malloc(size); + if (!path) + return NULL; + + snprintf(path, size, "%s/%s", config_dir, name); + return path; +} diff --git a/clients/desktop-shell.c b/clients/desktop-shell.c index 33ea677f..89c8a751 100644 --- a/clients/desktop-shell.c +++ b/clients/desktop-shell.c @@ -348,6 +348,7 @@ launcher_section_done(void *data) int main(int argc, char *argv[]) { struct desktop desktop; + char *config_file; desktop.display = display_create(&argc, &argv, NULL); if (desktop.display == NULL) { @@ -363,9 +364,11 @@ int main(int argc, char *argv[]) desktop.panel = panel_create(desktop.display); - parse_config_file("wayland-desktop-shell.ini", + config_file = config_file_path("wayland-desktop-shell.ini"); + parse_config_file(config_file, config_sections, ARRAY_LENGTH(config_sections), &desktop); + free(config_file); printf("panel color: %08x\n", key_panel_color); diff --git a/clients/window.h b/clients/window.h index 40bf1026..bad1e603 100644 --- a/clients/window.h +++ b/clients/window.h @@ -346,4 +346,7 @@ parse_config_file(const char *path, const struct config_section *sections, int num_sections, void *data); +char * +config_file_path(const char *name); + #endif