技術メモ

後で同じ状況が起こった時に思い出せるように技術的なちょっとしたことをメモする。ベストな解ではない。



[Linux] スリープのたびにディスプレイの配置が変わる (デュアルディスプレイ)


私が使っている2枚のディスプレイとPC(OS: Ubuntu)の組み合わせでは、なぜかスリープから復帰したりロックを解除すると、ディスプレイが1つ切断されていて真っ黒になっていたり、配置が変わってしまっていたりする。
原因はわからないが、毎回毎回ロックを解除するたびに配置が変わるのは困る。
いちいち設定し直すのが面倒くさかったので、ロック解除時に自動的にディスプレイの配置を設定するスクリプトを作った。

とは言っても、以前の記事である、デュアルディスプレイの配置をコマンドで変える(xrandr)と、画面のロック・アンロック時にコマンドを実行するを組み合わせただけである。





 
まずは以下のようなスクリプトを作った。
やっていることは単純なので別にRubyじゃなくてシェリスクリプトでも十分だが、拡張性を考えて今回はRubyで書いている。

内容としてはxrandrコマンドを叩いて、ディスプレイの設定をしているだけである。
xrandrコマンドでディスプレイの配置を設定する方法はこちらを見てほしい。
13行目のxrandrコマンドが実際にディスプレイの配置をしているところなので、お使いの環境に合わせて変更する必要がある。





 
通常であれば、13行目のコマンドだけでディスプレイの配置を出来るはずだが、スリープから復帰した時に画面が片方映っていない場合などは、xrandrがSegmentation Faultで落ちてしまう。
この原因はわからないが、数回xrandrコマンドを実行するときちんと直る可能性が高いので、このスクリプトではSegmentation Faultが出ている間、定期的にxrandrコマンドを実行している。なお、10回目でもSegmentation Faultが出る場合は諦めるという内容になっている。
例えば、このrbスクリプトを/home/hoge/System/display.rbに保存し、実行権限を与え(chmod +x /home/hoge/System/display.rb)て実行(/home/hoge/System/display.rb)すると、画面の配置が変わる。(注意: 必要に応じて13行目のコマンドは変えてください)





 

あとはこのrbスクリプトをロック解除時に実行すれば良い。
ロック解除時に特定のスクリプトやコマンドを実行する方法はここに載っている。
そこを参考に、アンロック時にrbスクリプトを実行するシェルスクリプトを以下に書いた。

例えばこれを/home/hoge/System/display.shとして保存し、実行権限を与え(chmod +x /home/hoge/System/display.sh)て実行(/home/hoge/System/display.sh)するとロック解除時にrbスクリプトが実行され、画面の配置が変わっていた場合や片方の画面が切断されて映らなくなっていても元の設定値に直すことができる。
なお、7行目のrbスクリプトのパスは先程保存したrbスクリプトのパスを指定し、また、実行可能にすること。





 

ここまでで、アンロック時に画面を元に戻す設定が出来るようなスクリプトができたので、あとはそのシェルスクリプトを起動時に自動的に実行されるようにするだけである。

1番簡単なのは「自動起動するプログラム」に追加することである。
下の画像のように名前は何でもよく、コマンドのところに、上の例では/home/hoge/System/display.shに設定する
あとは「追加」を押すだけである。

これで、起動時に自動的にディスプレイの配置を自分が好きなものに変更するスクリプトが実行される。



タグ:
投稿日: 2018年9月11日





コメントを残す

回答をお約束することは出来ませんので予めご了承ください。
コメントは承認されると表示されるようになります。
コメントを送信する前に「私はロボットではありません」にチェックを入れて下さい。