xcb_get_geometry_reply returns 比 Gnome 上的真实 window 几何图形稍大 window

xcb_get_geometry_reply returns slightly larger window geometry then the real window on Gnome

我有一个方法应该 return 活动 window 的位置和大小。例如,在 Plasma 上可以找到作品,但在 Gnome 上,几何图形比真实的 window 大一点,如屏幕截图所示:

我正在使用 xcb_get_geometry_reply 获取 window 信息。知道是什么导致了这种行为以及如何减轻这种行为吗?

Any idea what might be causing such behavior

我认为你得到的值是正确的。您可以在 window 周围看到阴影(至少在右侧和底部,但我敢打赌左侧和顶部也有阴影)。我敢打赌阴影是通过更大的 window 然后使其部分透明来实现的。

因此,您获得的值是正确的,因为它们还包括阴影。

and how to mitigate it?

您可以在终端中 运行 xprop -frame and/or xprop 然后单击 window。 GTK 是否设置了一些包含阴影大小的 属性? (我不知道这个问题的答案;这只是一个猜测)(这甚至是 GTK window?)

感谢 Uli Schlachter 指出了正确的方向,我得到了一个可行的解决方案,以防有人遇到这个问题 post。

auto connection = QX11Info::connection();
auto atom_cookie = xcb_intern_atom(connection, 0, strlen("_GTK_FRAME_EXTENTS"), "_GTK_FRAME_EXTENTS");
ScopedCPointer<xcb_intern_atom_reply_t> atom_reply(xcb_intern_atom_reply(connection, atom_cookie, nullptr));

if (!atom_reply.isNull()) {
    auto cookie = xcb_get_property(connection, 0, windowId, atom_reply->atom, XCB_ATOM_CARDINAL, 0, 4);
    ScopedCPointer<xcb_get_property_reply_t> reply(xcb_get_property_reply(connection, cookie, nullptr));

    if (!reply.isNull()) {
        int length = xcb_get_property_value_length(reply.data());
        if (length != 0) {
            auto gtkFrameExtents = static_cast<uint32_t*>(xcb_get_property_value(reply.data()));
            auto left = gtkFrameExtents[0];
            auto right = gtkFrameExtents[1];
            auto top = gtkFrameExtents[2];
            auto bottom = gtkFrameExtents[3];
        }
    }
}