[shlug]Ubuntu11.10如何自动设置外接显示器的分辨率

30 views
Skip to first unread message

罗健忠

unread,
Apr 11, 2012, 8:24:23 AM4/11/12
to sh...@googlegroups.com
我的笔记本系统是Ubuntu11.10,显卡是i5核芯显卡

在VGA接口上外接了一个显示器,如果直接连的话,可以正确识别显示器型号和最大分辨率1280*1024
但是我在中间加了一个一分二的切换器后,系统就认不出外接显示器的型号,而且分辨率也变成了1024*768

目前我写了一个调用xrandr的脚本,见:https://github.com/newkedison/shell_script/blob/master/externscreen
可以正确修改外接显示器的分辨率,但是有一个缺点,就是每次接上这个显示器后,都需要调用一次这个脚本才行

不知道有什么办法,可以使得在接上显示器后,可以自动设置其分辨率为1280*1024?

我在网上看的很多地方,说的都是要修改xorg.conf,但是听说Unity已经开始抛弃xorg.conf了,是不是有这回事?

我因为在系统里面找不到xorg.conf,所以看着man和网上的例子自己写了一个,放在/etc/xorg.conf下面,但是没有效果
文件内容如下:
>Section "Monitor"
>    Identifier      "LCD"
>EndSection
>Section "Monitor"
>    Identifier      "ROC"
>    Modeline        "1280x1024_75.00"  138.75  1280 1368 1504 1728  1024 1027 1034 1072 -hsync +vsync
>    Option          "PreferredMode" "1280x1024_75.00"
>EndSection
>Section "Device"
>    Identifier      "Intel Card"
>    Driver          "Intel"
>EndSection
>Section "Screen"
>    Identifier      "Primary Screen"
>    Device          "Intel Card"
>    Monitor         "LCD"
>    DefaultDepth    24
>    SubSection "Display"
>        Depth           24
>        Modes   "1366x768" "1360x768" "1024x768"
>    EndSubSection
>EndSection
>Section "Screen"
>    Identifier      "Second Screen"
>    Device          "Intel Card"
>    Monitor         "ROC"
>    DefaultDepth    24
>    SubSection "Display"
>        Depth           24
>        Modes   "1280x1024" "1024x768" "800x600"
>    EndSubSection
>EndSection
>
>Section "ServerLayout"
>        Identifier      "Default Layout"
>        Screen          "Primary Screen"
>        Screen          "Second Screen" RightOf "Primary Screen"
>EndSection

感谢你们的帮助

--

Zhenyu Wang

unread,
Apr 12, 2012, 1:57:12 AM4/12/12
to sh...@googlegroups.com
On 2012.04.11 20:24:23 +0800, 罗健忠 wrote:
> 我的笔记本系统是Ubuntu11.10,显卡是i5核芯显卡
>
> 在VGA接口上外接了一个显示器,如果直接连的话,可以正确识别显示器型号和最大分辨率
> 1280*1024
> 但是我在中间加了一个一分二的切换器后,系统就认不出外接显示器的型号,而且分辨率
> 也变成了1024*768

因为对显卡来说转换器相当于显示器了,依赖转换器的硬件只提供标准VESA模式,还是能
返回外设真正的EDID.

>
> 目前我写了一个调用xrandr的脚本,见:https://github.com/newkedison/shell_script/
> blob/master/externscreen
> 可以正确修改外接显示器的分辨率,但是有一个缺点,就是每次接上这个显示器后,都需
> 要调用一次这个脚本才行
>
> 不知道有什么办法,可以使得在接上显示器后,可以自动设置其分辨率为1280*1024?

外置显示器变化会产生中断,驱动会向用户空间发event。直接的做法是写一条udev rule,
收到event调你的脚本。大概应该是

SUBSYSTEM=="drm", ACTION=="change", ENV{HOTPLUG}=="1", RUN+="externscreen"

你可以用udevadm monitor --property,一边插拔一边观察一下事件参数。
但要注意插上和拔下都会产生事件,所以你的脚本需要改一下,例如判断当前是否有VGA连着.

其实hotplug也会产生randr的event,一般gnome环境里的display manager就会截获,比如
自动平铺等等, 但是高级的改法我就不知道了,呵呵.

>
> 我在网上看的很多地方,说的都是要修改xorg.conf,但是听说Unity已经开始抛弃
> xorg.conf了,是不是有这回事?

嗯,更加模块化了,一般不需要,特殊的设备可能还需要,但是不必写在一个中央的xorg.conf里.

--
Open Source Technology Center, Intel ltd.

$gpg --keyserver wwwkeys.pgp.net --recv-keys 4D781827

signature.asc

罗健忠

unread,
Apr 12, 2012, 7:28:34 AM4/12/12
to sh...@googlegroups.com
非常感谢Zhenyu Wang 介绍的办法,我觉得udev rules的方法是可行的
由于以前没有接触过,花了几个小时把udev的写法基本看了一遍,我觉得应该是理解了其用法
但是在实际操作中,却遇到了一个难题,没Google到相关的说明,只能再次请教

情况是这样的:
我在/etc/udev/rules.d/下新建了一个文件10-externscreen.rules,内容如下:
SUBSYSTEM=="drm", NAME="ROC", SYMLINK+="ROCROC" RUN+="notify-send --urgency=normal -i aaa hello"
(为了方便起见,只判断了SUBSYSTEM,其他就暂时忽略)

从结果来看,/etc/ROC和/etc/ROCROC都存在,使用udevadm monitor --property也可以监视到其名字已经改变
但是,RUN的内容始终得不到执行,无论是用上面的notify-send命令,或者是echo一段内容到文件,或者是调用一个可执行的脚本,均无法得到任何反应

然后我使用
$ udevadm test $(udevadm info -q path -n /dev/ROC)
测试其输出为:(内容较长,见:http://pastie.org/3773566
最后面可以看到:
DEVNAME=/dev/ROC
DEVTYPE=drm_minor
ACTION=add
SUBSYSTEM=drm
DEVLINKS=/dev/ROCROC
TAGS=:udev-acl:
PRIMARY_DEVICE_FOR_DISPLAY=1
run: 'notify-send --urgency=normal -i aaa hello'
run: 'udev-acl --action=add --device=/dev/ROC'
从倒数第二行可以看出,确实执行了预定的命令,但是没有看到任何效果(用echo到文件的方法或者调用可执行脚本也一样没有任何效果)
目前就卡在RUN这里,不知道还能怎么处理?


--
Reply all
Reply to author
Forward
0 new messages