• 作成:

xmonadを使っている時に一部のモニタの電源だけが起動時に点かないことへの対処

症状

PCモニタを4枚体制にしました - ncaq でPCモニタを増やしてから、 PC起動時に一部のモニタの電源だけが点かない時があると言う現象が起きていました。

現象が起きるモニタは確定していて、 xrandrで言うDP-4のモニタだけ点かないことがあったりなかったりします。

DisplayPortで接続されているため、電源が点かないと認識もされず、 xmonadのワークスペース割り当てがおかしくなる副作用も発生していました。

起動してからxrandrで設定しなおせばちゃんと電源が点くのですが、履歴に残って一撃で実行できるとは言え、一々起動してからコマンドを実行するのは面倒です。

色々試したら本質的では無いですが一応解決したのでメモを公開しておきます。

環境は、 Linux, Gentoo, Xorg, xrandr, xmonad, LightDM, NVIDIA RTX 2080 Tiです。

環境

2021-05-29T20:50:02 ✖ Xorg -version

X.Org X Server 1.20.11
X Protocol Version 11, Revision 0
Build Operating System: Linux 5.10.27-gentoo x86_64 Gentoo
Current Operating System: Linux strawberry 5.10.27-gentoo #2 SMP Thu May 6 16:48:42 JST 2021 x86_64
Kernel command line: BOOT_IMAGE=/vmlinuz-5.10.27-gentoo root=UUID=2a3ebb02-b199-485e-bae3-9076dceae3e5 ro init=/usr/lib/systemd/systemd pci=nommconf
Build Date: 06 May 2021  08:39:38PM

Current version of pixman: 0.40.0
       Before reporting problems, check http://wiki.x.org
       to make sure that you have the latest version.
2021-05-29T20:50:24 ❯ xrandr --version
xrandr program version       1.5.1
Server reports RandR version 1.6
2021-05-29T20:51:07 ❯ xrandr
Screen 0: minimum 8 x 8, current 11520 x 3600, maximum 32767 x 32767
DP-0 connected primary 3840x2160+3840+1440 (normal left inverted right x axis y axis) 600mm x 340mm
   3840x2160     60.00*+  30.00
   2560x1440     59.95
   1920x1080     60.00    59.94
   1600x900      60.00
   1280x1024     60.02
   1280x800      59.81
   1280x720      60.00    59.94
   1152x864      59.96
   1024x768      60.00
   800x600       60.32
   720x480       59.94
   640x480       59.94    59.93
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-0 connected 2560x1440+3840+0 (normal left inverted right x axis y axis) 527mm x 296mm
   2560x1440     59.95*+
   2048x1152     60.00
   1920x1080     60.00    59.94    29.97    23.98
   1600x900      60.00
   1280x1024     60.02
   1280x720      60.00    59.94
   1024x768      60.00
   800x600       60.32
   720x480       59.94
   640x480       59.94    59.93
DP-2 connected 3840x2160+7680+1440 (normal left inverted right x axis y axis) 621mm x 341mm
   3840x2160     60.00*+  30.00    29.97    23.98
   2560x1440     59.95
   1920x1080     60.00    59.94    50.00    29.97    23.98
   1680x1050     59.95
   1440x900      59.89
   1280x1024     75.02    60.02
   1280x960      60.00
   1280x800      59.81
   1280x720      60.00    59.94    50.00
   1152x864      75.00
   1024x768      75.03    70.07    60.00
   800x600       75.00    72.19    60.32    56.25
   720x576       50.00
   720x480       59.94
   640x480       75.00    72.81    59.94    59.93
DP-3 disconnected (normal left inverted right x axis y axis)
DP-4 connected 3840x2160+0+1440 (normal left inverted right x axis y axis) 600mm x 340mm
   3840x2160     60.00*+  59.94    50.00    29.97    25.00    23.98    23.98
   2560x1440     59.95
   1920x1080     60.00    59.94    50.00
   1680x1050     59.95
   1440x900      59.89
   1280x1024     60.02
   1280x960      60.00
   1280x800      59.81
   1280x720      60.00    59.94    50.00
   1024x768      60.00
   800x600       60.32    56.25
   720x576       50.00
   720x480       59.94
   640x480       59.94    59.93
DP-5 disconnected (normal left inverted right x axis y axis)
USB-C-0 disconnected (normal left inverted right x axis y axis)
2021-05-29T20:54:45 ❯ cat stack.yaml
packages:
  - .
resolver: lts-17.4
xmonad 0.15
xmonad-contrib 0.16

ncaq/.xmonad

やってダメだった策

startupHookでxrandrの実行完了を待ってもダメ

startupHookで、

spawn "xrandr --output DP-0 --primary --output DP-2 --right-of DP-0 --output DP-4 --left-of DP-0 --output HDMI-0 --above DP-0"

でモニターの上下左右位置を設定しているのですが、これの実行完了を待たないからダメなのではと思いました。

なので、 xmonadの提供するspawnではなく、 System.Processの提供するreadProcessWithExitCodeを使ってみました。

しかし、 ~/.xsession-errorsに、 waitForProcess: does not exist (No child processes) みたいな追記がされるだけで、特に解決しませんでした。

Legacy BIOSとの互換性を切ってもダメ

UEFIでLegacy BIOSとの互換性を切るとDisplayPortで繋がるという情報を目にしたので、試してみましたが効果はありませんでした。

ちなみに私がLegacy BIOSとの互換性をオンにしていたのは、昔のXPS 13でUEFI onlyでLinuxを起動するとグラフィックが壊滅したから、困らないならとりあえず有効にしておくと言う策を取っていたためです。

countScreensで解決

この問題とは関係なく、ラップトップとデスクトップでmanageHookを共有していると、シングルモニタのラップトップでもワークスペースが分割されて、面倒と言う問題がありました。

この問題の解決策として、 countScreensでシングルモニタであることが確認できたら余計なワークスペースを作らないことにしました。

この時、前のモニタの設定の時はcountScreensでモニタ数が3の時のみxrandrを実行していたことに気が付きました。

もしかしてcountScreensでスクリーン(モニタ)数を取得した場合、取得する過程で電源が必ずオンになるのでは? と思いこの変更を適応してみた所、少なくとも現在は電源が必ずオンになっています。

countScreensの内部でopenDisplayとか行っているので必ず電源オンになるのではないかと思います。

本質的に原因を補足したわけではありませんが、とりあえず問題は解決しました。