Bash 脚本无法按照 xbindkeys 要求运行

Bash 脚本无法按照 xbindkeys 要求运行

我编写了一个简单的 bash 脚本,每当我按下 capslock 键时都会显示通知。当我像这样调用它时,它工作正常bash capsnotify.sh

现在的问题是,当我capslock使用工具将上述脚本绑定到键时,它无法按要求工作。当我的 Caps 开启时,xbindkeys它会显示通知,但当我的 Caps 关闭时,它不会显示通知,而是再次显示通知。caps ONcaps OFFcaps ON

capsnotify.sh

#!/bin/bash

value=$(xset -q | awk '/Caps/ {print $4}')

if [ "$value" == "on" ]

then    
    notify-send "caps ON"

elif [ "$value" == "off" ]

then    
    notify-send "caps OFF"    
fi

.xbindkeysrc

"bash /home/ranveer/capsnotify.sh"
  m:0x2 + c:66

因此,问题是在两个事件(开/关)上绑定我的大写锁定键后,它会显示caps ON通知。

答案1

可能最简单的做法是指定xbindkeys您的脚本应该用什么启动gnome-terminal(或等效的),并最小化终端的大小。您可以将您的输入替换~/.xbindkeysrc为:

"gnome-terminal --geometry=1x1+1141+27 --hide-menubar -e /home/ranveer/capsnotify.sh"
 m:0x2 + c:66

我们通过将终端放置在屏幕的右上角,然后运行xwininfo并单击窗口来获取终端的几何读数。通过指定这样一个小终端 (1x1) 及其右上角位置 (1141+27) 并隐藏菜单栏,我们可以确保缩略图大小的终端实际上​​会在屏幕右上角的大写锁定通知消息下方瞬间打开。应该也可以使用其他终端指定这样的几何形状。

在对 进行任何更改后~/.xbindkeysrc,您必须输入

killall xbindkeys

进而

xbindkeys

以便读取新的更改。

在下面的屏幕截图中,我快速按下两次 caps-lock 键,以便第一个通知发送消息尚未消失:

在此处输入图片描述

可能还有其他方法可以解决问题,但这是一种快速可靠的方法,不需要重写脚本或安装其他程序。

答案2

对我有用的是sleep在调用我的脚本之前添加xbindkeys。所以现在我.xbindkeysrc看起来像

"sleep 0.1 && bash /home/ranveer/capsnotify.sh"

我相信它通过添加来工作,sleep因为对 xset 的调用查询 CapsLock 的状态发生在 Xserver 切换状态之前,这可能是由于我的窗口管理器抓取了按键事件但不能超快速地处理它,因此 X 切换稍晚一些。

相关内容