dwm-quitprompt-20220718-6613d9f.diff (2826B)
1 From eb558048819ed916b272765e64e1ea795a85740e Mon Sep 17 00:00:00 2001 2 From: Lerrrtaste <lerrrtaste@protonmail.com> 3 Date: Mon, 18 Jul 2022 12:22:39 +0200 4 Subject: [PATCH] This Patch replaces the default quit behavior with an dmenu 5 prompt. Possible selections are (Quit DWM?) "yes", "no" and "restart". The 6 additional confirmation can save your work from accidentally hitting the quit 7 key by requiring two additional keystrokes (y/yes and RET). Additionally it 8 allows for restarting / reloading dwm without ending the xsession and closing 9 all open x windows. To abort press ESC or n/no and RET. 10 11 --- 12 config.def.h | 2 +- 13 dwm.c | 30 ++++++++++++++++++++++++++++++ 14 2 files changed, 31 insertions(+), 1 deletion(-) 15 16 diff --git a/config.def.h b/config.def.h 17 index a2ac963..9e3b394 100644 18 --- a/config.def.h 19 +++ b/config.def.h 20 @@ -94,7 +94,7 @@ static Key keys[] = { 21 TAGKEYS( XK_7, 6) 22 TAGKEYS( XK_8, 7) 23 TAGKEYS( XK_9, 8) 24 - { MODKEY|ShiftMask, XK_q, quit, {0} }, 25 + { MODKEY|ShiftMask, XK_q, quitprompt, {0} }, 26 }; 27 28 /* button definitions */ 29 diff --git a/dwm.c b/dwm.c 30 index 7c0f978..3761ba4 100644 31 --- a/dwm.c 32 +++ b/dwm.c 33 @@ -188,6 +188,7 @@ static Client *nexttiled(Client *c); 34 static void pop(Client *c); 35 static void propertynotify(XEvent *e); 36 static void quit(const Arg *arg); 37 +static void quitprompt(const Arg *arg); 38 static Monitor *recttomon(int x, int y, int w, int h); 39 static void resize(Client *c, int x, int y, int w, int h, int interact); 40 static void resizeclient(Client *c, int x, int y, int w, int h); 41 @@ -262,6 +263,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { 42 }; 43 static Atom wmatom[WMLast], netatom[NetLast]; 44 static int running = 1; 45 +static int restart = 1; 46 static Cur *cursor[CurLast]; 47 static Clr **scheme; 48 static Display *dpy; 49 @@ -1258,6 +1260,31 @@ quit(const Arg *arg) 50 running = 0; 51 } 52 53 +void 54 +quitprompt(const Arg *arg) 55 +{ 56 + FILE *pp = popen("echo -e \"no\nrestart\nyes\" | dmenu -i -sb red -p \"Quit DWM?\"", "r"); 57 + if(pp != NULL) { 58 + char buf[1024]; 59 + if (fgets(buf, sizeof(buf), pp) == NULL) { 60 + fprintf(stderr, "Quitprompt: Error reading pipe!\n"); 61 + return; 62 + } 63 + if (strcmp(buf, "yes\n") == 0) { 64 + pclose(pp); 65 + restart = 0; 66 + quit(NULL); 67 + } else if (strcmp(buf, "restart\n") == 0) { 68 + pclose(pp); 69 + restart = 1; 70 + quit(NULL); 71 + } else if (strcmp(buf, "no\n") == 0) { 72 + pclose(pp); 73 + return; 74 + } 75 + } 76 +} 77 + 78 Monitor * 79 recttomon(int x, int y, int w, int h) 80 { 81 @@ -2155,5 +2182,8 @@ main(int argc, char *argv[]) 82 run(); 83 cleanup(); 84 XCloseDisplay(dpy); 85 + if (restart == 1) { 86 + execlp("dwm", "dwm", NULL); 87 + } 88 return EXIT_SUCCESS; 89 } 90 -- 91 2.36.0 92