summaryrefslogtreecommitdiffstats
path: root/dwl.c
diff options
context:
space:
mode:
Diffstat (limited to 'dwl.c')
-rw-r--r--dwl.c50
1 files changed, 50 insertions, 0 deletions
diff --git a/dwl.c b/dwl.c
index d284fe0..d7da6e9 100644
--- a/dwl.c
+++ b/dwl.c
@@ -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)
{