TL; DR
Gtk+ 3アプリケーションがXSendEvent(3)
による入力を受け付けない時は環境変数GDK_CORE_DEVICE_EVENTS=1
をセットすればよい。
詳細
XSendEvent(3)
はXlibの関数で、X Window Systemのイベントメッセージを指定のウィンドウに送りつける関数です。これを使うとキーボード入力のエミュレーションを(ある程度)実現できます。例えば、xvkbdやxdotoolといったエミュレーションツールは裏でこの関数を使う場合があります1。
が、Evinceなど一部のGtk+ 3アプリケーションではXSendEvent(3)
によるキーボード入力を受け付けません。
これはGtk+ 3の入力バックエンドがデフォルトでXInput2というX Window System拡張を使うからです。GDK_CORE_DEVICE_EVENTS=1
環境変数をセットすると、イベントメッセージによる入力を受け付けるようになり、XSendEvent(3)
も効くようになります。
参考
- Using GTK+ on the X Window System: GTK+ 3 Reference Manual
- GTK3 and XINPUT_2
- gnome - xvkbd not working on GTK3 apps - Ask Ubuntu
- 435742 – [GTK3] Some keybindings/shortcuts become unresponsive
-
ただし、これらのツールは可能ならばXTest拡張の関数を使うようになっています。これは、
XSendEvent(3)
で送るイベントメッセージは人工的な(synthesized)イベントであることが分かるフラグが付けられており、アプリケーションによってはそれを無視する場合があるためです。XTestによる入力はアプリケーションからは物理デバイスからの入力と区別できず、エミュレーションとしてより信頼性が高いと考えられます。 ↩