Làm cách nào để buộc nhiều màn hình độ phân giải chính xác cho LightDM?


17

Tôi bị ảnh hưởng bởi BUG: https://bugs.launchpad.net/ubfox/+source/unity-greeter/+orms/874241 Nếu không, nếu như tôi, bạn có một máy tính xách tay được kết nối với màn hình thứ hai có độ phân giải cao hơn, LIGHTDM tại giai đoạn đăng nhập, phản chiếu màn hình trong cả hai màn hình và gán cho chúng độ phân giải chung (1024X768) trong trường hợp của tôi, thay vì mở rộng màn hình nền (Màn hình chính với lời chào và phụ chỉ có logo như được đề cập trong sách thông số kỹ thuật UX của nhiều màn hình cho 12.04).

Đây là xrandr của tôi

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

Tôi đã cố buộc lightdm thực thi một số lệnh xrandr để đặt độ phân giải phù hợp cho từng màn hình và mở rộng màn hình nền, vì vậy tôi đã tạo một tập lệnh đơn giản có tên /usr/share/lightdmxrand.sh :

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

Và bảo lightdm chạy nó: /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

khởi động lại lightdm: sudo restart lightdm Và màn hình đăng nhập chào mừng đoàn kết là chính xác. Các màn hình có độ phân giải chính xác tương ứng và nếu tôi di chuyển chuột đến màn hình, nó sẽ lấy nét với hộp đăng nhập và bảng điều khiển, trong khi màn hình không lấy nét chỉ hiển thị Logo Ubuntu (Giống như được chỉ định trong sách đặc tả MM UX). Tuyệt diệu!

Cách giải quyết này hoạt động rất tốt miễn là Màn hình ngoài được kết nối với máy tính xách tay. Trong trường hợp không được kết nối, ở giai đoạn đăng nhập, tôi nhận được: L ERI CHẾ ĐỘ HÌNH ẢNH THẤP (Bạn đang chạy ở chế độ đồ họa thấp, màn hình, thiết bị đầu vào ... không bị phát hiện ..). Bình thường, vì xrandrcố gắng xuất ra màn hình không kết nối.

Câu hỏi ở đây là làm thế nào tôi nên sửa đổi tập lệnh theo cách mà khi màn hình ngoài không được kết nối xrandrchỉ xuất ra màn hình máy tính xách tay và bỏ qua bất kỳ màn hình bên ngoài nào. VÍ DỤ:

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)

Cảm ơn trước.

Câu trả lời:


18

LƯU Ý: Tôi cũng đã đăng câu trả lời này tại đây

Tôi tìm thấy một cách giải quyết rất đơn giản, phù hợp với tôi khi chạy 13.04. trên máy tính xách tay có màn hình ngoài 24 "không được kết nối vĩnh viễn.

Tôi sẽ chỉ sao chép từ đây

  1. đăng nhập
  2. sử dụng xrandr hoặc tiện ích điều khiển Hiển thị để định cấu hình màn hình của bạn theo cách bạn muốn cấu hình chúng trong màn hình đăng nhập
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

Vì màn hình của tôi đã được cấu hình đúng, tôi chỉ phải thực hiện bước 3.


9

Tôi đã quản lý kịch bản cơ bản nhỏ này bên dưới để trả lời câu hỏi của tôi. Bây giờ, cho dù màn hình ngoài có được kết nối hay không, Lightdm sử dụng độ phân giải phù hợp ở giai đoạn chào. Tuy nhiên, cùng một kịch bản này cần được sửa đổi thành chung chung , theo cách mà người dùng sẽ không cần chỉ định độ phân giải thủ công của màn hình máy tính xách tay và màn hình.

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

Vì vậy, nếu ai đó có một giải pháp tốt hơn hoặc một kịch bản chung chung hơn, anh ta là người đàn ông.

KỊCH BẢN:

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

Rất cám ơn Hanynowsky! Tìm câu trả lời của bạn đã tiết kiệm cho tôi rất nhiều công việc (được nâng cấp gần đây 12.04). Tuy nhiên trong trường hợp của tôi, nó không cung cấp giải pháp hoàn chỉnh nên tôi muốn thêm những gì tôi đã học. Thiết lập của tôi là Samsung S22A300B cắm vào cổng VGA của Vaio VGN-CR120E với màn hình 1280x800 tích hợp và Bộ điều khiển đồ họa tích hợp GM965 / GL960.

Tóm lại những gì tôi tìm thấy là:

  • Độ phân giải tối đa tôi có thể đặt trên màn hình Samsung bên ngoài bằng Cài đặt hệ thống hiển thị là 1024x768.
  • Điều này rõ ràng là do bộ điều khiển VGA của tôi không hỗ trợ EDID. Vì một số lý do, cả Windows Vista và Windows 7 (trên một máy tính xách tay khác) có thể xử lý tình huống này và cung cấp đầy đủ các độ phân giải.

Để khắc phục độ phân giải tối đa giới hạn này, tôi đã làm như sau:

  • Đã thêm các dòng vào tập lệnh của bạn để gọi xrandr với --newmode và --addmode
  • Đã thử cvt để tạo mô hình --newmode cho 1920x1080, nhưng tiếc là nó không hoạt động cho thiết lập của tôi.
  • Mượn máy tính xách tay có cổng HDMI, khởi động nó với Samsung đã cắm và lấy modline cho 1920x1080 56.2 kHz trong số /var/log/Xorg.0.log
  • Đã cắm modline đó cùng với sửa đổi tập lệnh của bạn cho thiết lập của tôi (ví dụ: HDMI1-> VGA1, độ phân giải máy tính xách tay chính xác, v.v.)

ALMOST này đã hoạt động, nhưng sau khi đăng nhập, màn hình ngoài đã được đặt lại từ 1920x1080 đẹp trở lại 1024x768. Hóa ra đây là cài đặt người dùng liên tục và có thể dễ dàng sửa bằng cách sử dụng Hiển thị ... Cài đặt hệ thống (từ menu bánh răng) đến 1920x1080 hiện có sẵn. Bây giờ khi tôi khởi động với màn hình ngoài được kết nối, mọi thứ sẽ hoạt động như mong đợi.

Một trục trặc bổ sung: Nếu tập lệnh này được chạy hai lần (ví dụ từ thiết bị đầu cuối), dòng xrandr --newmode sẽ gặp lỗi "BadName (tên màu hoặc phông chữ không tồn tại)", nhưng /programming/ 851704 / xrandr-lỗi-badname-name-color-or-font-does-not-tồn tại đã giải thích điều này và nó có vẻ lành tính. Cũng không nên là một vấn đề khi tập lệnh được nối với lightdm.conf theo hướng dẫn của Hanynowsky so với chạy thủ công.

Tôi đang cung cấp các thay đổi phù hợp với điều trên (VGA không có chức năng EDID) với hy vọng nó sẽ giúp được người khác. Như đã đề cập trong các câu trả lời trước, bạn sẽ phải điều chỉnh nó cho thiết lập của riêng bạn. Tôi không có lời khuyên nào tốt để có được bản sửa đổi chính xác, nhưng nếu có ai đó vui lòng gắn chip.

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

LƯU Ý: Tôi không chắc chắn nếu eval là cần thiết (so với echo trong bản gốc). Tôi đặt nó vào trước khi tôi phát hiện ra rằng các cài đặt Hiển thị của tôi đang đặt lại màn hình ngoài ở độ phân giải thấp hơn.


Bạn được chào đón @Walter Wittel và cảm ơn bạn vì sự đóng góp quý báu của bạn. Khi tôi có thời gian, tôi sẽ cố gắng tìm ra một kịch bản chung chung hơn nếu có thể; nhưng tôi nghi ngờ có thể trích xuất mô-đun chính xác cho màn hình không EDID bằng XRANDR. Dù sao đi nữa, hãy xem.
Hanynowsky

1

Tôi thấy rằng thay vì sử dụng --mode để nêu rõ độ phân giải, --auto sẽ chọn độ phân giải tốt nhất cho bạn (độ phân giải lớn nhất mà tôi tin).

#!/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 kịch bản của bạn hoạt động tuyệt vời! Bất cứ ai bị ảnh hưởng với lỗi này chỉ cần đưa độ phân giải chính xác của màn hình vào tập lệnh này và khởi động lại lightdm: sudo restart lightdm đó là tất cả! Tất cả mọi thứ hoạt động tuyệt vời! Tôi đã đăng câu hỏi của mình về vấn đề này tại đây: Askubfox.com/questions/181112/ mẹo
lương tâm

0

Nếu bạn đang sử dụng công cụ chào mừng GTK của LightDM thì bạn có thể chạy xrandr -qđể tìm tên của màn hình sau đó chỉnh sửa /etc/lightdm/lightdm-gtk-greetervà đặt thuộc tính active-monitornhư được mô tả trong các nhận xét bên trong tệp đó. Thuộc tính này có thể nhận nhiều giá trị được đặt hàng, bao gồm cả #cursormàn hình hiện đang hiển thị con trỏ chuột.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.