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.: 这些片段是从我的原始来源中删除的。它可能包含拼写错误。
目前我负责为一个小项目开发一个(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.: 这些片段是从我的原始来源中删除的。它可能包含拼写错误。