JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
reverted uint redefinition
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 3d9a063..29157de 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -63,21 +63,17 @@ enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle,
        ClkClientWin, ClkRootWin, ClkLast };             /* clicks */
 
-/* typedefs */
-typedef unsigned int uint;
-typedef unsigned long ulong;
-
 typedef union {
        int i;
-       uint ui;
+       unsigned int ui;
        float f;
        void *v;
 } Arg;
 
 typedef struct {
-       uint click;
-       uint mask;
-       uint button;
+       unsigned int click;
+       unsigned int mask;
+       unsigned int button;
        void (*func)(const Arg *arg);
        const Arg arg;
 } Button;
@@ -89,7 +85,7 @@ struct Client {
        int x, y, w, h;
        int basew, baseh, incw, inch, maxw, maxh, minw, minh;
        int bw, oldbw;
-       uint tags;
+       unsigned int tags;
        Bool isfixed, isfloating, isurgent;
        Client *next;
        Client *snext;
@@ -98,8 +94,8 @@ struct Client {
 
 typedef struct {
        int x, y, w, h;
-       ulong norm[ColLast];
-       ulong sel[ColLast];
+       unsigned long norm[ColLast];
+       unsigned long sel[ColLast];
        Drawable drawable;
        GC gc;
        struct {
@@ -112,7 +108,7 @@ typedef struct {
 } DC; /* draw context */
 
 typedef struct {
-       uint mod;
+       unsigned int mod;
        KeySym keysym;
        void (*func)(const Arg *);
        const Arg arg;
@@ -127,7 +123,7 @@ typedef struct {
        const char *class;
        const char *instance;
        const char *title;
-       uint tags;
+       unsigned int tags;
        Bool isfloating;
 } Rule;
 
@@ -139,31 +135,32 @@ 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 drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]);
+static void drawtext(const char *text, unsigned long 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);
 static void focusstack(const Arg *arg);
 static Client *getclient(Window w);
-static ulong getcolor(const char *colstr);
+static unsigned long getcolor(const char *colstr);
 static long getstate(Window w);
-static Bool gettextprop(Window w, Atom atom, char *text, uint size);
+static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size);
 static void grabbuttons(Client *c, Bool focused);
 static void grabkeys(void);
 static void initfont(const char *fontstr);
-static Bool isoccupied(uint t);
+static Bool isoccupied(unsigned int t);
 static Bool isprotodel(Client *c);
-static Bool isurgent(uint t);
+static Bool isurgent(unsigned int t);
 static void keypress(XEvent *e);
 static void killclient(const Arg *arg);
 static void manage(Window w, XWindowAttributes *wa);
@@ -185,7 +182,7 @@ static void setmfact(const Arg *arg);
 static void setup(void);
 static void spawn(const Arg *arg);
 static void tag(const Arg *arg);
-static int textnw(const char *text, uint len);
+static int textnw(const char *text, unsigned int len);
 static void tile(void);
 static void togglebar(const Arg *arg);
 static void togglefloating(const Arg *arg);
@@ -208,9 +205,9 @@ static void zoom(const Arg *arg);
 static char stext[256];
 static int screen, sx, sy, sw, sh;
 static int by, bh, blw, wx, wy, ww, wh;
-static uint seltags = 0, sellt = 0;
+static unsigned int seltags = 0, sellt = 0;
 static int (*xerrorxlib)(Display *, XErrorEvent *);
-static uint numlockmask = 0;
+static unsigned int numlockmask = 0;
 static void (*handler[LASTEvent]) (XEvent *) = {
        [ButtonPress] = buttonpress,
        [ConfigureRequest] = configurerequest,
@@ -228,7 +225,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
 static Atom wmatom[WMLast], netatom[NetLast];
 static Bool otherwm, readin;
 static Bool running = True;
-static uint tagset[] = {1, 1}; /* after start, first tag is selected */
+static unsigned int tagset[] = {1, 1}; /* after start, first tag is selected */
 static Client *clients = NULL;
 static Client *sel = NULL;
 static Client *stack = NULL;
@@ -240,13 +237,13 @@ static Window root, barwin;
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
-/* compile-time check if all tags fit into an uint bit array. */
-struct NumTags { char limitexceeded[sizeof(uint) * 8 < LENGTH(tags) ? -1 : 1]; };
+/* compile-time check if all tags fit into an unsigned int bit array. */
+struct NumTags { char limitexceeded[sizeof(unsigned int) * 8 < LENGTH(tags) ? -1 : 1]; };
 
 /* function implementations */
 void
 applyrules(Client *c) {
-       uint i;
+       unsigned int i;
        Rule *r;
        XClassHint ch = { 0 };
 
@@ -303,7 +300,7 @@ attachstack(Client *c) {
 
 void
 buttonpress(XEvent *e) {
-       uint i, x, click;
+       unsigned int i, x, click;
        Arg arg = {0};
        Client *c;
        XButtonPressedEvent *ev = &e->xbutton;
@@ -343,7 +340,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 +372,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;
 
@@ -474,6 +488,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;
 
@@ -518,7 +542,7 @@ drawbar(void) {
 }
 
 void
-drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]) {
+drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) {
        int x;
        XGCValues gcv;
        XRectangle r = { dc.x, dc.y, dc.w, dc.h };
@@ -539,7 +563,7 @@ drawsquare(Bool filled, Bool empty, Bool invert, ulong col[ColLast]) {
 }
 
 void
-drawtext(const char *text, ulong col[ColLast], Bool invert) {
+drawtext(const char *text, unsigned long col[ColLast], Bool invert) {
        int i, x, y, h, len, olen;
        XRectangle r = { dc.x, dc.y, dc.w, dc.h };
        char buf[256];
@@ -581,16 +605,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;
 
@@ -661,13 +675,13 @@ getclient(Window w) {
        return c;
 }
 
-ulong
+unsigned long
 getcolor(const char *colstr) {
        Colormap cmap = DefaultColormap(dpy, screen);
        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;
 }
 
@@ -676,7 +690,7 @@ getstate(Window w) {
        int format, status;
        long result = -1;
        unsigned char *p = NULL;
-       ulong n, extra;
+       unsigned long n, extra;
        Atom real;
 
        status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
@@ -690,7 +704,7 @@ getstate(Window w) {
 }
 
 Bool
-gettextprop(Window w, Atom atom, char *text, uint size) {
+gettextprop(Window w, Atom atom, char *text, unsigned int size) {
        char **list = NULL;
        int n;
        XTextProperty name;
@@ -717,8 +731,8 @@ gettextprop(Window w, Atom atom, char *text, uint size) {
 
 void
 grabbuttons(Client *c, Bool focused) {
-       uint i, j;
-       uint modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
+       unsigned int i, j;
+       unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask };
 
        XUngrabButton(dpy, AnyButton, AnyModifier, c->win);
        if(focused) {
@@ -733,7 +747,7 @@ grabbuttons(Client *c, Bool focused) {
 
 void
 grabkeys(void) {
-       uint i, j;
+       unsigned int i, j;
        KeyCode code;
        XModifierKeymap *modmap;
 
@@ -793,7 +807,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;
        }
@@ -801,7 +815,7 @@ initfont(const char *fontstr) {
 }
 
 Bool
-isoccupied(uint t) {
+isoccupied(unsigned int t) {
        Client *c;
 
        for(c = clients; c; c = c->next)
@@ -826,7 +840,7 @@ isprotodel(Client *c) {
 }
 
 Bool
-isurgent(uint t) {
+isurgent(unsigned int t) {
        Client *c;
 
        for(c = clients; c; c = c->next)
@@ -837,7 +851,7 @@ isurgent(uint t) {
 
 void
 keypress(XEvent *e) {
-       uint i;
+       unsigned int i;
        KeySym keysym;
        XKeyEvent *ev;
 
@@ -877,7 +891,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 */
@@ -961,7 +975,7 @@ monocle(void) {
 void
 movemouse(const Arg *arg) {
        int x1, y1, ocx, ocy, di, nx, ny;
-       uint dui;
+       unsigned int dui;
        Client *c;
        Window dummy;
        XEvent ev;
@@ -1198,7 +1212,7 @@ run(void) {
        char sbuf[sizeof stext];
        fd_set rd;
        int r, xfd;
-       uint len, offset;
+       unsigned int len, offset;
        XEvent ev;
 
        /* main event loop, also reads status text from stdin */
@@ -1216,7 +1230,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))) {
@@ -1254,7 +1268,7 @@ run(void) {
 
 void
 scan(void) {
-       uint i, num;
+       unsigned int i, num;
        Window *wins, d1, d2;
        XWindowAttributes wa;
 
@@ -1315,7 +1329,7 @@ setmfact(const Arg *arg) {
 
 void
 setup(void) {
-       uint i;
+       unsigned int i;
        int w;
        XSetWindowAttributes wa;
 
@@ -1418,7 +1432,7 @@ tag(const Arg *arg) {
 }
 
 int
-textnw(const char *text, uint len) {
+textnw(const char *text, unsigned int len) {
        XRectangle r;
 
        if(dc.font.set) {
@@ -1431,7 +1445,7 @@ textnw(const char *text, uint len) {
 void
 tile(void) {
        int x, y, h, w, mw;
-       uint i, n;
+       unsigned int i, n;
        Client *c;
 
        for(n = 0, c = nexttiled(clients); c; c = nexttiled(c->next), n++);
@@ -1482,7 +1496,7 @@ togglefloating(const Arg *arg) {
 
 void
 toggletag(const Arg *arg) {
-       uint mask = sel->tags ^ (arg->ui & TAGMASK);
+       unsigned int mask = sel->tags ^ (arg->ui & TAGMASK);
 
        if(sel && mask) {
                sel->tags = mask;
@@ -1492,10 +1506,11 @@ toggletag(const Arg *arg) {
 
 void
 toggleview(const Arg *arg) {
-       uint mask = tagset[seltags] ^ (arg->ui & TAGMASK);
+       unsigned int mask = tagset[seltags] ^ (arg->ui & TAGMASK);
 
        if(mask) {
                tagset[seltags] = mask;
+               clearurgent();
                arrange();
        }
 }
@@ -1626,10 +1641,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);
        }
 }
@@ -1641,6 +1659,7 @@ view(const Arg *arg) {
        seltags ^= 1; /* toggle sel tagset */
        if(arg && (arg->ui & TAGMASK))
                tagset[seltags] = arg->i & TAGMASK;
+       clearurgent();
        arrange();
 }
 
@@ -1695,15 +1714,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();