diff options
Diffstat (limited to 'dwl.c')
-rw-r--r-- | dwl.c | 50 |
1 files changed, 50 insertions, 0 deletions
@@ -414,6 +414,7 @@ static void urgent(struct wl_listener *listener, void *data); static void view(const Arg *arg); static void virtualkeyboard(struct wl_listener *listener, void *data); static void virtualpointer(struct wl_listener *listener, void *data); +static void wmenuspawn(const Arg *arg); static Monitor *xytomon(double x, double y); static void xytonode(double x, double y, struct wlr_surface **psurface, Client **pc, LayerSurface **pl, double *nx, double *ny); @@ -3707,6 +3708,55 @@ virtualpointer(struct wl_listener *listener, void *data) wlr_cursor_map_input_to_output(cursor, device, event->suggested_output); } +void +wmenuspawn(const Arg *arg) +{ + unsigned int focused_tag; + unsigned long int i, j; + char **cmd; + + cmd = malloc(8 * sizeof(char*)); + if (!cmd) + return; + + for (i = 0; i < 8 && ((char**)arg->v)[i] != NULL; i++) { + cmd[i] = strdup(((char**)arg->v)[i]); + if (!cmd[i]) { + for (j = 0; j < i; j++) { + free(cmd[j]); + } + free(cmd); + return; + } + } + focused_tag = selmon->tagset[selmon->seltags]; + for (j = 0; j < LENGTH(tags); j++) { + if (focused_tag & (1 << (j - 1))) { + break; + } + } + cmd[i] = strdup(tagselstr[j - 1][0]); + if (!cmd[i]) { + for (j = 0; j < i; j++) { + free(cmd[j]); + } + free(cmd); + return; + } + cmd[i + 1] = NULL; + if (fork() == 0) { + close(STDIN_FILENO); + dup2(STDERR_FILENO, STDOUT_FILENO); + setsid(); + execvp(((char **)cmd)[0], (char **)cmd); + die("dwl: execvp %s failed:", ((char **)cmd)[0]); + } + for (i = 0; cmd[i] != NULL; i++) { + free(cmd[i]); + } + free(cmd); +} + Monitor * xytomon(double x, double y) { |