【发布时间】:2016-09-30 18:58:52
【问题描述】:
目前我负责为一个小项目开发一个(C++)窗口类;目标是将依赖关系保持在最低限度。 Win32/WinAPI 的实现按预期工作,但是,当涉及到 Linux/XCB 时,我正在苦苦挣扎。
我知道,我可以检查“_NET_WM_STATE”属性,但是,文档没有指定任何事件,这会在窗口最大化或最小化时发生。 Extended Window Manager Hints 规范似乎也没有定义事件。
那么,如何拦截最大化/最小化事件?
编辑: 我的代码看起来基本上是这样的,但不起作用: (by 不起作用,我的意思是永远不会满足下面的 if 条件。)
// xcb_generic_event_t* msg;
// xcb_intern_atom_reply_t* wmStateMinimized;
case XCB_PROPERTY_NOTIFY: {
xcb_property_notify_event_t* data{reinterpret_cast<xcb_property_notify_event_t*>(msg)};
if(data->atom == wmStateMinimized->atom)
eventQueue.emplace(Event::Minimized);
} break;
我还检查了事件提供给我的原子。它们与“wmStateMinimized”提供的原子不同,尽管“wmStateMinimized”的原子由窗口管理器提供。
编辑 2: 好的,xcb_property_notify_event_t 提供已更改的原子,而不是它自身的值。 所以 if 应该是这样的:
if(data->atom == wmState->atom)
必须弄清楚如何正确检索值。
【问题讨论】:
-
没有最大化/最小化的特定事件。要查看属性更改,您需要订阅 PropertyNotify 事件。这由 PropertyChangeMask 控制。
-
谢谢,我也想通了,通过打印我的应用程序将获得的事件代码。
-
AFAIK,在 X11 中,最大化-最小化已由窗口管理器处理。在我编写的一些 X11 应用程序中,我从未明确处理过它。然而,您可能会对这个SO post 感兴趣。
-
看起来我不理解规范:“实施说明:如果应用程序要求切换 _NET_WM_STATE_HIDDEN,则窗口管理器可能应该忽略该请求,因为 _NET_WM_STATE_HIDDEN 是窗口最小化,而不是一个独立的状态。” - 这是什么意思?
-
@user3078414 这意味着 _NET_WM_STATE_HIDDEN 不控制隐藏状态,它只是反映它。