Bagaimana memaksa Multiple Monitor resolusi yang benar untuk LightDM?


17

Saya terpengaruh oleh BUG: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 Jika tidak, jika seperti saya Anda memiliki laptop yang terhubung ke monitor kedua dengan resolusi lebih tinggi, LIGHTDM di tahap login, mencerminkan layar di kedua layar dan menetapkan resolusi umum (1024X768) dalam kasus saya, alih-alih memperluas desktop (Layar primer dengan penyambut dan sekunder dengan hanya logo seperti yang disebutkan dalam buku spesifikasi Multiple Monitor UX untuk 12,04).

Inilah xrandr -q saya

@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)

Saya mencoba memaksa lightdm untuk menjalankan beberapa perintah xrandr untuk mengatur resolusi yang tepat untuk setiap monitor dan memperluas desktop, jadi saya membuat skrip sederhana bernama /usr/share/lightdmxrand.sh :

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

Dan menyuruh lightdm untuk menjalankannya: /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

restart lightdm: sudo restart lightdm Dan layar masuk penyapa yang lebih baik benar. Layar dengan resolusi masing-masing yang benar dan jika saya memindahkan mouse ke layar, itu mendapat fokus dengan kotak dan panel login, sedangkan layar yang tidak fokus hanya menampilkan Logo Ubuntu (Seperti yang ditentukan dalam buku spesifikasi MM UX). Fantastis!

Solusi ini berfungsi dengan baik selama monitor eksternal terhubung ke laptop. Dalam situasi di mana itu tidak terhubung, pada tahap login, saya mendapatkan: KESALAHAN MODAL RENDAH GRAPHICS (Anda menjalankan dalam mode grafis rendah, layar Anda, perangkat input ... tidak terdeteksi ..). Normal, karena xrandrmencoba output ke monitor yang tidak terhubung.

The Pertanyaan di sini adalah bagaimana saya harus memodifikasi script dengan cara yang ketika monitor eksternal tidak terhubung xrandroutput hanya ke layar laptop dan mengabaikan setiap monitor eksternal. MISALNYA:

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)

Terima kasih sebelumnya.

Jawaban:


18

CATATAN: Saya juga memposting jawaban ini di sini

Saya menemukan solusi yang sangat sederhana yang bekerja sempurna untuk saya menjalankan 13,04. pada laptop dengan layar eksternal 24 "yang tidak terhubung secara permanen.

Saya hanya akan menyalin dari sini

  1. Gabung
  2. gunakan xrandr atau utilitas kontrol Layar untuk mengonfigurasi monitor Anda bagaimana Anda ingin mereka dikonfigurasikan di layar masuk
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Karena monitor saya sudah terkonfigurasi dengan benar, saya hanya perlu melakukan langkah 3.


9

Saya mengelola skrip dasar kecil di bawah ini yang menjawab pertanyaan saya. Sekarang, apakah monitor eksternal terhubung atau tidak, Lightdm menggunakan resolusi yang tepat pada tahap penyapa. Namun demikian, skrip yang sama ini perlu dimodifikasi menjadi generik , sehingga pengguna tidak perlu menentukan resolusi laptop dan layar monitor secara manual.

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

Jadi, jika seseorang memiliki solusi yang lebih baik atau skrip yang lebih umum, dialah orangnya.

NASKAH:

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

Terima kasih banyak Hanynowsky! Menemukan jawaban Anda menghemat banyak pekerjaan (baru-baru ini ditingkatkan 12,04). Namun dalam kasus saya itu tidak memberikan solusi lengkap jadi saya ingin menambahkan apa yang saya pelajari. Pengaturan saya adalah Samsung S22A300B yang dicolokkan ke port VGA dari Vaio VGN-CR120E dengan layar 1280x800 built-in dan Pengontrol Grafis Terintegrasi Ponsel GM965 / GL960.

Secara singkat apa yang saya temukan adalah:

  • Resolusi maksimum yang dapat saya atur pada tampilan Samsung eksternal menggunakan Pengaturan Sistem Layar adalah 1024x768.
  • Ini tampaknya disebabkan karena pengontrol VGA saya tidak mendukung EDID. Untuk beberapa alasan, baik Windows Vista dan Windows 7 (pada laptop yang berbeda) dapat menangani situasi ini dan memberikan berbagai resolusi.

Untuk mengatasi resolusi maksimum terbatas ini, saya melakukan hal berikut:

  • Menambahkan baris ke skrip Anda untuk memanggil xrandr dengan --newmode dan --addmode
  • Mencoba cvt untuk menghasilkan --newmode modeline untuk 1920x1080, tapi sayangnya itu tidak berhasil untuk pengaturan saya.
  • Meminjam laptop dengan port HDMI, mem-boot-nya dengan Samsung terhubung, dan meraih modline untuk 1920x1080 56,2 kHz dari /var/log/Xorg.0.log
  • Menyambungkan modline itu bersama dengan memodifikasi skrip Anda untuk pengaturan saya (mis. HDMI1-> VGA1, resolusi laptop yang benar, dll.)

HAMPIR ini berhasil, tetapi setelah masuk monitor eksternal diatur ulang dari 1920x1080 yang bagus kembali ke 1024x768. Ternyata ini adalah pengaturan pengguna yang gigih dan mudah diperbaiki dengan menggunakan Displays ... System Setting (dari menu roda gigi) ke 1920x1080 yang sekarang tersedia. Sekarang ketika saya boot dengan monitor eksternal yang terhubung semuanya berfungsi seperti yang diharapkan.

Satu kesalahan tambahan: Jika skrip ini dijalankan dua kali (misalnya dari terminal), baris xrandr --newmode akan mendapatkan kesalahan "BadName (nama warna atau font tidak ada)", tetapi /programming/ 851704 / xrandr-errors-badname-name-color-or-font-tidak-ada menjelaskan ini dan sepertinya tidak berbahaya. Juga seharusnya tidak menjadi masalah ketika skrip terhubung lightdm.conf sesuai instruksi Hanynowsky vs. berjalan secara manual.

Saya memberikan perubahan yang disesuaikan untuk yang di atas (VGA tanpa fungsi EDID) dengan harapan ini akan membantu orang lain. Seperti disebutkan dalam jawaban sebelumnya Anda harus menyesuaikan ini untuk pengaturan Anda sendiri. Saya tidak memiliki saran yang bagus tentang cara mendapatkan modline yang benar, tetapi jika orang lain melakukannya, silakan masuk.

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

CATATAN: Saya tidak yakin apakah eval diperlukan (vs. gema dalam aslinya). Saya memasukkan ini sebelum saya menemukan bahwa pengaturan Display ... saya mengatur ulang tampilan eksternal ke resolusi yang lebih rendah.


Terima kasih @Walter Wittel & terima kasih atas kontribusi Anda yang berharga. Setelah saya punya waktu, saya akan mencoba mencari skrip yang lebih umum jika memungkinkan; tapi saya ragu akan mungkin untuk mengekstrak modline yang benar untuk monitor non-EDID menggunakan XRANDR. Bagaimanapun, mari kita lihat.
Hanynowsky

1

Saya menemukan bahwa alih-alih menggunakan --mode untuk secara eksplisit menyatakan resolusi, --auto akan memilih resolusi terbaik untuk Anda (yang terbesar yang saya percayai).

#!/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 skrip Anda berfungsi dengan baik! Siapa pun yang terpengaruh dengan bug ini hanya perlu menempatkan resolusi yang benar dari tampilan mereka dalam skrip ini dan restart lightdm: sudo restart lightdm, itu saja! Semuanya bekerja dengan baik! Saya telah memposting pertanyaan saya tentang masalah ini di sini: askubuntu.com/questions/181112/…
conscientist

0

Jika Anda menggunakan penyambut GTDM LightDM maka Anda dapat menjalankan xrandr -quntuk menemukan nama-nama monitor Anda kemudian mengedit /etc/lightdm/lightdm-gtk-greeterdan mengatur properti active-monitorseperti yang dijelaskan dalam komentar di dalam file itu. Properti ini dapat mengambil banyak, nilai yang diurutkan termasuk #cursoruntuk monitor yang saat ini menunjukkan kursor mouse.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.