【问题标题】:XCB Set Window On Top Not WorkingXCB 在顶部设置窗口不起作用
【发布时间】:2016-08-17 11:33:09
【问题描述】:

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

我的代码是 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);

我通过获取窗口标题测试了我有正确的窗口。但是,上面的代码并没有使窗口始终位于顶部。能否请教。

我有一种感觉,也许我得到的窗口不是“所有者窗口”,这意味着它不负责始终位于顶部,所以我做了查询树并尝试将每个窗口都放在顶部(根窗口除外),但是没有工作。

【问题讨论】:

    标签: xcb


    【解决方案1】:

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

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

    the documentation:

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

    【讨论】:

    • 看起来还不错。您是否检查过错误响应?
    • Oooo Ingo 我想通了。我正在使用xcb_get_input_focus 获取当前的焦点窗口。所以我会用这个窗口ID发送消息。但是当我得到这个窗口的窗口标题时,它是一个空白字符串。所以我确实用xcb_query_tree 查询了父母,直到我找到一个标题不是空白的窗口。我将顶部的集合发送到那个窗口(带有标题)并且它设置在顶部。无论如何要知道将那个窗口设置在顶部是否是我所期望的?在发送到带有空白标题的窗口后,我做了一个xcb_send_event_checked,检查时没有错误,它是空的。
    • 啊,是的。这实际上是一个老问题。 :-) 我的建议是您查看xwininfo 源代码。他们有一个功能可以解决这个问题(我忘记了他们使用的实际算法)。鉴于这是一个久经考验的工具,他们的解决方案应该足够好。
    • 谢谢先生,我马上去看看! :) 你的推荐信对我帮助很大,你的知识很丰富!
    • @Noitidart 您正在寻找类似this 的东西,尽管我认为检查WM_CLASS 是危险的。 _NET_WM_STATE 会更好,并且被大多数其他工具使用(但它们以相反的方式搜索,从上到下)。但是,您真的需要具有输入焦点的窗口吗?您可能需要活动窗口。这需要 EWMH 支持,但更容易找到。只需从根窗口查询_NET_ACTIVE_WINDOW
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多