fixed misappearance of iconified windows on SIGKILL
authorAnselm R. Garbe <garbeam@gmail.com>
Sun, 19 Aug 2007 16:39:54 +0000 (18:39 +0200)
committerAnselm R. Garbe <garbeam@gmail.com>
Sun, 19 Aug 2007 16:39:54 +0000 (18:39 +0200)
main.c
screen.c

diff --git a/main.c b/main.c
index b56e333..79b301d 100644 (file)
--- a/main.c
+++ b/main.c
@@ -111,6 +111,24 @@ initfont(const char *fontstr) {
        dc.font.height = dc.font.ascent + dc.font.descent;
 }
 
+static long
+getstate(Window w) {
+       int format, status;
+       long result = -1;
+       unsigned char *p = NULL;
+       unsigned long n, extra;
+       Atom real;
+
+       status = XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState],
+                       &real, &format, &n, &extra, (unsigned char **)&p);
+       if(status != Success)
+               return -1;
+       if(n != 0)
+               result = *p;
+       XFree(p);
+       return result;
+}
+
 static void
 scan(void) {
        unsigned int i, num;
@@ -123,7 +141,14 @@ scan(void) {
                        if(!XGetWindowAttributes(dpy, wins[i], &wa)
                        || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1))
                                continue;
-                       if(wa.map_state == IsViewable)
+                       if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState)
+                               manage(wins[i], &wa);
+               }
+               for(i = 0; i < num; i++) { /* now the transients */
+                       if(!XGetWindowAttributes(dpy, wins[i], &wa))
+                               continue;
+                       if(XGetTransientForHint(dpy, wins[i], &d1)
+                       && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState))
                                manage(wins[i], &wa);
                }
        }
index 022633b..a8b093c 100644 (file)
--- a/screen.c
+++ b/screen.c
@@ -60,7 +60,7 @@ setdwmprops(void) {
        for(i = 0; i < ntags && i < sizeof prop - 1; i++)
                prop[i] = seltags[i] ? '1' : '0';
        if(i < sizeof prop - 1)
-               prop[i++] = (char)ltidx;
+               prop[i++] = (char)ltidx + '0';
        prop[i] = '\0';
        XChangeProperty(dpy, root, dwmprops, XA_STRING, 8,
                        PropModeReplace, (unsigned char *)prop, i);
@@ -223,8 +223,8 @@ getdwmprops(void) {
                for(i = 0; i < ntags && i < sizeof prop - 1 && prop[i] != '\0'; i++)
                        seltags[i] = prop[i] == '1';
                if(i < sizeof prop - 1 && prop[i] != '\0') {
-                       if(prop[i] < nlayouts)
-                               ltidx = prop[i];
+                       if((unsigned int)(prop[i] - '0') < nlayouts)
+                               ltidx = prop[i] - '0';
                }
        }
 }