一尘不染

为什么XGrabKey会生成额外的聚焦和聚焦事件?

linux

有谁知道xlib函数可以在不失去原始焦点的情况下捕获按键事件?如何摆脱它?

(或“使用XGrabKey()而不生成Grab样式的聚焦”?)

(或“如何在系统级别摆脱NotifyGrab和NotifyUngrab焦点事件?)

XGrabKey将失去对按键的关注,而将精力恢复于释放的键。

而且我想捕获按键而不泄漏到原始窗口(就像XGrabKey可以做到的一样)。

参考文献:

  1. … XGrabKey将窃取焦点… https://bugs.launchpad.net/gtkhotkey/+bug/390552/comments/8

  2. …该程序接收控制以响应按键组合执行某些操作。同时,该程序暂时处于焦点状态… 在XGrabKey(board)期间,发现哪个窗口处于焦点状态

  3. … XGrabKeyboard函数会主动获取键盘控制权并生成FocusIn和FocusOut事件… http://www.x.org/archive/X11R6.8.0/doc/XGrabKeyboard.3.html#toc3

  4. …我看不到一种方法来提供metacity当前的桌面更改行为(同时更改和显示弹出对话框)而不会在窗口上引起Grab类型的焦点… https://mail.gnome .org / archives / wm-spec-list / 2007-May / msg00000.html

  5. …全屏模式不应通过NotifyGrab在FocusOut事件上退出… https://bugzilla.mozilla.org/show_bug.cgi?id=578265

  6. 抓住键盘不允许改变焦点… 抓住键盘不允许改变焦点

  7. Grabs生成的焦点事件(XGrabKeyboard的主动抓取和XGrabKey的被动抓取) http://www.x.org/releases/X11R7.6/doc/libX11/specs/libX11/libX11.html#Focus_Events_Generated_by_Grabs

  8. XGrabKey源代码:http ://cgit.freedesktop.org/xorg/lib/libX11/tree/src/GrKey.c 也许我们可以修改它以摆脱焦点事件?

  9. 有“ 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


阅读 610

收藏
2020-06-07

共1个答案

一尘不染

最后,正如您所知,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

2020-06-07