dwm窗口管理器中Xlib EnterNotify事件未按预期生成的问题
Dwm中EnterNotify事件未触发的异常问题
我正在运行dwm平铺窗口管理器,通过以下方式检测EnterNotify事件接收情况:
- 在另一个虚拟终端执行
sudo gdb -p $(pidof dwm),将gdb附加到dwm进程 - 在
enternotify函数上设置断点(b enternotify),该函数会在dwm收到EnterNotify事件时被调用
正常触发场景
将鼠标移到不同窗口,或鼠标在空显示器上时把窗口移到该显示器,断点都会正常触发,说明dwm能接收到EnterNotify事件。
异常未触发场景
打开两个各占半屏的窗口A和B,指针初始位于右上角的A窗口上;使用快捷键打开新窗口后,布局变更:A被移到右下角,B移到右上角,此时指针落在B窗口上,但断点未触发——dwm未接收到EnterNotify事件。
根据Xlib文档,当指针移动或窗口层级/位置变更导致指针落在不同窗口时,X服务器应向订阅该事件的客户端发送EnterNotify或LeaveNotify事件,此场景完全符合触发条件,但事件未生成。
补充测试结果
- 将其他显示器的现有窗口移到指针所在显示器:断点正常触发
- 关闭指针下的聚焦窗口后,同显示器的其他窗口扩展到指针下方:断点未触发
- 通过
setmfact按键绑定调整布局,导致指针落在不同窗口上:断点未触发
事件订阅配置
所有窗口均已订阅EnterNotify事件,相关代码如下:
/* called after MapRequest */ XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); ...
/* on setup, the root window is subscribed */ wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask |ButtonPressMask|PointerMotionMask|EnterWindowMask |LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); XSelectInput(dpy, root, wa.event_mask); ...
dwm完整源码可通过git://git.suckless.org/dwm获取。
请问为何会出现此情况?如何解决?
内容的提问来源于stack exchange,提问作者C. Lang
相关产品推荐
相关产品推荐

