使用Go+Xlib(cgo)实现X11键盘事件抓取后转发至子窗口问题
X11窗口管理器全键盘抓取后事件转发异常问题
我用Go结合Xlib(通过cgo)开发X11基础窗口管理器,目前已经实现了带容器窗口的重定向WM——容器窗口作为根窗口的直接子窗口,被管理的客户端窗口则是对应容器的直接子窗口。
现在需要实现全键盘抓取:判断按键事件是否属于窗口管理器自身的快捷键,若是则处理;否则将事件转发给对应的客户端窗口。我已经能通过XGrabKey指定特定按键/修饰键实现局部抓取,但全键盘抓取的转发逻辑一直失效。
当前代码片段如下:
... C.XGrabKeyboard( display, rootWindow, 0, C.GrabModeAsync, C.GrabModeAsync, C.CurrentTime, ) ... for { var event C.XEvent C.XNextEvent(display, &event) eventType := (*C.int)(unsafe.Pointer(&event[0])) switch *eventType { ... case C.KeyPress: eventPayload := (*C.XKeyEvent)(unsafe.Pointer(&event[0])) // 这里eventPayload.root等于rootWindow // eventPayload.window等于rootWindow // eventPayload.subwindow是对应的ContainerWindow if SOME_CONDITIONS_ARE_MET { // 处理窗口管理器自身的按键事件 ... continue } // 转发事件给客户端窗口 C.XAllowEvents(display, C.ReplayKeyboard, C.CurrentTime) ... } }
补充说明:
- 已经调用
C.XSynchronize(display, 1),无需额外调用XSync - 在
XAllowEvents后加XFlush也无法解决转发失效的问题 - 最初是参考相关方案尝试用
XAllowEvents实现转发,但没有效果
内容的提问来源于stack exchange,提问作者Parsa Ghahremani
相关产品推荐
相关产品推荐

