#include <sys/epoll.h>
#include <linux/input.h>
#include <libgen.h>
+#include <ctype.h>
#include <time.h>
#include <wayland-client.h>
struct panel *panel;
cairo_surface_t *icon;
int focused, pressed;
- const char *path;
+ char *path;
struct wl_list link;
+ struct wl_array envp;
+ struct wl_array argv;
};
struct panel_clock {
static void
panel_launcher_activate(struct panel_launcher *widget)
{
+ char **argv;
pid_t pid;
pid = fork();
if (pid)
return;
- if (execl(widget->path, widget->path, NULL) < 0) {
- fprintf(stderr, "execl '%s' failed: %m\n", widget->path);
+ argv = widget->argv.data;
+ if (execve(argv[0], argv, widget->envp.data) < 0) {
+ fprintf(stderr, "execl '%s' failed: %m\n", argv[0]);
exit(1);
}
}
panel_add_launcher(struct panel *panel, const char *icon, const char *path)
{
struct panel_launcher *launcher;
+ char *start, *p, *eq, **ps;
+ int i, j, k;
launcher = malloc(sizeof *launcher);
memset(launcher, 0, sizeof *launcher);
launcher->icon = cairo_image_surface_create_from_png(icon);
launcher->path = strdup(path);
+
+ wl_array_init(&launcher->envp);
+ wl_array_init(&launcher->argv);
+ for (i = 0; __environ[i]; i++) {
+ ps = wl_array_add(&launcher->envp, sizeof *ps);
+ *ps = __environ[i];
+ }
+ j = 0;
+
+ start = launcher->path;
+ while (*start) {
+ for (p = start, eq = NULL; *p && !isspace(*p); p++)
+ if (*p == '=')
+ eq = p;
+
+ if (eq && j == 0) {
+ ps = launcher->envp.data;
+ for (k = 0; k < i; k++)
+ if (strncmp(ps[k], start, eq - start) == 0) {
+ ps[k] = start;
+ break;
+ }
+ if (k == i) {
+ ps = wl_array_add(&launcher->envp, sizeof *ps);
+ *ps = start;
+ i++;
+ }
+ } else {
+ ps = wl_array_add(&launcher->argv, sizeof *ps);
+ *ps = start;
+ j++;
+ }
+
+ while (*p && isspace(*p))
+ *p++ = '\0';
+
+ start = p;
+ }
+
+ ps = wl_array_add(&launcher->envp, sizeof *ps);
+ *ps = NULL;
+ ps = wl_array_add(&launcher->argv, sizeof *ps);
+ *ps = NULL;
+
launcher->panel = panel;
wl_list_insert(panel->launcher_list.prev, &launcher->link);