XCB 设置 Window 置顶不工作

XCB Set Window On Top Not Working

我正在尝试将托管 window 设置为始终位于最前面。但是此代码不起作用:

我的代码是 js-ctypes,但它是一个 XCB API 问题:

var rez_focus = xcb_get_input_focus_reply(c, xcb_get_input_focus(c), null);

var change_list = xcb_atom_t.array()([cachedXCBAtom('_NET_WM_STATE_ABOVE')]);
var req_change = xcb_change_property(c, XCB_PROP_MODE_REPLACE, rez_focus.focus, cachedXCBAtom('_NET_WM_STATE'), XCB_ATOM_ATOM, 32, change_list.length, change_list);

xcb_flush(c);

我通过获取 window 标题测试了我拥有正确的 window。但是,上面的这段代码并没有使 window 始终位于最前面。能否请教一下。

我有一种感觉,也许我得到的 window 不是 "owner window",这意味着它不负责总是在最前面,所以我做了查询树并尝试了每个 window 在最上面(root 除外),但是 none 有效。

首先,您应该说明您正在使用哪个 window 管理器进行测试,并通过根 window 上的 _NET_SUPPORTED 验证 window 管理器支持此原子.

其次,您违反了规范。直接设置原子只有在 window 被撤销然后映射时才会被 window 管理器接受。如果要对已映射的 window 执行此操作,则需要使用客户端消息发送到根 window。

the documentation:

The Window Manager SHOULD honor _NET_WM_STATE whenever a withdrawn window requests to be mapped. A Client wishing to change the state of a window MUST send a _NET_WM_STATE client message to the root window (see below). The Window Manager MUST keep this property updated to reflect the current state of the window.