Rust xcb:EnterNotify之后立即收到LeaveNotify

Rust xcb:EnterNotify之后立即收到LeaveNotify,rust,x11,window-managers,xcb,Rust,X11,Window Managers,Xcb,我正在使用库编写一个Rust窗口管理器,用于学习。我的代码和几个测试窗口(xterm实例)都在Xephyr会话中运行。我将根窗口上的事件掩码设置为 xproto::EVENT_MASK_SUBSTRUCTURE_REDIRECT | xproto::EVENT_MASK_SUBSTRUCTURE_NOTIFY | xproto::EVENT_MASK_POINTER_MOTION | xproto::EVENT_MASK_LEAVE_WINDOW | xproto::EVENT_MASK_ENT

我正在使用库编写一个Rust窗口管理器,用于学习。我的代码和几个测试窗口(
xterm
实例)都在Xephyr会话中运行。我将根窗口上的事件掩码设置为

xproto::EVENT_MASK_SUBSTRUCTURE_REDIRECT
| xproto::EVENT_MASK_SUBSTRUCTURE_NOTIFY
| xproto::EVENT_MASK_POINTER_MOTION
| xproto::EVENT_MASK_LEAVE_WINDOW
| xproto::EVENT_MASK_ENTER_WINDOW
| xproto::EVENT_MASK_BUTTON_PRESS
| xproto::EVENT_MASK_PROPERTY_CHANGE
| xproto::EVENT_MASK_FOCUS_CHANGE
所有子窗口的事件掩码均为

xproto::EVENT_MASK_ENTER_WINDOW
| xproto::EVENT_MASK_LEAVE_WINDOW
| xproto::EVENT_MASK_BUTTON_PRESS
| xproto::EVENT_MASK_PROPERTY_CHANGE
| xproto::EVENT_MASK_POINTER_MOTION
| xproto::EVENT_MASK_FOCUS_CHANGE
| xproto::EVENT_MASK_STRUCTURE_NOTIFY
| xproto::EVENT_MASK_EXPOSURE
当我将鼠标移到非根窗口上时,我使用
EnterNotify
事件抓住该窗口上的鼠标按钮,以便单击以聚焦,并取消选中
LeaveNotify
。事件的顺序是:

  • 在根窗口上单击鼠标
  • 将鼠标移到非根窗口上
  • 接收非根窗口的
    EnterNotify
  • 非根窗口上的抓取按钮
  • 当鼠标仍在非根窗口上时,立即接收
    LeaveNotify
  • 由于
    LeaveNotify
  • 尝试单击非根窗口
  • 接收非根窗口的第二个
    LeaveNotify
  • 接收根窗口的
    EnterNotify
    ,并抓住根窗口上的鼠标按钮
  • ButtonPress
    为根窗口发送,尽管光标位于非根窗口上
我真的不确定这可能是什么原因;使用谷歌之类的工具没有发现任何有用的东西


对于以后可能偶然发现这一点的任何人,部分解决方案是:

  • 仅在窗口上侦听输入事件以获取窗口上的按钮
  • 屏蔽根目录为
    子结构|重定向|子结构|通知|按钮|只按
  • 不要屏蔽
    将\u窗口保留在非根窗口上,也不要处理这些事件
我不想添加此作为答案,因为:

  • 我不确定这是正确的做法
  • 我还没有彻底测试过这个
  • 它没有回答我的主要问题“为什么会收到这样的事件?”

  • 请看协议参考手册。它描述了(除许多其他内容外)生成进入和离开事件的确切算法:

    在您的特定情况下,我希望
    LeaveNotify
    事件具有
    mode:Grab
    ,这意味着窗口不再具有“正常”指针焦点,因为有东西(您的程序)捕获了输入


    如果这不是答案,我建议您在下运行WM(在基于Debian的发行版中作为package
    xtrace
    提供)。此程序打印“通过”的所有X11流量。这可能有助于弄清发生了什么。

    似乎就是这样!非常感谢你!