
キーストロークを送信しようとしていますxdotool
。ところが転送が正しくできません。
以下は、Geditからすべてのテキストを選択してコピー(何もしません)して、出力(stdoutとstderrをリダイレクトしてキャプチャ)するスクリプトのログです。
+ xdotool getwindowname 29360262
*Unsaved Document 1 - gedit
+ xdotool key --window 29360262 ctrl+a
+ sleep 1
+ xdotool key --window 29360262 ctrl+c
+ sleep 1
私はThunderbirdを試しましたが、スクリプトはキーを押しましたが、修飾子はありません(Control
例:いいえ)。ところで、スクリプトでは、キーは"
のように に囲まれています"ctrl+a"
。
GeditとThunderbirdの違いは、GeditはGTK3アプリケーションですが、ThunderbirdはGTK2アプリケーションのようです(FirefoxはGTK3アプリケーションのように見え、Thunderbirdのように動作します)。
xdotoolバージョン3.20141006.1
オペレーティングシステム:Debian GNU / Linux 8.1(Linuxカーネル3.16.0-4-amd64)
デスクトップマネージャ:GNOME Shell 3.14.4
答え1
キーボードまたはマウスイベントが入力ペリフェラルではなくアプリケーションによって生成される場合、そのイベントは「合成」と表示されます。多くのアプリケーションは合成イベントを拒否します。
理論的には、ここにはセキュリティ上の理由があります。 Xモニターで実行されているアプリケーションがあるかもしれませんが、他のアカウントや別のコンピューターで実行することもできます。しかし、Xはアプリケーションを分離するのにはあまり良くありません(このためには設計されていません)。信頼できないアプリケーションがディスプレイにアクセスすることをまったく許可しないでください。そうでなければ、合成イベントを拒否する理由はありません。
私が知る限り、Gtkは合成イベントを許可するかどうかを決定する一般的な方法を提供しません。個々のアプリケーションによって異なり、プログラマが気にしない場合、デフォルト値は何であるかはわかりません。
入力イベントを挿入する別の方法であるXTEST拡張があります。この方法で注入されたイベントは、入力周辺機器からのイベントと同じように見えます。実際、イベントは「テスト」入力周辺機器から発生します。このアプローチの欠点は、イベントが他のイベントと同じ方法でウィンドウにルーティングされるため、フォーカスがあるウィンドウに送信されることです(ウィンドウマネージャが傍受しない限り)。 xdotool(最新バージョン)を使用してXTESTイベントを送信でき、ウィンドウIDを渡さない場合はこれが行われます。
xdotool windowactivate 29360262
xdotool key ctrl+a ctrl+c
はい、迷惑です。この問題に関するディスカッションは以下にあります。セレンウィキ。 GTK信号やGDKイベントを介してGTK +アプリケーションに偽のイベントを送信する方法があるようですが、どのように機能するのかわかりません。
答え2
ばかげて聞こえるかもしれませんが、WaylandではなくX11を使用していることを確認してください。
echo $XDG_SESSION_TYPE
出力すると動作しませんwayland
(Xツール)