ウィンドウフォーカス/フォーカス解除時にコマンドを実行するには?

ウィンドウフォーカス/フォーカス解除時にコマンドを実行するには?

xinput disable bcm5974Gnome Terminal(および他のアプリケーション)がフォーカスを取得したときと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

上記のコードはチェックフォーカスアプリケーションを永遠に実行します。期待した結果が出たら実行if条件それ以外の場合は実行それ以外の条件。

必要に応じてこのスクリプトを細かく調整できます。

答え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

関連情報