half a start on iconify animation iconify
authorDana Jansens <danakj@orodu.net>
Fri, 15 Feb 2008 05:36:55 +0000 (00:36 -0500)
committerDana Jansens <danakj@orodu.net>
Sat, 16 Feb 2008 00:25:47 +0000 (19:25 -0500)
xcompmgr.c

index 291624be46e497ddd8499944f84068205d101fec..70b07f218ee9f4205bbe223a6adef77b4537a0e0 100644 (file)
@@ -99,6 +99,7 @@ typedef struct _win {
     int                        shadow_height;
     unsigned int       opacity;
     wintype             windowType;
+    Bool                iconic;
     unsigned long      damage_sequence;    /* sequence when damage was created */
 
     Bool                need_configure;
@@ -152,6 +153,9 @@ int         composite_opcode;
 Atom           opacityAtom;
 Atom            winTypeAtom;
 Atom            winType[NUM_WINTYPES];
+Atom            stateAtom;
+Atom            stateHiddenAtom;
+
 double          winTypeOpacity[NUM_WINTYPES];
 Bool            winTypeShadow[NUM_WINTYPES];
 Bool            winTypeFade[NUM_WINTYPES];
@@ -1215,6 +1219,40 @@ wintype_name(wintype type)
     return t;
 }
 
+static Bool
+get_iconic_prop(Display * dpy, Window w)
+{
+    Atom actual;
+    int format;
+    unsigned long n, left, off;
+    unsigned char *data;
+    Bool ret = False;
+
+    off = 0;
+
+    do {
+        int result = XGetWindowProperty (dpy, w, stateAtom, off, 1L, False,
+                                         XA_ATOM, &actual, &format,
+                                         &n, &left, &data);
+
+        if (result == Success && data != None)
+        {
+            Atom a;
+            memcpy (&a, data, sizeof (Atom));
+            if (a == stateHiddenAtom) {
+                ret = True;
+                break;
+            }
+
+            XFree ( (void *) data);
+        }
+
+        ++off;
+    } while (left >= 4 && !ret);
+
+    return ret;
+}
+
 static wintype
 get_wintype_prop(Display * dpy, Window w)
 {
@@ -1311,6 +1349,7 @@ map_win (Display *dpy, Window id, unsigned long sequence, Bool fade)
        return;
 
     w->a.map_state = IsViewable;
+    w->iconic = False;
 
     w->windowType = determine_wintype (dpy, w->id, w->id);
 #if 0
@@ -2148,6 +2187,8 @@ main (int argc, char **argv)
     winType[WINTYPE_NOTIFY] = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_NOTIFICATION", False);
     winType[WINTYPE_COMBO] = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_COMBO", False);
     winType[WINTYPE_DND] = XInternAtom (dpy, "_NET_WM_WINDOW_TYPE_DND", False);
+    stateAtom = XInternAtom (dpy, "_NET_WM_STATE", False);
+    stateHiddenAtom = XInternAtom (dpy, "_NET_WM_STATE_HIDDEN", False);
 
     pa.subwindow_mode = IncludeInferiors;
 
@@ -2311,6 +2352,14 @@ main (int argc, char **argv)
                        }
                    }
                }
+                if (ev.property.atom == stateAtom) {
+                    win *w = find_win (dpy, ev.xproperty.window);
+                    if (w)
+                    {
+                        if (w->a.map_state != IsUnmapped)
+                            w->iconic = get_iconic_prop (dpy, w->id);
+                    }
+                }
                break;
            default:
                if (ev.type == damage_event + XDamageNotify)