X-Git-Url: https://jasonwoof.com/gitweb/?p=dwm.git;a=blobdiff_plain;f=dwm.c;h=48785c7cdd38b792a6b596f1b94ed3073f151f28;hp=1554a166f3a6fcd2a78d07fdcec190e862196de3;hb=9aa4a9043d1261f9ae71cc2740d061d68a99227e;hpb=45768ee04bfab45a5dfd21105419806422ca8954 diff --git a/dwm.c b/dwm.c index 1554a16..48785c7 100644 --- a/dwm.c +++ b/dwm.c @@ -139,17 +139,18 @@ static void attachstack(Client *c); static void buttonpress(XEvent *e); static void checkotherwm(void); static void cleanup(void); +static void clearurgent(void); static void configure(Client *c); static void configurenotify(XEvent *e); static void configurerequest(XEvent *e); static void destroynotify(XEvent *e); static void detach(Client *c); static void detachstack(Client *c); +static void die(const char *errstr, ...); static void drawbar(void); static void drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]); static void drawtext(const char *text, ulong col[ColLast], Bool invert); static void enternotify(XEvent *e); -static void eprint(const char *errstr, ...); static void expose(XEvent *e); static void focus(Client *c); static void focusin(XEvent *e); @@ -343,7 +344,7 @@ checkotherwm(void) { XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); XSync(dpy, False); if(otherwm) - eprint("dwm: another window manager is already running\n"); + die("dwm: another window manager is already running\n"); XSetErrorHandler(NULL); xerrorxlib = XSetErrorHandler(xerror); XSync(dpy, False); @@ -375,6 +376,23 @@ cleanup(void) { } void +clearurgent(void) { + XWMHints *wmh; + Client *c; + + for(c = clients; c; c = c->next) + if(ISVISIBLE(c) && c->isurgent) { + c->isurgent = False; + if (!(wmh = XGetWMHints(dpy, c->win))) + continue; + + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + XFree(wmh); + } +} + +void configure(Client *c) { XConfigureEvent ce; @@ -459,16 +477,10 @@ destroynotify(XEvent *e) { void detach(Client *c) { - Client *i; + Client **tc; - if (c != clients) { - for(i = clients; i->next != c; i = i->next); - i->next = c->next; - } - else { - clients = c->next; - } - c->next = NULL; + for(tc = &clients; *tc && *tc != c; tc = &(*tc)->next); + *tc = c->next; } void @@ -480,6 +492,16 @@ detachstack(Client *c) { } void +die(const char *errstr, ...) { + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(EXIT_FAILURE); +} + +void drawbar(void) { int i, x; @@ -587,16 +609,6 @@ enternotify(XEvent *e) { } void -eprint(const char *errstr, ...) { - va_list ap; - - va_start(ap, errstr); - vfprintf(stderr, errstr, ap); - va_end(ap); - exit(EXIT_FAILURE); -} - -void expose(XEvent *e) { XExposeEvent *ev = &e->xexpose; @@ -673,7 +685,7 @@ getcolor(const char *colstr) { XColor color; if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) - eprint("error, cannot allocate color '%s'\n", colstr); + die("error, cannot allocate color '%s'\n", colstr); return color.pixel; } @@ -799,7 +811,7 @@ initfont(const char *fontstr) { dc.font.xfont = NULL; if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) - eprint("error, cannot load font: '%s'\n", fontstr); + die("error, cannot load font: '%s'\n", fontstr); dc.font.ascent = dc.font.xfont->ascent; dc.font.descent = dc.font.xfont->descent; } @@ -883,7 +895,7 @@ manage(Window w, XWindowAttributes *wa) { XWindowChanges wc; if(!(c = calloc(1, sizeof(Client)))) - eprint("fatal: could not calloc() %u bytes\n", sizeof(Client)); + die("fatal: could not calloc() %u bytes\n", sizeof(Client)); c->win = w; /* geometry */ @@ -1222,7 +1234,7 @@ run(void) { if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) { if(errno == EINTR) continue; - eprint("select failed\n"); + die("select failed\n"); } if(FD_ISSET(STDIN_FILENO, &rd)) { switch((r = read(STDIN_FILENO, sbuf + offset, len - offset))) { @@ -1502,6 +1514,7 @@ toggleview(const Arg *arg) { if(mask) { tagset[seltags] = mask; + clearurgent(); arrange(); } } @@ -1632,10 +1645,13 @@ updatewmhints(Client *c) { XWMHints *wmh; if((wmh = XGetWMHints(dpy, c->win))) { - if(c == sel) - sel->isurgent = False; + if(ISVISIBLE(c) && wmh->flags & XUrgencyHint) { + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + } else c->isurgent = (wmh->flags & XUrgencyHint) ? True : False; + XFree(wmh); } } @@ -1647,6 +1663,7 @@ view(const Arg *arg) { seltags ^= 1; /* toggle sel tagset */ if(arg && (arg->ui & TAGMASK)) tagset[seltags] = arg->i & TAGMASK; + clearurgent(); arrange(); } @@ -1701,15 +1718,15 @@ zoom(const Arg *arg) { int main(int argc, char *argv[]) { if(argc == 2 && !strcmp("-v", argv[1])) - eprint("dwm-"VERSION", © 2006-2008 dwm engineers, see LICENSE for details\n"); + die("dwm-"VERSION", © 2006-2008 dwm engineers, see LICENSE for details\n"); else if(argc != 1) - eprint("usage: dwm [-v]\n"); + die("usage: dwm [-v]\n"); if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) fprintf(stderr, "warning: no locale support\n"); if(!(dpy = XOpenDisplay(0))) - eprint("dwm: cannot open display\n"); + die("dwm: cannot open display\n"); checkotherwm(); setup();