如何在窗口焦点/取消焦点上执行命令?

如何在窗口焦点/取消焦点上执行命令?

我想xinput disable bcm5974在 Gnome 终端(也许还有其他应用程序)获得焦点以及xinput enable bcm5974失去焦点时执行。

这是因为 libinput 和我的 macbook 的触摸板不是朋友,libinput 的防手掌误触功能几乎不起作用,当在 Vim 中编辑代码并且它意外滚动时,或者在终端上键入命令时,它真的让我发疯。

libinput 1.1.4-1
xf86-input-libinput 0.16.0-1
ArchLinux

答案1

以下命令将为您提供焦点应用程序的名称

xdotool getwindowfocus getwindowname

使用它,您可以编写一个包装脚本来实现您的目标。

例如

while [ true ]
do
  FocusApp=`xdotool getwindowfocus getwindowname`
  if [ "xTerminal" -eq "x$FocusApp" ]; then
          xinput disable bcm5974
  else
          xinput enable bcm5974
  fi
done

上面的代码将永远运行检查焦点应用程序。如果得到预期结果则执行如果条件否则执行否则条件。

您可以微调此脚本以适合您的需求。

答案2

用于xprop获取我的窗口的类,xdotool如下所示:

xdotool search --onlyvisible --classname gnome-terminal-server behave %@ focus exec xinput disable bcm5974 &

xdotool search --classname gnome-terminal-server behave %@ blur exec xinput enable bcm5974 &

前面的脚本不稳定,因此基于@SHW答案的以下脚本更好:

#!/bin/sh

[ "$(pgrep -x $(basename $0))" != "$$" ] && exit 1

while [ true ]
do
    window=`xdotool getwindowfocus getwindowname`
    is_enabled=`xinput --list-props bcm5974 | awk '/Device Enabled/{print $NF}'`
    if [ "$window" = "Terminal" -o "$window" = "Guake!" ]; then
        if [ "$is_enabled" = "1" ]; then
            xinput disable bcm5974
        fi
    else
        if [ "$is_enabled" = "0" ]; then
            xinput enable bcm5974
        fi
    fi
    sleep 1
done

相关内容