Ignorar os eventos de hotplug de monitor usando x11 e uma placa AMD

5

Eu tenho uma configuração de monitor triplo (xorg.conf gerado com amdcccle: link ) rodando no Arch Linux com o Xmonad como meu gerenciador de janelas. Fisicamente, há uma HDTV à esquerda, um belo monitor no centro e um monitor girado para a direita. Como minha HDTV tem apenas uma entrada HDMI, estou usando um comutador de 4 entradas e 2 saídas com alguns outros dispositivos. Minha HDTV nem sempre está conectada, o que faz com que essa seção da minha área de trabalho virtual seja desativada. Isso causa muitos aborrecimentos:

  1. An annoying screen flicker due to the driver's hotplug event (which basically runs xrandr --auto).
  2. The physical screen order gets changed (the hdtv becomes the third monitor instead of the first), causing my keybindings for focusing on a screen to be wrong. I have made this a non-issue with my xmonad config, but the bindings still change when there are only two monitors detected.
  3. If I start my computer without the HDTV connected, that section of my virtual desktop isn't usable until it becomes connected on the hotplug event or I run xrandr to enable it.
  4. Windows from the workspace on the disconnected monitor are moved to other workspaces on visible monitors. This basically means any windows that were showing on my HDTV get thrown around randomly, which is pointless because of the way Xmonad handles workspaces.
  5. I can't put one or two monitors into dpms standby or turn a display off manually with xrandr --off because the others will freak out. For example, if I was just using my tv to watch something, I don't necessarily want the other two monitors to be turned on, but I want their window positions kept intact.

Quando eu troco as entradas no interruptor HDMI ou o ligo / desliga, ou desconecto fisicamente os cabos, isso é interpretado pelo driver de vídeo como desconectando o meu monitor e é removido do meu desktop virtual. Eu quero que o X sempre aja como se todos esses três monitores estivessem conectados e não respondessem a nenhum evento de hotplug do monitor. É ótimo que o Linux seja capaz de trabalhar com configuração xorg totalmente automática, mas eu quero essa configuração exata o tempo todo até que eu mude meu hardware. Os eventos do hotplug ficam assim nos meus logs do 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.

Eu realmente não me preocupo com o hotplugging porque estou usando o Xmonad e prefiro sempre gerar saída para esses três dispositivos, independentemente de serem considerados conectados ou não. Pode haver alguma maneira de configurar o driver de vídeo para fazer o que eu quero, mas não tenho certeza se a opção existe e ainda não encontrei nenhuma informação boa, por isso estou perguntando aqui. Se isso estivesse funcionando corretamente, a saída desses dois comandos seria idêntica e não faria nada acontecer visualmente além do desligamento / reinício da 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
    
por s00pcan 02.02.2013 / 19:49

1 resposta

1

Estou tentando corrigir esse problema há semanas. O melhor que consegui foi criar um script xrandr que definisse as exibições e a posição delas para o que eu ligava esse script a um atalho de teclado. Dessa forma, sempre que eu desligar um monitor ou acordar do sono, pressiono o atalho e todos os monitores ficam configurados para o que eu quero.

Meu script:

Primeiro eu tenho os nomes dos meus monitores executando o comando xrandr. Para mim, eles eram DP3.1, DP3.2 e DP-4.

Depois, defino meu comando com a resolução e a posição relativa deles:

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

Seria muito melhor se xrandr simplesmente "lembrasse" essas configurações e nunca mudasse. Quando meus monitores despertam do sono, eles são detectados como desconectados e bagunçam as coisas, exigindo esse script, que leva alguns segundos para ser executado.

    
por 08.12.2016 / 14:53