JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
fixed misappearance of iconified windows on SIGKILL
[dwm.git] / main.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);
                }
        }