Maximizing/Minimizing使用什么事件?

What event is used for Maximizing/Minimizing?

目前我负责为一个小项目开发一个(C++) window class;目标是将依赖性保持在最低限度。 Win32/WinAPI 的实现按预期工作,但是,当涉及到 Linux/XCB.

时,我很挣扎

我知道,我可以检查“_NET_WM_STATE”属性,但是,文档没有指定任何事件,该事件会在 window正在最大化或最小化。 Extended Window Manager Hints 规范似乎也没有定义事件。

那么,如何拦截 Maximize/Minimize 事件呢?

编辑: 我的代码基本上是这样的,但不起作用: (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' 的原子是由 window 经理提供的。

编辑 2: 好的,xcb_property_notify_event_t 提供了已经改变的原子,而不是它自己的价值。 所以 if 应该是这样的:

if(data->atom == wmState->atom)

必须弄清楚如何正确检索值。

所以,3 小时后我终于弄明白了。 此解决方案片段假定您已经查询了原子:

  • _NET_WM_STATE
  • _NET_WM_STATE_HIDDEN
  • _NET_WM_STATE_MAXIMIZED_VERT
  • _NET_WM_STATE_MAXIMIZED_HORZ

它们被存储在以下原子中:

xcb_atom_t wmState;
xcb_atom_t wmStateHidden;
xcb_atom_t wmStateMaxVert;
xcb_atom_t wmStateMaxHorz;

此代码段还假定您已指定

XCB_EVENT_MASK_PROPERTY_CHANGE

对于 window,以便实际获得有关 属性 更改的通知。

那么,假设我们现在处于事件循环中:

case XCB_PROPERTY_NOTIFY: {
    xcb_property_notify_event_t* data{reinterpret_cast<xcb_property_notify_event_t*>(msg)};
    if(data->atom == wmState){ // the WM_STATE property was changed.
        // Now we need the value.
        // Therefore I implemented an auxiliary function.
        if(internal::getAtomValue(connection, window, wmState) == wmStateHidden)
            // Handle Events here:
            eventQueue.emplace(Event::Minimized);
        else{
            xcb_atom_t value{internal::getAtomValue(connection, window, wmState)};
            if((value == wmStateMaxVert) || (value == wmStateMaxHorz))
            // Handle Event here
            eventQueue.emplace(Event::Maximized);
        }
    }

} break;

辅助函数'internal::getAtomValue'的作用如下:

xcb_get_property_cookie_t    cookie{xcb_get_property(connection, false, window, atom, XCB_ATOM_ATOM, 0, 32)};
xcb_generic_error_t*         err{nullptr};
xcb_get_property_reply_t     reply{xcb_get_property_reply(connection, cookie, &err);
xcb_atom_t*                  value{reinterpret_cast<xcb_atom_t*>(xcb_get_property_value(reply))};

我希望这个解决方案的概念得到证明和正确。供各位需要使用XCB的朋友参考。

P.S.: 这些片段是从我的原始来源中删除的。它可能包含拼写错误。