¿Cómo forzar la resolución correcta de múltiples monitores para LightDM?

17

El ERROR me afecta: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 De lo contrario, si como yo tiene una computadora portátil conectada a un segundo monitor de mayor resolución, LIGHTDM en la etapa de inicio de sesión, refleja las pantallas en ambas pantallas y les asigno una resolución común (1024X768) en mi caso, en lugar de extender el escritorio (pantalla principal con la pantalla de bienvenida y secundaria con solo un logotipo como se menciona en el libro de especificaciones de Monitores múltiples UX para 12.04).

Aquí está mi 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)

Intenté forzar a lightdm a ejecutar algunos comandos xrandr para establecer la resolución correcta para cada monitor y extender el escritorio, así que creé un script simple llamado /usr/share/lightdmxrand.sh :

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

Y le dije a lightdm que lo ejecutara: /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 Y la pantalla de inicio de sesión de Unity Greeter era correcta. Pantallas con sus respectivas resoluciones correctas y si muevo el mouse a una pantalla, se enfoca con el cuadro de inicio de sesión y el panel, mientras que la pantalla desenfocada solo muestra un Logotipo de Ubuntu (tal como se especifica en el libro de especificaciones de MM UX). ¡Fantástico!

Esta solución funciona muy bien siempre que el monitor externo esté conectado a la computadora portátil. En la situación en la que no está conectado, en la etapa de inicio de sesión, obtengo: un ERROR DE MODO DE GRÁFICOS BAJOS (está ejecutando en modo de gráficos bajos, su pantalla, dispositivos de entrada ... no se detectaron ...). Normal, porque xrandrintenta enviar a un monitor no conectado.

La pregunta aquí es cómo debería modificar el script de manera que cuando el monitor externo no esté conectado xrandr, solo salga a la pantalla del portátil e ignore cualquier monitor externo. P.EJ:

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)

Gracias por adelantado.

Hanynowsky
fuente

Respuestas:

18

NOTA: también publiqué esta respuesta aquí

Encontré una solución muy simple que funciona perfectamente para mí ejecutando 13.04. en una computadora portátil con una pantalla externa de 24 "que no está conectada permanentemente.

Solo copiaré desde aquí

  1. iniciar sesión
  2. use xrandr o la utilidad de control Displays para configurar sus monitores como desea que se configuren en la pantalla de inicio de sesión
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Como ya tenía mis monitores configurados correctamente, solo tenía que hacer el paso 3.

Tobold
fuente
9

Logré este pequeño script básico a continuación que responde a mi pregunta. Ahora, ya sea que el monitor externo esté conectado o no, Lightdm usa las resoluciones correctas en la etapa de bienvenida. Sin embargo, este mismo script debe modificarse para que sea genérico , de manera que el usuario no necesite especificar manualmente las resoluciones de su computadora portátil y pantallas 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). 

Entonces, si alguien tiene una mejor solución o un script más genérico, él es el hombre.

GUIÓN:

    #!/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
fuente
2

Muchas gracias Hanynowsky! Encontrar su respuesta me ahorró un montón de trabajo (actualizado recientemente 12.04). Sin embargo, en mi caso no proporcionó la solución completa, así que me gustaría agregar lo que aprendí. Mi configuración fue un Samsung S22A300B conectado al puerto VGA de un Vaio VGN-CR120E con pantalla incorporada de 1280x800 y un controlador de gráficos integrado Mobile GM965 / GL960.

Brevemente lo que encontré fue:

  • La resolución máxima que pude establecer en la pantalla externa de Samsung usando la Configuración del sistema de pantallas fue 1024x768.
  • Aparentemente esto fue causado porque mi controlador VGA no es compatible con EDID. Por alguna razón, tanto Windows Vista como Windows 7 (en una computadora portátil diferente) pueden manejar esta situación y proporcionar una gama completa de resoluciones.

Para solucionar esta resolución máxima limitada, hice lo siguiente:

  • Se agregaron líneas a su script para invocar xrandr con --newmode y --addmode
  • Intenté cvt para generar la línea de modo --newmode para 1920x1080, pero desafortunadamente no funcionó para mi configuración.
  • Pidió prestada una computadora portátil con un puerto HDMI, la arrancó con el Samsung enchufado y agarró la línea de modulación para 1920x1080 56.2 kHz de /var/log/Xorg.0.log
  • Conecté esa línea de modulación junto con la modificación de su script para mi configuración (por ejemplo, HDMI1-> VGA1, resolución correcta de la computadora portátil, etc.)

Esto casi funcionó, pero después de iniciar sesión, el monitor externo se reinició de 1920x1080 a 1024x768. Resultó que esta era una configuración de usuario persistente y se solucionó fácilmente mediante el uso de la Configuración del sistema de pantallas (desde el menú de ajustes) hasta el 1920x1080 ahora disponible. Ahora, cuando inicio con el monitor externo conectado, todo funciona como se esperaba.

Una falla adicional: si este script se ejecuta dos veces (por ejemplo desde la terminal), la línea xrandr --newmode obtendrá un error "BadName (el nombre del color o la fuente no existe)", pero /programming/ 851704 / xrandr-errors-badname-named-color-or-font-not-not-exist explicó esto y parece benigno. Tampoco debería ser un problema cuando el script está conectado a lightdm.conf según las instrucciones de Hanynowsky en lugar de ejecutarse manualmente.

Estoy proporcionando los cambios adaptados para lo anterior (VGA sin funcionalidad EDID) con la esperanza de que ayude a alguien más. Como se mencionó en las respuestas anteriores, tendrá que adaptar esto para su propia configuración. No tengo ningún buen consejo sobre cómo obtener la línea de modulación correcta, pero si alguien más lo hace, por favor ingrese.

#!/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: No estoy seguro si la evaluación es necesaria (vs. echo en el original). Puse esto antes de descubrir que mis configuraciones de pantallas ... restablecían la pantalla externa a una resolución más baja.

Walter Wittel
fuente
De nada @Walter Wittel y gracias por su valiosa contribución. Una vez que tenga tiempo, trataría de encontrar un script más genérico si es posible; pero dudo que sea posible extraer la línea de modulación correcta para un monitor sin EDID usando XRANDR. De todos modos, veamos.
Hanynowsky
1

Descubrí que en lugar de usar --mode para establecer explícitamente la resolución, --auto elegirá la mejor resolución para usted (la más grande, creo).

#!/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
fuente
1
hachi tu script funciona muy bien! Cualquier persona afectada con este error solo tiene que poner la resolución correcta de sus pantallas en este script y reiniciar lightdm: sudo restart lightdm ¡eso es todo! ¡Todo funciona muy bien! He publicado mi pregunta sobre este problema aquí: askubuntu.com/questions/181112/…
concientista el
0

Si está utilizando el saludo GTK de LightDM, puede ejecutar xrandr -qpara encontrar los nombres de sus monitores y luego editar /etc/lightdm/lightdm-gtk-greetery configurar la propiedad active-monitorcomo se describe en los comentarios dentro de ese archivo. Esta propiedad puede tomar múltiples valores ordenados, incluso #cursorpara el monitor que actualmente muestra el cursor del mouse.

Dzamo Norton
fuente