config: support merging multiple config files

Add the -m|--merge-config command line option to iterate backwards over
XDG Base Dir paths and read config/theme files multiple times.

For example if both ~/.config/labwc/rc.xml and /etc/xdg/labwc/rc.xml
exist, the latter will be read first and then the former (if
--merge-config is enabled).

When $XDG_CONFIG_HOME is defined, make it replace (not augment)
$HOME/.config. Similarly, make $XDG_CONFIG_DIRS replace /etc/xdg when
defined.

XDG Base Dir Spec does not specify whether or not an application (or a
compositor!) should (a) define that only the file under the most important
base directory should be used, or (b) define rules for merging the
information from the different files.

ref: https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html

In the case of labwc there is a use-case for both positions, just to be
clear, the default behaviour, described by position (a) above, does NOT
change.

This change affects the following config/theme files:
  - rc.xml
  - menu.xml
  - autostart
  - environment
  - themerc
  - themerc-override
  - Theme buttons, for example max.xbm

Instead of caching global config/theme directories, create lists of paths
(e.g.  '/home/foo/.config/labwc/rc.xml', '/etc/xdg/labwc/rc.xml', etc).
This creates more common parsing logic and just reversing the direction
of iteration and breaks early if config-merge is not wanted.

Enable better fallback for themes. For example if a particular theme does
not exist in $HOME/.local/share/themes, it will be searched for in
~/.themes/ and so on. This also applies to theme buttons which now
fallback on an individual basis.

Avoid using stat() in most situations and just go straight to fopen().

Fixes #1406
This commit is contained in:
Johan Malm 2024-01-09 22:00:45 +00:00 committed by Johan Malm
parent d0aff49c81
commit 698c7ace07
14 changed files with 330 additions and 240 deletions

View file

@ -2,12 +2,19 @@
#ifndef LABWC_DIR_H
#define LABWC_DIR_H
char *config_dir(void);
#include <wayland-server-core.h>
/**
* theme_dir - find theme directory containing theme @theme_name
* @theme_name: theme to search for
*/
char *theme_dir(const char *theme_name);
struct path {
char *string;
struct wl_list link;
};
struct wl_list *paths_get_prev(struct wl_list *elm);
struct wl_list *paths_get_next(struct wl_list *elm);
void paths_config_create(struct wl_list *paths, const char *filename);
void paths_theme_create(struct wl_list *paths, const char *theme_name,
const char *filename);
void paths_destroy(struct wl_list *paths);
#endif /* LABWC_DIR_H */

View file

@ -48,6 +48,7 @@ struct window_switcher_field {
struct rcxml {
char *config_dir;
bool merge_config;
/* core */
bool xdg_shell_server_side_deco;

View file

@ -4,17 +4,15 @@
/**
* session_environment_init - set enrivonment variables based on <key>=<value>
* @dir: path to config directory
* pairs in `${XDG_CONFIG_DIRS:-/etc/xdg}/lawbc/environment` with user override
* in `${XDG_CONFIG_HOME:-$HOME/.config}`
*/
void session_environment_init(const char *dir);
void session_environment_init(void);
/**
* session_autostart_init - run autostart file as shell script
* @dir: path to config directory
* Note: Same as `sh ~/.config/labwc/autostart` (or equivalent XDG config dir)
*/
void session_autostart_init(const char *dir);
void session_autostart_init(void);
#endif /* LABWC_SESSION_H */