(1)在XCB中,必须在某些请求之前手动分配XID。例如,
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失败了,情况如何?例如,
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做些什么?
发布于 2022-05-20 12:59:11
是否足以调用xcb_destroy_window?
是啊。可悲的是,我没有任何权威的文档可以链接,所以我可以说“相信我”。
这是问题1的简单答案。回答2.嗯,我想这不是一个简单的答案。所以我想你需要“完全的真相”。
当X11客户端连接到X11服务器时,将为它分配一个要使用的XID范围。以下是服务器响应中的字段resource-id-base和resource-id-mask:https://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。东西是自动工作的。
https://stackoverflow.com/questions/72282520
复制相似问题