我发现了很多关于这个主题的非常可靠的文章/答案:
- https://askubuntu.com/a/555812/574648
- https://unix.stackexchange.com/a/213984
- https://askubuntu.com/a/662567/574648
而且当然:
- https://wiki.archlinux.org/index.php/Xrandr
- https://wiki.archlinux.org/index.php/HiDPI#Multiple_displays
但是,我还是有点纠结。我的笔记本电脑是戴尔 XPS15。它的显示屏是 3840x2160。我试过不同的外接显示器,但目前我用的也是戴尔的,分辨率是 1920x1080。
当我连接外接显示器时,一些面板在 3840x2160 屏幕上立即变得非常小。当我尝试放大内置显示器时,chrome 缩放,我的 IDE 缩放,但显示窗口以及其他窗口(如 NVIDIA X Server 设置)保持非常小。我尝试过缩放所有窗口内容以匹配在展示但无济于事。要么是外接屏幕上太大,要么是内置屏幕上太小。我也尝试过使用比例参数的 xrandr,但它给了我:
xrandr --output HDMI-1 --scale 2x2
X Error of failed request: BadValue (integer parameter out of range for operation)
Major opcode of failed request: 140 (RANDR)
Minor opcode of failed request: 26 (RRSetCrtcTransform)
Value in failed request: 0x40
Serial number of failed request: 38
Current serial number in output stream: 39
理想情况下,我希望同一个应用程序的多个窗口(比如说 Chrome 或 Intellij Idea)在不同的显示器上打开并在它们上独立缩放。
编辑
我不是在寻找菜单和标题栏的比例,我喜欢这些栏目。我希望窗口内容可以独立缩放。显示器UI 迫使我缩放所有窗口以匹配内置显示屏或外部显示屏。结果:
缩放所有窗口内容以匹配内置显示屏:
内置显示器 - 一切看起来很完美;外置显示器 - 一切都很大。
缩放所有窗口内容以匹配外部显示:
内置显示器 - 非常小;外置显示器 - 一切看起来都很完美。
答案1
我有340.98
GT218M [NVS 3100M] 的 nvidia 驱动程序,Xubuntu 16.04,如果我没有特别说明,下面的任何结果都来自这个环境。以下是我的测试环境信息,输出:
sudo apt-get install pastebinit; \
sudo sh -c "lsb_release -sd; \
dmidecode -s system-product-name; echo ==; \
lshw -c display; echo ==; \
xrandr --verbose; echo ==; \
cat /etx/X11/xorg.conf" \
| tee ~/Desktop/ubuntu-graphic-info.txt \
| pastebinit
使用专有驱动程序调试时,堆栈奇怪而复杂。大多数时候,我都会遇到意想不到的行为,这可能是由于对当前 Linux 图形堆栈设置缺乏了解。
- 我写这个答案之前,可能会引入一些调试工具,例如
xtrace
- 避免运行多个/连续的
xrandr
命令,仅在 X 服务器重置后。根据先前的命令,相同的命令可能会有不同的结果。我注意到--scale
(参见我答案中的测试用例,链接在上面)--transform
&--fb
。仍然不知道仅通过注销/登录的简单方法。因此,在进行另一次尝试之前,请务必注销/登录。 - 截图仅从 FB 截取像素大小的图像,因此我将添加相机照片来展示真实效果。
方法 1:xrandr --output .. --scale HCoefxVCoef
或--scale-from WxH
注意,对我来说很好用。--scale
是的快捷方式--transform
,请参阅方法3
(VGA-0 低于 DP-3)
xrandr \
--output DP-3 --mode 1280x800 --scale 1x1 --pos 0x0 --fb 2880x2600 \
--output VGA-0 --mode 1440x900 --scale 2x2 --pos 0x800
或者:
xrandr \
--output DP-3 --mode 1280x800 --pos 0x0 --fb 2880x2600 \
--output VGA-0 --mode 1440x900 --scale-from 2880x1800 --pos 0x800
FrameBuffer大小计算:
width = max(1280,1440*2) = 2880
height = 800+900*2 = 2600
结果:
方法 2:nvidia-settings
查看端口输入/输出
注意,效果不佳。nvidia-settings
不会按照xrandr
命令将帧缓冲区更改为所需的大小。这似乎是一个错误(有点像,nvidia
有自己的 FB),需要进一步研究。
尝试xrandr
使用以下方式直接复制设置nvidia-settings
(我使用了方法 1 中的 xrandr,标记了 nvidia 设置,重置设置,然后直接使用 nvidia-settings):
gksu nvidia-settings
→ X 服务器显示配置- 选择外接显示器→高级...
- 制作视口输入&平移两倍视口输出(与原始分辨率相同)
- 保持内部监视器不变,然后申请
例子:
-
Position: +0+0 ViewPortIn: 1280x800 ViewPortOut: 1280x800+0+0 Panning: 1280x800
-
Position: +1280+0 (rightof) or +0+800 (below) ViewPortIn: 2880x1800 ViewPortOut: 1440x900+0+0 Panning: 2880x1800
结果:注意鼠标指针,即使它只绘制左上角的四分之一,它也可以到达第二台显示器的所有边缘。
更新:好吧,我终于找到了一个解决方法。将平移的宽度或高度增加 1px ( Panning
)
Panning: 2881x1800 or 2880x1801
新结果:我无法解释这一点,如果我使用下面的方法,背景就会被破坏,否则一切似乎都正常。
nvidia-settings viewportin 带平移技巧截图
nvidia -settings viewportin 带平移技巧照片
方法 3:xrandr --output .. --transform "H,0,0,0,V,0,0,0,1"
注意,对我来说效果很好,与方法 1 相同
(DP-3 右侧的 VGA-0)
xrandr \
--output DP-3 -primary --mode 1280x800 --pos 0x0 --transform "1,0,0,0,1,0,0,0,1" --fb 4160x1800 \
--output VGA-0 --mode 1440x900 --transform "2,0,0,0,2,0,0,0,1" --right-of DP-3
FrameBuffer大小计算:
width = 1280+1440*2 = 4160
height = max(800,900*2) = 1800
结果:
答案2
我找到了一个简单的解决方案。我正在运行 Ubuntu 18.04。这是我的 xrandr 输出:
light@light:~$ xrandr
Screen 0: minimum 8 x 8, current 5760 x 2160, maximum 32767 x 32767
HDMI-0 connected 1920x1080+3840+92 (normal left inverted right x axis y axis) 476mm x 268mm
1920x1080 60.00*+ 59.94 50.00
1680x1050 59.95
1600x900 60.00
1440x900 59.89
1280x1024 60.02
1280x800 59.81
1280x720 60.00 59.94 50.00
1024x768 60.00
800x600 60.32
720x576 50.00
720x480 59.94
640x480 59.94 59.93
DP-0 connected primary 3840x2160+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
3840x2160 60.02*+ 48.02
DP-1 disconnected (normal left inverted right x axis y axis)
DP-2 disconnected (normal left inverted right x axis y axis)
DP-1-1 disconnected (normal left inverted right x axis y axis)
HDMI-1-1 disconnected (normal left inverted right x axis y axis)
DP-1-2 disconnected (normal left inverted right x axis y axis)
HDMI-1-2 disconnected (normal left inverted right x axis y axis)
light@light:~$
我只需运行以下命令,它就能完美运行:
light@light:~$ xrandr --output HDMI-0 --scale 2x2 --mode 1920x1080
light@light:~$
--scale 2x2
意味着将外部屏幕上的所有内容缩小一倍。
--mode
是您想要的分辨率。
就是这样