[PATCH 1/4] window: add a helper for config file paths

Kristian Høgsberg krh at bitplanet.net
Tue Nov 15 06:04:29 PST 2011


On Tue, Nov 15, 2011 at 4:45 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> 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.

Ah, very nice.  I expected we'd do something like this, but this is
exactly how it should work.  I removed the fprintf when
XDG_CONFIG_HOME isn't set, as that's OK.  We warn for XDG_RUNTIME_DIR
since the spec requires that one to be set.

Kristian

> Signed-off-by: Pekka Paalanen <ppaalanen at gmail.com>
> ---
>  clients/config.c        |   38 ++++++++++++++++++++++++++++++++++++++
>  clients/desktop-shell.c |    5 ++++-
>  clients/window.h        |    3 +++
>  3 files changed, 45 insertions(+), 1 deletions(-)
>
> diff --git a/clients/config.c b/clients/config.c
> index f389b69..42acee7 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 33ea677..89c8a75 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 40bf102..bad1e60 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
> --
> 1.7.3.4
>
>


More information about the wayland-devel mailing list