获取X11窗口标题高度

时间:2016-03-23 20:32:17

标签: c linux x11

如何在X11中获取窗口的标题/标题高度?我使用以下内容来获取边框粗细:

XWindowAttributes wndattr;
::XGetWindowAttributes(display, wnd, &wndattr)
... = lWndAttr->border_width;

我似乎无法为标题栏找到任何直接的内容。 (This回答似乎意味着我需要通过一种字体,但这不对,对吗?)

3 个答案:

答案 0 :(得分:0)

<div class="loader"></div> 返回指向XGetWindowAttributes结构x的指针,如下所示:

XWindowAttributes

唯一有趣的部分是在开头,给出了窗口小部件窗口的位置和大小。 标题不是该窗口的一部分。它由窗口管理器管理,是所谓的“#34;装饰&#34;。

的一部分

进一步阅读:

答案 1 :(得分:0)

答案实际上取决于所使用的窗口管理器,将大多数WM重新定位的目标窗口视为帧的子节点,因此算法将是:

  • 走到父窗口,直到你到达root。 root之前的那个可能是框架
  • 将目标窗口矩形与框架矩形进行比较。框架顶部减去目标顶部将为您提供标题高度

答案 2 :(得分:0)

现代窗口管理员遵守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的回答中的建议走上窗户树。这很可能有效,但不能保证。一些窗口管理器根本不使用单独的“框架”窗口(例如,它们可以在叠加的视觉上在单个窗口上绘制所有帧)。