ディスプレイの設定をコマンドライン・シェルで行う

<h1>はじめに</h1>
グラフィックの扱いは全くの初心者が
色々と試行錯誤した上でコマンドライン上からディスプレイの設定を行う物語。
ツッコミとかアドバイスがあれば是非教えて頂きたいです。

<h1>マルチディスプレイの設定を行う</h1>
本来であればX Window Systemが参照する設定ファイル、/etc/X11/xorg.conf をいじれば
ディスプレイの設定ができるようだ。

しかしながらネットの情報通りに色々試したが、そもそもxorg.confが適用されていないっぽい。
この時使用しているPCは"どこかの業者"が組んだものらしく、パーツについての詳細は不明。
いや、システムからでも各情報は参照できるが正直面倒くさい。
一応、グラボがGeForce GTX 1050 Tiを搭載しているのは把握したが、だからなんだという話だ。
残念ながらその"業者"との窓口がなく聞くすべもないので、闇雲に試してみた結果以下が使用できた。

<h1>xrandr</h1>
ディスプレイの設定を行えるライブラリとコマンドの総称だそう。
さっそくコマンドを実行してみた。

```
$ xrandr
```
すると以下のような結果が出た。

```
Screen 0: minimum 8 x 8, current 1920 x 1200, maximum 32767 x 32767
eDP1 connected primary 1920x1200+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
   2880x1800     59.99 +
   2560x1600     60.00  
   2048x1536     60.00  
   1920x1440     60.00  
   1856x1392     60.01  
   1792x1344     60.01  
   1920x1200     60.00*   59.95  
   1920x1080     59.93  
   1600x1200     60.00  
   1680x1050     60.00    59.95    59.88  
   1600x1024     60.17  
   1400x1050     59.98  
   1280x1024     60.02  
   1440x900      59.89    60.00  
   1400x900      60.00  
   1280x960      60.00  
   1360x768      59.80    59.96  
   1280x800      60.00  
   1152x864      60.00  
   1024x768      60.00  
   800x600       60.32    56.25  
   640x480       59.94  
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
HDMI3 disconnected (normal left inverted right x axis y axis)
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)

```

システムが認識している映像出力と、使用できる解像度・フレームレートを表示しているようだ。
この記事を書こうと思った動機になる環境とは違い、個人の環境での出力結果である。

補足しておくと、上記の結果で表示された数の分だけ映像出力端子があるとは限らない。
例えば上記で言うとDP1、DP2と２つの映像出力（DP　= DisplayPort）があるが、2つまとめて１つのDisplayPortの出力端子を表している。
ちなみに、変換ケーブルを使用しアナログ信号であるVGAをDisplayPortに変換し接続するとDP1がconnectedになり、
デジタル信号であるDVI-DをDisplayPortに変換し接続するとDP2がconnectedとなった。
だからといって具体的にDP1とDP2がどう違うのかは詳しく判明していないので割愛する。

<h1>いよいよ、コマンドでディスプレイの設定</h1>
まずは、上のセクションにあるxrandrの結果にあるeDP1を、現状の1920x1200の出力から2880x1800への出力に変更するコマンド

```
$ xrandr --output eDP1 --mode 2880x1800
```

![Ih4Oyma5XIRa21v1520045103_1520045111.jpg](https://qiita-image-store.s3.amazonaws.com/0/240483/bfc17361-5b55-8064-49e0-117166dec039.jpeg)

![vYsEv_wMvrpqL_51520045180.png](https://qiita-image-store.s3.amazonaws.com/0/240483/95e12356-171c-6fd3-e5fe-74ce62e0c459.png)

上の画像、１枚目はコマンドを実施する前、２枚目はコマンドを実施した後になる。
アイコンやらが小さくなっており、解像度が上がったことが確認できる。

1枚のディスプレイの設定を行ってもそこまで面白くないので、マルチディスプレイでの設定方法を以下に記す。

<h1>2枚以上のディスプレイの配置を変更する</h1>
ここからは手元に環境が無いので、実行するコマンドと結果をテキストだけでお伝えします。
まずは2枚のディスプレイを左右に並べるコマンド

```
$ xrandr --output eDP1 --auto --right-of HDMI1
```

上記コマンドはeDP1のディスプレイをHDMI1の右側に出力して、というコマンド。
左側にしたい場合は --left-of オプションを使用する。
--autoオプションは解像度をディスプレイに最適な値に設定してくれる。
上下に並べたければ以下のようになる。

```
$ xrandr --output eDP1 --auto --below HDMI1
```

上記コマンドはeDP1のディスプレイをHDMI1の下側に出力して、というコマンド。
上側にしたい場合は --above オプションを使用する。
これらを使用すれば、2枚以上のディスプレイを配置する事が可能になる。

上記２つのコマンドによるディスプレイの配置は相対的な指定をしている。
そのため、もしHDMI1が接続されていない場合は適用できない。
そんな状況があり得る環境であれば絶対座標を使用する。
こちらのほうがいかなる状況でも対応可能であろう。

```
$ xrandr --output eDP1 --mode 1920x1080 --pos 1920x1080
```

上記コマンドは、eDP1の映像出力を解像度は1920x1080、ディスプレイの配置はx:1920 y:1080 で出力となる。

<h1>永続的な設定を</h1>
この状態でPCを再起動すると初期設定に戻ってしまう。
また、ディスプレイの切断-再接続等が行われると配置が変わってしまう。
なので定期的にディスプレイの配置を監視して、
配置が変わっていれば再度ディスプレイの配置を行うようなシェルスクリプトを作成して /rc.local にでも放り込んでおこう。
xrandrコマンドを実行すればディスプレイの接続状態とディスプレイのジオメトリが取れるので、その値を監視すればいいだろう。

<h1>まとめ</h1>
個人の環境であればすべて把握しているし自由に構成も変更できるが、
仕事となると色んな兼ね合いがあるものだ。
効率を上げる為の手段が使えない場合も沢山ある。

使えるものは何でも使ってやりたい事を実現していこう。