00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #include <X11/Xlib.h>
00031 #include <X11/Xatom.h>
00032
00033 #include <X11/Xmu/WinUtil.h>
00034
00035
00036
00037
00038 static Window TryChildren(Display*, Window, Atom);
00039
00040
00041
00042 Window
00043 XmuClientWindow(Display *dpy, Window win)
00044 {
00045 Atom WM_STATE;
00046 Atom type = None;
00047 int format;
00048 unsigned long nitems, after;
00049 unsigned char *data = NULL;
00050 Window inf;
00051
00052 WM_STATE = XInternAtom(dpy, "WM_STATE", True);
00053 if (!WM_STATE)
00054 return win;
00055 XGetWindowProperty(dpy, win, WM_STATE, 0, 0, False, AnyPropertyType,
00056 &type, &format, &nitems, &after, &data);
00057 if (data)
00058 XFree(data);
00059 if (type)
00060 return win;
00061 inf = TryChildren(dpy, win, WM_STATE);
00062 if (!inf)
00063 inf = win;
00064 return inf;
00065 }
00066
00067 static Window
00068 TryChildren(Display *dpy, Window win, Atom WM_STATE)
00069 {
00070 Window root, parent;
00071 Window *children;
00072 unsigned int nchildren;
00073 unsigned int i;
00074 Atom type = None;
00075 int format;
00076 unsigned long nitems, after;
00077 unsigned char *data;
00078 Window inf = 0;
00079
00080 if (!XQueryTree(dpy, win, &root, &parent, &children, &nchildren))
00081 return 0;
00082 for (i = 0; !inf && (i < nchildren); i++) {
00083 data = NULL;
00084 XGetWindowProperty(dpy, children[i], WM_STATE, 0, 0, False,
00085 AnyPropertyType, &type, &format, &nitems,
00086 &after, &data);
00087 if (data)
00088 XFree(data);
00089 if (type)
00090 inf = children[i];
00091 }
00092 for (i = 0; !inf && (i < nchildren); i++)
00093 inf = TryChildren(dpy, children[i], WM_STATE);
00094 if (children)
00095 XFree(children);
00096 return inf;
00097 }