Hatena::ブログ(Diary)

mooz deceives you

(about 'mooz) ; => "See http://mooz.github.com/index-ja.html"

 | 

December 28 (Tue), 2010

xdotool を使い特定ウィンドウの表示をワンキーでトグル

EijiroX

最近, Google Chrome を良く使うようになりました. と言っても, ブラウジング用途にではなく, 専ら EijiroX による辞書引きにですが.

EijiroXid:edvakf さんの作成されたGoogle Chrome 用の拡張機能で, かの「英辞郎」をサクサクっと快適に検索・閲覧するためのツールとなっています. Google Chrome がクロスプラットフォーム対応であるために, Windows, Mac, Linux などで動作し, 日頃からこの三つを代わる代わるに使用している身としては大助り. カナダに足を向けて寝ることは出来ないなと枕の位置を調節する日々です. とまあ, 今日は EijiroX の紹介がメインでは無いので, この辺りにしておきます.

早速, 本題に入りますと, どうせならワンキーでこの EijiroX の表示をトグルできないかな, と僕は常々考えていました.

つまり, 以下のような状態から,

f:id:mooz:20101228192654p:image:w480

キーを押すと EijiroX のウィンドウが表れ,

f:id:mooz:20101228192653p:image:w480

もう一度同じキーを押すと元の画面に戻る. この一連の流れができないものかなと.

一般化すると, こうなります.

  • 特定アプリケーションが実行中なら, そのウィンドウを最全面に持ってきてフォーカス
  • 実行していない場合は, アプリケーションを実行
  • もし, 特定アプリケーションが実行中かつ既に最全面にあるなら, 一つ前にフォーカスしていたウィンドウを最全面に

この挙動, ぜひ実現したいものだと試行錯誤した結果, xdotool というツールを使うことにより上記の挙動を実現することができたので, 今日はその方法を紹介したいと思います.

xdotool

X 向けに xdotool というツールが存在します. 詳しくは公式サイトを参照して頂きたいのですが, このツールを使うと以下のようなことをコマンドラインから行うことが可能となります.

  • ウィンドウ ID の取得
    • 名前やクラスによる検索
    • 現在アクテイブなウィンドウ
  • ウィンドウ ID で指定されたウィンドウの操作
    • リサイズ
    • 移動
    • 最小化
    • 最全面へ
  • マウスイベントの模倣
    • マウスカーソル移動
    • マウスクリック
  • キーイベントの模倣
    • 文字入力
    • ショートカットキー入力

コマンドラインから使える, ということはすなわち xdotool を使って適当なコマンドを書いておき, そのコマンドを Metacity や Compiz, Awesome や xmonad と言ったウィンドウマネージャでショートカットキーに割り当てておくことにより, 上記の動作をキーボード操作で (しかも WM 非依存で!) 行うことが可能となるわけです.

また, キーイベントの模倣機能を駆使すれば, 例えば前述の EijiroX ウィンドウへフォーカスした後, 入力欄に現在クリップボードへ入っているテキストを (テキストのキーイベントを模倣することで) 貼り付ける, なんてことも考えられて, 夢は広がるばかりです.

この xdotool ですが, デフォルトの状態ではおそらく入っていないので, 使用するためには適宜インストールを行う必要があります. Ubuntu なら (多少古いバージョンではありますが) apt にパッケージが用意されているようです.

sudo apt-get install xdotool

togwin

上記の xdotool を使い, togwin という簡単なコマンドを作成しました. インストールはソースコードコチラよりダウンロードし, 環境変数 PATH の通った場所へ配置することで行えます.

togwin コマンドは, 以下のような挙動を実現してくれるものとなっています.

  • 特定アプリケーションが実行中なら, そのウィンドウを最全面に持ってきてフォーカス
  • 実行していない場合は, コマンドを実行
  • もし, 特定アプリケーションが実行中かつ既に最全面にあるなら, 一つ前にフォーカスしていたウィンドウを最全面に

使い方は以下の通りで, 簡単です.

Usage: togwin [--class] [--title] [--name] PATTERN [ACTION]

  PATTERN  正規表現で対象ウィンドウを指定. (--class, --title, --name でその正規表現のマッチ先を指定)
  ACTION   対象ウィンドウが見つからなかった場合に実行するコマンド (ダブルクォート推奨)

使用例を以下に.

togwin --title "EijiroX:" "chromium --user-data-dir=${HOME}/data/chrome_eijiro/"

第一引数 (ここでは "EijiroX:") に指定した正規表現パターンにマッチするウィンドウが対象となり, この条件に当てはまるウィンドウが見つからなければ第二引数に指定したコマンド (ここでは "chromium --user-data-dir=${HOME}/data/chrome_eijiro/") が実行されます.

上記の例では, タイトルが "EijiroX:" にマッチするウィンドウが見つかった場合そのウィンドウの表示がコマンド実行の度にトグルされ, 見つからなかった場合は Google Chrome が立ち上がることとなります.

もう一つ例をあげておきます. ターミナルをワンキーでトグルしたいなら, 以下のようにすれば良いでしょう. 僕は以下のコマンドを gvisor という名前で保存し F3 キーへ割り当てて Visor 気分を味わっています.

togwin --class gnome-terminal "gnome-terminal"

このように, togwin を使うと任意のアプリケーションを Visor のようにワンキーでトグル出来るようにしてしまうことが可能となるわけです. これは非常に便利です.

ウィンドウにマッチする条件の調べ方

class や title に指定する条件を調べたい場合は xprop コマンドを使います.

xprop WM_CLASS WM_NAME

上記のように WM_CLASS (--class に対応) と WM_NAME (--title, --name に対応) を指定して xprop コマンドを実行した後, 対象のウィンドウをクリックすることで, そのウィンドウにマッチするような条件を調べることが可能です.

例えば, EijiroX の起動している Chromium をクリックしたところ, 以下のような出力が得られました.

WM_CLASS(STRING) = "chromium-browser", "Chromium-browser"
WM_NAME(STRING) = "EijiroX: - Chromium"

ここから, xdotool における条件は '--name "EijiroX:"' のようにしておけば良いことが分かります. (xdotool の仕様上 --name と --class を別々に指定することは出来ないようなので, ここでは EijiroX: の方を採用しています)

同様に, Gnome Terminal では以下のようになりました.

WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal"
WM_NAME(STRING) = "Terminal"

この場合は class の gnome-terminal を使っておくのが良さそうです.

Compiz でのショートカットキー割り当て

おまけとして Compiz でのショートカットキー割り当て方法を掲載しておきます.

最近の Ubuntu にはデフォルトで Compiz が入っていますが, 設定ツールは別途インストールする必要があります.

sudo apt-get install compizconfig-settings-manager

これにより ccsm コマンドが入りますので, ターミナルから ccsm を実行してやります. システム -> 設定と進み CompizConfig 設定マネージャを選択しても良いでしょう.

設定ツールが起動したら「コマンド」をクリックし,

f:id:mooz:20101228192655p:image

コマンド 0, コマンド 1, となっているところにコマンド名を入力してやります.

f:id:mooz:20101228192656p:image

Compiz ではコマンドにショートカットキーを割り当てることは出来ても引数を渡すことが出来ないような雰囲気があるため, 面倒ですが僕は一つ一つをシェルスクリプトのコマンドとして ${HOME}/bin 以下に配置し, それらを指定するようにしています.

eijirox, gvisor コマンドはそれぞれ以下のようになっています.

#!/bin/sh

togwin --title "EijiroX:" "chromium-browser --user-data-dir=${HOME}/data/chrome_eijiro/"
#!/bin/sh

togwin --class gnome-terminal "gnome-terminal"

最後に, 今作成したコマンドにショートキーを割り当ててやります. 「キー割り当て」タブをクリックし, 「無効」の部分をクリックして下さい.

f:id:mooz:20101228192657p:image

これで, キー入力によりコマンドを実行することが可能となりました. 試しに, ここで指定したキーを何度か押してみてください. ウィンドウ表示がトグルされるかと思います.

まとめ

xdotool は本当に便利で夢が広がるので, どんどん活用されることをオススメします.

 |