diff --git a/src/launcher/apps-common.c b/src/launcher/apps-common.c index 9988054..4209a10 100644 --- a/src/launcher/apps-common.c +++ b/src/launcher/apps-common.c @@ -110,7 +110,7 @@ void expand_exec(DesktopEntry *entry, const char *path) gboolean read_desktop_file_full_path(const char *path, DesktopEntry *entry) { - entry->name = entry->generic_name = entry->icon = entry->exec = NULL; + entry->name = entry->generic_name = entry->icon = entry->exec = entry->cwd = NULL; entry->hidden_from_menus = FALSE; FILE *fp = fopen(path, "rt"); @@ -185,6 +185,8 @@ gboolean read_desktop_file_full_path(const char *path, DesktopEntry *entry) } } else if (!entry->exec && strcmp(key, "Exec") == 0) { entry->exec = strdup(value); + } else if (!entry->cwd && strcmp(key, "Path") == 0) { + entry->cwd = strdup(value); } else if (!entry->icon && strcmp(key, "Icon") == 0) { entry->icon = strdup(value); } else if (strcmp(key, "NoDisplay") == 0) { diff --git a/src/launcher/apps-common.h b/src/launcher/apps-common.h index 917dfff..6b9e3b8 100644 --- a/src/launcher/apps-common.h +++ b/src/launcher/apps-common.h @@ -15,6 +15,7 @@ typedef struct DesktopEntry { char *exec; char *icon; char *path; + char *cwd; gboolean hidden_from_menus; } DesktopEntry; diff --git a/src/launcher/launcher.c b/src/launcher/launcher.c index 8ad8b2a..47f2b91 100644 --- a/src/launcher/launcher.c +++ b/src/launcher/launcher.c @@ -441,6 +441,7 @@ void launcher_action(LauncherIcon *icon, XEvent *evt) // Allow children to exist after parent destruction setsid(); // Run the command + chdir(icon->cwd); execl("/bin/sh", "/bin/sh", "-c", icon->cmd, NULL); fprintf(stderr, "Failed to execlp %s\n", icon->cmd); #if HAVE_SN @@ -507,6 +508,13 @@ void launcher_reload_icon(Launcher *launcher, LauncherIcon *launcherIcon) if (launcherIcon->cmd) free(launcherIcon->cmd); launcherIcon->cmd = strdup(entry.exec); + if (launcherIcon->cwd) + free(launcherIcon->cwd); + if (entry.cwd) { + launcherIcon->cwd = strdup(entry.cwd); + } else { + launcherIcon->cwd = get_current_dir_name(); + } if (launcherIcon->icon_name) free(launcherIcon->icon_name); launcherIcon->icon_name = entry.icon ? strdup(entry.icon) : strdup(DEFAULT_ICON); diff --git a/src/launcher/launcher.h b/src/launcher/launcher.h index c3652ec..e03368a 100644 --- a/src/launcher/launcher.h +++ b/src/launcher/launcher.h @@ -28,6 +28,7 @@ typedef struct LauncherIcon { Imlib_Image image_hover; Imlib_Image image_pressed; char *cmd; + char *cwd; char *icon_name; char *icon_path; char *icon_tooltip;