gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:43:13 29 4
gpt4 key购买 nike

目前我负责为一个小项目开发一个(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)

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

最佳答案

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

辅助函数“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的 friend 引用。

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

关于c++ - 什么事件用于最大化/最小化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37568142/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com