Xubuntu 保存多显示器配置

Xubuntu 保存多显示器配置

我在 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

谢谢至雅各布·弗莱姆通过出色的解释让这个设置变得非常简单

相关内容