RandR是对X11的一个扩展协议,允许在不重启X的情况下修改输出的一些参数并使之生效,xrandr是该协议的命令行界面,它的功能之一就是用来设置双屏显示。

缺省情况下,外接显示器后启用的是屏幕复制模式,即两个屏幕显示完全相同的内容。使用命令xrandr -q查看当前的输出状态:

Screen 0: minimum 320 x 200, current 1920 x 1080, maximum 8192 x 8192 LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm 1280x800 60.0+ 60.0 50.0
1024x768 75.1 70.1 60.0
800x600 72.2 75.0 60.3 56.2
768x576 75.0 72.0 60.0
640x480 72.8 75.0 60.0 59.9
VGA1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 509mm x 286mm 1920x1080 60.0
+ 1680x1050 60.0
1280x1024 75.0 60.0
1440x900 59.9
1280x960 60.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 72.8 75.0 66.7 60.0
720x400 70.1
HDMI1 disconnected (normal left inverted right x axis y axis) DP1 disconnected (normal left inverted right x axis y axis) HDMI2 disconnected (normal left inverted right x axis y axis) DP2 disconnected (normal left inverted right x axis y axis) DP3 disconnected (normal left inverted right x axis y axis)

可见,笔记本电脑的屏幕输出(LVDS1)的显示分辨率是1280x800,外接显示器的输出(VGA1)的分辨率是1920x1080。两个输出在整个虚拟屏幕(名称:Screen 0;当前大小:1920x1080;最大:8192x8192)上的坐标都是+0+0。所以在外接显示器中可以看到屏幕左上角有一个1280x800分辨率的小屏幕。

屏幕复制模式最常用于外接投影仪,现在我需要两个屏幕分别显示在各自的显示器中,并在两个屏幕中显示不同的内容(也就是Windows下设置双屏显示时选择的扩展模式)。

由于我将笔记本电脑放在外接显示器的左边,所以为了操作的自然,使用命令xrandr --output VGA1 --right-of LVDS1将外接显示器的输出在虚拟屏幕上的位置设置在笔记本电脑的输出的右边,示意图如下:

这样,两个显示器中就可以显示不同的内容了。由于属于同一个虚拟屏幕,当然也可以将一个窗口跨过边界从一个显示器拖到另一个显示器中。再使用命令xrandr -q查看现在的输出状态:

Screen 0: minimum 320 x 200, current 3200 x 1080, maximum 8192 x 8192 LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm 1280x800 60.0+ 60.0 50.0
1024x768 75.1 70.1 60.0
800x600 72.2 75.0 60.3 56.2
768x576 75.0 72.0 60.0
640x480 72.8 75.0 60.0 59.9
VGA1 connected 1920x1080+1280+0 (normal left inverted right x axis y axis) 509mm x 286mm 1920x1080 60.0
+ 1680x1050 60.0
1280x1024 75.0 60.0
1440x900 59.9
1280x960 60.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 72.8 75.0 66.7 60.0
720x400 70.1
HDMI1 disconnected (normal left inverted right x axis y axis) DP1 disconnected (normal left inverted right x axis y axis) HDMI2 disconnected (normal left inverted right x axis y axis) DP2 disconnected (normal left inverted right x axis y axis) DP3 disconnected (normal left inverted right x axis y axis)

使用xrandr做的设置只对当前的X会话有效,重启后恢复原样。使设置持久化的方法为修改xorg.conf或设置自动执行命令。据说有一些图形界面封装的xrandr的前端,完善的桌面环境如GNOME和KDE应该也是可以在图形界面中设置的,不过我所使用的XFCE目前似乎只能启用/禁用复制模式,而不支持在图形界面中设置扩展模式。

下面的脚本用来简化双屏显示的设置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/bash

# Restart trayer and cairo-dock which I use on my desktop
restart_widget()
{
killall trayer
killall cairo-dock

# Another script which starts trayer and set some options
mytrayer
cairo-dock &
}

set_dualhead()
{
xrandr --output LVDS1 --auto
xrandr --output VGA1 --auto
xrandr --output VGA1 --right-of LVDS1
restart_widget
}

set_lvds()
{
xrandr --output VGA1 --off
xrandr --output LVDS1 --auto
restart_widget
}

set_vga()
{
xrandr --output LVDS1 --off
xrandr --output VGA1 --auto
restart_widget
}

if [ $# -eq 0 ]; then
set_dualhead
exit
fi

case "$1x" in
"lvdsx") set_lvds;;
"vgax") set_vga;;
*) echo 'Unknown parameter !';;
esac

Posted via UltraBlog.vim.