From d5273f51a1f452575eccfb855a8dc383c8d23f3a Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Thu, 8 Oct 2020 15:58:08 +0200 Subject: [PATCH] xdg-autostart: Add support for Path= in XDG Desktop File This sets the working directory of the application. --- src/xdg-autostart-generator/xdg-autostart-service.c | 12 ++++++++++++ src/xdg-autostart-generator/xdg-autostart-service.h | 1 + 2 files changed, 13 insertions(+) diff --git a/src/xdg-autostart-generator/xdg-autostart-service.c b/src/xdg-autostart-generator/xdg-autostart-service.c index 0485c90fc9..e111875b78 100644 --- a/src/xdg-autostart-generator/xdg-autostart-service.c +++ b/src/xdg-autostart-generator/xdg-autostart-service.c @@ -28,6 +28,7 @@ XdgAutostartService* xdg_autostart_service_free(XdgAutostartService *s) { free(s->type); free(s->exec_string); + free(s->working_directory); strv_free(s->only_show_in); strv_free(s->not_show_in); @@ -321,6 +322,7 @@ XdgAutostartService *xdg_autostart_service_parse_desktop(const char *path) { const ConfigTableItem items[] = { { "Desktop Entry", "Name", xdg_config_parse_string, 0, &service->description}, { "Desktop Entry", "Exec", xdg_config_parse_string, 0, &service->exec_string}, + { "Desktop Entry", "Path", xdg_config_parse_string, 0, &service->working_directory}, { "Desktop Entry", "TryExec", xdg_config_parse_string, 0, &service->try_exec}, { "Desktop Entry", "Type", xdg_config_parse_string, 0, &service->type}, { "Desktop Entry", "OnlyShowIn", xdg_config_parse_strv, 0, &service->only_show_in}, @@ -606,6 +608,16 @@ int xdg_autostart_service_generate_unit( "Slice=app.slice\n", exec_start); + if (service->working_directory) { + _cleanup_free_ char *e_working_directory = NULL; + + e_working_directory = cescape(service->working_directory); + if (!e_working_directory) + return log_oom(); + + fprintf(f, "WorkingDirectory=-%s\n", e_working_directory); + } + /* Generate an ExecCondition to check $XDG_CURRENT_DESKTOP */ if (!strv_isempty(service->only_show_in) || !strv_isempty(service->not_show_in)) { _cleanup_free_ char *only_show_in = NULL, *not_show_in = NULL, *e_only_show_in = NULL, *e_not_show_in = NULL; diff --git a/src/xdg-autostart-generator/xdg-autostart-service.h b/src/xdg-autostart-generator/xdg-autostart-service.h index 685f97824e..8cf07ef64a 100644 --- a/src/xdg-autostart-generator/xdg-autostart-service.h +++ b/src/xdg-autostart-generator/xdg-autostart-service.h @@ -10,6 +10,7 @@ typedef struct XdgAutostartService { char *type; /* Purely as an assertion check */ char *exec_string; + char *working_directory; char **only_show_in; char **not_show_in;