+ if(sel)
+ arrange();
+ else
+ drawbar();
+}
+
+void
+setmwfact(const char *arg) {
+ double delta;
+
+ if(!isarrange(tile))
+ return;
+ /* arg handling, manipulate mwfact */
+ if(arg == NULL)
+ mwfact = MWFACT;
+ else if(1 == sscanf(arg, "%lf", &delta)) {
+ if(arg[0] != '+' && arg[0] != '-')
+ mwfact = delta;
+ else
+ mwfact += delta;
+ if(mwfact < 0.1)
+ mwfact = 0.1;
+ else if(mwfact > 0.9)
+ mwfact = 0.9;
+ }
+ arrange();
+}
+
+void
+setup(void) {
+ unsigned int i, j, mask;
+ Window w;
+ XModifierKeymap *modmap;
+ XSetWindowAttributes wa;
+
+ /* init atoms */
+ wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
+ wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
+ wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False);
+ wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
+ netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
+ netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False);
+ XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
+ PropModeReplace, (unsigned char *) netatom, NetLast);
+
+ /* init cursors */
+ cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr);
+ cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing);
+ cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur);
+
+ /* init geometry */
+ sx = sy = 0;
+ sw = DisplayWidth(dpy, screen);
+ sh = DisplayHeight(dpy, screen);
+
+ /* init modifier map */
+ modmap = XGetModifierMapping(dpy);
+ for(i = 0; i < 8; i++)
+ for(j = 0; j < modmap->max_keypermod; j++) {
+ if(modmap->modifiermap[i * modmap->max_keypermod + j]
+ == XKeysymToKeycode(dpy, XK_Num_Lock))
+ numlockmask = (1 << i);
+ }
+ XFreeModifiermap(modmap);
+
+ /* select for events */
+ wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask
+ | EnterWindowMask | LeaveWindowMask | StructureNotifyMask;
+ wa.cursor = cursor[CurNormal];
+ XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa);
+ XSelectInput(dpy, root, wa.event_mask);
+
+ /* grab keys */
+ keypress(NULL);
+
+ /* init tags */
+ compileregs();
+ for(ntags = 0; tags[ntags]; ntags++);
+ seltags = emallocz(sizeof(Bool) * ntags);
+ seltags[0] = True;
+
+ /* init appearance */
+ dc.norm[ColBorder] = getcolor(NORMBORDERCOLOR);
+ dc.norm[ColBG] = getcolor(NORMBGCOLOR);
+ dc.norm[ColFG] = getcolor(NORMFGCOLOR);
+ dc.sel[ColBorder] = getcolor(SELBORDERCOLOR);
+ dc.sel[ColBG] = getcolor(SELBGCOLOR);
+ dc.sel[ColFG] = getcolor(SELFGCOLOR);
+ initfont(FONT);
+ dc.h = bh = dc.font.height + 2;
+
+ /* init layouts */
+ mwfact = MWFACT;
+ nlayouts = sizeof layouts / sizeof layouts[0];
+ for(blw = i = 0; i < nlayouts; i++) {
+ j = textw(layouts[i].symbol);
+ if(j > blw)
+ blw = j;
+ }
+
+ /* init bar */
+ bpos = BARPOS;
+ wa.override_redirect = 1;
+ wa.background_pixmap = ParentRelative;
+ wa.event_mask = ButtonPressMask | ExposureMask;
+ barwin = XCreateWindow(dpy, root, sx, sy, sw, bh, 0,
+ DefaultDepth(dpy, screen), CopyFromParent, DefaultVisual(dpy, screen),
+ CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa);
+ XDefineCursor(dpy, barwin, cursor[CurNormal]);
+ updatebarpos();
+ XMapRaised(dpy, barwin);
+ strcpy(stext, "dwm-"VERSION);
+ dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen));
+ dc.gc = XCreateGC(dpy, root, 0, 0);
+ XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter);
+ if(!dc.font.set)
+ XSetFont(dpy, dc.gc, dc.font.xfont->fid);
+
+ /* multihead support */
+ selscreen = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask);
+}
+
+void
+spawn(const char *arg) {
+ static char *shell = NULL;
+
+ if(!shell && !(shell = getenv("SHELL")))
+ shell = "/bin/sh";
+ if(!arg)
+ return;
+ /* The double-fork construct avoids zombie processes and keeps the code
+ * clean from stupid signal handlers. */
+ if(fork() == 0) {
+ if(fork() == 0) {
+ if(dpy)
+ close(ConnectionNumber(dpy));
+ setsid();
+ execl(shell, shell, "-c", arg, (char *)NULL);
+ fprintf(stderr, "dwm: execl '%s -c %s'", shell, arg);
+ perror(" failed");
+ }
+ exit(0);
+ }
+ wait(0);