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];
}
}
}
我有一个方法应该 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];
}
}
}