XCB设置窗口在顶部不起作用

时间:2016-08-17 11:33:09

标签: xcb

我正在尝试将托管窗口设置为始终位于顶部。但是这段代码不起作用:

我的代码是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),但没有一个工作。

1 个答案:

答案 0 :(得分:2)

首先,您应说明您正在测试此窗口管理器,并在根窗口上通过_NET_SUPPORTED验证窗口管理器是否支持此原子。

其次,您违反了规范。当窗口被撤回然后映射时,窗口管理器仅支持直接设置原子。如果要对已经映射的窗口执行此操作,则需要使用客户端消息到根窗口。

请参阅the documentation

  

每当撤销窗口请求映射时,窗口管理器应该尊重_NET_WM_STATE。希望更改窗口状态的客户端必须向根窗口发送_NET_WM_STATE客户端消息(见下文)。窗口管理器必须保持此属性更新以反映窗口的当前状态。