在命令行上操作 X 键和指针抓取

在命令行上操作 X 键和指针抓取

有哪些命令行工具可以列出和管理 X 服务器抓取? (这就像键和指针抓取一样,即限制对特定应用程序使用特定的键或鼠标按钮,或者限制鼠标指针保留在特定的屏幕区域。)我正在寻找一个假设的xgrab实用程序,它可以显示类似的东西

Key     0x00f00ba5  0x123   0
Button  0x00f00ba5  2       
Pointer 0x00abcdef  

表示已调用XGrabKey(display, 0x123, 0, 0x00f00ba5, ...), XGrabButton, XGrabPointer, XGrabKeyboardXGrabServer如果可能)。显示格式并不重要,我想要的是某种方式来查看谁在抓取什么,并且可能有某种方式撤销这些抓取(如果可能的话,我不确定 X11 API 是否允许这样做)。

答案1

最新版本的 X(X.org 服务器 ≥1.11)支持多种调试键盘符号,在这次提交。触发后,它们会执行与抓取相关的操作。

默认情况下 (至少在最近的版本中),这些被禁用(默认键盘映射中不存在)。

不过,如果你已经xdotool安装了,可以通过在命令行上执行来调用它们:

xdotool key NameOfKey

NameOfKey您要激活的键盘符号在哪里。例如,要将活动抓取列表打印到 X 服务器日志,请使用xdotool key XF86LogGrabInfo

相关按键符号是:

请注意,XF86LogGrabInfo仅列出主动抓取,而不列出被动抓取,例如抓取当前未按下的键。如果您想获取有关被动抓取的信息,则需要激活抓取:按下xdotool key XF86LogGrabInfo您感兴趣的键和弦或鼠标按钮组合时运行。做类似的事情:

  1. 跑步sleep 1; xdotool key XF86LogGrabInfo
  2. 在 1 秒内,按下琴键或鼠标按键组合。
  3. 1 秒后,松开按键/按钮。
  4. 检查 X 服务器日志中的“主动抓取…”信息(经常/var/log/Xorg.0.log)。

答案2

我不知道可能存在的单个按键或按钮的被动抓取1 的任何即时信息,但有几种方法可以列出整个键盘或鼠标设备的主动抓取。

  1. 在所有平台上,但仅限 Xorg 1.11 及更高版本(或应用了补丁的旧版本),映射热键以将抓取数据转储到日志中,如下所示这些补丁说明中描述
  2. 在 Solaris 11(Solaris 11 Express 2010.11 或实际的 Solaris 11 发行版)上,使用调试器脚本,例如/usr/demo/Xserver/mdb/list_Xserver_devicegrab_client,如从 X 服务器获取信息。这里还有一个用于服务器抢夺的功能,Xorg 1.11 热键当前未涵盖。

1http://tronche.com/gui/x/xlib/input/pointer-grabbing.html用于定义主动与被动抓取。

答案3

这是对机械蜗牛答案的补充——

Xorg 日志中的条目可能非常难以辨认。我编写了一个程序来解析它们并以人类易于处理的形式呈现它们:

https://gist.github.com/Cyber​​Shadow/6412d11aea64144f8905cc0b8196f38e

要使用,首先运行xdotool key XF86LogGrabInfo,如 Mechanical snail 的答案中所述。然后,运行上面链接的程序。如果您的 Xorg 日志文件不位于/var/log/Xorg.0.log,您可以使用--xorg-log选项指定其位置。--help详情请参阅。

答案4

根据上面的答案,以下命令帮助我识别所有获取键盘快捷键的程序:

$ lsof -c Xorg | grep ".log" # find out the path for the Xorg log file
Xorg    16025   sr    4w      REG              254,1    225839 3933229 /home/sr/.local/share/xorg/Xorg.0.log
$ xdotool key XF86LogGrabInfo # prints all Xorg registered grabs
$ cat /home/sr/.local/share/xorg/Xorg.0.log | grep grabs
[ 39303.019] (II) Printing all currently active device grabs:
[ 39303.019] (II) End list of active device grabs
[ 39303.019] Printing all currently registered grabs
[ 39303.019]   Printing all registered grabs of client pid 16024 xinit /home/sr/.xinitrc -- /etc/X11/xinit/xserverrc :0 vt1 -keeptty -auth /tmp/serverauth.6AO52I3zhe
[ 39303.019]   Printing all registered grabs of client pid 16045 unclutter 
[ 39303.019]   Printing all registered grabs of client pid 16047 xscreensaver 
[ 39303.019]   Printing all registered grabs of client pid 16109 /usr/lib/firefox/firefox 
[ 39303.019]   Printing all registered grabs of client pid 16055 xscreensaver-systemd 
[ 39303.019]   Printing all registered grabs of client pid 16057 xbindkeys 
[ 39303.027]   Printing all registered grabs of client pid 16039 /usr/bin/openbox --startup /usr/lib/openbox/openbox-autostart OPENBOX
[ 39303.039]   Printing all registered grabs of client pid 16048 copyq 
[ 39303.039]   Printing all registered grabs of client pid 16049 konsole 
[ 39303.039]   Printing all registered grabs of client pid 16095 /usr/bin/copyq --clipboard-access monitorClipboard
[ 39303.039]   Printing all registered grabs of client pid 16109 /usr/lib/firefox/firefox 
[ 39303.039]   Printing all registered grabs of client pid 16456 subl --detached
[ 39303.039]   Printing all registered grabs of client pid 16465 /usr/lib/at-spi2-registryd --use-gnome-session
[ 39303.039]   Printing all registered grabs of client pid 17178 xdotool key XF86LogGrabInfo
[ 39303.039] End list of registered passive grabs

所以在我的例子中,以下应用程序正在获取按键绑定:xinit、unclutter、xscreensaver、firefox、xbindkeys、openbox、copyq、konsole、subl、at-spi2-registryd

相关内容