如何强制多个显示器为LightDM设置正确的分辨率?


17

我受到了BUG的影响:https : //bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241 否则,如果像我一样,您有一台笔记本电脑已连接到第二个分辨率更高的显示器LIGHTDM,在登录阶段,对两个屏幕的显示都进行镜像,并为我分配一个通用分辨率(1024X768),而不是扩展桌面(带有greeter的主屏幕,仅带有徽标的辅助屏幕,如Multiple Monitors 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 统一迎宾员登录屏幕正确。具有各自正确分辨率的屏幕,如果将鼠标移至屏幕,它将通过登录框和面板获得焦点,而未聚焦的屏幕仅显示Ubuntu徽标(仅在MM UX规格书中指定)。太棒了!

只要将外接显示器连接到笔记本电脑,此解决方法就可以很好地工作。在未连接的情况下,在登录阶段,我会收到:LOW GRAPHICS MODE ERROR(您在低图形模式下运行,屏幕,输入设备...未检测到..)。正常,因为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)

提前致谢。

Answers:


18

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

我发现一个非常简单的解决方法,非常适合运行13.04的我。在具有永久不连接状态的24英寸外部屏幕的笔记本电脑上。

我只是从这里复制

  1. 登录
  2. 使用xrandr或Displays控件实用程序来配置监视器,并希望它们在登录屏幕中进行配置
  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). 

因此,如果有人有更好的解决方案或更通用的脚本,那么他就是那个人。

脚本:

    #!/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)。但是,就我而言,它没有提供完整的解决方案,因此我想补充一下我学到的东西。我的设置是将三星S22A300B插入具有内置1280x800显示屏和移动GM965 / GL960集成图形控制器的Vaio VGN-CR120E的VGA端口中。

简而言之,我发现的是:

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

为了解决这个有限的最大分辨率,我做了以下工作:

  • 在脚本中添加了行,以使用--newmode和--addmode调用xrandr
  • 尝试使用cvt生成1920x1080的--newmode modeline,但不幸的是,该设置不适用于我的设置。
  • 借用了带HDMI端口的笔记本电脑,插入三星电源启动了笔记本电脑,并从/var/log/Xorg.0.log中获取了1920x1080 56.2 kHz的Modline
  • 插入该modline以及修改脚本进行我的设置(例如HDMI1-> VGA1,正确的笔记本电脑分辨率等)

此ALMOST可以工作,但是登录后,外部监视器从漂亮的1920x1080重置为1024x768。原来,这是一个永久的用户设置,可以通过使用Displays ... System Setting(从齿轮菜单)轻松设置为现在可用的1920x1080。现在,当我在连接外接显示器的情况下启动时,一切正常。

另一个故障:如果此脚本运行两次(例如从终端运行),则xrandr --newmode行将收到“ BadName(命名的颜色或字体不存在)”错误,但/programming/ 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;

注意:我不确定评估是否必要(与原始文档中的echo相对)。在发现“显示器...”设置将外部显示器重置为较低的分辨率之前,我先放入了此显示器。


@Walter Wittel欢迎您,并感谢您的宝贵贡献。如果有时间,我会尽可能地找出一个更通用的脚本。但我怀疑是否有可能使用XRANDR为非EDID监视器提取正确的modline。无论如何,让我们看看。
Hanynowsky

1

我发现--auto不会使用--mode来明确指出分辨率,而是会为您选择最佳分辨率(我认为是最大的分辨率)。

#!/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
哈希您的脚本效果很好!受到此错误影响的任何人都只需要在此脚本中正确显示其分辨率,然后重新启动lightdm即可:sudo restart lightdm多数民众赞成在全部!一切正常!我在这里发布了有关此问题的问题:askubuntu.com/questions/181112/…–
良心

0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.