X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=main.c;h=6f60c9b07cf6f38811393115cdc8f72f1b11294b;hb=352e1b4c81d141cf60f98b38c93dd1fcd342c4a4;hp=869928417c19348e07d94a397405ee557d1cf523;hpb=ee31e38dc75832a66cb0fc01bcf2f419ac96a20b;p=dwm.git diff --git a/main.c b/main.c index 8699284..6f60c9b 100644 --- a/main.c +++ b/main.c @@ -18,16 +18,26 @@ /* static */ static int (*xerrorxlib)(Display *, XErrorEvent *); -static Bool otherwm; +static Bool otherwm, readin; static void cleanup() { + close(STDIN_FILENO); while(sel) { resize(sel, True, TopLeft); unmanage(sel); } + if(dc.font.set) + XFreeFontSet(dpy, dc.font.set); + else + XFreeFont(dpy, dc.font.xfont); + XUngrabKey(dpy, AnyKey, AnyModifier, root); + XFreePixmap(dpy, dc.drawable); + XFreeGC(dpy, dc.gc); + XDestroyWindow(dpy, barwin); XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); + XSync(dpy, False); } static void @@ -37,6 +47,7 @@ scan() 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)) @@ -51,25 +62,6 @@ scan() XFree(wins); } -static int -win_property(Window w, Atom a, Atom t, long l, unsigned char **prop) -{ - int status, format; - unsigned long res, extra; - Atom real; - - status = XGetWindowProperty(dpy, w, a, 0L, l, False, t, &real, &format, - &res, &extra, prop); - - if(status != Success || *prop == 0) { - return 0; - } - if(res == 0) { - free((void *) *prop); - } - return res; -} - /* * Startup Error handler to check if another window manager * is already running. @@ -100,21 +92,20 @@ Window root, barwin; int getproto(Window w) { - int protos = 0; + int status, format, protos = 0; int i; - long res; - Atom *protocols; + unsigned long extra, res; + Atom *protocols, real; - res = win_property(w, wmatom[WMProtocols], XA_ATOM, 20L, - ((unsigned char **)&protocols)); - if(res <= 0) { + status = XGetWindowProperty(dpy, w, wmatom[WMProtocols], 0L, 20L, + False, XA_ATOM, &real, &format, &res, &extra, (unsigned char **)&protocols); + if(status != Success || protocols == 0) return protos; - } for(i = 0; i < res; i++) { if(protocols[i] == wmatom[WMDelete]) protos |= PROTODELWIN; } - free((char *) protocols); + free(protocols); return protos; } @@ -136,7 +127,7 @@ sendevent(Window w, Atom a, long value) void quit(Arg *arg) { - running = False; + readin = running = False; } /* @@ -166,9 +157,7 @@ main(int argc, char *argv[]) int i, j, xfd; unsigned int mask; fd_set rd; - Bool readin = True; Window w; - XEvent ev; XModifierKeymap *modmap; XSetWindowAttributes wa; @@ -196,6 +185,7 @@ main(int argc, char *argv[]) if(otherwm) eprint("dwm: another window manager is already running\n"); + XSync(dpy, False); XSetErrorHandler(NULL); xerrorxlib = XSetErrorHandler(xerror); XSync(dpy, False); @@ -231,7 +221,7 @@ main(int argc, char *argv[]) for(ntags = 0; tags[ntags]; ntags++); seltag = emallocz(sizeof(Bool) * ntags); - seltag[DEFTAG] = True; + seltag[0] = True; /* style */ dc.bg = getcolor(BGCOLOR); @@ -268,18 +258,17 @@ main(int argc, char *argv[]) /* main event loop, also reads status text from stdin */ XSync(dpy, False); - goto XLoop; + procevent(); + readin = True; while(running) { FD_ZERO(&rd); if(readin) FD_SET(STDIN_FILENO, &rd); FD_SET(xfd, &rd); i = select(xfd + 1, &rd, NULL, NULL, NULL); - if(i == -1 && errno == EINTR) + if((i == -1) && (errno == EINTR)) continue; - if(i < 0) - eprint("select failed\n"); - else if(i > 0) { + if(i > 0) { if(readin && FD_ISSET(STDIN_FILENO, &rd)) { readin = NULL != fgets(stext, sizeof(stext), stdin); if(readin) @@ -288,15 +277,10 @@ main(int argc, char *argv[]) strcpy(stext, "broken pipe"); drawstatus(); } - if(FD_ISSET(xfd, &rd)) { -XLoop: - while(XPending(dpy)) { - XNextEvent(dpy, &ev); - if(handler[ev.type]) - (handler[ev.type])(&ev); /* call handler */ - } - } } + else if(i < 0) + eprint("select failed\n"); + procevent(); } cleanup(); XCloseDisplay(dpy);