dwm-restartsig-20180523-6.2.diff (3313B)
1 From 2991f37f0aaf44b9f9b11e7893ff0af8eb88f649 Mon Sep 17 00:00:00 2001 2 From: Christopher Drelich <cd@cdrakka.com> 3 Date: Wed, 23 May 2018 22:50:38 -0400 4 Subject: [PATCH] Modifies quit to handle restarts and adds SIGHUP and SIGTERM 5 handlers. 6 7 Modified quit() to restart if it receives arg .i = 1 8 MOD+CTRL+SHIFT+Q was added to confid.def.h to do just that. 9 10 Signal handlers were handled for SIGHUP and SIGTERM. 11 If dwm receives these signals it calls quit() with 12 arg .i = to 1 or 0, respectively. 13 14 To restart dwm: 15 MOD+CTRL+SHIFT+Q 16 or 17 kill -HUP dwmpid 18 19 To quit dwm cleanly: 20 MOD+SHIFT+Q 21 or 22 kill -TERM dwmpid 23 --- 24 config.def.h | 1 + 25 dwm.1 | 10 ++++++++++ 26 dwm.c | 22 ++++++++++++++++++++++ 27 3 files changed, 33 insertions(+) 28 29 diff --git a/config.def.h b/config.def.h 30 index a9ac303..e559429 100644 31 --- a/config.def.h 32 +++ b/config.def.h 33 @@ -94,6 +94,7 @@ static Key keys[] = { 34 TAGKEYS( XK_8, 7) 35 TAGKEYS( XK_9, 8) 36 { MODKEY|ShiftMask, XK_q, quit, {0} }, 37 + { MODKEY|ControlMask|ShiftMask, XK_q, quit, {1} }, 38 }; 39 40 /* button definitions */ 41 diff --git a/dwm.1 b/dwm.1 42 index 13b3729..36a331c 100644 43 --- a/dwm.1 44 +++ b/dwm.1 45 @@ -142,6 +142,9 @@ Add/remove all windows with nth tag to/from the view. 46 .TP 47 .B Mod1\-Shift\-q 48 Quit dwm. 49 +.TP 50 +.B Mod1\-Control\-Shift\-q 51 +Restart dwm. 52 .SS Mouse commands 53 .TP 54 .B Mod1\-Button1 55 @@ -155,6 +158,13 @@ Resize focused window while dragging. Tiled windows will be toggled to the float 56 .SH CUSTOMIZATION 57 dwm is customized by creating a custom config.h and (re)compiling the source 58 code. This keeps it fast, secure and simple. 59 +.SH SIGNALS 60 +.TP 61 +.B SIGHUP - 1 62 +Restart the dwm process. 63 +.TP 64 +.B SIGTERM - 15 65 +Cleanly terminate the dwm process. 66 .SH SEE ALSO 67 .BR dmenu (1), 68 .BR st (1) 69 diff --git a/dwm.c b/dwm.c 70 index bb95e26..286eecd 100644 71 --- a/dwm.c 72 +++ b/dwm.c 73 @@ -205,6 +205,8 @@ static void setup(void); 74 static void seturgent(Client *c, int urg); 75 static void showhide(Client *c); 76 static void sigchld(int unused); 77 +static void sighup(int unused); 78 +static void sigterm(int unused); 79 static void spawn(const Arg *arg); 80 static void tag(const Arg *arg); 81 static void tagmon(const Arg *arg); 82 @@ -260,6 +262,7 @@ static void (*handler[LASTEvent]) (XEvent *) = { 83 [UnmapNotify] = unmapnotify 84 }; 85 static Atom wmatom[WMLast], netatom[NetLast]; 86 +static int restart = 0; 87 static int running = 1; 88 static Cur *cursor[CurLast]; 89 static Clr **scheme; 90 @@ -1248,6 +1251,7 @@ propertynotify(XEvent *e) 91 void 92 quit(const Arg *arg) 93 { 94 + if(arg->i) restart = 1; 95 running = 0; 96 } 97 98 @@ -1536,6 +1540,9 @@ setup(void) 99 /* clean up any zombies immediately */ 100 sigchld(0); 101 102 + signal(SIGHUP, sighup); 103 + signal(SIGTERM, sigterm); 104 + 105 /* init screen */ 106 screen = DefaultScreen(dpy); 107 sw = DisplayWidth(dpy, screen); 108 @@ -1637,6 +1644,20 @@ sigchld(int unused) 109 } 110 111 void 112 +sighup(int unused) 113 +{ 114 + Arg a = {.i = 1}; 115 + quit(&a); 116 +} 117 + 118 +void 119 +sigterm(int unused) 120 +{ 121 + Arg a = {.i = 0}; 122 + quit(&a); 123 +} 124 + 125 +void 126 spawn(const Arg *arg) 127 { 128 if (arg->v == dmenucmd) 129 @@ -2139,6 +2160,7 @@ main(int argc, char *argv[]) 130 setup(); 131 scan(); 132 run(); 133 + if(restart) execvp(argv[0], argv); 134 cleanup(); 135 XCloseDisplay(dpy); 136 return EXIT_SUCCESS; 137 -- 138 2.7.4 139