X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=main.c;h=5551e6ed283e76f71d97086e7ddd9e2121a595a3;hp=1015017f1297af147482d917412a873595d9bb55;hb=d934296476be7345842fec1a2630d1752c704078;hpb=e7508783e85aba0ce4ab09b0dd76c40342113aed diff --git a/main.c b/main.c index 1015017..5551e6e 100644 --- a/main.c +++ b/main.c @@ -1,7 +1,9 @@ -/* (C)opyright MMVI-MMVII Anselm R. Garbe - * See LICENSE file for license details. - */ - +/* © 2006-2007 Anselm R. Garbe + * © 2006-2007 Sander van Dijk + * © 2006-2007 Jukka Salmi + * © 2007 Premysl Hruby + * © 2007 Szabolcs Nagy + * See LICENSE file for license details. */ #include "dwm.h" #include #include @@ -19,9 +21,8 @@ char stext[256]; int screen, sx, sy, sw, sh, wax, way, waw, wah; -unsigned int bh, ntags, numlockmask; +unsigned int bh, bpos, ntags, numlockmask; Atom wmatom[WMLast], netatom[NetLast]; -Bool running = True; Bool *seltag; Bool selscreen = True; Client *clients = NULL; @@ -36,6 +37,7 @@ Window root, barwin; static int (*xerrorxlib)(Display *, XErrorEvent *); static Bool otherwm, readin; +static Bool running = True; static void cleanup(void) { @@ -62,7 +64,7 @@ cleanup(void) { } static unsigned long -getcolor(const char *colstr) { +initcolor(const char *colstr) { Colormap cmap = DefaultColormap(dpy, screen); XColor color; @@ -72,27 +74,7 @@ getcolor(const char *colstr) { } static void -scan(void) { - unsigned int i, num; - Window *wins, d1, d2; - XWindowAttributes wa; - - wins = NULL; - if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { - for(i = 0; i < num; i++) { - if(!XGetWindowAttributes(dpy, wins[i], &wa) - || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) - continue; - if(wa.map_state == IsViewable) - manage(wins[i], &wa); - } - } - if(wins) - XFree(wins); -} - -static void -setfont(const char *fontstr) { +initfont(const char *fontstr) { char *def, **missing; int i, n; @@ -102,7 +84,7 @@ setfont(const char *fontstr) { dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); if(missing) { while(n--) - fprintf(stderr, "missing fontset: %s\n", missing[n]); + fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]); XFreeStringList(missing); } if(dc.font.set) { @@ -133,6 +115,26 @@ setfont(const char *fontstr) { } static void +scan(void) { + unsigned int i, num; + Window *wins, d1, d2; + XWindowAttributes wa; + + wins = NULL; + if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for(i = 0; i < num; i++) { + if(!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + continue; + if(wa.map_state == IsViewable) + manage(wins[i], &wa); + } + } + if(wins) + XFree(wins); +} + +static void setup(void) { int i, j; unsigned int mask; @@ -164,22 +166,23 @@ setup(void) { XFreeModifiermap(modmap); /* select for events */ wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask - | EnterWindowMask | LeaveWindowMask; + | EnterWindowMask | LeaveWindowMask | StructureNotifyMask; wa.cursor = cursor[CurNormal]; XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); + XSelectInput(dpy, root, wa.event_mask); grabkeys(); compileregs(); for(ntags = 0; tags[ntags]; ntags++); seltag = emallocz(sizeof(Bool) * ntags); seltag[0] = True; /* style */ - 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); - setfont(FONT); + dc.norm[ColBorder] = initcolor(NORMBORDERCOLOR); + dc.norm[ColBG] = initcolor(NORMBGCOLOR); + dc.norm[ColFG] = initcolor(NORMFGCOLOR); + dc.sel[ColBorder] = initcolor(SELBORDERCOLOR); + dc.sel[ColBG] = initcolor(SELBGCOLOR); + dc.sel[ColFG] = initcolor(SELFGCOLOR); + initfont(FONT); /* geometry */ sx = sy = 0; sw = DisplayWidth(dpy, screen); @@ -190,21 +193,20 @@ setup(void) { wa.override_redirect = 1; wa.background_pixmap = ParentRelative; wa.event_mask = ButtonPressMask | ExposureMask; - barwin = XCreateWindow(dpy, root, sx, sy + (TOPBAR ? 0 : sh - bh), sw, bh, 0, + 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]); + bpos = BARPOS; + updatebarpos(); XMapRaised(dpy, barwin); strcpy(stext, "dwm-"VERSION); - /* windowarea */ - wax = sx; - way = sy + (TOPBAR ? bh : 0); - wah = sh - bh; - waw = sw; /* pixmap for everything */ 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); } @@ -222,22 +224,34 @@ xerrorstart(Display *dsply, XErrorEvent *ee) { /* extern */ void -sendevent(Window w, Atom a, long value) { - XEvent e; - - e.type = ClientMessage; - e.xclient.window = w; - e.xclient.message_type = a; - e.xclient.format = 32; - e.xclient.data.l[0] = value; - e.xclient.data.l[1] = CurrentTime; - XSendEvent(dpy, w, False, NoEventMask, &e); - XSync(dpy, False); +quit(const char *arg) { + readin = running = False; } void -quit(Arg *arg) { - readin = running = False; +updatebarpos(void) { + XEvent ev; + + wax = sx; + way = sy; + wah = sh; + waw = sw; + switch(bpos) { + default: + wah -= bh; + way += bh; + XMoveWindow(dpy, barwin, sx, sy); + break; + case BarBot: + wah -= bh; + XMoveWindow(dpy, barwin, sx, sy + wah); + break; + case BarOff: + XMoveWindow(dpy, barwin, sx, sy - bh); + break; + } + XSync(dpy, False); + while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); } /* There's no way to check accesses to destroyed windows, thus those cases are @@ -267,8 +281,8 @@ main(int argc, char *argv[]) { fd_set rd; XEvent ev; - if(argc == 2 && !strncmp("-v", argv[1], 3)) - eprint("dwm-"VERSION", (C)opyright MMVI-MMVII Anselm R. Garbe\n"); + if(argc == 2 && !strcmp("-v", argv[1])) + eprint("dwm-"VERSION", © 2006-2007 A. R. Garbe, S. van Dijk, J. Salmi, P. Hruby, S. Nagy\n"); else if(argc != 1) eprint("usage: dwm [-v]\n"); setlocale(LC_CTYPE, ""); @@ -325,12 +339,11 @@ main(int argc, char *argv[]) { } drawstatus(); } - if(FD_ISSET(xfd, &rd)) - while(XPending(dpy)) { - XNextEvent(dpy, &ev); - if(handler[ev.type]) - (handler[ev.type])(&ev); /* call handler */ - } + while(XPending(dpy)) { + XNextEvent(dpy, &ev); + if(handler[ev.type]) + (handler[ev.type])(&ev); /* call handler */ + } } cleanup(); XCloseDisplay(dpy);