XmonadをウィンドウマネージャーとしてArchLinuxで実行しているトリプルモニターセットアップ(amdcccleで生成されたxorg.conf: http://Pastebin.com/gWSVEyLa )があります。物理的には、左側にHDTVがあり、中央にニースデルのモニターがあり、右側に回転したモニターがあります。私のHDTVにはHDMI入力が1つしかないため、他のいくつかのデバイスでは4入力2出力スイッチを使用しています。 HDTVが常に接続されているとは限らないため、仮想デスクトップのそのセクションが無効になります。これは多くの迷惑を引き起こします:
- ドライバーのホットプラグイベント(基本的にxrandr --autoを実行します)が原因で、画面がちらつきます。
- 物理的な画面の順序が変更され(hdtvが最初のモニターではなく3番目のモニターになります)、画面に焦点を合わせるためのキーバインドが間違っています。これをxmonad構成で問題にしないようにしましたが、検出されたモニターが2つしかない場合でも、バインディングは変更されます。
- HDTVを接続せずにコンピューターを起動した場合、仮想デスクトップのそのセクションは、ホットプラグイベントで接続されるか、xrandrを実行して有効にするまで使用できません。
- 切断されたモニターのワークスペースからのウィンドウは、表示されているモニターの他のワークスペースに移動されます。これは基本的に、HDTVに表示されていたウィンドウがランダムにスローされることを意味します。これは、Xmonadがワークスペースを処理する方法のために無意味です。
- 1つまたは2つのモニターをdpmsスタンバイにすることも、
xrandr --off
を使用して手動でディスプレイをオフにすることもできません。他のモニターがおかしくなります。たとえば、テレビを使って何かを見ているだけの場合、必ずしも他の2つのモニターをオンにする必要はありませんが、ウィンドウの位置はそのままにしておきます。
HDMIスイッチの入力を切り替えたり、オン/オフにしたり、ケーブルを物理的に切断したりすると、ビデオドライバーによってモニターが切断されたと解釈され、仮想デスクトップから削除されます。 Xは、これら3つのモニターすべてが接続されているかのように常に動作し、モニターのホットプラグイベントに応答しないようにします。 Linuxが完全に自動化されたxorg構成で動作できることは素晴らしいことですが、ハードウェアを変更するまで、常にこの正確なセットアップが必要です。ホットプラグイベントは、私のxorgログでは次のようになります。
When disconnected:
[ 1684.459] (II) fglrx(0): Hot-plug event occurs on device: 1:0:0
[ 1684.459] (II) fglrx(0): EDID vendor "DEL", prod id 40993
+-- 3 lines: [ 1684.459] (II) fglrx(0): Using hsync ranges from config file-----------------------------------------------------------------------------------------------------
+-- 11 lines: [ 1684.459] (II) fglrx(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz eP)----------------------------------
[ 1684.468] (II) fglrx(0): xdl_xs113_atiddxDisplayScreenEnableDisplays
[ 1684.468] (II) fglrx(0): User Preference Output DFP1 using refresh rate 60.0 Hz.
[ 1684.537] (II) fglrx(0): User Preference Output DFP10 using refresh rate 60.0 Hz.
When reconnected:
[ 1694.077] (II) fglrx(0): Hot-plug event occurs on device: 1:0:0
[ 1694.210] (II) fglrx(0): EDID vendor "DEL", prod id 40993
+-- 3 lines: [ 1694.210] (II) fglrx(0): Using hsync ranges from config file-----------------------------------------------------------------------------------------------------
+-- 9 lines: [ 1694.210] (II) fglrx(0): Modeline "1600x1200"x0.0 162.00 1600 1664 1856 2160 1200 1201 1204 1250 +hsync +vsync (75.0 kHz eP)----------------------------------
[ 1694.219] (II) fglrx(0): xdl_xs113_atiddxDisplayScreenEnableDisplays
[ 1694.219] (II) fglrx(0): User Preference Output DFP1 using refresh rate 60.0 Hz.
[ 1694.288] (II) fglrx(0): User Preference Output DFP9 using refresh rate 60.0 Hz.
[ 1694.359] (II) fglrx(0): User Preference Output DFP10 using refresh rate 60.0 Hz.
私はXmonadを使用しており、接続されていると見なされるかどうかに関係なく、これら3つのデバイスに常に出力したいので、ホットプラグについては本当に気にしません。私がやりたいことをするようにビデオドライバーを構成する方法があるかもしれませんが、オプションが存在するかどうかはわかりませんし、まだ良い情報が見つからないので、ここで尋ねています。これが正しく機能している場合、これら2つのコマンドの出力は同じであり、HDTVのオフ/オン以外に視覚的に何も起こりません。
$ xrandr | grep 'DFP.* connected'
DFP1 connected 2560x1600+1920+0 (normal left inverted right x axis y axis) 641mm x 401mm
DFP9 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 708mm x 398mm
DFP10 connected 1200x1600+4480+0 left (normal left inverted right x axis y axis) 367mm x 275mm
$ xrandr --verbose --output 'DFP9' --off
screen 0: 3760x1600 994x423 mm 96.08dpi
crtc 0: 2560x1600 60.0 +0+0 "DFP1"
crtc 2: 1600x1200 60.0 +2560+0 "DFP10"
$ xrandr | grep 'DFP.* connected'
DFP1 connected 2560x1600+0+0 (normal left inverted right x axis y axis) 641mm x 401mm
DFP9 connected (normal left inverted right x axis y axis)
DFP10 connected 1200x1600+2560+0 left (normal left inverted right x axis y axis) 367mm x 275mm
$ xrandr --verbose --output 'DFP9' --preferred --pos 0x0 --output 'DFP1' --preferred --pos 1920x0 --output DFP10 --preferred --pos 4480x0
screen 0: 5680x1600 1501x423 mm 96.08dpi
crtc 0: 2560x1600 60.0 +1920+0 "DFP1"
crtc 1: 1920x1080 60.0 +0+0 "DFP9"
crtc 2: 1600x1200 60.0 +4480+0 "DFP10"
$ xrandr | grep 'DFP.* connected'
DFP1 connected 2560x1600+1920+0 (normal left inverted right x axis y axis) 641mm x 401mm
DFP9 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 708mm x 398mm
DFP10 connected 1200x1600+4480+0 left (normal left inverted right x axis y axis) 367mm x 275mm
私はこの問題を何週間も修正しようとしています。私が得た最善の方法は、ディスプレイとその位置を私が何に設定するかを設定するxrandrスクリプトを設定し、そのスクリプトをキーボードショートカットにバインドすることでした。そうすれば、1台のモニターの電源を切ったり、スリープから復帰したりするたびに、ショートカットを押すと、すべてのディスプレイが希望どおりに設定されます。
私のスクリプト:
まず、コマンドxrandrを実行して、ディスプレイの名前を取得しました。私にとっては、DP3.1、DP3.2、DP-4でした。
次に、解像度と相対位置の両方を使用してコマンドを設定します。
xrandr --output DP-3.1 --auto --output DP-3.2 --auto --right-of DP-3.1 --output DP-4 --auto --right-of DP-3.2
Xrandrがこれらの設定を単に「記憶」し、決して変更しないと、はるかに良いでしょう。モニターがスリープから復帰すると、モニターがプラグが抜かれていることを検出し、問題が発生するため、このスクリプトが必要になります。実行には数秒かかります。