Como forçar vários monitores a corrigir as resoluções do LightDM?

17

Sou afetado pelo erro: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Caso contrário, se como eu, você tiver um laptop conectado a um segundo monitor de maior resolução, o LIGHTDM em o estágio de login, espelha os monitores nas duas telas e atribui a eles uma resolução comum (1024X768) no meu caso, em vez de estender a área de trabalho (tela principal com o greeter e secundário com apenas um logotipo, conforme mencionado no livro de especificações do Multiple Monitors UX) para 12.04).

Aqui está o 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)

Tentei forçar o 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

reiniciado lightdm: sudo restart lightdm E a tela de login do unity greeter estava correta. Telas com suas respectivas resoluções corretas e se eu mover o mouse para uma tela, ele fica focado na caixa de login e no painel, enquanto a tela fora de foco apenas exibe um logotipo do Ubuntu (exatamente como especificado no livro 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 BAIXO ERRO DE MODO GRÁFICO (Você está executando no modo de gráficos baixos, sua tela, dispositivos de entrada ... não foram detectados ..). Normal, porque xrandrtenta enviar para um monitor não conectado.

A questão aqui é como devo modificar o script de uma maneira que, quando o monitor externo não estiver conectado, xrandrsaia apenas da tela do laptop e ignore qualquer monitor externo. POR EXEMPLO:

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)

Desde já, obrigado.

Hanynowsky
fonte

Respostas:

18

NOTA: Também publiquei esta resposta aqui

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

Vou copiar daqui

  1. Conecte-se
  2. use xrandr ou o utilitário de controle Displays para configurar seus monitores como você gostaria que eles fossem configurados na tela de login
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Como eu já tinha meus monitores configurados corretamente, apenas tive que executar a etapa 3.

Tobold
fonte
9

Eu gerenciei esse pequeno script básico abaixo que responde à minha pergunta. Agora, esteja o monitor externo conectado ou não, o Lightdm usa as resoluções corretas no estágio greeter. 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 suas telas de laptop e monitor.

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

Portanto, se alguém tem uma solução melhor ou um script mais genérico, ele é o cara.

ROTEIRO:

    #!/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;
Hanynowsky
fonte
2

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

Resumidamente, o que encontrei foi:

  • A resolução máxima que pude definir na tela externa da Samsung usando a Configuração do sistema de telas foi 1024x768.
  • Aparentemente, isso foi causado porque meu controlador VGA não suporta 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 solucionar essa resolução máxima limitada, fiz o seguinte:

  • Foram adicionadas linhas ao seu script para chamar o xrandr com --newmode e --addmode
  • Tentei o cvt para gerar a modelagem --newmode para 1920x1080, mas infelizmente não funcionou na minha configuração.
  • Emprestou um laptop com uma porta HDMI, inicializou-o com a Samsung conectada e pegou o modline para 1920x1080 56,2 kHz em /var/log/Xorg.0.log
  • Conecte esse modline e modifique seu script para a minha configuração (por exemplo, HDMI1-> VGA1, resolução correta do laptop etc.)

Isso QUASE funcionou, mas após o logon, o monitor externo foi redefinido de um bom 1920x1080 para 1024x768. Descobriu-se que essa era uma configuração persistente do usuário e foi facilmente corrigida usando a Configuração do sistema Monitores ... (no menu de roda dentada) até o 1920x1080 agora disponível. Agora, quando eu inicializo com o monitor externo conectado, tudo funciona como esperado.

Uma falha adicional: se esse script for executado duas vezes (por exemplo, no terminal), a linha xrandr --newmode receberá o erro "BadName (cor ou fonte com nome inexistente)", mas /programming/ 851704 / xrandr-errors-badname-nomeado-cor-ou-fonte-não-existe- explicou isso e parece benigno. Também não deve ser um problema quando o script é conectado ao lightdm.conf de acordo com as instruções de Hanynowsky e executado manualmente.

Estou fornecendo as alterações adaptadas para o descrito acima (VGA sem funcionalidade EDID) na esperança de ajudar alguém. Conforme mencionado nas respostas anteriores, você terá que adaptar isso para sua própria configuração. Não tenho bons conselhos para obter o modline correto, mas se alguém o fizer, faça o login.

#!/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 a avaliação é necessária (vs. eco no original). Coloquei isso antes de descobrir que minhas configurações de Monitores ... estavam redefinindo o monitor externo para uma resolução mais baixa.

Walter Wittel
fonte
De nada, @Walter Wittel e obrigado por sua valiosa contribuição. Quando eu tiver tempo, tentarei descobrir um script mais genérico, se possível; mas duvido que seria possível extrair a linha de modificação correta para um monitor não EDID usando XRANDR. De qualquer forma, vamos ver.
Hanynowsky
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;
hachi
fonte
1
hachi seu script funciona muito bem! Qualquer pessoa afetada por esse bug precisa colocar a resolução correta de suas exibições nesse script e reiniciar o lightdm: sudo restart lightdm é tudo! Tudo funciona muito bem! Eu afixei minha pergunta sobre este problema aqui: askubuntu.com/questions/181112/...
conscientist
0

Se você estiver usando o grek GTK do LightDM, poderá correr xrandr -qpara encontrar os nomes dos seus monitores, editar /etc/lightdm/lightdm-gtk-greetere definir a propriedade active-monitorconforme descrito nos comentários dentro desse arquivo. Essa propriedade pode receber vários valores ordenados, inclusive #cursorpara o monitor que atualmente mostra o cursor do mouse.

Dzamo Norton
fonte