我的显示器顶部被边框物理遮挡。我想使用兰德重新定义显示分辨率(仅高度)以将其限制在显示器的可视部分。
显示器分辨率为 2880x1920,但顶部约 20 行像素被遮挡。我需要进行实验来确定究竟有多少行被遮挡。因此,我想要一个大约 2880x1900 的分辨率,固定在显示器底部(不居中),顶部约 20 行像素未使用。
我思考这意味着我需要使用--pos +0-20
,但是当我这样做时,Iget:
$ xrandr --output eDP-1 --pos +0-20
xrandr: failed to parse '+0-20' as a position
我还尝试了其他的变化:
$ xrandr --fb 2880x1900 --output eDP-1 --size 2880x1900+0+20
xrandr: specified screen 2880x1900 not large enough for output eDP-1 (2880x1920+0+0)
这与现有问题非常相似如何仅使用显示器的一部分来显示整个桌面?但该用户询问的是 Windows,每个人都建议只使用窗口管理器。这很快就会让人厌烦,因为这将是永恒的以及每个工作空间。我正在寻找一个更根本的解决方案。
以下测试针对 30 行像素
$ xrandr --output eDP-1 --transform 1,0,0,0,1,-30,0,0,1
确实将输出向下移动到受阻区域之外,但不幸的是,它还会将桌面的帧缓冲区扩展到可见屏幕下方。我可以为该变换添加比例因子,但我宁愿只调整桌面大小,以便桌面底部位于显示器底部。
答案1
我的配置:
- 英特尔赛扬 NUC
- Ubuntu 18.04.3 LTS
- Intel i915 驱动程序(集成显卡)
- HDMI 输出至旧液晶电视
无效的方法:
- 驱动程序不支持 xrandr 中的过度/欠扫描属性
- 自定义视频模式仍然延伸到显示器的边缘
什么做过工作:
xrandr --output "HDMI-2" --fb 1800x1000 --transform 1,0,-60,0,1,-30,0,0,1
--fb 1800x1000设置显示区域。单独使用此设置将为您提供右侧和底部的大边距,但不会使图像居中。
--变换 1,0,-60,0,1,-40,0,0,1将显示的图像向右移动 60 像素(-60)并向下移动 40 像素(-40)。
结合起来,我的屏幕左边距为 60 像素,显示屏宽度为 1800 像素,右边距为 60 像素,总共 1920。垂直方向上,顶部边距为 40 像素,显示屏高度为 1000 像素,底部边距为 40 像素,总共 1080。
我仍然收到警告:
xrandr: specified screen 1800x1000 not large enough for output HDMI-2 (1920x1080+-60+-40)
然而,帧缓冲区仍然会调整大小,并且仍然会应用变换,以便屏幕的边缘不再延伸到显示器的末端。
即使显示了上述警告消息,xrandr 后的 Errorlevel 仍为零(意味着它没有错误地工作)。
这是对我有用的解决方案,并且采用英特尔集成视频驱动程序而不是更先进的 nVidia 或 Radeon 驱动程序,这是迄今为止唯一有效的解决方案。
为了您的解决方案,我建议首先使用更小的 --fb :
xrandr --output eDP-1 --fb 2400x1800
然后进行变换以使左上角可见。
然后弄清楚如何扩展您的帧缓冲区以保持您的右边缘和底边缘可见。
这些都不会改变分辨率,您的屏幕仍然是 2880x1920。您只是改变了屏幕尺寸并将屏幕向下和向右移动。
答案2
此解决方案无需变换即可“裁剪”和定位。它甚至可以在多个真实显示器上留下多个裁剪区域。鼠标不会被限制在“裁剪”区域。¹
此命令行应该可以回答这个问题。有关更多解释,请继续阅读:
xrandr --setmonitor my-monitor-0 2880/2000x1900/1500+0+20 eDP-1
下图显示了不同状态下的 X11 屏幕示例。请注意,X11 屏幕始终是一个矩形。X11 屏幕的某些部分可能不可见。只要没有配置实际显示器来反映 X11 屏幕的这些部分,就会发生这种情况。
4 个真实显示器用于显示此 X11 屏幕。它们的位置为 2×2。这些数字表明了这些真实显示器的确切位置,因为窗口管理器(在本例中为 i3)在每个显示器上放置了一个桌面/工作区。这也解释了右上角的黑色边框。该特定显示器的分辨率略低于其他显示器。窗口管理器在该显示器上放置了一个工作区,其位置与其他显示器紧密贴合,在 X11 屏幕上留下一个“屏幕外”区域,i3 不会在该区域绘制任何内容。非平铺窗口管理器通常允许您将窗口的一半移出显示器,因此该区域可能实际上包含某些内容(并在屏幕截图上可见)。
图 1:X11 屏幕,配置 4 个 2×2 真实显示器
图 2 是通过启动xrandr --setmonitor my-monitor-0 520/5x480/4+1400+600 DVI-0
.--setmonitor
和 一起创建的--delmonitor
,--listactivemonitors
并且--listmonitors
尚未在我的系统的手册页中提及,但是xrandr --help
(在带有 RandR 1.6 的 X11 服务器上运行的 1.5.0 版本)显示了它们。
这里我们创建一个名为 的虚拟监视器my-monitor-0
。重点是窗口管理器(或任何其他 X11 客户端/应用程序)在遍历所有 X11 监视器(由虚拟监视器和常规监视器组成)时将看到它(例如,确定在 X11 屏幕上创建工作区的位置)。DVI-0
是--output
左上角真实监视器的名称,我们正在该监视器上执行此技巧。虽然DVI-0
现在构成了虚拟监视器的一部分my-monitor-0
,但重点是这里但还有别的东西:DVI-0
将从常规 X11 监视器列表中删除,因此窗口管理器将不会在此创建桌面/工作区!
该字符串520/5x480/4+1400+600
指定了虚拟显示器的分辨率、位置和像素密度。520x480 是像素的宽度和高度,+1400+600 分别是从左侧和顶部的偏移量(以像素为单位),/5
&/4
应该是毫米大小(宽度和高度)。(毫米大小用于计算该虚拟屏幕的像素密度;应用程序可以请求这些数字并可能调整其小部件大小等。——在我的例子中,它们完全是错误的。用尺子在真实显示器上测量以获取最终设置的数字。)
请注意,真实DVI-0
监视器仍显示 X11 屏幕的相同位置,并且不会通过此命令重新配置。它只会从 X11 监视器列表中删除。
图 2:左上角(真实)显示器内容被尺寸较小的虚拟显示器取代
对于图 3,我执行了xrandr --setmonitor my-monitor-1 300/30x200/20+50+30 none
在左上角创建一个额外的虚拟监视器(“裁剪区域”)。该命令与之前的命令类似。在这里,我选择了一个尚未被任何其他 X11 监视器覆盖的位置和尺寸,但它是真实DVI-0
监视器覆盖的区域的一部分。虚拟监视器的名称是新的,该虚拟监视器使用的真实监视器列表为空(none
)。重复使用DVI-0
将会破坏任何包含它的其他虚拟监视器。
图 3:在左上角真实显示器覆盖的空白区域上添加了额外的虚拟显示器
请注意,只要真实显示器形成一个连续区域,鼠标就被限制在真实显示器上(受 X11 屏幕限制)。如果一个真实显示器与其他所有显示器之间只有 1 个像素的距离,则允许鼠标在更大的 X11 屏幕矩形上移动。
对于类似的问题和类似的、通常较短的答案,请参阅列在这个答案里。
¹ X11 可以使用指针屏障来限制鼠标,但这需要使用其他软件进行额外的 X11 API 调用。
使用xwd -root | convert xwd:- screen.jpg
答案3
如何在 4K 电视中模拟 1440p 超宽显示器 [Ubuntu 23.04]
Greg 的问题是如何使用 xrandr 裁剪显示器以解决显示器上的障碍物。我用它来测试超宽 1440p 显示器是否适合我:
#!/bin/sh
xrandr --output HDMI-A-0 --mode 3840x2160 --panning 3840x2160
sleep 1
xrandr --output HDMI-A-0 --mode 3840x2160 --panning 3840x2160
sleep 1
xrandr --output HDMI-A-0 --mode 3840x2160 --fb 3440x1440 --transform 1,0,-200,0,1,-360,0,0,1
HDMI-A-0
用您的输出的实际名称替换。
xrandr --listmonitors
您可以在终端上运行检查名称。
我在 Ubuntu 23.04 上测试了这一点,但我不得不切换到 Xorg。在登录屏幕中,单击屏幕右下角的齿轮并选择 Xorg 上的 Ubuntu。
如何计算分辨率
real resolution: 3840x2160
emulated resolution: 3440x1440
3840 - 3440 = 400px which means a border of 200px on each side
2160 - 1440 = 720px which means a border of 360px on top and bottom
Notice the -200 and -360 in the example script.
答案4
在阅读并测试了所有这些答案(以及来自其他问题)之后,我发现了一种巧妙的方法来实现您想要的……它与我需要的相同。我有一台笔记本电脑,左侧 200px 完全丢失(我认为有东西物理地撞到了屏幕)。屏幕是 1366x768。我需要制作一个 1166x768 的屏幕,右侧水平偏移 200px。我做了这个脚本在启动时运行:
#!/bin/bash
# This works for my laptop!
xrandr --output LVDS --mode 1366x768 --panning 1366x768 && sleep 5
xrandr --output LVDS --mode 1366x768 --panning 1166x768 --transform 1,0,-200,0,1,0,0,0,1
运行这两个命令时,一定要延迟几秒钟(您可以尝试用更少的时间)。我认为第一个命令将平移设置为显示器分辨率。肉眼看来,它什么也不做。第二个命令使屏幕变小,并将其向右移动 200px。
如果我运行
xrandr --output LVDS --mode 1366x768 --transform 1,0,-200,0,1,0,0,0,1
(不平移),屏幕会向右移动 200px,但即使鼠标不会超出显示限制,桌面也会超出。我最大化窗口,最小-最大-关闭按钮会丢失:不可见且无法访问。如果我运行第二个命令而不运行第一个命令,它不起作用,它会显示错误。实现它的唯一方法是依次运行两个命令。
根据您的需要,您必须使用 --mode、--panning 和 --transform 值,但我认为这适合您:
#!/bin/bash
# This *may* works for you.
xrandr --output LVDS --mode 2880x1920 --panning 2880x1920 && sleep 5
xrandr --output LVDS --mode 2880x1920 --panning 2880x1900 --transform 1,0,0,0,1,-20,0,0,1
希望这对您或其他人有帮助。