Xinqi Bao's Git

patch: restartsig
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index fb1c33f..7665557 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -219,6 +219,8 @@ static void setup(void);
 static void seturgent(Client *c, int urg);
 static void showhide(Client *c);
 static void sigchld(int unused);
 static void seturgent(Client *c, int urg);
 static void showhide(Client *c);
 static void sigchld(int unused);
+static void sighup(int unused);
+static void sigterm(int unused);
 static void spawn(const Arg *arg);
 static void tag(const Arg *arg);
 static void tagmon(const Arg *arg);
 static void spawn(const Arg *arg);
 static void tag(const Arg *arg);
 static void tagmon(const Arg *arg);
@@ -281,6 +283,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
        [UnmapNotify] = unmapnotify
 };
 static Atom wmatom[WMLast], netatom[NetLast];
        [UnmapNotify] = unmapnotify
 };
 static Atom wmatom[WMLast], netatom[NetLast];
+static int restart = 0;
 static int running = 1;
 static Cur *cursor[CurLast];
 static Clr **scheme;
 static int running = 1;
 static Cur *cursor[CurLast];
 static Clr **scheme;
@@ -1336,6 +1339,7 @@ propertynotify(XEvent *e)
 void
 quit(const Arg *arg)
 {
 void
 quit(const Arg *arg)
 {
+       if(arg->i) restart = 1;
        running = 0;
 }
 
        running = 0;
 }
 
@@ -1637,6 +1641,9 @@ setup(void)
        /* clean up any zombies immediately */
        sigchld(0);
 
        /* clean up any zombies immediately */
        sigchld(0);
 
+       signal(SIGHUP, sighup);
+       signal(SIGTERM, sigterm);
+
        /* init screen */
        screen = DefaultScreen(dpy);
        sw = DisplayWidth(dpy, screen);
        /* init screen */
        screen = DefaultScreen(dpy);
        sw = DisplayWidth(dpy, screen);
@@ -1738,6 +1745,20 @@ sigchld(int unused)
        while (0 < waitpid(-1, NULL, WNOHANG));
 }
 
        while (0 < waitpid(-1, NULL, WNOHANG));
 }
 
+void
+sighup(int unused)
+{
+       Arg a = {.i = 1};
+       quit(&a);
+}
+
+void
+sigterm(int unused)
+{
+       Arg a = {.i = 0};
+       quit(&a);
+}
+
 void
 spawn(const Arg *arg)
 {
 void
 spawn(const Arg *arg)
 {
@@ -2435,6 +2456,7 @@ main(int argc, char *argv[])
 #endif /* __OpenBSD__ */
        scan();
        run();
 #endif /* __OpenBSD__ */
        scan();
        run();
+       if(restart) execvp(argv[0], argv);
        cleanup();
        XCloseDisplay(dpy);
        return EXIT_SUCCESS;
        cleanup();
        XCloseDisplay(dpy);
        return EXIT_SUCCESS;