首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

X11:_NET_FRAME_EXTENTS窗口属性。XCB的回报不一致

在 X11 窗口系统中,_NET_FRAME_EXTENTS 是一个窗口属性,用于描述窗口管理器为窗口装饰(如边框、标题栏等)添加的外部边框的大小。这个属性通常由窗口管理器设置,并且可以通过 X11 协议查询。

_NET_FRAME_EXTENTS 属性

_NET_FRAME_EXTENTS 属性包含四个整数值,分别表示窗口的左、右、上、下边框的宽度。这些值可以帮助应用程序了解窗口管理器为窗口添加的装饰的大小,从而进行适当的布局调整。

使用 XCB 查询 _NET_FRAME_EXTENTS

XCB(X C Binding)是一个用于与 X 服务器通信的库。使用 XCB 查询 _NET_FRAME_EXTENTS 属性的代码示例如下:

代码语言:javascript
复制
#include <xcb/xcb.h>
#include <xcb/xcb_atom.h>
#include <stdio.h>
#include <stdlib.h>

void get_net_frame_extents(xcb_connection_t *conn, xcb_window_t window) {
    xcb_intern_atom_cookie_t cookie = xcb_intern_atom(conn, 0, strlen("_NET_FRAME_EXTENTS"), "_NET_FRAME_EXTENTS");
    xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(conn, cookie, NULL);

    if (!reply) {
        fprintf(stderr, "Failed to get _NET_FRAME_EXTENTS atom.\n");
        return;
    }

    xcb_atom_t net_frame_extents = reply->atom;
    free(reply);

    xcb_get_property_cookie_t prop_cookie = xcb_get_property(conn, 0, window, net_frame_extents, XCB_ATOM_CARDINAL, 0, 4);
    xcb_get_property_reply_t *prop_reply = xcb_get_property_reply(conn, prop_cookie, NULL);

    if (!prop_reply) {
        fprintf(stderr, "Failed to get _NET_FRAME_EXTENTS property.\n");
        return;
    }

    if (xcb_get_property_value_length(prop_reply) == 4 * sizeof(uint32_t)) {
        uint32_t *extents = (uint32_t *)xcb_get_property_value(prop_reply);
        printf("Left: %u, Right: %u, Top: %u, Bottom: %u\n", extents[0], extents[1], extents[2], extents[3]);
    } else {
        fprintf(stderr, "Unexpected property value length.\n");
    }

    free(prop_reply);
}

int main() {
    xcb_connection_t *conn = xcb_connect(NULL, NULL);
    if (xcb_connection_has_error(conn)) {
        fprintf(stderr, "Failed to connect to X server.\n");
        return -1;
    }

    // Replace with the actual window ID you want to query
    xcb_window_t window = 0x02000007;

    get_net_frame_extents(conn, window);

    xcb_disconnect(conn);
    return 0;
}

不一致的回报

如果你在使用 XCB 查询 _NET_FRAME_EXTENTS 属性时遇到不一致的回报,可能有以下几个原因:

  1. 窗口管理器支持:确保你的窗口管理器支持并设置了 _NET_FRAME_EXTENTS 属性。并不是所有的窗口管理器都支持这个属性。
  2. 窗口管理器延迟:窗口管理器可能在窗口创建后的一段时间内才设置 _NET_FRAME_EXTENTS 属性。如果你在窗口创建后立即查询,可能会得到不完整或错误的结果。
  3. 窗口 ID 错误:确保你查询的窗口 ID 是正确的。如果你查询了错误的窗口 ID,可能会得到意外的结果。
  4. XCB 连接问题:确保你的 XCB 连接是有效的,并且没有错误。

调试建议

  1. 检查窗口管理器:使用 xprop 工具手动检查窗口的 _NET_FRAME_EXTENTS 属性,确保窗口管理器正确设置了这个属性。

xprop -id <window_id> _NET_FRAME_EXTENTS

  • 延迟查询:在窗口创建后,添加一些延迟再查询 _NET_FRAME_EXTENTS 属性,确保窗口管理器有足够的时间设置属性。
  • 日志和调试:在代码中添加更多的日志和错误检查,帮助你定位问题的根源。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • ubuntu7.10安装到3D开启

    累了好几天,重装了十几遍终于把ubuntu7.10搞定到了我自认为完美的状态了。现在总结一下安装过程(按操作顺序记录): 1.在xp下不管用pqmajac还是其他硬盘分区工具分出10G的空余分区来(实验阶段10G尝试下),不知道是不是必须得把空余分区放到硬盘的最后,似乎用中间分区会出现安装错误。 2.开始安装,简单步骤省略...这里注意的是分区时,一个swap:2G,logical,结束。一个/,ext3,8G,开始。还有就是安装过程中保持网络通畅,因为过程中要下载语言包支持。 3.安装结束。 ----------- 为了避免在以后的配置过程中出现错误,这里推荐用clonezilla live(ghost 4 linux)做备份,clonezilla下载地址:[url]http://clonezilla.sourceforge.net/download/sourceforge/[/url] 下载*.iso刻张碟子出来,从碟子启动进入clonezilla live进行备份,使用还是相当简单的。 ----------- 4.用clonezilla live做一次备份,起名original 5.装好ubuntu7.10后,第一件事情就是安装源了: sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup sudo gedit /etc/apt/sources.list 将内容全部替换成: deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-backports main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-backports main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-proposed main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-proposed main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-security main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-security main restricted universe multiverse deb [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-updates main restricted universe multiverse deb-src [url]http://ubuntu.cn99.com/ubuntu[/url] gutsy-updates main restricted universe multiverse ----更新软件包: sudo apt-get update sudo apt-get dist-upgrade --------------------------------这里更新软件包需要漫长的时间(取决于网速了) 可以在这个时候作一些比较简单的配置: ------------ 把桌面,把计算机、主文件夹、回收站放到桌面上,把挂载的卷去掉: gconf-editor 到/apps/nautilus/desktop/分支下,去掉volumes_visible前面的复选框,勾上trash_icon_visible,home_icon_visible,computer_icon_visible前面的复选框。 ------------ 调整上下任务栏里面的内容 ------------ 开通root登录: 1.修改root密码: sudo passwd root 2.系统->系统管理->登录窗口,在安全选项卡里“允许本地系统管理员登录”打勾 以后就可以通过切换用户从登录窗口用root权限登录

    08
    领券