如何强制多台显示器正确调整 LightDM 的分辨率?

如何强制多台显示器正确调整 LightDM 的分辨率?

我受到的BUG影响:https://bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 否则,如果你像我一样有一台笔记本电脑连接到第二台分辨率更高的显示器,光调制解调法在登录阶段,镜子在两个屏幕上显示并为它们分配一个公共分辨率(1024X768),而不是扩展桌面(主屏幕带有欢迎界面,辅助屏幕只带有徽标,如 12.04 版多显示器 UX 规范书中所述)。

这是我的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

重新启动 lig​​htdm : sudo restart lightdm 并且 unity 问候登录屏幕正确。屏幕具有各自的正确分辨率,如果我将鼠标移动到屏幕上,它会通过登录框和面板获得焦点,而未聚焦的屏幕只会显示 Ubuntu 徽标(正如 MM UX 规范书中所指定的一样)。太棒了!

只要外接显示器连接到笔记本电脑,此解决方法就很有效。在未连接的情况下,在登录阶段,我收到:低图形模式错误(您正在低图形模式下运行,您的屏幕、输入设备...未被检测到..)。正常,因为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)

提前致谢。

答案1

注意:我也发布了这个答案这里

我发现了一个非常简单的解决方法,对于运行 13.04 的我来说非常有效。在一台带有 24 英寸外接屏幕且未永久连接的笔记本电脑上。

我只是复制这里

  1. 登录
  2. 使用 xrandr 或显示控制实用程序来配置你的显示器,以便你在登录屏幕上按照自己的意愿进行配置
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

由于我已经正确配置了显示器,所以我只需要执行步骤 3。

答案2

我管理了下面这个回答我的问题的小基本脚本。现在,无论是否连接外部显示器,Lightdm 都会在欢迎阶段使用正确的分辨率。不过,这个脚本需要修改才能通用的,这样用户就不需要手动指定笔记本电脑和显示器屏幕的分辨率。

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

所以如果有人有更好的解决方案或更通用的脚本,那就是他了。

脚本:

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

答案3

非常感谢 Hanynowsky!找到您的答案让我省了很多事(最近升级了 12.04)。但是就我而言,它没有提供完整的解决方案,所以我想补充我学到的东西。我的设置是将三星 S22A300B 插入 Vaio VGN-CR120E 的 VGA 端口,该 Vaio VGN-CR120E 具有内置 1280x800 显示屏和 Mobile GM965/GL960 集成图形控制器。

简而言之,我发现:

  • 使用显示系统设置在外部三星显示器上我能够设置的最大分辨率是 1024x768。
  • 这显然是因为我的 VGA 控制器不支持 EDID。出于某种原因,Windows Vista 和 Windows 7(在不同的笔记本电脑上)都可以处理这种情况并提供全范围的分辨率。

为了解决这个有限的最大分辨率问题,我做了以下事情:

  • 在脚本中添加了使用 --newmode 和 --addmode 调用 xrandr 的行
  • 尝试使用 cvt 为 1920x1080 生成 --newmode 模式行,但不幸的是它对我的设置不起作用。
  • 借了一台带有 HDMI 端口的笔记本电脑,插入三星设备并启动它,然后从 /var/log/Xorg.0.log 中抓取 1920x1080 56.2 kHz 的模式行
  • 插入该 modline 并修改您的脚本以适合我的设置(例如 HDMI1->VGA1、正确的笔记本电脑分辨率等)

这几乎可以正常工作,但登录后,外接显示器从不错的 1920x1080 重置回 1024x768。事实证明,这是一个持久的用户设置,可以通过使用“显示...系统设置”(从齿轮菜单)轻松修复到现在可用的 1920x1080。现在,当我启动连接外接显示器时,一切都按预期工作。

另外一个问题:如果这个脚本运行两次(例如从终端),xrandr --newmode 行将出现“BadName(命名的颜色或字体不存在)”错误,但是https://stackoverflow.com/questions/851704/xrandr-errors-badname-named-color-or-font-does-not-exist对此进行了解释,这似乎是无害的。此外,当脚本按照 Hanynowsky 的说明连接到 lightdm.conf 而不是手动运行时,这应该不会有问题。

我提供针对上述情况(没有 EDID 功能的 VGA)所做的更改,希望它能帮助其他人。如前面的答案所述,您必须根据自己的设置进行调整。对于如何获得正确的 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 是否必要(相对于原始的 echo)。我将其放入后才发现我的 Displays... 设置正在将外部显示器重置为较低的分辨率。

答案4

如果您使用的是 LightDM 的 GTK 欢迎程序,那么您可以运行xrandr -q以查找显示器的名称,然后按照该文件中的注释所述编辑/etc/lightdm/lightdm-gtk-greeter和设置属性。此属性可以采用多个有序值,包括当前显示鼠标光标的显示器。active-monitor#cursor

相关内容