有谁知道xlib函数可以在不失去原始焦点的情况下捕获按键事件?如何摆脱它?
(或“使用XGrabKey()而不生成Grab样式的聚焦”?)
(或“如何在系统级别摆脱NotifyGrab和NotifyUngrab焦点事件?)
XGrabKey将失去对按键的关注,而将精力恢复于释放的键。
而且我想捕获按键而不泄漏到原始窗口(就像XGrabKey可以做到的一样)。
参考文献:
… XGrabKey将窃取焦点… https://bugs.launchpad.net/gtkhotkey/+bug/390552/comments/8
…该程序接收控制以响应按键组合执行某些操作。同时,该程序暂时处于焦点状态… 在XGrabKey(board)期间,发现哪个窗口处于焦点状态
… XGrabKeyboard函数会主动获取键盘控制权并生成FocusIn和FocusOut事件… http://www.x.org/archive/X11R6.8.0/doc/XGrabKeyboard.3.html#toc3
…我看不到一种方法来提供metacity当前的桌面更改行为(同时更改和显示弹出对话框)而不会在窗口上引起Grab类型的焦点… https://mail.gnome .org / archives / wm-spec-list / 2007-May / msg00000.html
…全屏模式不应通过NotifyGrab在FocusOut事件上退出… https://bugzilla.mozilla.org/show_bug.cgi?id=578265
抓住键盘不允许改变焦点… 抓住键盘不允许改变焦点
Grabs生成的焦点事件(XGrabKeyboard的主动抓取和XGrabKey的被动抓取) http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Focus_Events_Generated_by_Grabs
XGrabKey源代码:http ://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c 也许我们可以修改它以摆脱焦点事件?
有“ DoFocusEvents(keybd,oldWin,grab-> window,NotifyGrab);” 在ActivateKeyboardGrab()中:http : //cgit.freedesktop.org/xorg/xserver/tree/dix/events.c
我正在为按键组合(和鼠标移动)绘图软件编写一键操作:https : //code.google.com/p/diyism-myboard/
我已经在Windows中通过RegisterHotKey()和UnRegisterHotKey()意识到了这一点:https : //code.google.com/p/diyism- myboard/downloads/detail? name = MyBoard.pas
我想使用XGrabKey()和XUngrabKey()将其迁移到Linux:https : //code.google.com/p/diyism- myboard/downloads/detail? name = myboard.py
我创建了10美元的赏金来解决此问题。我们需要更多支持者来提供悬赏。 https://www.bountysource.com/issues/1072081-right-button-menu-flashes-while- jkli-keys-move-the-mouse- pointer
最后,正如您所知,Linux意味着自由,我修改了xserver摆脱了抓斗式对焦:
sudo apt-get build-dep xorg-server apt-get source xorg-server cd xorg-server-* #modify or patch dix/events.c: comment off "DoFocusEvents(keybd, oldWin, grab->window, NotifyGrab);" in ActivateKeyboardGrab(), comment off "DoFocusEvents(keybd, grab->window, focusWin, NotifyUngrab);" in DeactivateKeyboardGrab() sudo apt-get install devscripts debuild -us -uc #"-us -uc" to avoid the signature step cd .. sudo dpkg --install xserver-xorg-core_*.deb #clear dependencies: sudo apt-mark auto $(apt-cache showsrc xorg-server | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g') sudo apt-get autoremove
而且我还需要在gtk上下文菜单中摆脱XGrabKeyboard:
sudo apt-get build-dep gtk+2.0 apt-get source gtk+2.0 cd gtk+2.0-* #modify or patch it: add "return TRUE;" in first line of popup_grab_on_window() of gtk/gtkmenu.c dpkg-source --commit debuild -us -uc #"-us -uc" to avoid the signature step, maybe need: sudo apt-get install devscripts cd .. sudo dpkg --install libgtk2.0-0_*.deb #clear dependencies: sudo apt-mark auto $(apt-cache showsrc gtk+2.0 | grep Build-Depends | perl -p -e 's/(?:[\[(].+?[\])]|Build-Depends:|,|\|)//g') sudo apt-get autoremove
现在,myboard.py正常运行。
如果您使用的是ubuntu raring-updates版本,则可以尝试:
https://code.google.com/p/diyism-myboard/downloads/detail?name=xserver-xorg- core_1.13.3-0ubuntu6.2_i386.deb
和:
https://code.google.com/p/diyism- myboard/downloads/detail?name=libgtk2.0-0_2.24.17-0ubuntu2_i386.deb