什么事件用于最大化/最小化?

时间:2016-06-01 12:04:44

标签: c++ x11 xlib xcb

目前我负责为一个小项目开发一个(C ++)窗口类;目标是将依赖关系保持在最低限度。 Win32 / WinAPI的实现工作正常,但是,当涉及到Linux / XCB时,我正在努力。

我知道,我能够检查“_NET_WM_STATE”属性,但是,文档没有指定任何事件,当窗口被最大化或最小化时会发生这种事件。 扩展窗口管理器提示规范似乎也没有定义事件。

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

编辑: 我的代码看起来基本上是这样,但不起作用: (通过不起作用,我的意思是下面的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)

要弄明白,如何正确检索价值。

1 个答案:

答案 0 :(得分:5)

所以,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

用于窗口,以便实际获得有关属性更改的通知。

所以,让我们假装我们现在进入事件循环:

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;

辅助功能&#39; internal :: getAtomValue&#39;工作如下:

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。:这些片段是从我的原始资源中删除的。它可能包含错别字。