From d5273f51a1f452575eccfb855a8dc383c8d23f3a Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Thu, 8 Oct 2020 15:58:08 +0200 Subject: [PATCH 1/2] 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; From 51ac77d58c03f337e1347263eb4995e1f9947a9d Mon Sep 17 00:00:00 2001 From: Benjamin Berg Date: Thu, 8 Oct 2020 15:58:37 +0200 Subject: [PATCH 2/2] xdg-autostart: Ignore more common XDG Desktop Entry fields It makes sense to ignore all the common fields that are expected and that we can safely ignore. Note that it is fine to ignore URL as we will already warn about the type= being wrong in that case. Closes: #17276 --- src/xdg-autostart-generator/xdg-autostart-service.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/xdg-autostart-generator/xdg-autostart-service.c b/src/xdg-autostart-generator/xdg-autostart-service.c index e111875b78..dd90a41efd 100644 --- a/src/xdg-autostart-generator/xdg-autostart-service.c +++ b/src/xdg-autostart-generator/xdg-autostart-service.c @@ -340,9 +340,12 @@ XdgAutostartService *xdg_autostart_service_parse_desktop(const char *path) { { "Desktop Entry", "GenericName", NULL, 0, NULL}, { "Desktop Entry", "Icon", NULL, 0, NULL}, { "Desktop Entry", "Keywords", NULL, 0, NULL}, + { "Desktop Entry", "MimeType", NULL, 0, NULL}, { "Desktop Entry", "NoDisplay", NULL, 0, NULL}, { "Desktop Entry", "StartupNotify", NULL, 0, NULL}, + { "Desktop Entry", "StartupWMClass", NULL, 0, NULL}, { "Desktop Entry", "Terminal", NULL, 0, NULL}, + { "Desktop Entry", "URL", NULL, 0, NULL}, { "Desktop Entry", "Version", NULL, 0, NULL}, {} };