diff --git a/CHANGELOG.md b/CHANGELOG.md index a97aa72f..d8c84365 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,6 +35,8 @@ * Window title in the CSDs (https://codeberg.org/dnkl/foot/issues/638). * `-Ddocs=disabled|enabled|auto` meson command line option. +* Support for `~`-expansion in the `include` directive + (https://codeberg.org/dnkl/foot/issues/659). ### Changed diff --git a/config.c b/config.c index f671e7e0..f57129a7 100644 --- a/config.c +++ b/config.c @@ -644,12 +644,29 @@ parse_section_main(const char *key, const char *value, struct config *conf, const char *path, unsigned lineno, bool errors_are_fatal) { if (strcmp(key, "include") == 0) { - const char *include_path = value; + char *_include_path = NULL; + const char *include_path = NULL; + + if (value[0] == '~' && value[1] == '/') { + const char *home_dir = get_user_home_dir(); + + if (home_dir == NULL) { + LOG_AND_NOTIFY_ERRNO( + "%s:%d: [default]: include: %s: failed to expand '~'", + path, lineno, value); + return false; + } + + _include_path = xasprintf("%s/%s", home_dir, value + 2); + include_path = _include_path; + } else + include_path = value; if (include_path[0] != '/') { LOG_AND_NOTIFY_ERR( - "%s:%d: [default]: %s: not an absolute path", + "%s:%d: [default]: include: %s: not an absolute path", path, lineno, include_path); + free(_include_path); return false; } @@ -657,8 +674,9 @@ parse_section_main(const char *key, const char *value, struct config *conf, if (include == NULL) { LOG_AND_NOTIFY_ERRNO( - "%s:%d: [default]: %s: failed to open", + "%s:%d: [default]: include: %s: failed to open", path, lineno, include_path); + free(_include_path); return false; } @@ -667,6 +685,7 @@ parse_section_main(const char *key, const char *value, struct config *conf, fclose(include); LOG_INFO("imported sub-configuration from %s", include_path); + free(_include_path); return ret; } diff --git a/doc/foot.ini.5.scd b/doc/foot.ini.5.scd index 8233ed48..5e854420 100644 --- a/doc/foot.ini.5.scd +++ b/doc/foot.ini.5.scd @@ -70,13 +70,11 @@ in this order: The import file has its own section scope. I.e. the including configuration is still in the default section after the include, regardless of which section the included file ends in. - - The path must be an absolute path. - Multiple include directives are allowed, but only one path per - directive. - - Nested imports are allowed. + - The path must be an absolute path, or start with *~/*. + - Multiple include directives are allowed, but only one path per + directive. + - Nested imports are allowed. Default: _not set_.