diff --git a/config.def.h b/config.def.h index 1c0b587..f35676c 100644 --- a/config.def.h +++ b/config.def.h @@ -93,7 +93,7 @@ static Key keys[] = { TAGKEYS( XK_7, 6) TAGKEYS( XK_8, 7) TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_q, quit, {0} }, + { MODKEY|ShiftMask, XK_q, quitprompt, {0} }, }; /* button definitions */ diff --git a/dwm-quitprompt-20220718-6613d9f.diff b/dwm-quitprompt-20220718-6613d9f.diff new file mode 100644 index 0000000..0ffbc36 --- /dev/null +++ b/dwm-quitprompt-20220718-6613d9f.diff @@ -0,0 +1,92 @@ +From eb558048819ed916b272765e64e1ea795a85740e Mon Sep 17 00:00:00 2001 +From: Lerrrtaste +Date: Mon, 18 Jul 2022 12:22:39 +0200 +Subject: [PATCH] This Patch replaces the default quit behavior with an dmenu + prompt. Possible selections are (Quit DWM?) "yes", "no" and "restart". The + additional confirmation can save your work from accidentally hitting the quit + key by requiring two additional keystrokes (y/yes and RET). Additionally it + allows for restarting / reloading dwm without ending the xsession and closing + all open x windows. To abort press ESC or n/no and RET. + +--- + config.def.h | 2 +- + dwm.c | 30 ++++++++++++++++++++++++++++++ + 2 files changed, 31 insertions(+), 1 deletion(-) + +diff --git a/config.def.h b/config.def.h +index a2ac963..9e3b394 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -94,7 +94,7 @@ static Key keys[] = { + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) +- { MODKEY|ShiftMask, XK_q, quit, {0} }, ++ { MODKEY|ShiftMask, XK_q, quitprompt, {0} }, + }; + + /* button definitions */ +diff --git a/dwm.c b/dwm.c +index 7c0f978..3761ba4 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -188,6 +188,7 @@ static Client *nexttiled(Client *c); + static void pop(Client *c); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); ++static void quitprompt(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); + static void resize(Client *c, int x, int y, int w, int h, int interact); + static void resizeclient(Client *c, int x, int y, int w, int h); +@@ -262,6 +263,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { + }; + static Atom wmatom[WMLast], netatom[NetLast]; + static int running = 1; ++static int restart = 1; + static Cur *cursor[CurLast]; + static Clr **scheme; + static Display *dpy; +@@ -1258,6 +1260,31 @@ quit(const Arg *arg) + running = 0; + } + ++void ++quitprompt(const Arg *arg) ++{ ++ FILE *pp = popen("echo -e \"no\nrestart\nyes\" | dmenu -i -sb red -p \"Quit DWM?\"", "r"); ++ if(pp != NULL) { ++ char buf[1024]; ++ if (fgets(buf, sizeof(buf), pp) == NULL) { ++ fprintf(stderr, "Quitprompt: Error reading pipe!\n"); ++ return; ++ } ++ if (strcmp(buf, "yes\n") == 0) { ++ pclose(pp); ++ restart = 0; ++ quit(NULL); ++ } else if (strcmp(buf, "restart\n") == 0) { ++ pclose(pp); ++ restart = 1; ++ quit(NULL); ++ } else if (strcmp(buf, "no\n") == 0) { ++ pclose(pp); ++ return; ++ } ++ } ++} ++ + Monitor * + recttomon(int x, int y, int w, int h) + { +@@ -2155,5 +2182,8 @@ main(int argc, char *argv[]) + run(); + cleanup(); + XCloseDisplay(dpy); ++ if (restart == 1) { ++ execlp("dwm", "dwm", NULL); ++ } + return EXIT_SUCCESS; + } +-- +2.36.0 + diff --git a/dwm.c b/dwm.c index 4465af1..db409de 100644 --- a/dwm.c +++ b/dwm.c @@ -187,6 +187,7 @@ static Client *nexttiled(Client *c); static void pop(Client *); static void propertynotify(XEvent *e); static void quit(const Arg *arg); +static void quitprompt(const Arg *arg); static Monitor *recttomon(int x, int y, int w, int h); static void resize(Client *c, int x, int y, int w, int h, int interact); static void resizeclient(Client *c, int x, int y, int w, int h); @@ -261,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { }; static Atom wmatom[WMLast], netatom[NetLast]; static int running = 1; +static int restart = 1; static Cur *cursor[CurLast]; static Clr **scheme; static Display *dpy; @@ -1251,6 +1253,31 @@ quit(const Arg *arg) running = 0; } +void +quitprompt(const Arg *arg) +{ + FILE *pp = popen("echo -e \"no\nrestart\nyes\" | dmenu -i -sb red -p \"Quit DWM?\"", "r"); + if(pp != NULL) { + char buf[1024]; + if (fgets(buf, sizeof(buf), pp) == NULL) { + fprintf(stderr, "Quitprompt: Error reading pipe!\n"); + return; + } + if (strcmp(buf, "yes\n") == 0) { + pclose(pp); + restart = 0; + quit(NULL); + } else if (strcmp(buf, "restart\n") == 0) { + pclose(pp); + restart = 1; + quit(NULL); + } else if (strcmp(buf, "no\n") == 0) { + pclose(pp); + return; + } + } +} + Monitor * recttomon(int x, int y, int w, int h) { @@ -2145,5 +2172,8 @@ main(int argc, char *argv[]) run(); cleanup(); XCloseDisplay(dpy); + if (restart == 1) { + execlp("dwm", "dwm", NULL); + } return EXIT_SUCCESS; }