Zignoruj ​​zdarzenia hotplugowania monitora za pomocą x11 i karty AMD

5

Mam potrójną konfigurację monitora (xorg.conf wygenerowaną przez amdcccle: http://pastebin.com/gWSVEyLa ) działającą na Arch Linux z Xmonad jako moim menedżerem okien. Fizycznie po lewej stronie znajduje się telewizor HDTV, ładny monitor Dell w środku i obrócony monitor w prawo. Ponieważ mój telewizor HDTV ma tylko jedno wejście HDMI, używam przełącznika wyjścia 4, 2 wyjścia z niektórymi innymi urządzeniami. Mój telewizor HD nie zawsze jest podłączony, co powoduje wyłączenie tej sekcji mojego wirtualnego pulpitu. Powoduje to wiele niedogodności:

  1. Irytujące migotanie ekranu ze względu na zdarzenie hotplug sterownika (które w zasadzie uruchamia xrandr --auto).
  2. Fizyczna kolejność ekranów ulega zmianie (hdtv staje się trzecim monitorem zamiast pierwszego), co powoduje, że moje skróty klawiszowe do ustawiania ostrości na ekranie są nieprawidłowe. Zrobiłem to bez problemu z moją konfiguracją xmonad, ale powiązania wciąż się zmieniają, gdy wykryte są tylko dwa monitory.
  3. Jeśli uruchomię komputer bez podłączonego telewizora HDTV, ta sekcja wirtualnego pulpitu nie będzie użyteczna, dopóki nie zostanie połączona ze zdarzeniem hotplug lub uruchomię xrandr, aby ją włączyć.
  4. Okna z obszaru roboczego na odłączonym monitorze są przenoszone do innych obszarów roboczych na widocznych monitorach. Zasadniczo oznacza to, że wszystkie okna, które były wyświetlane na moim telewizorze HDTV, są wyrzucane losowo, co jest bezcelowe ze względu na sposób, w jaki Xmonad obsługuje obszary robocze.
  5. Nie mogę przełączać jednego lub dwóch monitorów w tryb gotowości dpms ani ręcznie wyłączać wyświetlacza, xrandr --offponieważ inne będą wariować. Na przykład, jeśli tylko oglądałem telewizję, niekoniecznie chcę, aby pozostałe dwa monitory były włączone, ale chcę, aby ich pozycje w oknie pozostały nienaruszone.

Kiedy przełączam wejścia na przełączniku HDMI, włączam / wyłączam go lub fizycznie odłączam kable, mój sterownik wideo interpretuje to jako odłączenie monitora i usunięcie go z wirtualnego pulpitu. Chcę, aby X zawsze zachowywał się tak, jakby wszystkie trzy z tych monitorów były podłączone i nie reagował na żadne zdarzenia związane z podłączaniem monitora. To wspaniale, że Linux jest w stanie pracować z całkowicie automatyczną konfiguracją xorg, ale chcę tę dokładną konfigurację przez cały czas, dopóki nie zmienię sprzętu. Wydarzenia hotplug wyglądają następująco w moich dziennikach 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.

Naprawdę nie dbam o hotplugging, ponieważ używam Xmonada i wolę zawsze wyświetlać dane na tych trzech urządzeniach, niezależnie od tego, czy są one uważane za połączone. Może być jakiś sposób skonfigurowania sterownika wideo do robienia tego, co chcę, ale nie jestem pewien, czy istnieje taka opcja i nie znalazłem jeszcze żadnych dobrych informacji, więc pytam tutaj. Gdyby to działało poprawnie, dane wyjściowe tych dwóch poleceń byłyby identyczne i nie spowodowałyby niczego wizualnego oprócz wyłączenia / włączenia 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
s00pcan
źródło

Odpowiedzi:

1

Od tygodni próbuję rozwiązać ten problem. Najlepsze, co dostałem, to skonfigurowanie skryptu xrandr, który ustawia wyświetlacze i ich pozycję do tego, co ja i powiązałem ten skrypt ze skrótem klawiaturowym. W ten sposób za każdym razem, gdy wyłączam jeden monitor lub budzę się ze snu, naciskam skrót, a wszystkie wyświetlacze są ustawiane zgodnie z tym, czego chcę.

Mój skrypt:

Najpierw uzyskałem nazwy moich wyświetlaczy, uruchamiając polecenie xrandr. Dla mnie były to DP3.1, DP3.2 i DP-4.

Następnie ustawiłem polecenie z ich rozdzielczością i względną pozycją:

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

Byłoby o wiele przyjemniej, gdyby xrandr po prostu „zapamiętał” te ustawienia i nigdy się nie zmienił. Kiedy moje monitory budzą się ze snu, wykrywa je jako odłączone od zasilania i psuje rzeczy, wymagając tego skryptu, którego uruchomienie zajmuje kilka sekund.

PaulS
źródło
Ostatecznie rozwiązaniem, które ostatecznie wdrożyłem, jest bałagan zdarzeń udev i skryptów xrandr. Mam przełącznik DisplayPort, więc kiedy zmieniam wejście, mój środkowy monitor znika, co wciąż ma problemy (czasami duplikuje wyświetlanie moich dwóch innych monitorów).
s00pcan