X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=main.c;h=750366e7cfb8f031ebaae4e77fb8f2c6c5223e56;hb=478f6f95f1cb349e93bfe49ae6721c222c3a1a6d;hp=b3c753e97e45f89777a3a6e5f75cc17728086a2b;hpb=d800ec05ff63451193a0b858c114f5144534c2a1;p=dwm.git diff --git a/main.c b/main.c index b3c753e..750366e 100644 --- a/main.c +++ b/main.c @@ -1,5 +1,4 @@ -/* - * (C)opyright MMVI Anselm R. Garbe +/* (C)opyright MMVI Anselm R. Garbe * See LICENSE file for license details. */ @@ -19,8 +18,8 @@ char stext[1024]; Bool *seltag; -int bx, by, bw, bh, bmw, mw, screen, sx, sy, sw, sh; -unsigned int ntags, numlockmask; +int bx, by, bw, bh, bmw, masterd, screen, sx, sy, sw, sh, wax, way, waw, wah; +unsigned int master, ntags, numlockmask; Atom wmatom[WMLast], netatom[NetLast]; Bool running = True; Bool issel = True; @@ -38,7 +37,7 @@ static int (*xerrorxlib)(Display *, XErrorEvent *); static Bool otherwm, readin; static void -cleanup() { +cleanup(void) { close(STDIN_FILENO); while(sel) { resize(sel, True, TopLeft); @@ -58,7 +57,7 @@ cleanup() { } static void -scan() { +scan(void) { unsigned int i, num; Window *wins, d1, d2; XWindowAttributes wa; @@ -79,7 +78,7 @@ scan() { } static void -setup() { +setup(void) { int i, j; unsigned int mask; Window w; @@ -93,12 +92,11 @@ setup() { 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 modifier map */ modmap = XGetModifierMapping(dpy); for (i = 0; i < 8; i++) { for (j = 0; j < modmap->max_keypermod; j++) { @@ -107,19 +105,16 @@ setup() { } } XFree(modmap); - + /* select for events */ wa.event_mask = SubstructureRedirectMask | SubstructureNotifyMask | EnterWindowMask | LeaveWindowMask; wa.cursor = cursor[CurNormal]; XChangeWindowAttributes(dpy, root, CWEventMask | CWCursor, &wa); - grabkeys(); initrregs(); - for(ntags = 0; tags[ntags]; ntags++); seltag = emallocz(sizeof(Bool) * ntags); seltag[0] = True; - /* style */ dc.norm[ColBG] = getcolor(NORMBGCOLOR); dc.norm[ColFG] = getcolor(NORMFGCOLOR); @@ -128,14 +123,15 @@ setup() { dc.status[ColBG] = getcolor(STATUSBGCOLOR); dc.status[ColFG] = getcolor(STATUSFGCOLOR); setfont(FONT); - - bmw = textw(FLOATSYMBOL) > textw(TILESYMBOL) ? textw(FLOATSYMBOL) : textw(TILESYMBOL); + /* geometry */ + bmw = textw(TILESYMBOL) > textw(FLOATSYMBOL) ? textw(TILESYMBOL) : textw(FLOATSYMBOL); sx = sy = 0; sw = DisplayWidth(dpy, screen); sh = DisplayHeight(dpy, screen); - mw = (sw * MASTERW) / 100; - - bx = by = 0; + master = MASTER; + /* bar */ + bx = sx; + by = sy; bw = sw; dc.h = bh = dc.font.height + 2; wa.override_redirect = 1; @@ -146,13 +142,18 @@ setup() { CWOverrideRedirect | CWBackPixmap | CWEventMask, &wa); XDefineCursor(dpy, barwin, cursor[CurNormal]); XMapRaised(dpy, barwin); - + strcpy(stext, "dwm-"VERSION); + /* windowarea */ + wax = sx; + way = sy + bh; + 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); - + /* multihead support */ issel = XQueryPointer(dpy, root, &w, &w, &i, &i, &i, &i, &mask); - strcpy(stext, "dwm-"VERSION); } /* @@ -204,8 +205,7 @@ quit(Arg *arg) { readin = running = False; } -/* - * There's no way to check accesses to destroyed windows, thus those cases are +/* There's no way to check accesses to destroyed windows, thus those cases are * ignored (especially on UnmapNotify's). Other types of errors call Xlibs * default error handler, which may call exit. */ @@ -236,21 +236,17 @@ main(int argc, char *argv[]) { } else if(argc != 1) eprint("usage: dwm [-v]\n"); - dpy = XOpenDisplay(0); if(!dpy) eprint("dwm: cannot open display\n"); - xfd = ConnectionNumber(dpy); screen = DefaultScreen(dpy); root = RootWindow(dpy, screen); - otherwm = False; XSetErrorHandler(xerrorstart); /* this causes an error if some other window manager is running */ XSelectInput(dpy, root, SubstructureRedirectMask); XSync(dpy, False); - if(otherwm) eprint("dwm: another window manager is already running\n"); @@ -258,7 +254,6 @@ main(int argc, char *argv[]) { XSetErrorHandler(NULL); xerrorxlib = XSetErrorHandler(xerror); XSync(dpy, False); - setup(); drawstatus(); scan(); @@ -272,25 +267,31 @@ main(int argc, char *argv[]) { if(readin) FD_SET(STDIN_FILENO, &rd); FD_SET(xfd, &rd); - r = select(xfd + 1, &rd, NULL, NULL, NULL); - if((r == -1) && (errno == EINTR)) - continue; - if(r > 0) { - if(readin && FD_ISSET(STDIN_FILENO, &rd)) { - readin = NULL != fgets(stext, sizeof(stext), stdin); - if(readin) - stext[strlen(stext) - 1] = 0; - else - strcpy(stext, "broken pipe"); - drawstatus(); + if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) { + if(errno == EINTR) + continue; + else + eprint("select failed\n"); + } + if(FD_ISSET(STDIN_FILENO, &rd)) { + switch(r = read(STDIN_FILENO, stext, sizeof(stext))) { + case -1: + strncpy(stext, strerror(errno), sizeof(stext)); + readin = False; + break; + case 0: + strncpy(stext, "EOF", sizeof(stext)); + readin = False; + break; + default: + stext[r-1] = 0; } + drawstatus(); } - else if(r < 0) - eprint("select failed\n"); - procevent(); + if(FD_ISSET(xfd, &rd)) + procevent(); } cleanup(); XCloseDisplay(dpy); - return 0; }