From: Dana Jansens Date: Fri, 15 Feb 2008 05:36:55 +0000 (-0500) Subject: half a start on iconify animation X-Git-Url: http://git.openbox.org/?a=commitdiff_plain;h=2979e4902c88308701ef34680a6c702fa5cfadea;p=dana%2Fxcompmgr.git half a start on iconify animation --- diff --git a/xcompmgr.c b/xcompmgr.c index 291624b..70b07f2 100644 --- a/xcompmgr.c +++ b/xcompmgr.c @@ -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)