วิธีการบังคับให้จอภาพหลายจอภาพมีความละเอียดที่ถูกต้องสำหรับ LightDM


17

ฉันได้รับผลกระทบจาก BUG: https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 ไม่เช่นนั้นถ้าฉันมีแล็ปท็อปที่เชื่อมต่อกับจอภาพที่สองที่มีความละเอียดสูงกว่าLIGHTDMที่ ขั้นตอนการเข้าสู่ระบบสะท้อนการแสดงผลในหน้าจอทั้งสองและกำหนดความละเอียดทั่วไป (1024X768) ให้กับพวกเขาแทนที่จะขยายเดสก์ท็อป (หน้าจอหลักที่มีหน้าจอกว้างและรองด้วยโลโก้ตามที่กล่าวไว้ในหนังสือข้อกำหนดหลายจอภาพ UX สำหรับ 12.04)

นี่คือ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)

ฉันพยายามบังคับให้ lightdm รันคำสั่ง xrandr บางคำสั่งเพื่อตั้งค่าความละเอียดที่เหมาะสมสำหรับแต่ละจอภาพและขยายเดสก์ท็อปดังนั้นฉันจึงสร้างสคริปต์ง่าย ๆ ชื่อ/usr/share/lightdmxrand.sh :

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

และบอกให้ lightdm เรียกใช้: /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: sudo restart lightdm และหน้าจอเข้าสู่ระบบ greeter unity นั้นถูกต้อง หน้าจอที่มีความละเอียดที่ถูกต้องและถ้าฉันเลื่อนเมาส์ไปที่หน้าจอจะได้รับการโฟกัสด้วยกล่องเข้าสู่ระบบและพาเนลในขณะที่หน้าจอที่ไม่มีการโฟกัสจะแสดงโลโก้ Ubuntu (เช่นเดียวกับที่ระบุในหนังสือ MM UX spec) Fantastic!

วิธีแก้ปัญหานี้ใช้งานได้ดีตราบใดที่จอภาพภายนอกเชื่อมต่อกับแล็ปท็อป ในสถานการณ์ที่ไม่ได้เชื่อมต่อในขั้นตอนการเข้าสู่ระบบฉันได้รับ: ข้อผิดพลาดโหมดกราฟิกต่ำ (คุณกำลังทำงานในโหมดกราฟิกต่ำ, หน้าจอ, อุปกรณ์อินพุตของคุณ ... ไม่ได้รับการตรวจพบ .. ) ปกติเนื่องจากxrandrพยายามส่งออกไปยังจอภาพที่ไม่ได้เชื่อมต่อ

คำถามที่นี่คือวิธีที่ผมควรแก้ไขสคริปต์ในทางที่เมื่อจอภาพภายนอกไม่ได้เชื่อมต่อxrandrเอาท์พุทเพียงไปที่หน้าจอแล็ปท็อปและละเว้นจอภาพภายนอกใด ๆ เช่น:

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)

ขอบคุณล่วงหน้า.

คำตอบ:


18

หมายเหตุ: ฉันโพสต์คำตอบนี้ที่นี่ด้วย

ฉันพบวิธีแก้ปัญหาง่ายๆที่ทำงานได้อย่างสมบูรณ์แบบสำหรับฉันที่ใช้งาน 13.04 บนแล็ปท็อปที่มีหน้าจอภายนอก 24 "ซึ่งไม่ได้เชื่อมต่ออย่างถาวร

ฉันจะคัดลอกจากที่นี่

  1. เข้าสู่ระบบ
  2. ใช้ xrandr หรือยูทิลิตี้การควบคุมการแสดงผลเพื่อกำหนดค่าจอภาพของคุณว่าคุณต้องการให้ตั้งค่าอย่างไรในหน้าจอการเข้าสู่ระบบ
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

เนื่องจากฉันได้ตั้งค่าจอภาพเรียบร้อยแล้วฉันจึงต้องทำขั้นตอนที่ 3


9

ฉันจัดการสคริปต์พื้นฐานเล็กน้อยด้านล่างที่ตอบคำถามของฉัน ในตอนนี้ไม่ว่าจะเชื่อมต่อจอภาพภายนอกหรือไม่ Lightdm ใช้ความละเอียดที่เหมาะสมในขั้นตอนการรับรู้ อย่างไรก็ตามสคริปต์เดียวกันนี้จำเป็นต้องแก้ไขให้เป็นแบบทั่วไปในลักษณะที่ผู้ใช้ไม่จำเป็นต้องระบุความละเอียดของแล็ปท็อปและหน้าจอมอนิเตอร์ด้วยตนเอง

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

ดังนั้นหากใครบางคนมีทางออกที่ดีกว่าหรือสคริปต์ทั่วไปที่มากกว่าเขาก็เป็นผู้ชายคนนั้น

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

ขอบคุณมาก Hanynowsky! การหาคำตอบของคุณช่วยให้ฉันทำงานได้หลายอย่าง (อัพเกรดล่าสุด 12.04) อย่างไรก็ตามในกรณีของฉันมันไม่ได้ให้โซลูชันที่สมบูรณ์ดังนั้นฉันต้องการเพิ่มสิ่งที่ฉันเรียนรู้ การตั้งค่าของฉันคือ Samsung S22A300B เสียบเข้ากับพอร์ต VGA ของ Vaio VGN-CR120E พร้อมจอแสดงผล 1280x800 ในตัวและตัวควบคุมกราฟิกในตัวแบบพกพา GM965 / GL960

สั้น ๆ สิ่งที่ฉันพบคือ:

  • ความละเอียดสูงสุดที่ฉันสามารถตั้งได้บนจอแสดงผลภายนอก Samsung โดยใช้การตั้งค่าระบบการแสดงผลคือ 1024x768
  • เห็นได้ชัดว่าเกิดจากตัวควบคุม VGA ของฉันไม่รองรับ EDID ด้วยเหตุผลบางอย่างทั้ง Windows Vista และ Windows 7 (บนแล็ปท็อปเครื่องอื่น) สามารถจัดการกับสถานการณ์นี้และให้ความละเอียดอย่างเต็มรูปแบบ

ในการแก้ไขปัญหาความละเอียดสูงสุดที่ จำกัด นี้ฉันทำดังต่อไปนี้:

  • เพิ่มบรรทัดในสคริปต์ของคุณเพื่อเรียกใช้ xrandr ด้วย --newmode และ --addmode
  • พยายาม cvt เพื่อสร้าง --newmode modeline สำหรับ 1920x1080 แต่น่าเสียดายที่มันไม่ทำงานสำหรับการตั้งค่าของฉัน
  • ยืมแล็ปท็อปที่มีพอร์ต HDMI บู๊ตด้วย Samsung เสียบเข้าและคว้า modline สำหรับ 1920x1080 56.2 kHz จาก /var/log/Xorg.0.log
  • เสียบ modline นั้นพร้อมกับการปรับเปลี่ยนสคริปต์สำหรับการตั้งค่าของฉัน (เช่น HDMI1-> VGA1, ความละเอียดแล็ปท็อปที่ถูกต้อง ฯลฯ )

ALMOST นี้ใช้งานได้ แต่หลังจากเข้าสู่ระบบจอภาพภายนอกก็ถูกรีเซ็ตจาก 1920x1080 ที่ดีกลับไปเป็น 1024x768 ปรากฎว่านี่เป็นการตั้งค่าผู้ใช้แบบถาวรและได้รับการแก้ไขอย่างง่ายดายโดยใช้การแสดง ... การตั้งค่าระบบ (จากเมนูรูปเฟือง) ไปจนถึง 1920x1080 ที่มีอยู่ในปัจจุบัน ตอนนี้เมื่อฉันบูตด้วยจอภาพภายนอกเชื่อมต่อทุกอย่างทำงานตามที่คาดไว้

อีกหนึ่งข้อผิดพลาดเพิ่มเติม: หากสคริปต์นี้ทำงานสองครั้ง (ตัวอย่างจากเทอร์มินัล) บรรทัด xrandr - newewode จะได้รับข้อผิดพลาด "BadName (ชื่อสีหรือแบบอักษรไม่มีอยู่)" แต่/programming/ 851704 / xrandr-errors-badname-named-color-or-font- ไม่มีอยู่จริงอธิบายสิ่งนี้และดูเหมือนว่าอ่อนโยน และไม่ควรเป็นปัญหาเมื่อสคริปต์ถูกเชื่อมโยง lightdm.conf ตามคำแนะนำของ Hanynowsky เทียบกับทำงานด้วยตนเอง

ฉันให้การเปลี่ยนแปลงที่ปรับใช้สำหรับด้านบน (VGA โดยไม่มีฟังก์ชั่น EDID) โดยหวังว่าจะช่วยคนอื่นได้ ดังที่กล่าวไว้ในคำตอบก่อนหน้านี้คุณจะต้องปรับเปลี่ยนสิ่งนี้สำหรับการตั้งค่าของคุณเอง ฉันไม่มีคำแนะนำที่ดีเกี่ยวกับการได้รับ modline ที่ถูกต้อง แต่ถ้ามีคนอื่นกรุณาชิป

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

หมายเหตุ: ฉันไม่แน่ใจว่าจำเป็นต้องใช้ Eval หรือไม่ ฉันใส่สิ่งนี้ลงไปก่อนที่ฉันจะค้นพบว่าการตั้งค่าจอแสดงผล ... กำลังรีเซ็ตจอแสดงผลภายนอกเป็นความละเอียดที่ต่ำกว่า


คุณยินดีต้อนรับ @Walter Wittel และขอบคุณสำหรับผลงานอันมีค่าของคุณ เมื่อฉันมีเวลาฉันจะพยายามหาบทที่กว้างขึ้นถ้าเป็นไปได้ แต่ฉันสงสัยว่าเป็นไปได้ที่จะแยก modline ที่ถูกต้องสำหรับจอภาพที่ไม่ใช่ EDID โดยใช้ XRANDR ในต่อไปเรามาดูกัน
Hanynowsky

1

ฉันพบว่าแทนที่จะใช้ - โหมดเพื่อระบุความละเอียดอย่างชัดเจน - อัตโนมัติจะเลือกความละเอียดที่ดีที่สุดสำหรับคุณ (อันที่ใหญ่ที่สุดที่ฉันเชื่อ)

#!/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 สคริปต์ของคุณใช้งานได้ดี! ทุกคนที่ได้รับผลกระทบจากข้อผิดพลาดนี้ต้องใส่ความละเอียดที่ถูกต้องของหน้าจอในสคริปต์นี้แล้วรีสตาร์ท lightdm: sudo รีสตาร์ท lightdm นั่นคือทั้งหมด! ทุกอย่างใช้งานได้ดี! ฉันได้โพสต์คำถามของฉันเกี่ยวกับปัญหานี้ที่นี่: askubuntu.com/questions/181112/…
conscientist

0

หากคุณกำลังใช้ greeter GTK ของ LightDM คุณสามารถเรียกใช้xrandr -qเพื่อค้นหาชื่อของจอภาพของคุณจากนั้นแก้ไข/etc/lightdm/lightdm-gtk-greeterและตั้งค่าคุณสมบัติactive-monitorตามที่อธิบายไว้ในความคิดเห็นภายในไฟล์นั้น คุณสมบัตินี้สามารถใช้หลายค่าสั่งซื้อรวมถึง#cursorการตรวจสอบที่แสดงเคอร์เซอร์ของเมาส์ในปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.