JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
yeah compiz didn't did the trick, but identifying dwm as LookingGlass (LG3D)
[dwm.git] / dwm.c
diff --git a/dwm.c b/dwm.c
index 8da3b6f..c11d7d2 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 */
@@ -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);
@@ -1509,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 LookingGlass to workaround the XToolkit bug of Sun JDK */
+       XChangeProperty(dpy, barwin, netatom[NetWMName], utf8string, 8,
+                       PropModeReplace, (unsigned char *) "LG3D", 4);
+       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