近頃は暇なことが多いので、自分の興味のあることができる。今週は、Linuxのプログラム(正確にはスクリプト)の改良をしたのだが、かなり劇的に改善できたので、悦に入っている。

そのスクリプトは、使っているディスプレイ(2台のうちの1台)の欠点を補うために必要になって、少し前に作ったものだ。スクリプトと言っても、実際には、Actionaという、X Window System(以下、X11)の処理を自動化する(例: ボタンを押す)プログラムで動かすプログラムである。

問題のディスプレイは、電源を切ったり省電力モードになった後に復帰すると、一瞬、PCとの接続を切ってしまうようなのだ(普通のディスプレイは、本当にPCとの接続ケーブルを外さない限り、そんなことにはならない。だから、そのディスプレイは腐っている)。そのため、Linuxは新しくディスプレイが接続されたと思って、そのディスプレイをどうするかというダイアログを、もう片方のディスプレイに出してしまう。そのダイアログの中のボタンを押してどうするか指定しない限り、問題のディスプレイには何も表示されない。

毎回それだったら、さすがにそんなディスプレイは捨てたくなるので、上記のActionaを使って、ディスプレイの再接続後にダイアログが出たことを検出して、そのボタンを自動的に押すようにした。

概ねうまく動いていたのだが、タイミングが悪いとうまく働かなかったり、スリープからの復帰に対応していないなどの問題があったので、直しながら使っていた。が、段々、Actionaの使い難さに嫌気が差して来た。プログラムといっても、BASIC程度のもので、制御構造が貧弱(基本的にGOTOしかない)なので、見やすいプログラムが書けず、保守性が悪いので、ちょっと直そうとするだけで、さまざまな落とし穴に落ちる。大幅な変更はかなり苦労する。

それで、何とかしてActionaを使わないで済ませられないか考えた。まずは、プログラムを見やすくするために、シェル・スクリプトにすることにした(というか、他に手軽な選択肢はほとんどない)。そして、幸い、ダイアログを探したりボタンを押したりする処理は、別の自動化プログラムxdotoolでできることが分かった。それで、今週の中頃に作ってみたら、うまく行った。

が、前から思っていたのだが、短時間(数秒間)でもダイアログが出て、スクリプトがそれを消すまでは自分が操作できないのが嫌だったし、Windowsじゃあるまいし、ダイアログのボタンを押すしか方法がないってのも馬鹿らしいと思い始め、ダイアログを使わないで済ませる方法を探したら、xrandrというディスプレイの設定のためのコマンドが見つかった。それを使う方法は、Actionaを使う前に検索して知っていたのだが、その時はどうもピンと来なかったので、使わなかったのだ。ちなみに、このコマンドは新しいようで、昔のX11にはなかった。そのために、すぐに思い浮かばなかったということもある(あと、その名前は何から来ているのか、謎だ)。

それで、今週の後半にxrandrを使ってプログラムを作り直した。更に、ダイアログを出さない方法(Linuxのデスクトップ環境の設定だった)も見つけたので、ダイアログを見つけて閉じる処理も不要になり(そのため、xdotoolも不要になった)、結局、最初とは全く異なる、すごくシンプルなプログラムになった。省電力モードなどからの復帰時にダイアログは出なくなり、一瞬で問題のディスプレイが使えるようになった。

ソフトは作る時(正確には動き出した時)はおもしろいけど、こうして、思わぬ展開でうまく(ドラスティックに?)改良できた時も、かなりおもしろい。

PS. ちょっと気に入らないのは、Windowsの時は、同じディスプレイが何も問題なく使えていたことだ。Windowsはディスプレイの状態や設定をうまく記憶しているのかも知れない(単に、何もしてないだけかも知れない)。Linuxにだってそういう機能があってしかるべきだが、今は分からない。もし見つかれば、作ったスクリプトが不要になる。新たに作る・動かすプログラムは少ない方がいい(プログラムなんて、作らないに越したことはない)から、例えそれまでの作業が無駄になったとしたって、それが理想の状態だから、作ったものを捨てるのは全く惜しくない。そして、そういう工夫もおもしろい。

  •   0
  •   1

コメントを書く

名前    

メール 

URL