From 9813966c84eef470fcd8c14d42218ece1928e36e Mon Sep 17 00:00:00 2001 From: Aaron Taylor Date: Thu, 2 Feb 2023 17:00:32 -0800 Subject: [PATCH] Added layout menu popup which presents available layouts after right-clicking the layout icon on the status bar. --- config.def.h | 3 ++- config.h | 3 ++- dwm.c | 19 +++++++++++++++++++ layoutmenu.sh | 7 +++++++ 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 layoutmenu.sh diff --git a/config.def.h b/config.def.h index 46333e6..bcc9748 100644 --- a/config.def.h +++ b/config.def.h @@ -59,6 +59,7 @@ static const Layout layouts[] = { /* commands */ static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "st", NULL }; +static const char *layoutmenu_cmd = "layoutmenu.sh"; static const Key keys[] = { /* modifier key function argument */ @@ -102,7 +103,7 @@ static const Key keys[] = { static const Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkLtSymbol, 0, Button3, layoutmenu, {0} }, { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, diff --git a/config.h b/config.h index 46333e6..bcc9748 100644 --- a/config.h +++ b/config.h @@ -59,6 +59,7 @@ static const Layout layouts[] = { /* commands */ static const char *dmenucmd[] = { "dmenu_run", "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL }; static const char *termcmd[] = { "st", NULL }; +static const char *layoutmenu_cmd = "layoutmenu.sh"; static const Key keys[] = { /* modifier key function argument */ @@ -102,7 +103,7 @@ static const Key keys[] = { static const Button buttons[] = { /* click event mask button function argument */ { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkLtSymbol, 0, Button3, layoutmenu, {0} }, { ClkWinTitle, 0, Button2, zoom, {0} }, { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, { ClkClientWin, MODKEY, Button1, movemouse, {0} }, diff --git a/dwm.c b/dwm.c index 14fe6cc..a94b759 100644 --- a/dwm.c +++ b/dwm.c @@ -178,6 +178,7 @@ static void grabkeys(void); static void incnmaster(const Arg *arg); static void keypress(XEvent *e); static void killclient(const Arg *arg); +static void layoutmenu(const Arg *arg); static void manage(Window w, XWindowAttributes *wa); static void mappingnotify(XEvent *e); static void maprequest(XEvent *e); @@ -1068,6 +1069,24 @@ killclient(const Arg *arg) } } +void +layoutmenu(const Arg *arg) { + FILE *p; + char c[3], *s; + int i; + + if (!(p = popen(layoutmenu_cmd, "r"))) + return; + s = fgets(c, sizeof(c), p); + pclose(p); + + if (!s || *s == '\0' || c[0] == '\0') + return; + + i = atoi(c); + setlayout(&((Arg) { .v = &layouts[i] })); +} + void manage(Window w, XWindowAttributes *wa) { diff --git a/layoutmenu.sh b/layoutmenu.sh new file mode 100644 index 0000000..1bf95f2 --- /dev/null +++ b/layoutmenu.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +cat <<> Floating Layout 1 +[M] Monocle Layout 2 +EOF -- 2.20.1