如何强制多个监视器为LightDM提供正确的分辨率?

我受到了BUG的影响: https : //bugs.launchpad.net/ubuntu/+source/unity-greeter/+bug/874241否则,如果像我这样你有一台笔记本电脑连接到更高分辨率的第二台显示器, LIGHTDM at登录阶段, 镜像两个屏幕中的显示,并在我的情况下为它们分配一个通用的分辨率(1024X768),而不是扩展桌面(主屏幕与greeter和secondary只有一个徽标,如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和unity greeter登录界面是正确的。 具有各自正确分辨率的屏幕,如果我将鼠标移动到屏幕上,它会通过登录框和面板获得焦点,而未聚焦的屏幕只显示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) 

提前致谢。

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

我找到了一个非常简单的解决方法,对于我运行13.04非常有效。 在笔记本电脑上,24英寸外屏并非永久连接。

我只是从这里复制一下

  1. 登录
  2. 使用xrandr或Displays控件实用程序来配置监视器在登录屏幕中如何配置它们的方式
  3. sudo cp ~/.config/monitors.xml /var/lib/lightdm/.config/

由于我已经正确配置了监视器,我只需要执行第3步。

我管理下面的这个小基本脚本来回答我的问题。 现在,无论外接显示器是否已连接,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; 

非常感谢Hanynowsky! 找到你的答案为我节省了大量的工作(最近升级了12.04)。 但是在我的情况下,它没有提供完整的解决方案,所以我想添加我学到的东西。 我的设置是三星S22A300B插入Vaio VGN-CR120E的VGA端口,内置1280×800显示屏和移动GM965 / GL960集成图形控制器。

简而言之,我发现的是:

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

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

  • 在脚本中添加了行以使用–newmode和–addmode调用xrandr
  • 试过cvt生成1920×1080的–newmode模式,但遗憾的是它不能用于我的设置。
  • 借用带有HDMI端口的笔记本电脑,在插入三星的情况下启动它,并从/var/log/Xorg.0.log中获取1920×1080 56.2 kHz的模式
  • 插入该modline以及为我的设置修改脚本(例如HDMI1-> VGA1,正确的笔记本电脑分辨率等)

此ALMOST工作正常,但登录后外部显示器从一个漂亮的1920×1080重置回1024×768。 事实certificate,这是一个持久的用户设置,可以通过使用显示…系统设置(从齿轮菜单)到现在可用的1920×1080轻松修复。 现在,当我连接外部显示器启动时,一切都按预期工作。

一个额外的故障:如果此脚本运行两次(例如从终端),xrandr –newmode行将获得“BadName(命名颜色或字体不存在)”错误,但https://stackoverflow.com/questions/ 851704 / xrandr-errors-badname-named-color-or-font-does-not-exist解释了这一点,看起来很温和。 当根据Hanynowsky的指令将脚本连接到lightdm.conf与手动运行时,也不应该是一个问题。

我提供适合上述的更改(没有EDIDfunction的VGA)希望它能帮助别人。 如前面的答案中所述,您必须根据自己的设置进行调整。 我对获得正确的模式没有任何好的建议,但是如果其他人确实需要填写。

 #!/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相比)。 在我发现我的显示器…设置将外部显示器重置为较低分辨率之前,我把它放入了。

我发现,而不是使用–mode明确说明分辨率, – auto会为你选择最佳分辨率(我相信最大的分辨率)。

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

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