Linuxでディスプレイ解像度を自動で切り替える方法です.
- ノートPCで外部モニタを使う場合
- ノートPCでサスペンドから復帰後,解像度がおかしくなる場合
- 画面切替機(キーボードスイッチャ,パソコン切替器)を使っている場合
などに,毎回解像度を手動で設定し直す必要がなくなります.便利です
設定方法
autorandr を使います.
インストールはaptが使える環境なら以下の通りです
$ sudo apt install autorandr
ソースコードは GitHub で公開されています.
github.com
ubuntu,centos などでもパッケージが標準で用意されているそうです.
使い方
- ディスプレイの設定を行います
- 設定が終わったら,設定をファイルに保存します.
- あとはホットプラグです
- ディプレイを接続するなどしたら,そのタイミングで自動的に設定が切り替わります.
便利ですね
2.の設定保存の操作では,以下のコマンドを使います.
$ autorandr --save ”名前”
名前はそのまま設定ファイルの名前として流用されるので,半角英数が良いでしょう.
例えばデフォルト設定を保存する場合は
$ autorandr --save default
などとします.
保存した設定の一覧は以下のコマンドで確認できます
$ autorandr
autorandr の動作原理
autorandr には大きく二つの機能があります
画面設定の save と load
ディスプレイ設定を保存するには以下のコマンドを実行します
$ autorandr --save 名前
このコマンドを実行すると ~/.config/autorandr/名前/ と言うディレクトリが生成され,以下のファイルが生成されます
- ~/.config/autorandr/名前/config
- ~/.config/autorandr/名前/setup
~/.config/autorandr/名前/config には解像度などのディスプレイ設定が保存されています.X window system では,画面解像度などのディスプレイに関する設定やその変更方法は, RandR extension と言う仕様で管理されています.autorandr は RandR extensionを使って,解像度の設定などを調べて,その情報をファイルに保存します.
~/.config/autorandr/名前/setup にはハードウェア情報(接続されたディスプレイのEDIDなど)が保存されています
保存した設定の一覧は以下のコマンドで確認できます
$ autorandr
保存した設定を読み込んで,ディスプレイ設定を変更するには以下のコマンドを実行します
$ autorandr --load 名前
ホットプラグ
autorandr はホットプラグに対応しています.ディスプレイをつないだり,サスペンドから復帰すると,autorandr が自動で起動されます.
これは udev を使って実現されています.
ディスプレイが検出されると Linuxカーネルの drm サブシステムが反応します.そこで udev を使ってdrmサブシステムに変化があった場合は autorandr を実行します.
具体的には,debian の場合だと /lib/udev/rules.d/40-monitor-hotplug.rules が udev のルールになっています.
ACTION=="change", SUBSYSTEM=="drm", RUN+="/bin/systemctl start --no-block autorandr.service"
このルールでまず udev 経由で systemctl にジョブをキューイングします
autorandr.service は /lib/systemd/system/autorandr.service で定義されています
[Unit] Description=autorandr execution hook After=sleep.target # Note: StartLimitInterval was renamed to StartLimitIntervalSec in systemd-230. # See autorandr bug #69. Do not rename for now, as the old name is kept for # compatibility. StartLimitInterval=5 StartLimitBurst=1 [Service] ExecStart=/usr/bin/autorandr --batch --change --default default Type=oneshot RemainAfterExit=false [Install] WantedBy=sleep.target
つまりディスプレイが接続されると,
/usr/bin/autorandr --batch --change --default default
が一度だけ実行されます.
この際の /usr/bin/autorandr の挙動は以下の通りです.
- 検出したディスプレイに対応する randr の設定があればそれを load
- 細かく言うと,まず接続されたディスプレイのEDIDなどと ~/.config/autorandr/*/setup に保存された情報を照らし合わせて,対応するものが見つかれば その config をloadします.
- 新しいディスプレイの場合は "default" をload
- 細かく言うと,上記処理で対応する autorandr/*/setupが見つからない場合,となります.
- "--default default"の設定で defaultを指定しているので, ~/.config/autorandr/default/config をloadします
と言うわけで,デフォルト設定が必要な場合は,設定を
$ autorandr --save default
で保存しておくと良いかもしれません.