Wie erzwinge ich die korrekte Auflösung mehrerer Monitore für LightDM?

17

Ich bin von dem BUG betroffen: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Ansonsten, wenn Sie wie ich einen Laptop an einen zweiten Monitor mit höherer Auflösung angeschlossen haben, LIGHTDM unter Die Anmeldephase spiegelt die Anzeigen in beiden Bildschirmen und weist ihnen in meinem Fall eine gemeinsame Auflösung (1024 x 768) zu, anstatt den Desktop (primärer Bildschirm mit dem Begrüßer und sekundärer Bildschirm mit nur einem Logo, wie im Lastenheft für Multiple Monitors UX angegeben) zu erweitern für 12.04).

Hier ist mein 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)

Ich habe versucht, lightdm zu zwingen, einige xrandr-Befehle auszuführen, um die richtige Auflösung für jeden Monitor festzulegen und den Desktop zu erweitern. Deshalb habe ich ein einfaches Skript mit dem Namen /usr/share/lightdmxrand.sh erstellt :

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

Und forderte lightdm auf, es auszuführen : /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

lightdm neu gestartet: sudo restart lightdm Und der Unity-Begrüßer-Anmeldebildschirm war korrekt. Bildschirme mit der jeweils richtigen Auflösung und wenn ich die Maus auf einen Bildschirm bewege, wird dieser mit dem Anmeldefeld und dem Bedienfeld scharfgestellt, während auf dem nicht scharfgestellten Bildschirm nur ein Ubuntu-Logo angezeigt wird (wie im MM UX-Spezifikationsbuch angegeben). Fantastisch!

Diese Problemumgehung funktioniert einwandfrei, solange der externe Monitor an den Laptop angeschlossen ist. In einer Situation, in der keine Verbindung besteht, erhalte ich beim Anmelden Folgendes: EINEN FEHLER IM NIEDRIGEN GRAFIKMODUS (Sie haben einen niedrigen Grafikmodus, Ihr Bildschirm, Ihre Eingabegeräte ... wurden nicht erkannt.). Normal, da xrandrversucht wird, auf einem nicht angeschlossenen Monitor auszugeben.

Die Frage ist hier, wie ich das Skript so ändern soll, dass, wenn der externe Monitor nicht angeschlossen ist xrandr, nur Ausgaben an den Laptopbildschirm gesendet werden und jeder externe Monitor ignoriert wird. Z.B:

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)

Danke im Voraus.

Hanynowsky
quelle

Antworten:

18

HINWEIS: Diese Antwort habe ich auch hier gepostet

Ich habe eine sehr einfache Problemumgehung gefunden, die für mich mit 13.04 perfekt funktioniert. auf einem Laptop mit einem 24 "externen Bildschirm, der nicht permanent verbunden ist.

Ich kopiere einfach von hier

  1. Einloggen
  2. Verwenden Sie xrandr oder das Dienstprogramm Displays, um Ihre Monitore so zu konfigurieren, wie Sie sie im Anmeldebildschirm konfigurieren möchten
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Da ich meine Monitore bereits richtig konfiguriert hatte, musste ich nur Schritt 3 ausführen.

Tobold
quelle
9

Ich habe dieses kleine grundlegende Skript verwaltet, das meine Frage beantwortet. Unabhängig davon, ob der externe Monitor angeschlossen ist oder nicht, verwendet Lightdm im Begrüßungsstadium die richtigen Auflösungen. Dennoch muss dasselbe Skript so geändert werden, dass es generisch ist , sodass der Benutzer die Auflösungen seines Laptops und seines Bildschirms nicht manuell festlegen muss.

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

Wenn also jemand eine bessere Lösung oder ein allgemeineres Skript hat, ist er der Mann.

SKRIPT:

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

Vielen Dank Hanynowsky! Das Finden Ihrer Antwort ersparte mir eine Menge Arbeit (vor kurzem aktualisiert 12.04). Da es in meinem Fall jedoch nicht die vollständige Lösung lieferte, möchte ich hinzufügen, was ich gelernt habe. Mein Setup war ein Samsung S22A300B, der an den VGA-Anschluss eines Vaio VGN-CR120E mit integriertem 1280x800-Display und einem mobilen integrierten Grafikcontroller GM965 / GL960 angeschlossen wurde.

Kurz gesagt, was ich gefunden habe, war:

  • Die maximale Auflösung, die ich mit der Systemeinstellung "Displays" auf dem externen Samsung-Display einstellen konnte, betrug 1024 x 768.
  • Dies wurde anscheinend verursacht, weil mein VGA-Controller EDID nicht unterstützt. Aus irgendeinem Grund können sowohl Windows Vista als auch Windows 7 (auf einem anderen Laptop) diese Situation bewältigen und eine Reihe von Auflösungen bereitstellen.

Um diese begrenzte maximale Auflösung zu umgehen, habe ich Folgendes ausgeführt:

  • Es wurden Zeilen zu Ihrem Skript hinzugefügt, um xrandr mit --newmode und --addmode aufzurufen
  • Ich habe versucht, mit cvt die Modeline --newmode für 1920 x 1080 zu generieren, aber leider hat es bei meinem Setup nicht funktioniert.
  • Leihte sich einen Laptop mit einem HDMI-Anschluss aus, bootete ihn mit angeschlossenem Samsung und holte sich die Modline für 1920 x 1080 (56,2 kHz) aus /var/log/Xorg.0.log
  • Steckte diese Modline zusammen mit dem Ändern Ihres Skripts für mein Setup (z. B. HDMI1-> VGA1, korrekte Laptopauflösung usw.)

Dies hat FAST geklappt, aber nach der Anmeldung wurde der externe Monitor von 1920x1080 auf 1024x768 zurückgesetzt. Es stellte sich heraus, dass dies eine dauerhafte Benutzereinstellung war und mit der Systemeinstellung "Anzeigen ..." (aus dem Zahnradmenü) problemlos auf die jetzt verfügbaren 1920 x 1080 eingestellt werden konnte. Wenn ich jetzt mit dem angeschlossenen externen Monitor boote, funktioniert alles wie erwartet.

Ein zusätzlicher Fehler: Wenn dieses Skript zweimal ausgeführt wird (z. B. vom Terminal), wird in der Zeile xrandr --newmode der Fehler "BadName (benannte Farbe oder Schriftart existiert nicht)" angezeigt, aber /programming/ 851704 / xrandr-error-badname-named-color-or-font-does-not-existierte erklärt dies und es scheint harmlos. Auch sollte es kein Problem sein, wenn das Skript gemäß den Anweisungen von Hanynowsky über lightdm.conf verbunden ist und nicht manuell ausgeführt wird.

Ich stelle die Änderungen zur Verfügung, die für das oben genannte (VGA ohne EDID-Funktionalität) angepasst wurden, in der Hoffnung, dass es jemand anderem hilft. Wie in den vorhergehenden Antworten erwähnt, müssen Sie dies für Ihr eigenes Setup anpassen. Ich habe keinen guten Rat, um die richtige Modline zu erhalten, aber wenn jemand anderes es tut, bitte einschneiden.

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

HINWEIS: Ich bin mir nicht sicher, ob die Auswertung notwendig ist (im Vergleich zum Echo im Original). Ich habe dies eingegeben, bevor ich feststellte, dass meine Einstellungen für Displays ... das externe Display auf eine niedrigere Auflösung zurücksetzten.

Walter Wittel
quelle
Gern geschehen bei Walter Wittel & vielen Dank für Ihren wertvollen Beitrag. Wenn ich Zeit habe, würde ich versuchen, wenn möglich ein allgemeineres Skript zu finden. aber ich bezweifle, dass es möglich wäre, die richtige Modline für einen Nicht-EDID-Monitor mit XRANDR zu extrahieren. Auf jeden Fall mal sehen.
Hanynowsky
1

Ich habe festgestellt, dass --auto anstelle der expliziten Angabe der Auflösung mit --mode die beste Auflösung für Sie auswählt (die größte, die ich glaube).

#!/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
quelle
1
hachi dein script funktioniert super! Jeder, der von diesem Fehler betroffen ist, muss nur die korrekte Auflösung seiner Anzeigen in dieses Skript einfügen und lightdm neu starten: sudo restart lightdm thats all! Alles funktioniert super! Ich habe meine Frage zu diesem Problem hier gestellt: askubuntu.com/questions/181112/…
conscientist
0

Wenn Sie den GTK-Begrüßer von LightDM verwenden, können xrandr -qSie die Namen Ihrer Monitore suchen /etc/lightdm/lightdm-gtk-greeterund die Eigenschaft active-monitorwie in den Kommentaren in dieser Datei beschrieben bearbeiten und festlegen . Diese Eigenschaft kann mehrere geordnete Werte annehmen, einschließlich #cursorfür den Monitor, auf dem derzeit der Mauszeiger angezeigt wird.

Dzamo Norton
quelle