古いノート＋Ubuntu18.04LTSで古いiPadをサブモニターにする

古いノートには外部出力(VGA)の口はあるが、モニターとつなげても何故かマルチモニターになってくれない。

一方、Windowsだとスマホやタブレットをサブモニターとするアプリ「spacedesk」というものがあり、実際に手持ちの古いiPadで確認できたので、Ubuntuでも同じようなことができないかと模索。

そうしたところ、Qiitaで以下の記事を見つけたので倣ってやってみることにした。

[Ubuntu 18.04] Android(やiPad)をサブモニターにする備忘録
https://qiita.com/hir-osechi/items/5a106f75ff1b9b8cd469

簡単そうだったので、Qiitaに残すようなことにはならないと思ったのに・・・。

## 材料
- PC：FMV-BIBLO MG70W＋ubuntu18.04LTS
- タブレット：iPad 第3世代(iOS 9.3.5)
- アプリ：PC＝vino、iPad＝VNC Viewer

## 方法
1. PC(Ubuntu)で仮想ディスプレイを追加し、画面領域を拡張する
2. PCで画面共有を有効にし、一方のタブレット(iPad)にはVNC Viewerを入れてタブレット→PCに接続
3. PCはプライマリディスプレイをそのまま表示し、タブレットはVNCで仮想ディスプレイ側を表示することで、タブレットをサブモニターと見做す

## VNCの導入
まずは肝となる「VNC」を入れる。

### iPad側
App Storeから「VNC Viewer」をインストール。

と、言うも行うも容易いことだが、執筆時点(2020/11)で「iOS 14」が出ている状況の中で、5世代も前の「iOS 9.3.5」をサポートしてくれるアプリは本当に少なく、**何かやろうとしてもインストールすらできずに終わることが多い。**

幸い、奇跡的にもVNC Viewerは「iOS 9.0以降対応」だったのでインストールできたが、これが10.0以降対応とかだったら今回の試みは即終了だった。

### PC側
先人の足跡に沿って、進める。

まずは念の為、vino(GNOMEのVNCサーバ)がインストールされているか確認する。

```
$ sudo apt install vino
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
vino はすでに最新バージョン (3.22.0-3ubuntu1.1) です。
アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 4 個。
$
```

次に[設定]→[共有]を開いて、右上のスイッチを「オン」にした後に中央の「画面共有」をクリックすると以下のウインドウが開く。

![qiita_20201106_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/a4ec6d0d-11da-e3fb-5e04-0cc7e677625c.png)

左上のスイッチを「オン」にし、「パスワードを要求する」にチェックをつけて、パスワードを入力して閉じる。

これでVNCのサーバ側が出来上がるが、(VNCの接続が)Linux同士でないとうまくいかないらしいので、以下のコマンドを実行して暗号化要求を無効化しておく。

```
$ sudo gsettings set org.gnome.Vino require-encryption false
```
でもって、iPadのVNC ViewerからPCに接続する。暗号化要求が無いとの警告は無視して進め、iPad側のVNCでPCの画面が表示されることを確認する(この時点では同じ画面が映るはず)。

## 仮想ディスプレイを追加
次にPCの画面領域を拡張するため、仮想ディスプレイの追加設定を行う。

まずは状態確認。

```
$ xrandr -q
Screen 0: minimum 8 x 8, current 2352 x 800, maximum 32767 x 32767
LVDS1 connected primary 1280x800+1072+0 (normal left inverted right x axis y axis) 286mm x 178mm
   1280x800      60.00*+  59.81    59.91  
   1280x720      59.86    59.74  
   1024x768      60.00  
   1024x576      59.90    59.82  
   960x540       59.63    59.82  
   800x600       60.32    56.25  
   864x486       59.92    59.57  
   640x480       59.94  
   720x405       59.51    58.99  
   640x400       60.00  
   640x360       59.84    59.32  
TV1 disconnected (normal left inverted right x axis y axis)
VGA1 disconnected (normal left inverted right x axis y axis)
$
```

・・・**なんと「VIRTUAL1」の定義がない！**orz

先人の足跡では「VIRTUAL1」ありきで話が進んでいるので簡単に見えたのだが、同じOSなのにそんな大事なものが無いだなんて予想もしてなかったのでいきなり躓いてしまった。

しかし、あれやこれやとWeb徘徊した結果、何故無いのかはわからないが、無いならば作ってしまえばいいという結論にたどり着いた。

```
$ cd /usr/share/X11/xorg.conf.d/
$ sudo nano 30-virtscreen.conf
---
Section "Device"
	Identifier "intelgpu0"
	Driver     "intel"
	Option     "VirtualHeads" "1"
EndSection
---
```

保存したら一旦、ログオフ＆ログインして、再度確認する。

```
$ xrandr -q
Screen 0: minimum 8 x 8, current 2352 x 800, maximum 32767 x 32767
LVDS1 connected primary 1280x800+1072+0 (normal left inverted right x axis y axis) 286mm x 178mm
   1280x800      60.00*+  59.81    59.91  
   1280x720      59.86    59.74  
   1024x768      60.00  
   1024x576      59.90    59.82  
   960x540       59.63    59.82  
   800x600       60.32    56.25  
   864x486       59.92    59.57  
   640x480       59.94  
   720x405       59.51    58.99  
   640x400       60.00  
   640x360       59.84    59.32  
TV1 disconnected (normal left inverted right x axis y axis)
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 connected 1072x800+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
```

**おお、VIRTUAL1が追加されてる！**(本当にいいのかわからんけど・・・)


次にcvtコマンドで表示したい解像度とリフレッシュレートを指定して、詳細な情報を取得する。

iPad自体は「2048x1536」だが、そのままの解像度で表示すると小さすぎるため、PC側の「1280x800」の縦に合わせつつ、比率を守った「約1067x800」を仮想ディスプレイ側のサイズとした。さすがに1067は半端な数値だったようで、1072に補正された。

```
$ cvt 1067 800
# 1072x800 59.83 Hz (CVT) hsync: 49.72 kHz; pclk: 70.00 MHz
Modeline "1072x800_60.00"   70.00  1072 1136 1240 1408  800 803 813 831 -hsync +vsync
```

得られた情報をxrandrコマンドで登録する。--newmodeの後ろには、cvtコマンドの結果でModelineから後ろの部分をコピペする。

```
$ xrandr --newmode  "1072x800_60.00"   70.00  1072 1136 1240 1408  800 803 813 831 -hsync +vsync
$ xrandr -q
Screen 0: minimum 8 x 8, current 1280 x 800, maximum 32767 x 32767
LVDS1 connected primary 1280x800+0+0 (normal left inverted right x axis y axis) 286mm x 178mm
   1280x800      60.00*+  59.81    59.91  
   1280x720      59.86    59.74  
   1024x768      60.00  
   1024x576      59.90    59.82  
   960x540       59.63    59.82  
   800x600       60.32    56.25  
   864x486       59.92    59.57  
   640x480       59.94  
   720x405       59.51    58.99  
   640x400       60.00  
   640x360       59.84    59.32  
TV1 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)
  1072x800_60.00 (0x13a) 70.000MHz -HSync +VSync
        h: width  1072 start 1136 end 1240 total 1408 skew    0 clock  49.72KHz
        v: height  800 start  803 end  813 total  831           clock  59.83Hz
$
```

そして、この登録した解像度の情報をVIRTUAL1に紐付ける。

```
$ xrandr -q
Screen 0: minimum 8 x 8, current 2352 x 800, maximum 32767 x 32767
LVDS1 connected primary 1280x800+1072+0 (normal left inverted right x axis y axis) 286mm x 178mm
   1280x800      60.00*+  59.81    59.91  
   1280x720      59.86    59.74  
   1024x768      60.00  
   1024x576      59.90    59.82  
   960x540       59.63    59.82  
   800x600       60.32    56.25  
   864x486       59.92    59.57  
   640x480       59.94  
   720x405       59.51    58.99  
   640x400       60.00  
   640x360       59.84    59.32  
TV1 disconnected (normal left inverted right x axis y axis)
VGA1 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 connected 1072x800+0+0 (normal left inverted right x axis y axis) 0mm x 0mm
   1072x800_60.00  59.83* 
VIRTUAL2 disconnected (normal left inverted right x axis y axis)
```

リフレッシュレートの値の後ろにアスタリスクがついているし、問題なく設定できたようだ。

・・・って、あれ？ **突然「VIRTUAL2」が増えたぞ？？**
：
：
んー・・・よくわかんないけど、先を急ぎたいのでCLIでのコマンドは一旦終わり。

最後に[設定]→[デバイス]→[ディスプレイ]を開き、ディスプレイが２つになっていることを確認。

![qiita_20201106_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/0533ff63-f774-b983-706c-cf81b7f474c1.png)

セカンダリは「Unknown Display」となっているが、これが追加した仮想ディスプレイの領域であり、VNCを使ってiPad側で表示させる領域となる。

## 動作確認
改めてiPadのVNC ViewerでPCに接続する。

接続すると、最初はPCと同じ画面(プライマリ)が表示されるが、iPad側の画面を横にスライドさせることで仮想ディスプレイ側に切り替えられる。これでiPadをサブモニターとして使うことが出来るようになった。

![qiita_20201106_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/552413/e7df72c6-062c-dbfb-7f0c-347714494867.png)

## 設定の自動化
xrandrの設定は再起動すると失われてしまうので、当初は永続化することを考えたのだが、ログイン直後から仮想ディスプレイがある状態というのはちと都合が悪い。

なので、xrandr --newmodeと--addmodeを続けて実行する簡易なスクリプトを作り、「画面を広くしたーい！」と思ったときに、このスクリプトをランチャーから実行できるようにした。

まず、スクリプト。

```
$ cd $HOME
$ nano virtual_display_set.sh
---
#!/bin/bash

MSG=`xrandr -q | grep "VIRTUAL1 disconnected"`
if [ "$MSG" != "" ]; then
#    echo "disconnected!"
    xrandr --newmode  "1072x800_60.00"   70.00  1072 1136 1240 1408  800 803 813 831 -hsync +vsync
    xrandr --addmode VIRTUAL1 1072x800_60.00
else
#    echo "connected!"
    xrandr --delmode VIRTUAL1 1072x800_60.00
    sleep 5
    xrandr --rmmode "1072x800_60.00"
fi

exit 0
---
```

多重で実行しないよう、VIRTUAL1がdisconnectだったらnewmodeとaddmodeを実行し、そうでない場合はdelmodeとrmmodeで削除するようにした。一応、動いたのだが、動作確認のために何度も実行していたら画面が崩れて元に戻せずPCを強制終了する羽目になったので、削除についてはちと不安。

でもって、ランチャーにはこのスクリプトをキックするショートカットを「VDispSet」という名前で登録する。

```
$ sudo nano ~/.local/share/applications/VDispSet.desktop
---
[Desktop Entry]
Version=1.0
Type=Application
Name=VDispSet
Exec="/home/xxx/virtual_display_set.sh"
Icon=VDispSet.png
Path=/home/xxx
Terminal=false
StartupNotify=false
---
```
アイコンファイルは~/.local/share/icons配下に格納する。といっても良さげなものがなかったので今は置いてないが、その場合はデフォルトのアイコンが使われるので表示上は問題なし。

一旦、ログオフ・ログインして動作確認。

- ログイン直後、[設定]→[デバイス]→[ディスプレイ]ではディスプレイは１つのみ
- ランチャーの「VDispSet」を実行
- [設定]→[デバイス]→[ディスプレイ]に仮想ディスプレイが追加されて２つになった
- iPadからVNCで接続

うん、スッキリできた！

## 雑感
- VNCを使っているということ、またiPad自体が非力なのでもっさり感は否めない(Spacedesk使ってWin-iPadも同じくらいのもっさり感だった)。なのでサブ側で作業するのは辛いので、サブにはブラウザを表示させておき、これを見ながらメインで作業するというような形にはなる。

- Androidタブレットもあるので、もっさり感を解消したいならAndroidの方がよいのだろうが、iPadの方が画面が広いし、何より**ノートPCと共にiPadを復活させてるという(自己)満足感**が大きく違う。

- 何か作業をしたらVIRTUAL1が追加されるものだと思い込んでいたので、VIRTUAL1をどうにか出そうとvirtscreenを入れてみたり、はたまたspacedeskをwineで動かせないかとか迷走してやたらと時間を食ってしまった。