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

标签 python linux x11 xlib

有没有人知道一个 xlib 函数来捕获按键事件而不会失去原始焦点?如何摆脱它?

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

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

XGrabKey 将失去对按下键的关注并恢复对释放键的关注。

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

引用资料:

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

  2. ...程序接收控制以响应组合键。同时,该计划暂时集中在... During XGrabKey(board), discover which window had been focused

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

  4. ...我看不到 提供 metacity 当前桌面更改行为的方法(更改 并同时显示弹出对话框)而不会导致 抓取式对焦窗外... 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. 抓取键盘不允许改变焦点... grabbing keyboard doesnt allow changing focus

  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

最佳答案

我当前的代码(来自 http://diyism-myboard.googlecode.com/files/myboard.py ):

disp=Display()
screen=disp.screen()
root=screen.root

def grab_key(key, mod):
    key_code=string_to_keycode(key)
    #3rd: bool owner_events, 4th: pointer_mode, 5th: keyboard_mode, X.GrabModeSync, X.GrabModeAsync
    root.grab_key(key_code, mod, 0, X.GrabModeAsync, X.GrabModeAsync)
    root.grab_key(key_code, mod|X.LockMask, 0, X.GrabModeAsync, X.GrabModeAsync) #caps lock
    root.grab_key(key_code, mod|X.Mod2Mask, 0, X.GrabModeAsync, X.GrabModeAsync) #num lock
    root.grab_key(key_code, mod|X.LockMask|X.Mod2Mask, 0, X.GrabModeAsync, X.GrabModeAsync)

def main():
    grab_key('Shift_L', X.NONE)
    grab_key('Shift_R', X.NONE)
    while 1:
          evt=root.display.next_event()
          if evt.type in [X.KeyPress, X.KeyRelease]: #ignore X.MappingNotify(=34)
             handle_event(evt)

if __name__ == '__main__':
   main()

当我按下“shift”键时,焦点丢失,当我松开它时,焦点又回来了。

关于python - 为什么 XGrabKey 会生成额外的聚焦和聚焦事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15270420/

相关文章:

python - python 3.4 向后兼容 python 3.3 吗?

linux - Vlc 检查流状态

java - X11 JNA Bad Window(无效的Window参数)导致JVM退出

c - 获取 X11 窗口标题高度

由于身份验证错误,X11 连接被拒绝

python - SQLAlchemy:选择查询中对象的哪些列

python - Markdown 预览基于 Python 的 gedit 插件

python - 使用 PyPi 时在 Python 3 代码库中支持 Python 2 的好方法是什么?

linux - 使用 gnuplot 将页面附加到现有的 Postscript 文件

c - 在 Linux 与 Windows 中读取系统