使用 xrandr 设置多显示器

使用 xrandr 设置多显示器

到目前为止,我一直单独使用笔记本电脑屏幕 (3840x2160),现在我正尝试设置辅助显示器 (1920x1080)。由于我的主显示器的分辨率是辅助显示器的两倍,因此配置起来非常困难。最初,当我连接第二台显示器时,我的笔记本电脑分辨率降低到 1920x1080,缩放比例为 100%。这会导致问题,原因有两个:

  • 我想保留我的笔记本电脑显示器支持的 3840x2160
  • 我的应用程序缩放比例设置为 200%,否则,许多应用程序在 4K 显示器上看起来不太好

将显示器重新设置为 3840x2160 又带来了另一个问题:由于笔记本电脑显示器的尺寸是辅助显示器的两倍,因此只有当光标移动到屏幕右侧的上半部分时,它才会从笔记本电脑转换到外部显示器。光标无法移动到下半部分。

此外,如果我将缩放比例设置回 200%,那么在 4K 显示器上可以很好地显示的应用程序在 FHD 显示器上看起来会很糟糕。

为了解决这个问题,我一直在寻找这个答案:两个不同的屏幕可以有不同的 DPI 配置吗? 。按照其说明调整我的显示器时,我发现虽然第二台显示器确实如我所愿显示,但我无法将光标移出其第一象限。这些是我执行的命令(DP-1是我的外接显示器,eDP-1是我的笔记本电脑):

xrandr --output DP-1 --scale 2x2 --mode 1920x1080 --fb 7680x2160 --pos 3840x0
xrandr --output eDP-1 --scale 1x1 --pos 0x0

在尝试运行各种其他命令以实现我想要的结果后,我设法让它工作了 - 虽然不是以一种可以清楚地看到我的哪些步骤起作用的方式。我基本上使用我正在测试的各种选项运行 xrandr,直到它工作为止。从那时起,我重新启动了系统,并记录了一组命令,这些命令将监视器配置设置为我想要的,如下所示(请注意,重新启动后,我的输出名称中不再有破折号)。

xrandr --output DP1 --scale 2x2 --mode 1920x1080 --fb 7680x2160 --pos 3840x0
xrandr --output DP1 --panning 3840x2160
xrandr --output DP1 --panning 1920x1080
X Error of failed request:  BadMatch (invalid parameter attributes)
  Major opcode of failed request:  140 (RANDR)
  Minor opcode of failed request:  7 (RRSetScreenSize)
  Serial number of failed request:  40
  Current serial number in output stream:  41
xrandr --output DP1 --scale 1x1
xrandr --output DP1 --scale 2x2
xrandr --output DP1 --scale 2x2 --mode 1920x1080 --fb 7680x2160 --pos 3840x0
xrandr --output DP1 --panning 1920x1080
xrandr --output DP1 --scale 2x2 --mode 1920x1080 --fb 7680x2160 --pos 3840x0
xrandr --output eDP1 --scale 1x1 --pos 0x0
xrandr --output DP1 --pos 3840x0
xrandr --output eDP1 --pos 0x0

为了弄清楚哪些步骤是必要的,哪些步骤不是,我尝试在配置设置时省略我认为不负责任的命令。问题是,弄乱它会导致我的显示器进入伪冻结状态,在这种情况下我可以移动鼠标,但其他图形元素都不会移动 - 遇到这种情况时我必须重新启动。

最初,当系统启动时,我的外接显示器的应用程序内容(包括光标)看起来相当放大。我按照列出的顺序运行命令,在倒数第二步,图形像我在上一节中描述的那样冻结 - 尽管尽管如此,继续输入最后的命令会导致系统恢复正常,并按照我希望的方式进行配置。

请注意,“失败请求的 X 错误”消息似乎与平移命令没有直接关系 - 在一个我省略此行的测试中,该消息出现在取代其位置的行(比例线)上。

对于我来说,直接解决问题的最佳方法是什么,而不是运行一系列(某种程度上)当前对我有用的命令?

编辑:这些命令也不是绝对的 - 它们似乎只能保证相对于 xrandr 的默认配置起作用。如果我在运行这些命令之前弄乱了 xrandr,它可能无法正常工作。

EDIT2:我也看到了,这听起来就像我面临的问题,但显然已经修复了(我正在运行 1.5 版本)。

答案1

鼠标无法与第二/第三显示器缩放:

我发现在我的第三台显示器的偏移量上添加 1 个像素可以解决鼠标被限制在原始屏幕尺寸(左上象限)的问题。

以下是适用于 3 台显示器(两个 4k,一个 1280x1024)的 xrandr 脚本:

xrandr \
  --dpi 282 \
  --fb 9409x2160 \
  --output eDP --primary --mode 3840x2160 --pos 0x0 --rotate normal \
  --output DisplayPort-7 --mode 3840x2160 --right-of eDP --rotate normal \
  --output DisplayPort-4 --mode 1280x1024 --pos 7681x0 --scale 1.6875x1.6875 --rotate left;

注意:偏移量 pos 增加 1:DisplayPort-4 --mode 1280x1024 --pos7681x0并且 --fb 大 1 以适应这种情况。

为了清除运行此程序后的一些图形故障,我还更新了壁纸:

# load wallpaper (remove screen-load artifacts)
feh --bg-fill ~/Pictures/The\ Old\ School\ 2018.jpeg

现在我只需要弄清楚为什么物理显示器有时会在启动时交换显示端口。最初 DisplayPort-4 会与 DisplayPort-5 交换,最近 DisplayPort-4 和 7 交换。 :(

我很高兴收到所有反馈,但这不是我的专业领域。

系统:Dell Precision 7530、TB18DC 底座、U2718Q Ultrasharp 27 英寸 4k 和 Ultrasharp 1703FP 显示器

史蒂夫

答案2

今天(2019-02-15)发布了 18.04 的新版本 18.04.02。它包含一个新的 Xserver,解决了鼠标被限制在外接显示器屏幕四分之一的问题。我花了好几天时间试图找到解决方法,现在它已经按预期工作了!:-)

但是如果您使用的是 18.04 LTS,您将无法通过更新系统获得修复!您需要安装新的内核和硬件驱动程序,其中还包括新的 xserver sudo apt-get install --install-recommends linux-generic-hwe-18.04 xserver-xorg-hwe-18.04(感谢 omgubuntu.co.uk 指出您不会自动获得更新)。

作为对我上面发布的脚本的更新,将外接显示器放在右侧的神奇线条,现在不受鼠标限制,是: xrandr --output DP-1 --auto --scale 2x2 --pos 3840x0 --fb 6000x3840 --right-of eDP-1 --rotate left --output eDP-1 --auto --scale 1x1 --pos 0x0 --primary

我发现,如果我一直在使用 --panning(根据我的经验,它会取消 2x2 缩放),新的 xrandr 命令不会取消平移:我必须重新启动。

答案3

我有一台带外接显示器的笔记本电脑,两者的分辨率都和你一样。但我以纵向方式使用外接显示器。我的显示器在笔记本电脑的左侧 - 当 xrandr 在右侧时,我无法让 xrandr 执行我想要的操作。我将显示器插入两个端口之一,以便脚本可以正常工作。如果没有 s,--auto我发现外部显示器可能会偶尔被禁用,这引起了很多困惑,直到我在 GUI 设置中找到它被禁用(我使用 kubuntu 18.04)。这是我的脚本,它包含有关所涉及数学的注释:

#!/bin/bash

# 2mon: adjusts displays after plugging or plugging second monitor

# Main laptop display is eDP-1 3840x2160 landscape
# Second ASUS monitor is DP-1 or DP-2 1920x1080 portrait ie. 1080x1920
#                        has to have 2x2 scale or everything appears huge

# Find current monitors
tmp=~/tmp/xrandr.txt
xrandr>$tmp

# Set $dp to DP-1 or DP-2 as appropriate
# xrandr prints "DP-1 connected" and "DP-2 disconnected" or vice versa. But
# don't match eDP-1...
dp=
if   (grep "^DP-1 connected" $tmp >/dev/null);  then dp=DP-1;
elif (grep "^DP-2 connected" $tmp >/dev/null);  then dp=DP-2; fi

if [ "$dp" = "" ]; then
  echo External monitor is not connected

  # Reset pos and frame buffer size in case second monitor was previously connected
  xrandr --output eDP-1 --auto --scale 1x1 --pos 0x0 --fb 3840x2160 --primary
else
  echo External monitor is on $dp

  # External monitor to left of main display

  # Main display starts at 2*1080=2160 (2* because of 2x scale)
  # Frame Buffer -fb x-direction is 2*1080=2160 (external) + 3840 (main) = 6000
  #                  y-direction is largest of 2*external y= 3840 and main y = 3840
  xrandr --output $dp   --auto --scale 2x2 --pos 0x0 --fb 6000x3840 --left-of eDP-1 --rotate left
  xrandr --output eDP-1 --auto --scale 1x1 --pos 2160x0 --primary
fi

答案4

最简单的实现方法是

xrandr --fbmm 6528x3672 --output HDMI-0 --pos 2688x0 --mode 3840x2160 --scale 1x1 --primary --output DVI-0 --pos 0x0 --mode 1920x1080 --scale 1.4x1.4

如果你正在运行 KDE,你必须重新启动 Plasma,否则第二个显示器不会充满桌面,而且边框是黑色的

kquitapp5 plasmashell && kstart5 plasmashell

相关内容