我在不同的工作环境之间移动我的笔记本电脑(ThinkPad T570、Ubuntu Xenial、Unity/Compiz),我发现使用 Unity 控制中心“显示”小程序无法可靠地(永远?!)保留我指定的安排。
为了解决这个问题,我编写了一个 bash/xrandr 脚本,可以按照我的需要安排事情。(可用这里作为要点,但这些细节对于我的问题来说并不重要,因此没有包括全部内容)。如果屏幕显示不正确,那么我会执行此脚本来安排它们。
我希望让此脚本在显示器连接时触发。Unity/Compiz 对存储在 Display prefs 中的设置执行此操作,因此我想知道以 bash/xrandr 中表达的正确方式获取我的首选设置,并让 Ubuntu 作为“本机”体验的一部分提供该设置。
更新:我发现~/.config/monitors.xml
这似乎是 Unity 存储设置的地方。这是我的,随着我更换位置,有了新的修改。
我曾考虑通过 触发重新排列/etc/udev/rules.d
,但这需要允许 root 运行的脚本与我的 WM 通信,这可能意味着打开 xhost 权限。由于默认操作系统似乎可以在没有该权限的情况下排列显示器(只是不是我想要的排列),我更愿意找到尽可能“原生”的解决方案。
答案1
我最终在一个 bash 脚本中处理了这个问题,该脚本测试xrandr
连接设备的输出,然后设置适当的每个环境布局。
下面是一个简化版本,演示了如何执行此操作。
#!/bin/bash
# Unity doesn't remember my screen layouts, so I made this to do it for me.
# GPLv3+, (c) Chris Burgess @xurizaemon
CONNECTED=$( xrandr | grep ' connected' )
LAYOUT=unknown
if [[ $CONNECTED = *"DP-1 connected"* ]] ; then
LAYOUT=thunderbolt
elif [[ $CONNECTED = *"HDMI-2 connected"* ]] ; then
LAYOUT=hdmi-2
fi
case "$LAYOUT" in
"thunderbolt")
# Thunderbolt, laptop
xrandr --output DP-1 --auto --left-of eDP-1 --primary
echo "Configured for $LAYOUT"
;;
"hdmi-2")
# Set to 57Hz for monitor support
xrandr --newmode "1920x1080_57.00" 163.00 1920 2040 2240 2560 1080 1083 1088 1119 -hsync +vsync
xrandr --addmode HDMI-2 "1920x1080_57.00"
# HDMI, laptop
xrandr --output HDMI-2 --mode "1920x1080_57.00" --left-of eDP-1 --primary
echo "Configured for $LAYOUT"
;;
*)
echo "Layout $LAYOUT not known."
esac
我的实际脚本位于https://gist.github.com/e1892192ea8dd03a210d2890f8f966e7