我正在尝试将托管窗口设置为始终位于顶部。但是这段代码不起作用:
我的代码是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);
通过获取窗口标题,我测试了我有正确的窗口。但是,上面的代码并没有使窗口始终位于顶部。能告诉你吗。
我感觉可能我得到的窗口不是"所有者窗口",这意味着它不负责总是在顶部,所以我查询树并尝试将每个窗口放在顶部(除了root),但没有一个工作。
答案 0 :(得分:2)
首先,您应说明您正在测试此窗口管理器,并在根窗口上通过_NET_SUPPORTED
验证窗口管理器是否支持此原子。
其次,您违反了规范。当窗口被撤回然后映射时,窗口管理器仅支持直接设置原子。如果要对已经映射的窗口执行此操作,则需要使用客户端消息到根窗口。
每当撤销窗口请求映射时,窗口管理器应该尊重_NET_WM_STATE。希望更改窗口状态的客户端必须向根窗口发送_NET_WM_STATE客户端消息(见下文)。窗口管理器必须保持此属性更新以反映窗口的当前状态。