Como forçar resoluções corretas de Monitores Múltiplos para LightDM?

17

Eu sou afetado pelo BUG: link Caso contrário, se como eu, você tem um laptop conectado a um segundo monitor de resolução mais alta, LIGHTDM no estágio de login, espelha os displays nas duas telas e atribui a eles um resolução (1024X768) no meu caso, em vez de estender a área de trabalho (tela principal com o greeter e secundário com apenas um logotipo, como mencionado no livro de especificações Multiple Monitors UX para 12,04).

Aqui está meu xrandr -q

@L502X:~$ xrandr -q
Screen 0: minimum 320 x 200, current 1920 x 1848, maximum 8192 x 8192
LVDS1 connected 1366x768+309+1080 (normal left inverted right x axis y axis) 344mm x 193mm
   1366x768       60.0*+
   1360x768       59.8     60.0  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 510mm x 287mm
   1920x1080      60.0*+
   1600x1200      60.0  
   1680x1050      60.0  
   1280x1024      60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x800       59.8  
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        60.0  
DP1 disconnected (normal left inverted right x axis y axis)

Eu tentei forçar lightdm a executar alguns comandos xrandr para definir a resolução correta para cada monitor e estender a área de trabalho, então criei um script simples chamado /usr/share/lightdmxrand.sh :

#!/bin/sh
xrandr --output HDMI1 --primary --mode 1920x1080 --output LVDS1 --mode 1366x768 --below HDMI1

E disse ao lightdm para executá-lo: /etc/lightdm/lightdm.conf

[SeatDefaults]
greeter-session=unity-greeter
user-session=ubuntu
greeter-setup-script=/usr/bin/numlockx on
display-setup-script=/usr/share/lightdmxrandr.sh

restarted lightdm: sudo restart lightdm E a tela de login do greeter de unidade estava correta. Telas com suas respectivas resoluções corretas e se eu mover o mouse para uma tela, ele fica focado com a caixa de login e o painel, enquanto a tela desfocada exibe apenas um logotipo do Ubuntu (exatamente como especificado no caderno de especificações do MM UX). Fantástico!

Esta solução alternativa funciona muito bem, desde que o monitor externo esteja conectado ao laptop. Na situação em que não está conectado, no estágio de login, recebo: um ERRO DE MODO BAIXO DE GRÁFICOS (Você está executando no modo de gráficos baixos, sua tela, dispositivos de entrada ... não foram detectados ...). Normal, porque xrandr tenta enviar para um monitor não conectado.

A pergunta aqui é como devo modificar o script de forma que, quando o monitor externo não estiver conectado, xrandr envie apenas para a tela do laptop e ignore qualquer monitor externo. E.G:

If (xrandr -q | grep 'HDMI1 connected') != NULL (HDMI1 is connected )
then xrandr --output HDMI1 --primary --mode 1920x1080 --output LVDS1 --mode 1366x768 --below HDMI1
else xrandr --output LVDS1 --mode 1366x768 (or do nothing - because the resolution of the laptop screen is correct when no external monitor is connected)

Obrigado antecipadamente.

    
por Hanynowsky 08.04.2012 / 01:21

5 respostas

9

Eu gerenciei este pequeno script básico abaixo que responde à minha pergunta. Agora, se o monitor externo está conectado ou não, o Lightdm usa as resoluções corretas no estágio de boas-vindas. No entanto, esse mesmo script precisa ser modificado para ser genérico , de forma que o usuário não precise especificar manualmente as resoluções de seu laptop e telas de monitor.

 (Parse the output of 'XRAND -q' command, 
identify the connected devices, 
grab their first/maximum resolutions 
and use 'XRANDR --output' to display them). 

Então, se alguém tiver uma solução melhor ou um roteiro mais genérico, ele é o cara.

SCRIPT:

    #!/bin/bash
    # V-1.0 by Hanynowsky - April 2012. 
    # I am a very basic script that works around bug 874241 repprted in launchpad.

    XCOM0='xrandr -q | grep 'HDMI1 connected''
    XCOM1='xrandr --output HDMI1 --primary --mode 1920x1080 --output LVDS1 --mode 1366x768 --below HDMI1'
    XCOM2='xrandr --output LVDS1 --mode 1366x768'
    # if the external monitor is connected, then we tell XRANDR to set up an extended desktop
    if [ -n "$XCOM0" ] || [ ! "$XCOM0" = "" ]; then echo $XCOM1
    # if the external monitor is disconnected, then we tell XRANDR to output only to the laptop screen
    else echo $XCOM2
    fi
    exit 0;
    
por Hanynowsky 08.04.2012 / 05:59
18

OBSERVAÇÃO: também postei esta resposta aqui

Eu encontrei uma solução muito simples que funciona perfeitamente para mim rodando 13.04. em um laptop com uma tela externa de 24 "que não está permanentemente conectada.

Eu apenas copio de aqui

% bl0ck_qu0te%

Desde que eu já tive meus monitores configurados corretamente eu tive que fazer o passo 3.

    
por Tobold 13.08.2013 / 10:49
2

Muito obrigado Hanynowsky! Encontrar sua resposta me poupou muito trabalho (recentemente atualizado 12.04). No entanto, no meu caso, não forneceu a solução completa, por isso gostaria de acrescentar o que aprendi. Minha configuração foi um Samsung S22A300B conectado à porta VGA de um Vaio VGN-CR120E com tela embutida 1280x800 e um controlador gráfico integrado GM965 / GL960 móvel.

Resumidamente, o que encontrei foi:

  • A resolução máxima que eu pude definir no monitor externo da Samsung usando a configuração do sistema de monitores foi de 1024x768.
  • Isso aparentemente foi causado porque meu controlador VGA não suporta o EDID. Por alguma razão, o Windows Vista e o Windows 7 (em um laptop diferente) podem lidar com essa situação e fornecer uma gama completa de resoluções.

Para contornar essa resolução máxima limitada, fiz o seguinte:

  • Linhas adicionadas ao seu script para chamar xrandr com --newmode e --addmode
  • Tentei cvt para gerar a modeline --newmode para 1920x1080, mas infelizmente não funcionou para minha configuração.
  • Pedi emprestado um laptop com uma porta HDMI, inicializei com o Samsung conectado e peguei a modline para 1920 x 1080 56,2 kHz fora do /var/log/Xorg.0.log
  • Conectei essa modline junto com a modificação do script da minha configuração (por exemplo, HDMI1- > VGA1, resolução correta do laptop, etc.)

Este QUASE funcionou, mas após o logon o monitor externo foi reiniciado de uma agradável 1920x1080 para 1024x768. Descobriu-se que essa era uma configuração de usuário persistente e que era facilmente corrigida com o uso dos Displays ... System Setting (do menu de roda dentada) para o agora disponível 1920x1080. Agora, quando eu inicializo com o monitor externo conectado, tudo funciona como esperado.

Uma falha adicional: Se este script for executado duas vezes (por exemplo, do terminal), a linha xrandr --newmode receberá um erro "BadName (cor ou fonte nomeada não existe)", mas link explicou isso e parece benigno. Também não deve ser um problema quando o script estiver ligado ao lightdm.conf de acordo com as instruções de Hanynowsky vs. executar manualmente.

Estou fornecendo as alterações adaptadas para o acima (VGA sem funcionalidade EDID) na esperança de que isso ajude alguém. Como mencionado nas respostas anteriores, você terá que adaptar isso para sua própria configuração. Eu não tenho nenhum bom conselho sobre como obter a modline correta, mas se outra pessoa fizer isso, por favor, participe.

#!/bin/bash
# Modified for Vaio with 1920x1080 external on VGA
XCOM0='xrandr -q | grep 'VGA1 connected''
XCOM1="xrandr --output VGA1 --primary --mode 1920x1080 --output LVDS1 --mode 1280x800 --left-of VGA1"
XCOM2="xrandr --output LVDS1 --mode 1280x800"
NEWMODE="xrandr --newmode "1920x1080" 148.50  1920 2448 2492 2640  1080 1084 1089 1125 +hsync +vsync"
ADDMODE="xrandr --addmode VGA1 1920x1080"

# Always add this mode in case we need it (better would be to test first)
eval $NEWMODE
eval $ADDMODE

if [ -n "$XCOM0" ] || [ ! "$XCOM0" = "" ];
then
        # if the external monitor is connected, then we tell XRANDR to set up an extended desktop
        eval $XCOM1
else
        # if the external monitor is disconnected, then we tell XRANDR to output only to the laptop screen
        eval $XCOM2
fi
exit 0;

NOTA: Não tenho certeza se o eval é necessário (vs. eco no original). Eu coloquei isso antes de descobrir que minhas configurações de Display ... estavam redefinindo o monitor externo para uma resolução mais baixa.

    
por Walter Wittel 30.04.2012 / 03:53
1

Descobri que, em vez de usar --mode para declarar explicitamente a resolução, --auto escolherá a melhor resolução para você (a maior que eu acredito).

#!/bin/bash

XCOM0='xrandr -q | grep 'VGA1 connected''
XCOM1='xrandr --output LVDS1 --primary --auto --output VGA1 --auto --right-of LVDS1'
XCOM2='xrandr --output LVDS1 --primary --auto'
# if the external monitor is connected, then we tell XRANDR to set up an extended desktop
if [ -n "$XCOM0" ] || [ ! "$XCOM0" = "" ]; then echo $XCOM1
# if the external monitor is disconnected, then we tell XRANDR to output only to the laptop screen
else echo $XCOM2
fi

exit 0;
    
por hachi 11.08.2012 / 23:40
0

Se você estiver usando o grek GTK do LightDM, poderá executar xrandr -q para localizar os nomes de seus monitores e, em seguida, editar /etc/lightdm/lightdm-gtk-greeter e definir a propriedade active-monitor conforme descrito nos comentários dentro desse arquivo. Esta propriedade pode ter vários valores ordenados, incluindo #cursor para o monitor que atualmente mostra o cursor do mouse.

    
por Dzamo Norton 04.04.2018 / 04:57