VNC をセカンドディスプレイとして使う on Ubuntu 18.04

「ノートPCをディスプレイ代わりにしてマルチディスプレイを試す on Windows10」
https://qiita.com/nanbuwks/items/aed19202d51e4af82cde

のようなことを Ubuntu Linux でしたい。

「おまけ Ubuntu Linux から接続できるかな？」
https://qiita.com/nanbuwks/items/aed19202d51e4af82cde#%E3%81%8A%E3%81%BE%E3%81%91-ubuntu-linux-%E3%81%8B%E3%82%89%E6%8E%A5%E7%B6%9A%E3%81%A7%E3%81%8D%E3%82%8B%E3%81%8B%E3%81%AA

では MiracleCast を使おうとしましたがうまくいきませんでした。

# 調査

調べたら、iPadや Android タブレットをセカンドディスプレイとして使っている人がいます。

## vnc4serverを使うやり方
「AndroidタブレットをLinuxのサブディスプレイにする | ともの技術メモ 」
https://tomono.tokyo/2016/08/09/6228/


マウスは行き来できますが、ウィンドウは行き来できないそうです。

## xrandr + vnc

「Using iPad as a 2nd monitor on Linux」
https://kbumsik.io/using-ipad-as-a-2nd-monitor-on-linux
この例でもx11vncを使っています。
VIRTUAL1 仮想ディスプレイを作って xrandr でディスプレイ集合にアタッチ。ディスプレイ集合の一部画面だけvncで配信するやりかたです。
これだとウィンドウも行き来できるようです。

### GUI

先の方法は VirtScreen という新しいプロジェクトに進んでいるらしい。
https://github.com/kbumsik/VirtScreen
GUIユーティリティーになっています。

## 使用していないディスプレイポートを使うやり方

xrandr + vnc の元ネタはこれ。
「Extending desktop over VNC, the easy way」
https://bbs.archlinux.org/viewtopic.php?id=191555
これは使っていないディスプレイポートを使い、 xrandr で解像度を指定してディスプレイ集合にアタッチしています。

この方法を使って試してみました。

# 環境

- Ubuntu 18.04
- ThinkPad X230  (1360x768)
- HDMI 入力付テレビ x 1 (1360x768)
- Windows10 ノートPC x ２ (1920x1080) 
- USB to HDMIx2  ディスプレイアダプタ
 -  Plugable USB3.0 HDMIx2 + Gigabit Ethernet RJ-45 port (USB3-6950-HDMI)
https://qiita.com/nanbuwks/items/924324fa51f73307c6c0#%E3%81%9D%E3%81%AE5-plugable-usb30-hdmix2--gigabit-ethernet-rj-45-port-usb3-6950-hdmi

あらかじめ、 USB to HDMIx2  ディスプレイアダプタのうちの１ポートに、 HDMI 入力付テレビ x 1 (1360x768)を接続しています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/701fe089-c999-febc-f5bb-352d2ffe1278.png)

# 方法

この方法ではディスプレイの空きポートを使います。

xrandr で調べます・

```

$ xrandr
Screen 0: minimum 320 x 200, current 2646 x 1792, maximum 8192 x 8192
LVDS-1 connected primary 1366x768+1280+768 (normal left inverted right x axis y axis) 277mm x 156mm
   1366x768      60.00*+
   1360x768      59.80    59.96  
   1280x720      60.00    59.99    59.86    59.74  
   1024x768      60.04    60.00  
   960x720       60.00  
   928x696       60.05  
   896x672       60.01  
   1024x576      59.95    59.96    59.90    59.82  
   960x600       59.93    60.00  
   960x540       59.96    59.99    59.63    59.82  
   800x600       60.00    60.32    56.25  
   840x525       60.01    59.88  
   864x486       59.92    59.57  
   800x512       60.17  
   700x525       59.98  
   800x450       59.95    59.82  
   640x512       60.02  
   720x450       59.89  
   700x450       59.96    59.88  
   640x480       60.00    59.94  
   720x405       59.51    58.99  
   684x384       59.88    59.85  
   680x384       59.80    59.96  
   640x400       59.88    59.98  
   576x432       60.06  
   640x360       59.86    59.83    59.84    59.32  
   512x384       60.00  
   512x288       60.00    59.92  
   480x270       59.63    59.82  
   400x300       60.32    56.34  
   432x243       59.92    59.57  
   320x240       60.05  
   360x202       59.51    59.13  
   320x180       59.84    59.32  
VGA-1 disconnected 1280x1024+0+768 (normal left inverted right x axis y axis) 0mm x 0mm
   1280x1024_60.00  60.00* 
HDMI-1 disconnected (normal left inverted right x axis y axis)
   2560x1440_30.00  29.94  
   3840x2160     24.00  
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-2 disconnected (normal left inverted right x axis y axis)
HDMI-3 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-3 disconnected (normal left inverted right x axis y axis)
DVI-I-2-2 disconnected (normal left inverted right x axis y axis)
DVI-I-1-1 connected 1360x768+1280+0 (normal left inverted right x axis y axis) 1600mm x 900mm
   1920x1080     60.00 +  59.94    30.00    24.00    29.97    23.98  
   1280x1024     60.02  
   1360x768      60.02* 
   1280x768      74.89    59.87  
   1280x720      60.00    59.94  
   1024x768      75.03    70.07    60.00  
   800x600       72.19    75.00    60.32    56.25  
   848x480       60.00  
   720x480       60.00    59.94  
   640x480       75.00    72.81    60.00    59.94  
  1024x768 (0x50) 65.000MHz -HSync -VSync
        h: width  1024 start 1048 end 1184 total 1344 skew    0 clock  48.36KHz
        v: height  768 start  771 end  777 total  806           clock  60.00Hz
  800x600 (0x53) 40.000MHz +HSync +VSync
        h: width   800 start  840 end  968 total 1056 skew    0 clock  37.88KHz
        v: height  600 start  601 end  605 total  628           clock  60.32Hz
  800x600 (0x54) 36.000MHz +HSync +VSync
        h: width   800 start  824 end  896 total 1024 skew    0 clock  35.16KHz
        v: height  600 start  601 end  603 total  625           clock  56.25Hz
  640x480 (0x5b) 25.175MHz -HSync -VSync
        h: width   640 start  656 end  752 total  800 skew    0 clock  31.47KHz
        v: height  480 start  490 end  492 total  525           clock  59.94Hz

```

ThinkPad の VGAポート、miniDPポート、 USB to HDMIx2  ディスプレイアダプタのうちの１ポートは空いています。それぞれ、VGA-1、DP-1、DVI-I-2-2という名前です。
使っているポートは内蔵LCDが LVDS-1 、 HDMI 入力付テレビがつながっているUSB to HDMIx2 アダプタのうちの1つのポートは DVI-I-1-1 です。

「Ubuntu で 4K Display @ThinkPad X230(Intel HD 4000 Graphics)」
https://qiita.com/nanbuwks/items/dc26353486df80660e1f
で4Kディスプレイの永続化設定を入れているのでHDMI-1に設定が余計に付いています。

```

$ gtf 1920 1080 60

  # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
  Modeline "1920x1080_60.00"  172.80  1920 2040 2248 2576  1080 1081 1084 1118  -HSync +Vsync

```
と出たのでコピペします。

```

$ xrandr --newmode  "1920x1080_60.00"  172.80  1920 2040 2248 2576  1080 1081 1084 1118  -HSync +Vsync
```

VGA-1にモードを追加し、外部ディスプレイの左側へ出力します。

```

$ xrandr --addmode VGA-1  "1920x1080_60.00"  
$ xrandr --output VGA-1 --mode 1920x1080_60.00 --left-of DVI-I-1-1
```

この時点で、ディスプレイの設定画面には出ていませんが

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/1428ef70-0fe4-5243-1c1b-91834d133f8d.png)


ディスプレイアレイ内部の描画はこのようになっています。なお、この図ではきれいに描画できているように見えますが実はVGA-1の内部はぐちゃぐちゃになっています（後述）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/e931ad29-2878-f3d1-51f0-280178c45e67.png)


vncをインストールし、vncサーバを起動します。ディスプレイアレイ内部の描画の左上から1920x1080だけを切り出して配信します。

```

$ sudo apt install x11vnc
$ x11vnc -clip 1920x1080+0+0

```

Windowsマシンでは、UltraVNCを使ってみました。

接続すると・・・ウィンドウが移動できるように見えますが実際に移動するととんでもないことになってしまいました。ウィンドウが定位せず、残像が暴れます。

![無題2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c686430e-3f92-8e02-4aea-879d7f57a5a9.png)

ウィンドウが定位しない問題は、画面端へのスナップという悪の機能が悪いことをしているようです。

 window snapping off で検索して、以下のようにして切りました。

```

$ gsettings set org.gnome.mutter edge-tiling false

```

残像が暴れる問題
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/c410529e-0e6c-b1bf-4a10-b8498103158f.png)

残像が残るだけならまだいいのですが、残像がずっと描画し続けます。これについては、アニメーション効果が悪いのかな・・・？しかしながら

```
$ gsettings set org.gnome.desktop.interface enable-animations false 

```
とてみましたが効果はありませんでした。


ウィンドウをVGA-1内に最大化すると残像はごまかせそうです。最大化ボタンが効かないので手作業で最大サイズに調整しました。

残像が暴れるのは背景があるところだけだったので、適当にChromeとかを背景においてごまかしました。

背景を隠す自動化はこちら
「XWindow の GUI アプリを CUI で操作」
https://qiita.com/nanbuwks/items/80171364434bc86170fc

# クアッドディスプレイへ


調子に乗ってもう一台も設定しました。

```

$ xrandr --addmode DVI-I-2-2  "1920x1080_60.00"  
$ xrandr --output DVI-I-2-2 --mode 1920x1080_60.00 --right-of DVI-I-1-1
$ x11vnc -clip 1920x1080+3280+0 -rfbport 5901

```
![IMG_20200222_144943.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/ff5315cf-8a04-41ff-b1ca-b48ff3f7f80c.jpeg)

# 問題点


## スクリーンキャプチャが取れない
Print Screen では 本物のディスプレイしか取れないので、GIMPで取るようにします。

## Wineアプリが変
Wine-5.2を使ってますがマルチディスプレイに対応していないようです。それもどういうわけか一番左のVGA-1でしか使えません。
WineアプリとしてKindleを使っていますが画面横幅が1360に制限されました。
また、WeChatでは操作ができなくなったりします。

## キーボードが変

キーボードリピートが効かなくなる時があります。設定画面のアクセスビリティでタイミングを変更すると使えるようになります。

# 良い所

Windowsは背景で動いているので VNCの画面の裏でBGMとか流しておくのが、意外とよい感じ。


# その後の調査

xrandr での出力を見ると VGA-1/DP-1/DP-2/DP-3/HDMI-1/HDMI-2/HDMI-3 が含まれているけれども同時に使えるのは1つのみ。

X230の本体にはVGAとDisplayPortがついているが排他使用。ドックのVGAやDisplayPortも含めても同時に1つしか使えないことに由来しているようだ。

HDMIはDisplayPortを変換して使う時のものかな？

面白いことに DVI-I-1-1 および DVI-I-2-2 はUSBビデオアダプタのものだけれどもUSBビデオアダプタを外していてもxrandrからは見えるのでUSBビデオアダプタを刺していなくても空きポートとしてxrandrで操作してVNCでマルチディスプレイ化できる。

xrandrの出力には今まで接続したディスプレイアダプタが記憶されているようだ。

しかしながら物理にひっぱられるのはあれなので仮想ディスプレイポートを試してみた。


```

$ sudo vim /usr/share/X11/xorg.conf.d/20-intel.conf
```

```

Section "Device"
    Identifier "intelgpu0"
    Driver "intel"
    Option "VirtualHeads" "2"
EndSection
```

としてみる。しかしこれで再起動したらUSBビデオアダプタが機能しなくなった。内蔵ディスプレイしか認識していない。xrandrの結果は以下の通り。

```

$ xrandr
Screen 0: minimum 8 x 8, current 1366 x 768, maximum 32767 x 32767
LVDS1 connected primary 1366x768+0+0 (normal left inverted right x axis y axis) 280mm x 160mm
   1366x768      60.00*+
   1360x768      59.96  
   1280x720      59.86    60.00    59.74  
   1024x768      60.00  
   1024x576      60.00    59.90    59.82  
   960x540       60.00    59.63    59.82  
   800x600       60.32    56.25  
   864x486       60.00    59.92    59.57  
   640x480       59.94  
   720x405       59.51    60.00    58.99  
   680x384       60.00  
   640x360       59.84    59.32    60.00  
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP3 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)
VIRTUAL2 disconnected (normal left inverted right x axis y axis)
  2560x1440_30.00 (0x129) 146.250MHz -HSync +VSync
        h: width  2560 start 2680 end 2944 total 3328 skew    0 clock  43.95KHz
        v: height 1440 start 1443 end 1448 total 1468           clock  29.94Hz
  3840x2160 (0x12a) 210.620MHz +HSync -VSync
        h: width  3840 start 3888 end 3920 total 4000 skew    0 clock  52.66KHz
        v: height 2160 start 2183 end 2188 total 2194           clock  24.00Hz

```

はて？


# 明日からがんばる

今回は、使っていないビデオアダプターヘッドを使ったが、仮想ビデオドライバーを使うほうがスマート。これを読んで明日(来週？ 来月？ 来年？ 来生？)がんばる。
http://rarak.jp/16022