Jak wymusić poprawne rozdzielczości wielu monitorów dla LightDM?

17

BŁĄD dotyczy mnie: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 W przeciwnym razie, jeśli tak jak ja, masz laptopa podłączonego do drugiego monitora o wyższej rozdzielczości, LIGHTDM na etap logowania, odzwierciedla ekrany na obu ekranach i przypisuje im wspólną rozdzielczość (1024 x 768) w moim przypadku, zamiast rozszerzania pulpitu (ekran główny z powitaniem i ekran wtórny tylko z logo, jak wspomniano w specyfikacji specyfikacji wielu monitorów UX do 12.04).

Oto mój 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)

Próbowałem zmusić lightdm do wykonania niektórych poleceń xrandr, aby ustawić odpowiednią rozdzielczość dla każdego monitora i rozszerzyć pulpit, dlatego stworzyłem prosty skrypt o nazwie /usr/share/lightdmxrand.sh :

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

I powiedział lightdm, aby go uruchomił: /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 I ekran logowania powitania jedności był poprawny. Ekrany z ich odpowiednimi rozdzielczościami i jeśli przesunę mysz do ekranu, ostrość zostanie zaznaczona za pomocą pola logowania i panelu, podczas gdy nieostry ekran wyświetla tylko logo Ubuntu (dokładnie tak, jak podano w specyfikacji MM UX). Fantastyczny!

To obejście działa świetnie, dopóki monitor zewnętrzny jest podłączony do laptopa. W sytuacji, gdy nie jest podłączony, na etapie logowania otrzymuję: BŁĄD TRYBU NISKIEJ GRAFIKI (Pracujesz w trybie niskiej grafiki, ekran, urządzenia wejściowe ... nie zostały wykryte ...). Normalne, ponieważ xrandrpróbuje wyprowadzić sygnał do niepodłączonego monitora.

Pytanie o to, jak należy zmodyfikować skrypt w taki sposób, że gdy zewnętrzny monitor nie jest podłączony xrandrwyjścia tylko na ekranie laptopa i ignoruje wszelkie monitora zewnętrznego. NA PRZYKŁAD:

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)

Z góry dziękuję.

Hanynowski
źródło

Odpowiedzi:

18

UWAGA: zamieściłem również tę odpowiedź tutaj

Znalazłem bardzo proste obejście, które działa idealnie dla mnie w wersji 13.04. na laptopie z 24-calowym ekranem zewnętrznym, który nie jest na stałe podłączony.

Skopiuję stąd

  1. Zaloguj sie
  2. użyj xrandr lub narzędzia kontrolnego Displays do skonfigurowania monitorów tak, jak chcesz, aby były konfigurowane na ekranie logowania
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Ponieważ miałem już poprawnie skonfigurowane monitory, musiałem po prostu zrobić krok 3.

Tobold
źródło
9

Udało mi się wykonać ten mały podstawowy skrypt poniżej, który odpowiada na moje pytanie. Teraz, niezależnie od tego, czy monitor zewnętrzny jest podłączony, czy nie, Lightdm używa właściwych rozdzielczości na etapie powitania. Niemniej jednak ten sam skrypt należy zmodyfikować, aby był ogólny , tak aby użytkownik nie musiał ręcznie określać rozdzielczości ekranów laptopa i monitora.

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

Więc jeśli ktoś ma lepsze rozwiązanie lub bardziej ogólny skrypt, to on jest człowiekiem.

SCENARIUSZ:

    #!/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;
Hanynowski
źródło
2

Wielkie dzięki Hanynowsky! Znalezienie odpowiedzi pozwoliło mi zaoszczędzić mnóstwo pracy (ostatnio zaktualizowana 12.04). Jednak w moim przypadku nie zapewniło to kompletnego rozwiązania, dlatego chciałbym dodać to, czego się nauczyłem. Moją konfiguracją był Samsung S22A300B podłączony do portu VGA Vaio VGN-CR120E z wbudowanym wyświetlaczem 1280x800 i zintegrowanym kontrolerem graficznym Mobile GM965 / GL960.

W skrócie znalazłem:

  • Maksymalna rozdzielczość, którą mogłam ustawić na zewnętrznym wyświetlaczu Samsunga za pomocą ustawienia Systemu wyświetlania wynosiła 1024x768.
  • Najwyraźniej było to spowodowane tym, że mój kontroler VGA nie obsługuje EDID. Z jakiegoś powodu zarówno Windows Vista, jak i Windows 7 (na innym laptopie) mogą poradzić sobie z tą sytuacją i zapewnić pełny zakres rozdzielczości.

Aby obejść tę ograniczoną maksymalną rozdzielczość, wykonałem następujące czynności:

  • Dodano wiersze do skryptu, aby wywołać xrandr za pomocą --newmode i --addmode
  • Próbowałem cvt, aby wygenerować modeline --newmode dla 1920x1080, ale niestety to nie zadziałało w mojej konfiguracji.
  • Pożyczyłem laptopa z portem HDMI, uruchomiłem go z podłączonym Samsungiem i złapałem modline dla 1920x1080 56,2 kHz z /var/log/Xorg.0.log
  • Podłączyłem ten moduł wraz ze zmodyfikowaniem skryptu dla mojej konfiguracji (np. HDMI1-> VGA1, poprawna rozdzielczość laptopa itp.)

PRAWIE działało, ale po zalogowaniu zewnętrzny monitor został zresetowany z ładnego 1920x1080 z powrotem do 1024x768. Okazało się, że było to trwałe ustawienie użytkownika i można je łatwo naprawić za pomocą ekranów ... Ustawienia systemowe (z menu koła zębatego) do obecnie dostępnej 1920x1080. Teraz, gdy uruchamiam z podłączonym zewnętrznym monitorem, wszystko działa zgodnie z oczekiwaniami.

Jedna dodatkowa usterka: jeśli ten skrypt zostanie uruchomiony dwukrotnie (na przykład z terminala), linia xrandr --newmode otrzyma błąd „BadName (nazwany kolor lub czcionka nie istnieje)”, ale /programming/ 851704 / xrandr-error-badname-named-color-or-font-not-not-exist wyjaśnił to i wydaje się łagodny. Nie powinno też stanowić problemu, gdy skrypt jest podłączony do lightdm.conf zgodnie z instrukcjami Hanynowsky'ego, a nie uruchamiany ręcznie.

Dostarczam zmiany dostosowane do powyższego (VGA bez funkcji EDID) w nadziei, że pomoże to komuś innemu. Jak wspomniano w poprzednich odpowiedziach, będziesz musiał dostosować to do własnej konfiguracji. Nie mam żadnych dobrych rad na temat uzyskania prawidłowego modlina, ale jeśli ktoś inny to zrobi, proszę się włączyć.

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

UWAGA: Nie jestem pewien, czy ewaluacja jest konieczna (vs. echo w oryginale). Włożyłem to, zanim odkryłem, że moje ustawienia Monitory ... resetują wyświetlacz zewnętrzny do niższej rozdzielczości.

Walter Wittel
źródło
Nie ma za co @Walter Wittel i dziękuję za cenny wkład. Kiedy będę miał czas, spróbuję wymyślić bardziej ogólny skrypt, jeśli to możliwe; ale wątpię, czy przy pomocy XRANDR byłoby możliwe wyodrębnienie prawidłowej linii modularnej dla monitora innego niż EDID. W każdym razie zobaczmy.
Hanynowsky
1

Przekonałem się, że zamiast --mode do jednoznacznego określenia rozdzielczości, --auto wybierze najlepszą dla ciebie rozdzielczość (największą, jak sądzę).

#!/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
źródło
1
hachi twój skrypt działa świetnie! Każda osoba dotknięta tym błędem musi po prostu wstawić prawidłową rozdzielczość swoich wyświetlaczy w tym skrypcie i zrestartować lightdm: sudo restart lightdm to wszystko! Wszystko działa świetnie! Zadałem
sumienie
0

Jeśli używasz programu GTDM LightDM, możesz uruchomić, xrandr -qaby znaleźć nazwy swoich monitorów, a następnie edytować /etc/lightdm/lightdm-gtk-greeteri ustawić właściwość active-monitorzgodnie z opisem w komentarzach w tym pliku. Ta właściwość może przyjmować wiele uporządkowanych wartości, w tym #cursordla monitora, który aktualnie pokazuje kursor myszy.

Dzamo Norton
źródło