先日の、webshot サーバーを作る時に得た知識を、ここでひとつ。
Linux に限らず、GUI のウィンドウを操作しようと思うには、マウスが必要です。
場合によっては、キーボードで操作できる場合もあるかもしれませんが、普通はマウスで操作しますね。
しかし、たまには GUI をコマンドラインから操作したいこともあるでしょう。
特に、ウィンドウの操作。
たとえば、先日作った web ページを画像化するプログラムでは、内部でウィンドウサイズの変更や移動などが必要になってきたりします。
その場合、人力でやるわけにはいかない上に、Xvfb の中で動いているので、マウスなんか操作できません。
なので、コマンドラインから、ウィンドウを操作する必要が出てきます。
この問題を解消してくれるのが、wmctrl です。
wmctrl とは?
たぶん、名前の由来は "Window Manager ConTRoL" とかそんな感じじゃないですかね?
単純に言えば、ウィンドウマネージャーをコマンドラインからコントロールできるツールです。
使い方は、上記サイトに記載されています。(only English
が、使い方を、簡単にメモりたいと思います。
fedora や debian, ubuntu では yum や apt-get で導入できるかと思います。
CentOS については、fedora のパッケージを(ry とかして僕は動かしてますが、オススメするわけではありません。
実行環境...
wmctrl は X のウィンドウをコマンドラインから操作することができます。
しかし、動作にはいわゆる Window manager と言われるものが必要です。
GNOME とか KDE とかそういうやつです。(厳密には違うw
- GNOME
- KDE
- Xfce
- fluxbox
- icewm
- fvwm
など、その他多数の wm が対応しています。
これらのウィンドウマネージャが動いている、X のディスプレイ上で wmctrl は動作することができます。
できること。
wmctrl を使ってコマンドラインから実行できる操作は
- ウィンドウのリストを表示
- ウィンドウの移動、サイズ変更
- ウィンドウを閉じる
- デスクトップの切り替え
など。
他にも色々できます。
簡単な使い方。
wmctrl のコマンドについて、簡単にメモ。
-l ウィンドウリストの表示
$ wmctrl -l
0x0200001e -1 localhost.localdomain x-nautilus-desktop
0x01a00003 -1 localhost.localdomain Top Panel
0x01a00028 -1 localhost.localdomain Bottom Panel
0x040000c1 0 localhost.localdomain 端末
0x0420005f 0 localhost.localdomain *GNU Emacs* - emacs@localhost.localdomain
0x04400050 0 localhost.localdomain 編集中のドキュメント 1 - gedit
0x0460007d 0 localhost.localdomain Google - Mozilla Firefox
0x02000a72 0 localhost.localdomain ゴミ箱
-e ウィンドウの移動、リサイズ
$ wmctrl -r emacs -e 0,0,0,800,600
- -r : ウィンドウ名
- -e : 0, X座標, Y座標, Width, Height
X,Y,W,H は、各値に -1 を指定することで、実行前の値を保持します。
-b ウィンドウの状態を変更
$ wmctrl -r emacs -b add,fullscreen
- -r : ウィンドウ名
- -b : (remove | add | toggle),(fullscreen | maximized_vert | maximized_horz)
その他にも色々パターンがあります。
また、fullscreen は、フレームを考えずフルにしてくれるので、限界突破できますw
-c ウィンドウを閉じる
$ wmctrl -c emacs
グラフィカルに閉じてくれます。
即ち、閉じるボタンを押したときと同じ動作をするってこと。
その他にも、
- -s : デスクトップの切り替え
- -a : ウィンドウをアクティブに
- -R : 現在のデスクトップにウィンドウを引っ張ってくる
- -n : デスクトップの数を変更する
などなど、面白いものがたくさんあります。
[注意] ウィンドウの指定方法
ウィンドウの指定方法が何通りかあります。
上記の例ではウィンドウ名を使いましたが、window id を使用することも可能です。
その場合は "-i" オプションを使用します。
- $ wmctrl -l
...
0x0420005f 0 localhost.localdomain *GNU Emacs* - emacs@localhost.localdomain
... - $ wmctrl -i -r 0x0420005f -e 0,0,0,800,600
などとできます。
また、"-r" オプションなど、ウィンドウを指定するオプションに、以下の文字列を渡すことで、特殊な動作をさせることも可能です。
- :SELECT:
コマンドを適用するウィンドウをクリックして選択 - :ACTIVE:
アクティブウィンドウにコマンドを適用する
たとえば以下のような場合、クリックされたウィンドウを閉じる動作をします。
ex) $ wmctrl -c :SELECT:
なんか、読みずらい構成だね。
ってことで終了。
なんか書き忘れてるような気もするが...


コメントする