JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
foo
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index bd7ffe3..e87caab 100644 (file)
--- a/dwm.c
+++ b/dwm.c
@@ -53,7 +53,7 @@
 enum { BarTop, BarBot, BarOff };                       /* bar position */
 enum { CurNormal, CurResize, CurMove, CurLast };       /* cursor */
 enum { ColBorder, ColFG, ColBG, ColLast };             /* color */
-enum { NetSupported, NetWMName, NetLast };             /* EWMH atoms */
+enum { NetSupported, NetWMCheck, NetWMName, NetLast }; /* EWMH atoms */
 enum { WMProtocols, WMDelete, WMName, WMState, WMLast };/* default atoms */
 
 /* typedefs */
@@ -233,7 +233,7 @@ Regs *regs = NULL;
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
-Bool prevtags[LENGTH(tags)] = {[0] = True};
+Bool prevtags[LENGTH(tags)];
 
 /* function implementations */
 void
@@ -1287,6 +1287,7 @@ restack(void) {
 void
 run(void) {
        char *p;
+       char buf[sizeof stext];
        fd_set rd;
        int r, xfd;
        unsigned int len, offset;
@@ -1298,7 +1299,7 @@ run(void) {
        readin = True;
        offset = 0;
        len = sizeof stext - 1;
-       stext[len] = '\0'; /* 0-terminator is never touched */
+       buf[len] = stext[len] = '\0'; /* 0-terminator is never touched */
        while(running) {
                FD_ZERO(&rd);
                if(readin)
@@ -1310,7 +1311,7 @@ run(void) {
                        eprint("select failed\n");
                }
                if(FD_ISSET(STDIN_FILENO, &rd)) {
-                       switch((r = read(STDIN_FILENO, stext + offset, len - offset))) {
+                       switch((r = read(STDIN_FILENO, buf + offset, len - offset))) {
                        case -1:
                                strncpy(stext, strerror(errno), len);
                                readin = False;
@@ -1320,14 +1321,18 @@ run(void) {
                                readin = False;
                                break;
                        default:
-                               stext[offset + r] = '\0';
-                               for(p = stext; *p && *p != '\n'; p++);
-                               if(*p == '\n') {
-                                       *p = '\0';
-                                       offset = 0;
-                               }
-                               else
-                                       offset = (offset + r < len - 1) ? offset + r : 0;
+                               for(p = buf + offset; r > 0; p++, r--, offset++)
+                                       if(*p == '\n' || *p == '\0') {
+                                               *p = '\0';
+                                               strncpy(stext, buf, len);
+                                               p += r - 1; /* p is buf + offset + r - 1 */
+                                               for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
+                                               offset = r;
+                                               if(r)
+                                                       memmove(buf, p - r + 1, r);
+                                               break;
+                                       }
+                               break;
                        }
                        drawbar();
                }
@@ -1422,19 +1427,20 @@ void
 setup(void) {
        int d;
        unsigned int i, j, mask;
+       Atom utf8string;
        Window w;
        XModifierKeymap *modmap;
        XSetWindowAttributes wa;
 
        /* init atoms */
+       utf8string = XInternAtom(dpy, "UTF8_STRING", False);
        wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False);
        wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False);
        wmatom[WMName] = XInternAtom(dpy, "WM_NAME", False);
        wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False);
        netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False);
+       netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False);
        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);
@@ -1467,6 +1473,7 @@ setup(void) {
        grabkeys();
 
        /* init tags */
+       memcpy(prevtags, seltags, sizeof seltags);
        compileregs();
 
        /* init appearance */
@@ -1508,6 +1515,17 @@ setup(void) {
 
        /* multihead support */
        selscreen = XQueryPointer(dpy, root, &w, &w, &d, &d, &d, &d, &mask);
+
+       /* EWMH properties */
+       XChangeProperty(dpy, barwin, netatom[NetWMCheck], XA_WINDOW, 32,
+                       PropModeReplace, (unsigned char *) &barwin, 1);
+       /* HACK: dwm identifies itself as compiz to workaround the XToolkit bug of Sun JDK */
+       XChangeProperty(dpy, barwin, netatom[NetWMName], utf8string, 8,
+                       PropModeReplace, (unsigned char *) "compiz", 6);
+       XChangeProperty(dpy, root, netatom[NetWMCheck], XA_WINDOW, 32,
+                       PropModeReplace, (unsigned char *) &barwin, 1);
+       XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32,
+                       PropModeReplace, (unsigned char *) netatom, NetLast);
 }
 
 void
@@ -1849,11 +1867,11 @@ view(const char *arg) {
 
 void
 viewprevtag(const char *arg) {
-       static Bool tmptags[sizeof tags / sizeof tags[0]];
+       static Bool tmp[LENGTH(tags)];
 
-       memcpy(tmptags, seltags, sizeof seltags);
+       memcpy(tmp, seltags, sizeof seltags);
        memcpy(seltags, prevtags, sizeof seltags);
-       memcpy(prevtags, tmptags, sizeof seltags);
+       memcpy(prevtags, tmp, sizeof seltags);
        arrange();
 }