web-dev-qa-db-ja.com

x11とAMDカードを使用したモニターのホットプラグイベントを無視する

XmonadをウィンドウマネージャーとしてArchLinuxで実行しているトリプルモニターセットアップ(amdcccleで生成されたxorg.conf: http://Pastebin.com/gWSVEyLa )があります。物理的には、左側にHDTVがあり、中央にニースデルのモニターがあり、右側に回転したモニターがあります。私のHDTVにはHDMI入力が1つしかないため、他のいくつかのデバイスでは4入力2出力スイッチを使用しています。 HDTVが常に接続されているとは限らないため、仮想デスクトップのそのセクションが無効になります。これは多くの迷惑を引き起こします:

  1. ドライバーのホットプラグイベント(基本的にxrandr --autoを実行します)が原因で、画面がちらつきます。
  2. 物理的な画面の順序が変更され(hdtvが最初のモニターではなく3番目のモニターになります)、画面に焦点を合わせるためのキーバインドが間違っています。これをxmonad構成で問題にしないようにしましたが、検出されたモニターが2つしかない場合でも、バインディングは変更されます。
  3. HDTVを接続せずにコンピューターを起動した場合、仮想デスクトップのそのセクションは、ホットプラグイベントで接続されるか、xrandrを実行して有効にするまで使用できません。
  4. 切断されたモニターのワークスペースからのウィンドウは、表示されているモニターの他のワークスペースに移動されます。これは基本的に、HDTVに表示されていたウィンドウがランダムにスローされることを意味します。これは、Xmonadがワークスペースを処理する方法のために無意味です。
  5. 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
5
s00pcan

私はこの問題を何週間も修正しようとしています。私が得た最善の方法は、ディスプレイとその位置を私が何に設定するかを設定する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がこれらの設定を単に「記憶」し、決して変更しないと、はるかに良いでしょう。モニターがスリープから復帰すると、モニターがプラグが抜かれていることを検出し、問題が発生するため、このスクリプトが必要になります。実行には数秒かかります。

1
PaulS