Xinqi Bao's Git

patch: restartsig
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 5b0c792..7665557 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -212,12 +212,15 @@ static void sendmon(Client *c, Monitor *m);
 static void setclientstate(Client *c, long state);
 static void setfocus(Client *c);
 static void setfullscreen(Client *c, int fullscreen);
+static void fullscreen(const Arg *arg);
 static void setlayout(const Arg *arg);
 static void setmfact(const Arg *arg);
 static void setup(void);
 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);
@@ -280,6 +283,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
        [UnmapNotify] = unmapnotify
 };
 static Atom wmatom[WMLast], netatom[NetLast];
+static int restart = 0;
 static int running = 1;
 static Cur *cursor[CurLast];
 static Clr **scheme;
@@ -1335,6 +1339,7 @@ propertynotify(XEvent *e)
 void
 quit(const Arg *arg)
 {
+       if(arg->i) restart = 1;
        running = 0;
 }
 
@@ -1584,6 +1589,19 @@ setfullscreen(Client *c, int fullscreen)
        }
 }
 
+Layout *last_layout;
+void
+fullscreen(const Arg *arg)
+{
+       if (selmon->showbar) {
+               for(last_layout = (Layout *)layouts; last_layout != selmon->lt[selmon->sellt]; last_layout++);
+               setlayout(&((Arg) { .v = &layouts[2] }));
+       } else {
+               setlayout(&((Arg) { .v = last_layout }));
+       }
+       togglebar(arg);
+}
+
 void
 setlayout(const Arg *arg)
 {
@@ -1623,6 +1641,9 @@ setup(void)
        /* clean up any zombies immediately */
        sigchld(0);
 
+       signal(SIGHUP, sighup);
+       signal(SIGTERM, sigterm);
+
        /* init screen */
        screen = DefaultScreen(dpy);
        sw = DisplayWidth(dpy, screen);
@@ -1724,6 +1745,20 @@ sigchld(int unused)
        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)
 {
@@ -2421,6 +2456,7 @@ main(int argc, char *argv[])
 #endif /* __OpenBSD__ */
        scan();
        run();
+       if(restart) execvp(argv[0], argv);
        cleanup();
        XCloseDisplay(dpy);
        return EXIT_SUCCESS;