Xinqi Bao's Git

patch: restartsig
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index f266a37..7665557 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -63,6 +63,8 @@
 #define TAGMASK                 ((1 << LENGTH(tags)) - 1)
 #define TEXTW(X)                (drw_fontset_getwidth(drw, (X)) + lrpad)
 
+#define OPAQUE                  0xffU
+
 /* enums */
 enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */
 enum { SchemeNorm, SchemeSel }; /* color schemes */
@@ -210,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);
@@ -243,6 +248,7 @@ static Monitor *wintomon(Window w);
 static int xerror(Display *dpy, XErrorEvent *ee);
 static int xerrordummy(Display *dpy, XErrorEvent *ee);
 static int xerrorstart(Display *dpy, XErrorEvent *ee);
+static void xinitvisual();
 static void zoom(const Arg *arg);
 
 static pid_t getparentprocess(pid_t p);
@@ -277,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;
@@ -287,6 +294,11 @@ static Window root, wmcheckwin;
 
 static xcb_connection_t *xcon;
 
+static int useargb = 0;
+static Visual *visual;
+static int depth;
+static Colormap cmap;
+
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
@@ -1327,6 +1339,7 @@ propertynotify(XEvent *e)
 void
 quit(const Arg *arg)
 {
+       if(arg->i) restart = 1;
        running = 0;
 }
 
@@ -1576,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)
 {
@@ -1615,12 +1641,16 @@ setup(void)
        /* clean up any zombies immediately */
        sigchld(0);
 
+       signal(SIGHUP, sighup);
+       signal(SIGTERM, sigterm);
+
        /* init screen */
        screen = DefaultScreen(dpy);
        sw = DisplayWidth(dpy, screen);
        sh = DisplayHeight(dpy, screen);
        root = RootWindow(dpy, screen);
-       drw = drw_create(dpy, screen, root, sw, sh);
+       xinitvisual();
+       drw = drw_create(dpy, screen, root, sw, sh, visual, depth, cmap);
        if (!drw_fontset_create(drw, fonts, LENGTH(fonts)))
                die("no fonts could be loaded.");
        lrpad = drw->fonts->h;
@@ -1648,7 +1678,7 @@ setup(void)
        /* init appearance */
        scheme = ecalloc(LENGTH(colors), sizeof(Clr *));
        for (i = 0; i < LENGTH(colors); i++)
-               scheme[i] = drw_scm_create(drw, colors[i], 3);
+               scheme[i] = drw_scm_create(drw, colors[i], alphas[i], 3);
        /* init bars */
        updatebars();
        updatestatus();
@@ -1715,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)
 {
@@ -1902,16 +1946,18 @@ updatebars(void)
        Monitor *m;
        XSetWindowAttributes wa = {
                .override_redirect = True,
-               .background_pixmap = ParentRelative,
+               .background_pixel = 0,
+               .border_pixel = 0,
+               .colormap = cmap,
                .event_mask = ButtonPressMask|ExposureMask
        };
        XClassHint ch = {"dwm", "dwm"};
        for (m = mons; m; m = m->next) {
                if (m->barwin)
                        continue;
-               m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen),
-                               CopyFromParent, DefaultVisual(dpy, screen),
-                               CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa);
+               m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, depth,
+                                         InputOutput, visual,
+                                         CWOverrideRedirect|CWBackPixel|CWBorderPixel|CWColormap|CWEventMask, &wa);
                XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor);
                XMapRaised(dpy, m->barwin);
                XSetClassHint(dpy, m->barwin, &ch);
@@ -2338,6 +2384,43 @@ xerrorstart(Display *dpy, XErrorEvent *ee)
        return -1;
 }
 
+void
+xinitvisual()
+{
+       XVisualInfo *infos;
+       XRenderPictFormat *fmt;
+       int nitems;
+       int i;
+
+       XVisualInfo tpl = {
+               .screen = screen,
+               .depth = 32,
+               .class = TrueColor
+       };
+       long masks = VisualScreenMask | VisualDepthMask | VisualClassMask;
+
+       infos = XGetVisualInfo(dpy, masks, &tpl, &nitems);
+       visual = NULL;
+       for(i = 0; i < nitems; i ++) {
+               fmt = XRenderFindVisualFormat(dpy, infos[i].visual);
+               if (fmt->type == PictTypeDirect && fmt->direct.alphaMask) {
+                       visual = infos[i].visual;
+                       depth = infos[i].depth;
+                       cmap = XCreateColormap(dpy, root, visual, AllocNone);
+                       useargb = 1;
+                       break;
+               }
+       }
+
+       XFree(infos);
+
+       if (! visual) {
+               visual = DefaultVisual(dpy, screen);
+               depth = DefaultDepth(dpy, screen);
+               cmap = DefaultColormap(dpy, screen);
+       }
+}
+
 void
 zoom(const Arg *arg)
 {
@@ -2373,6 +2456,7 @@ main(int argc, char *argv[])
 #endif /* __OpenBSD__ */
        scan();
        run();
+       if(restart) execvp(argv[0], argv);
        cleanup();
        XCloseDisplay(dpy);
        return EXIT_SUCCESS;