現代のウィンドウマネージャはExtended Window Manager Hints仕様を遵守し、あなたはちょうど_NET_FRAME_EXTENTS
プロパティをチェックする必要があります。
#include <X11/Xlib.h>
#include <stdio.h>
int main()
{
Display* d;
Window w, root;
Atom a, t;
int s;
long fg, bg;
int f;
unsigned long n, b;
unsigned char *data = 0;
long* extents;
XEvent e;
d = XOpenDisplay(0);
s = DefaultScreen(d);
root = DefaultRootWindow(d);
fg = BlackPixel(d, s);
bg = WhitePixel(d, s);
w = XCreateSimpleWindow(d, root, 0, 0, 200, 200, 0, fg, bg);
XSelectInput(d, w, ExposureMask|ButtonPressMask|KeyPressMask|PropertyChangeMask);
XMapWindow(d,w);
a = XInternAtom(d, "_NET_FRAME_EXTENTS", True); /* Property to check */
/* Window manager doesn't set up the extents immediately */
/* Wait until they are set up and there are 4 of them */
while (XGetWindowProperty(d, w, a,
0, 4, False, AnyPropertyType,
&t, &f,
&n, &b, &data) != Success || n != 4 || b != 0)
{
printf ("Waiting for extents\n");
XNextEvent(d, &e);
}
/* OK got extents */
extents = (long*) data;
printf ("Got frame extents: left %ld right %ld top %ld bottom %ld\n",
extents[0], extents[1], extents[2], extents[3]);
return 0;
}
近代的でないWMを使用している場合は、あなた自身で行ってください。 Andreyの答えに示唆されるように、ウィンドウツリーを歩いてみてください。これはうまくいく可能性がありますが、保証されていません。一部のウィンドウマネージャーは、別々の「フレーム」ウィンドウをまったく使用しません(たとえば、1つのウィンドウにすべてのフレームをオーバーレイビジュアルで描画できます)。
もちろんその答えは正しいわけではありません。 –