Come forzare la risoluzione corretta di più monitor per LightDM?


17

Sono interessato dal BUG: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Altrimenti, se come me hai un laptop collegato a un secondo monitor ad alta risoluzione, LIGHTDM a la fase di accesso, rispecchia i display in entrambe le schermate e assegna loro una risoluzione comune (1024X768) nel mio caso, invece di estendere il desktop (schermata principale con il messaggio di benvenuto e secondaria con solo un logo, come menzionato nel libro delle specifiche UX di Multiple Monitors per 12.04).

Ecco il mio 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)

Ho provato a forzare lightdm ad eseguire alcuni comandi xrandr al fine di impostare la giusta risoluzione per ciascun monitor ed estendere il desktop, quindi ho creato un semplice script chiamato /usr/share/lightdmxrand.sh :

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

E disse a lightdm di eseguirlo: /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

riavviato lightdm: sudo restart lightdm E la schermata di accesso dell'unità greeter era corretta. Schermi con le rispettive risoluzioni corrette e se sposto il mouse su uno schermo, viene messo a fuoco con la casella di accesso e il pannello, mentre lo schermo sfocato visualizza solo un logo Ubuntu (proprio come specificato nel libro delle specifiche MM UX). Fantastico!

Questa soluzione alternativa funziona perfettamente finché il monitor esterno è collegato al laptop. Nella situazione in cui non è collegato, nella fase di accesso, ottengo: un ERRORE MODALITÀ GRAFICA BASSO (Stai funzionando in modalità grafica bassa, lo schermo, i dispositivi di input ... non sono stati rilevati ..). Normale, perché xrandrtenta di eseguire l'output su un monitor non collegato.

La domanda qui è come dovrei modificare lo script in modo tale che quando il monitor esterno non è collegato xrandresce solo sullo schermo del laptop e ignora qualsiasi monitor esterno. PER ESEMPIO:

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)

Grazie in anticipo.

Risposte:


18

NOTA: ho anche pubblicato questa risposta qui

Ho trovato una soluzione molto semplice che funziona perfettamente con me in esecuzione 13.04. su un laptop con uno schermo esterno da 24 "che non è collegato in modo permanente.

Copierò da qui

  1. accesso
  2. usa xrandr o l'utility di controllo Display per configurare i tuoi monitor come desideri che vengano configurati nella schermata di accesso
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Dato che i miei monitor erano già configurati correttamente, dovevo solo eseguire il passaggio 3.


9

Ho gestito questo piccolo script di base che risponde alla mia domanda. Ora, indipendentemente dal fatto che il monitor esterno sia collegato o meno, Lightdm utilizza le giuste risoluzioni nella fase di benvenuto. Tuttavia, questo stesso script deve essere modificato per essere generico , in modo che l'utente non debba specificare risoluzioni manuali del suo laptop e schermi del monitor.

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

Quindi, se qualcuno ha una soluzione migliore o una sceneggiatura più generica, è l'uomo.

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;

2

Mille grazie Hanynowsky! Trovare la tua risposta mi ha fatto risparmiare un sacco di lavoro (aggiornato di recente il 12.04). Tuttavia nel mio caso non ha fornito la soluzione completa, quindi vorrei aggiungere ciò che ho imparato. La mia configurazione era un Samsung S22A300B collegato alla porta VGA di un Vaio VGN-CR120E con display 1280x800 incorporato e un controller grafico integrato mobile GM965 / GL960.

In breve quello che ho trovato è stato:

  • La risoluzione massima che ho potuto impostare sul display Samsung esterno utilizzando l'impostazione del sistema display era 1024x768.
  • Ciò è apparentemente causato perché il mio controller VGA non supporta EDID. Per qualche motivo sia Windows Vista che Windows 7 (su un laptop diverso) possono gestire questa situazione e fornire una gamma completa di risoluzioni.

Per ovviare a questa risoluzione massima limitata ho fatto quanto segue:

  • Aggiunte righe allo script per richiamare xrandr con --newmode e --addmode
  • Ho provato a generare il modello --newmode per 1920x1080, ma sfortunatamente non ha funzionato per la mia configurazione.
  • Preso in prestito un laptop con una porta HDMI, avviato con il Samsung collegato e preso la modline per 1920x1080 56,2 kHz da /var/log/Xorg.0.log
  • Ho collegato quella modline insieme alla modifica dello script per la mia configurazione (ad es. HDMI1-> VGA1, risoluzione corretta del laptop, ecc.)

Questo QUASI ha funzionato, ma dopo l'accesso il monitor esterno è stato ripristinato da un bel 1920x1080 a 1024x768. Si è scoperto che si trattava di un'impostazione utente persistente ed è stata facilmente risolta utilizzando le Impostazioni di sistema Display ... (dal menu a forma di ingranaggio) al 1920x1080 ora disponibile. Ora, quando avvio con il monitor esterno collegato, tutto funziona come previsto.

Un altro problema tecnico: se questo script viene eseguito due volte (ad esempio dal terminale), la riga xrandr --newmode visualizzerà un errore "BadName (nome o carattere non esiste)", ma /programming/ 851704 / xrandr-errors-badname-named-color-or-font-in-non-ha spiegato questo e sembra benigno. Inoltre, non dovrebbe essere un problema quando lo script è collegato lightdm.conf secondo le istruzioni di Hanynowsky e viene eseguito manualmente.

Sto fornendo le modifiche adattate per quanto sopra (VGA senza funzionalità EDID) nella speranza che possa aiutare qualcun altro. Come menzionato nelle risposte precedenti, dovrai adattarlo per la tua configurazione. Non ho alcun buon consiglio su come ottenere la modline corretta, ma se qualcun altro lo fa per favore chip in.

#!/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: non sono sicuro che l'Eval sia necessario (rispetto all'eco nell'originale). L'ho inserito prima di scoprire che le mie impostazioni di Display ... stavano ripristinando il display esterno a una risoluzione inferiore.


Di niente @Walter Wittel e grazie per il tuo prezioso contributo. Una volta che avrò tempo, proverei a capire uno script più generico, se possibile; ma dubito che sarebbe possibile estrarre la modline corretta per un monitor non EDID usando XRANDR. In ogni caso, vediamo.
Hanynowsky,

1

Ho scoperto che invece di usare --mode per dichiarare esplicitamente la risoluzione, --auto sceglierà la migliore soluzione per te (la più grande credo).

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

1
hachi la tua sceneggiatura funziona alla grande! Chiunque sia affetto da questo bug deve solo inserire la corretta risoluzione dei propri display in questo script e riavviare lightdm: sudo restart lightdm è tutto! Funziona tutto alla grande! Ho pubblicato la mia domanda su questo problema qui: askubuntu.com/questions/181112/…
coscienziere,

0

Se stai usando il programma di benvenuto GTK di LightDM, puoi eseguire xrandr -qper trovare i nomi dei tuoi monitor, quindi modificare /etc/lightdm/lightdm-gtk-greetere impostare la proprietà active-monitorcome descritto nei commenti all'interno di quel file. Questa proprietà può assumere più valori ordinati anche #cursorper il monitor che attualmente mostra il cursore del mouse.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.