在不同显示器上以不同方式缩放应用程序 - Ubuntu 16.04

yur*_*nos 6 nvidia nvidia-settings 16.04

我发现了很多关于这个主题的非常可靠的文章/答案:

而且当然:

然而,我仍在挣扎。我的笔记本电脑是戴尔 XPS15。它的显示为 3840x2160。我尝试过不同的外接显示器,但目前我使用的也是戴尔分辨率为 1920x1080 的显示器。

当我连接外接显示器时,某些面板在 3840x2160 屏幕上立即变得非常小。当我尝试放大内置显示器时,chrome 会缩放,我的 IDE 会缩放,但显示窗口与其他窗口(如 NVIDIA X Server 设置)保持非常小。我试图在显示中使用缩放所有窗口内容以匹配但无济于事。它要么在外部屏幕上太大,要么在内置屏幕上太小。我也试过 xrandr 与 scale param 但它给了我:

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
Run Code Online (Sandbox Code Playgroud)

理想情况下,我希望同一应用程序的多个窗口(假设 Chrome 或 Intellij Idea 在不同的显示器上打开并在它们上独立缩放)。

编辑

我不是在为菜单和标题栏寻找Scale,我喜欢的方式。我希望 Windows 内容独立缩放。显示UI 迫使我缩放所有窗口以匹配内置 ID 显示或外部显示。其结果:

  1. 缩放所有窗口内容以匹配内置显示:

    内置显示器 - 一切看起来都很完美;外部显示器 - 一切都是巨大的。

  2. 缩放所有窗口内容以匹配外部显示:

    内置显示器 - 非常小;外部显示器 - 一切看起来都很完美。

use*_*.dz 3

我有340.98GT218M [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
Run Code Online (Sandbox Code Playgroud)

奇怪而复杂的堆栈,需要专门使用专有驱动程序进行调试。大多数时候,我会遇到意想不到的行为,可能是由于缺乏对当前 Linux 图形堆栈设置的了解。

  • 我之前写过这个答案,可能会引入一些调试工具,例如xtrace
  • xrandr仅在 X 服务器重置后,避免运行多个/连续命令。根据之前的命令,相同的命令可能会产生不同的结果。我注意到 with --scale(请参阅我的答案中的测试用例,上面链接)--transform& --fb。仍然不知道只有注销/登录的简单方法。因此,在进行另一次尝试之前,请务必先注销/登录。
  • 屏幕截图仅从 FB 获取像素大小的图像,因此我将添加相机照片以显示真实结果。

方法一: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
Run Code Online (Sandbox Code Playgroud)

或者:

xrandr \
--output DP-3 --mode 1280x800 --pos 0x0 --fb 2880x2600 \
--output VGA-0 --mode 1440x900 --scale-from 2880x1800 --pos 0x800
Run Code Online (Sandbox Code Playgroud)

帧缓冲区大小计算:

width = max(1280,1440*2) = 2880
height = 800+900*2 = 2600
Run Code Online (Sandbox Code Playgroud)

结果:

  • nvidia xrandr 比例屏幕截图

    nvidia xrandr 比例屏幕截图

  • nvidia xrandr 比例照片

    nvidia xrandr 比例照片

方法2:nvidia-settings查看端口输入/输出

注意,效果不太好。nvidia-settings不会将帧缓冲区更改为xrandr命令中所需的大小。这似乎是一个错误(有点,nvidia有自己的 FB),需要更多研究。

尝试xrandr直接使用复制设置nvidia-settings(我使用方法1中的xrandr,标记nvidia设置,重置设置,然后直接使用nvidia-settings):

  1. gksu nvidia-settings→ X 服务器显示配置
  2. 选择外部显示器→高级...
  3. 使ViewPortIn平移为ViewPortOut的两倍(与原始分辨率相同)
  4. 保持内部监视器不变然后应用

例子:

结果:注意鼠标指针,它可以到达第二个显示器的所有边缘,即使它只绘制左上四分之一。

  • nvidia-设置视口屏幕截图

    nvidia-设置视口屏幕截图

  • nvidia-设置视口照片

    nvidia-设置视口照片

更新:嗯,我终于找到了一个解决方法。将平移的宽度或高度添加 1px ( Panning)

    Panning:     2881x1800 or 2880x1801
Run Code Online (Sandbox Code Playgroud)

新结果:我无法解释这一点,如果我在下面使用,只是背景被损坏,否则一切看起来都很好。

  • nvidia-settings viewportin 与平移技巧屏幕截图

    nvidia-settings viewportin 与平移技巧屏幕截图 - 下面 降低了上图的颜色质量,使图像限制小于 2MB nvidia-settings viewportin 与平移技巧屏幕截图 - 右侧

  • nvidia -设置视口与平移技巧照片

    nvidia-settings viewportin 与平移技巧照片 - 下面 nvidia-settings viewportin 与平移技巧照片 - 右侧

方法三: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
Run Code Online (Sandbox Code Playgroud)

帧缓冲区大小计算:

width = 1280+1440*2 = 4160
height = max(800,900*2) = 1800
Run Code Online (Sandbox Code Playgroud)

结果:

  • nvidia xrandr 变换截图

    nvidia xrandr 变换截图

  • nvidia xrandr 变换照片

    nvidia xrandr 变换照片


小智 0

我找到了一个简单的解决方案。我运行的是 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:~$
Run Code Online (Sandbox Code Playgroud)

我只是运行了以下命令,它运行得很好:

light@light:~$ xrandr --output HDMI-0 --scale 2x2 --mode 1920x1080
light@light:~$
Run Code Online (Sandbox Code Playgroud)

--scale 2x2意味着将外部屏幕上的所有内容缩小两倍。

--mode是你想要的分辨率。

就是这样