我在 xubuntu 16.04 上安装了多显示器设置,有 2 个屏幕(笔记本 T460s 本身有 3 个),DP KVM 切换器。笔记本通过 Dock-3 扩展坞通过 2 个 DP 端口连接。
每次我从台式机切换到笔记本电脑时,显示器配置都会丢失,因此我必须从头开始配置,包括激活单个显示器。有没有办法保存这些配置并在笔记本电脑与扩展坞连接时自动恢复?
xrandr
连接屏幕后的(缩短的)输出:
Screen 0: minimum 8 x 8, current 6800 x 1440, maximum 32767 x 32767
eDP1 connected 2560x1440+4240+0 (normal left inverted right x axis y axis) 310mm x 170mm
2560x1440 60.00*+ 48.00
1920x1440 60.00
.........
DP1 disconnected (normal left inverted right x axis y axis)
DP2 disconnected (normal left inverted right x axis y axis)
DP2-1 connected 1680x1050+2560+0 (normal left inverted right x axis y axis) 473mm x 296mm
1680x1050 59.88*+ 59.95
1920x1080 60.00 50.00 59.94
..........
DP2-2 connected primary 2560x1440+0+0 (normal left inverted right x axis y axis) 527mm x 296mm
2560x1440 59.95*+
1920x1200 59.95
..........
DP2-3 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
HDMI2 disconnected (normal left inverted right x axis y axis)
VIRTUAL1 disconnected (normal left inverted right x axis y axis)
答案1
不特定于 16.04
您遇到的问题并非 16.04 独有,它发生在许多 Ubuntu 版本上。
怎么解决
读取您的输出xrandr
,并假设我没有输入错误,以下命令应该按照您设置的方式排列您的屏幕:
xrandr --output DP2-2 --auto --pos 0x0 --output DP2-1 --auto --pos 2560x0 --output eDP1 --auto --pos 4240x0
最快捷、最简单的解决方案是将其添加到快捷键:设置 > 键盘 > 应用程序快捷键。然后在屏幕连接后按下快捷键。
解释
从输出中xrandr
我们可以看到连接的三个屏幕的信息:
eDP1 connected 2560x1440+4240+0
DP2-1 connected 1680x1050+2560+0
DP2-2 connected primary 2560x1440+0+0
在最后一节中2560x1440+4240+0
,在部分中+4240+0
,我们可以看到屏幕在组合屏幕 (x,y) 的整个图片中的位置。从左到右,屏幕的排列方式显然如下:
DP2-2 +0+0 | DP2-1 +2560+0 | eDP1 +4240+0
如果没有自动记住这种安排,我们可以用我在本答案开头添加的命令进行设置。
由于--auto
您提到还必须启用屏幕。
编辑
根据要求,如果屏幕已连接,则在后台运行一个小型 bash 脚本来进行设置:
#!/bin/bash
let "target = 3"
swon=false
function nscreens {
curr=$(xrandr | grep " connected" | wc -l)
}
function setup_scr {
xrandr --output DP2-1 --auto --pos 0x0 \
--output DP2-2 --auto --pos 2560x0 \
--output eDP1 --auto --pos 4240x0
}
while true
do
sleep 4
nscreens
if [ "$curr" -eq "$target" ] && [ "$swon" == false ]
then
setup_scr
swon=true
elif [ "$curr" -ne "$target" ] && [ "$swon" == true ]
then
swon=false
fi
done
- 将脚本复制到一个空文件中,另存为
setup_scr.sh
,使其可执行 使用以下命令在终端中测试运行它:
/path/to/setup_scr.sh
连接/断开屏幕
如果运行正常,请将其添加到启动应用程序:Dash > 启动应用程序 > 添加。添加命令:
/bin/bash -c "sleep 15 && /path/to/setup_scr.sh"
解释
每 4 秒,脚本会计算一次连接的屏幕数量。如果等于 3,它会运行一次设置,记住它确实通过将“swon”(已打开)的值切换为 来设置屏幕
true
。然后如果屏幕数量不再等于3,则“swon”
false
再次设置为,依此类推。
笔记
我在我的双屏设置上测试了该脚本,它运行良好,但是,我可能在某个地方输入了错误,而且显然我无法在您的系统上测试它。如果有错误,请告知。
答案2
这些答案仅与恢复有关。要“保存”当前状态,您可以使用此脚本 (dump_randr.sh)
#!/bin/bash
fileName="$1"
while read -r line; do
IFS=" "
entry=( $line )
display=${entry[0]}
IFS="x+"
if [[ "${entry[2]}" == primary ]]; then
primary=1
measurement=( ${entry[3]} )
else
primary=0
measurement=( ${entry[2]} )
fi
unset IFS
width=${measurement[0]}
height=${measurement[1]}
left=${measurement[2]}
top=${measurement[3]}
xrandrOpt="$xrandrOpt --output $display --mode ${width}x${height} --pos ${left}x${top}"
((primary)) && xrandrOpt="$xrandrOpt --primary"
done < <(xrandr | grep " connected")
echo "#!/bin/bash" > "$fileName"
echo "xrandr $xrandrOpt" > "$fileName"
chmod +x "$fileName"
这将转储当前的 xrandr 选项以便再次使用它们。您可以执行类似以下操作来存储当前设置:
dump_randr.sh 2_monitors_home.sh
这将创建2_monitors_home.sh
用于恢复当前状态的操作。
答案3
我尝试了 Jacob Vlijm 提出的方法,当然,我根据自己的情况对该方法进行了修改。它并没有完全起作用,而且出于某种原因,任何带有 --auto 或 --pos 的 xrand 命令都会导致我的机器崩溃(我使用的是 Xubuntu 16.04)
这是我的解决方案
xrandr --output HDMI1 --mode 1920x1080 --pos 0x0 --rate 60.00 --output eDP1 --off
这将把我通过 HDMI 连接的辅助显示器设置为 1080p 60Hz,同时禁用我的笔记本电脑显示器
xrandr --output eDP1 --mode 1366x768 --pos 0x0 --rate 60.00
这将我的笔记本电脑显示屏设置为其原始分辨率 1366x768 60Hz
当我连接到 2 个显示器时,我使用第一个设置,而当我仅连接到笔记本电脑显示器时,我使用第二个设置。
这是我的setup_scr.sh文件:
#!/bin/bash
let "target = 2"
swon=false
function nscreens
{
curr=$(xrandr | grep " connected" | wc -l)
}
function setup_dubai
{
xrandr --output HDMI1 --mode 1920x1080 --pos 0x0 --rate 60.00 --output eDP1 --off
}
function setup_normal
{
xrandr --output eDP1 --mode 1366x768 --pos 0x0 --rate 60.00
}
while true
do
sleep 4
nscreens
if [ "$curr" -eq "$target" ] && [ "$swon" == false ]
then
setup_dubai
swon=true
elif [ "$curr" -ne "$target" ] && [ "$swon" == true ]
then
swon=false
setup_normal
fi
done
谢谢至雅各布·弗莱姆通过出色的解释让这个设置变得非常简单