首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XCB:如何“释放”由xcb_generate_id分配的XID

XCB:如何“释放”由xcb_generate_id分配的XID
EN

Stack Overflow用户
提问于 2022-05-18 02:12:48
回答 1查看 104关注 0票数 0

(1)在XCB中,必须在某些请求之前手动分配XID。例如,

代码语言:javascript
复制
xcb_window_t win = xcb_generate_id(conn);
xcb_create_window(conn, XCB_COPY_FROM_PARENT, win, ...);

那么,我们应该如何释放(或取消分配) XID呢?调用xcb_destroy_window就足够了吗?

(2)如果xcb_create_window失败了,情况如何?例如,

代码语言:javascript
复制
xcb_generic_cookie_t cookie = xcb_create_window_checked(conn, XCB_COPY_FROM_PARENT, win, ...);
if(xcb_request_check(conn, cookie)) ... // xcb_create_window failed.

在上面的示例中,xcb_create_window失败了。因此,XID win是分配的,但不使用。在这种情况下,我们应该为win做些什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-05-20 12:59:11

是否足以调用xcb_destroy_window?

是啊。可悲的是,我没有任何权威的文档可以链接,所以我可以说“相信我”。

这是问题1的简单答案。回答2.嗯,我想这不是一个简单的答案。所以我想你需要“完全的真相”。

当X11客户端连接到X11服务器时,将为它分配一个要使用的XID范围。以下是服务器响应中的字段resource-id-baseresource-id-maskhttps://www.x.org/releases/X11R7.6/doc/xproto/x11protocol.html#server_response

从概念上讲,这两个字段描述的内容类似于“从0x100到0x200的所有XID都是为您准备的”。

xcb_generate_id()现在只是从这个范围返回下一个条目,并将其标记为已使用的条目。因此,在第一次调用之后并继续使用上面的示例,“从0x101到0x200的所有XID”仍然可用。

这是一个非常简单的数据结构,无法以“不再使用”的形式返回XID。

那么,在使用所有XID之后会发生什么呢?为此,存在XC-MISC扩展:https://www.x.org/releases/X11R7.7/doc/xcmiscproto/xc-misc.html

当XID用完时,libxcb将发送一个XCMiscGetXIDRange请求,以获得“新”批XID,然后开始分发它们。

我用引号写"new“,因为它实际上是原始XID范围的一个子范围: X11服务器知道它最初分配给这个客户机的范围。它知道使用的是哪些XID。因此,它可以选择一个自由范围并将其返回给客户端。

由于这种机制,libxcb不必以任何方式跟踪已使用的XID。东西是自动工作的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72282520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档