Raspberry Pi xdotoolで快適なディスクトップ環境

xdotoolはX上のウインドウやキーボード、マウスをコマンドラインから操作可能なツールです。

Piをディスクトップ環境で利用していると電源投入後起動するアプリケーションとその配置は大体決まってくると思います。LXDE+openboxは以前と比べるとうまく配置してくれますがまぁ必ず並べ替えが必要になってきますね。今回はその並べ替えをxdotoolにお願いしたいと思います。

スクリプトの作り込みによってはウインドウではなくベースのディスクトップ自体が動いてしまうことがあります。再起動または後述する方法で復帰することができます。
一応バックアップを取っておきます。バックアップはcp -r ~/.config ~/.config.bakでいいと思います。
LXDEは基本終了時に現在の状態を保存します。バックアップを復元するにはCLIで起動、バックアップファイルを上書き、置き換えしてやります。

インストール

# apt install xdotool

ウインドウを操作するにはウインドウIDを取得する必要があります。search –nameで取得できたIDでもほとんどが動いてくれません(試した中ではmltermだけOK)manを見ても多くのコマンド(オプション)があってよくわかりません。
ネット情報を見るとgetwindowfocusを使うと良さそうです。
参考にしたサイト xdotoolを使ってコマンドラインからウィンドウを操作する

基本の操作

ウインドウIDの取得

$ xdotool selectwindow
18874828
$ xdotool getwindowfocus
23068676
$ sleep 3 && xdotool getwindowfocus
23068676

xdotool selectwindowを実行するとカーソルがアイマークに変わります。目的のウインドウをクリックして取得します。テストには便利そうです。
テストではターミナル自身のIDを取得していますがsleepを入れて目的のウインドウをクリックすることによりgetwindowfocusでIDを取得できます。
selectwindowとgetwindowfocusでは取得したIDは異なりますがどちらも動かすことができます。

今回の目的は電源投入、OS起動後アプリケーションを起動、並べ替えをするのですがウインドウIDを取得するタイミングをうまく計る必要があります。短くても失敗するし無駄に長いと有り難みが無くなってしまいます。(電源投入後初回起動時の時間が基準)
アプリケーション起動中はいろんなウインドウIDが存在するようです。ウインドウを操作できるIDは起動の最終あたりに取得できるのでアプリケーションごとに適切なsleepを設定します。
設定中には失敗してディスクトップ自体のIDを取得してしまい背景があらぬ方向に移動してしまうこともあります。
その際は再起動または上記の方法でディスクトップ自体のIDを取得(なにもないところでクリック)
$ xdotool windowmove 取得したID 0 0
で戻すことができます。

設定 運用してみる

当サイトの設定例です。
ディスプレイ 1024×768
pcmanfm,lxterminal,mltermを起動並べ替えをしています。
terminalはgeometryでも指定できるのですがここはxdotoolで統一します。
当サイトのopenboxはmoves overでフォーカスを当てているので最初にカーソルを左隅に移動しています。動作はアプリケーションを起動、sleepを入れてウインドウIDを取得、ウインドウサイズを指定、移動位置を指定、順次繰り返します。
アプリケーション起動後のsleepがポイントでしょうか。(ほか必要に応じて)
osのsleepも使えますがxdotool sleepは小数点以下も指定できるようです。
~/bin/pcmanfm.sh

#!/bin/sh
xdotool mousemove 0 0
mlterm &
    xdotool sleep 1
    ID=`xdotool getwindowfocus`
    xdotool sleep 1
    xdotool windowmove $ID 505 420
lxterminal &
    xdotool sleep 1
    ID=`xdotool getwindowfocus`
    xdotool sleep 1
    xdotool windowmove $ID  20 420
pcmanfm &
    xdotool sleep 3
    ID=`xdotool getwindowfocus`
    xdotool sleep 1
    xdotool windowsize $ID 515 365
    xdotool windowmove $ID 505 31
    cd ~/

次は2つのターミナルを起動して1つはサーバーにアクセス、もう1つは自マシンで使用します。
ローカルにおいてあるサーバーはtmuxが起動していて作業を再開できるようになっています。
xdotoolのキー入力を利用してsshでログイン、最初のログ確認コマンドを実行しています。
スクリプトファイルにはpasswordが平文で記載しているのでパーミッション(700 動作確認後は500にしています)そして扱いには慎重に、かつ自己判断で実行します。
(サーバーへのアクセスはログイン程度にとどめてそこからはサーバー側で処理するのがいいと思います)
~/bin/server.sh

#!/bin/sh
xdotool mousemove 0 0
mlterm &
    xdotool sleep 1
    ID=`xdotool getwindowfocus`
    xdotool sleep 1
    xdotool windowsize $ID 490 660
    xdotool windowmove $ID 515  60
lxterminal &
    xdotool sleep 1
    ID=`xdotool getwindowfocus`
    xdotool sleep 1
    xdotool windowmove $ID  30 400
xdotool sleep 2

# server pi2
xdotool mousemove 600 100
xdotool click 1
xdotool sleep 1
xdotool type --delay 100 'ssh hogehoge'
xdotool sleep 0.4
xdotool key Return
xdotool sleep 3
xdotool type --delay 100 'password'
xdotool sleep 0.4
xdotool key Return
xdotool sleep 0.4
xdotool type 'tmux a'
xdotool sleep 0.4
xdotool key Return
xdotool sleep 0.4
xdotool type --delay 100 'cd /var/log'
xdotool sleep 0.4
xdotool key Return
xdotool sleep 0.4
xdotool type --delay 100 'tail fail2ban.log'
xdotool sleep 0.4
xdotool key Return
xdotool key Return
xdotool sleep 2
# pi3
xdotool mousemove 200 500
xdotool sleep 1
xdotool click 1
xdotool type --delay 100 'df'
xdotool sleep 0.4
xdotool key Return
xdotool key Return

次に上記のスクリプトをワークスペースを切り替えながら実行して更にほかに起動したいアプリケーションを登録、実行します。
当サイトではメールクライアントとchromium-browserを登録しています。
set_desktop (0-5)はwork space (1-6)に対応します。
work space6で実行後は先に実行したwork space5と3を5秒づつ確認 work space1に移動してchromium-browserの起動を待ちます。(約5秒後に起動開始)
~/bin/work.sh

#!/bin/sh
xdotool mousemove 0 0
xdotool sleep 1
xdotool set_desktop 2
    /home/pi/bin/pcman.sh
xdotool sleep 3

xdotool set_desktop 4
    /home/pi/bin/server.sh
xdotool sleep 3

xdotool set_desktop 5
   sylpheed &
   xdotool sleep 5
   chromium-browser &
   xdotool sleep 5

xdotool set_desktop 4
xdotool sleep 5
xdotool set_desktop 2
xdotool sleep 5
xdotool set_desktop 0


上記のwork.shはOS起動後1回だけの実行なので誤操作避けるためzenityのquestionダイアログで確認を取ります。

~/bin/desktop.sh

#!/bin/sh
ACTION=$(zenity --question --default-cancel --title "DeskTop" --text "Run DeskTop Programs 実行しますか?");
if [ "$?" = "0" ]; then
    /home/pi/bin/work.sh
else
    echo "cancel"
fi


zenity実行スクリプトはメニューに登録してディスクトップに貼り付けました。
各スクリプトは実行権限が必要です。
実行中はマウスを動かさないようにただ見てるだけです。
sleep時間やウインドウサイズなどは各環境によって違うので参考までに!
まだそれほど使い込んではいませんが今のところ順調に仕事をしてくれます。

ボタン一発で初期起動アプリケーションの実行を代行してくれるのでキーボード操作が下手糞な当サイトにとっては実に快適です。


前回はsurf2で小さい画面を使いましたがaptからインストールしたsurfもxdotoolでサイズを自由に設定できます。逆にsurf2も引き伸ばすこともできますね。

違いはテキストエリアのフォントサイズが少々違うこと、ここから新しいウインドウ開いた際の初期画面はそれぞれのデフォルトの大きさになります。
見え方はサイトによって違ってきます。