将两块显示器组合成一块超大的屏幕

01 Aug 2023 5277 words 18 minutes BY-SA 4.0
develop

程序员永远不会停止对显示器、键盘、处理器、内存、存储等设备的追求

醉卧沙场

动机

导师为每个学生配备了一台主机和两台 2560x1440 的显示器。本着物尽其用的原则,现将两台 2560x1440 的显示器拼接为一个 2880x2560 的大显示屏。

展示效果:

Video

无论是顶部弹幕和底部弹幕都不会遮挡 16:9 的视频。

video

Coding

分割屏幕的空间变大了。

coding

Reading

主流的双栏论文刚好被两块显示器的顶部边框一分为二。 nice!

reading

背景

交互方式/用户界面

用户界面通常分为文本用户界面 (TUI) 和 图形化用户界面 (GUI) 。 除此之外还有无用户界面的命令行 (CLI) 交互方式。

并非只有操作系统才能显示图形化用户界面。例如可以利用 framebuffer:

fallout-grub-theme

图形化用户界面

排除一些软件直接利用 framebuffer 而非 X11/Wayland 去显示图像或 pdf 。 Linux 的图形化用户界面主要分为 X11 和 Wayland 2 个方案。

早期在 nvidia 显卡下被报道过有屏幕撕裂的 bug 。不过此 bug 已被某些用户报告消失(可能是 nvidia 驱动开源的缘故?)。

整体动画和特效很惊艳,没有了 X11 那种山寨的感觉,纯 wayland 环境下完全没有屏幕撕裂,实时帧率远高于 X11 环境

2022 年,用 Wayland 开启 linux

某些视频会议的软件无法投屏,得额外用 X11 启动。

原生 Wayland 下无法使用摄像头,无法直接进行屏幕共享。如有上述需求请使用 wemeet-x11 启动。

腾讯会议

某些支持背景透明的软件(例如终端模拟器)无法支持。

window_background_opacity cannot work on wayland

桌面环境

Linux 桌面环境(DE)九宫格 用户善良
功能多才是好桌面环境
用户中立
功能够用才是好桌面环境
用户邪恶
桌面环境是什么?能吃吗?
语言保守
C 才是 Linux 软件开发的正统
Gnome
Gnome
Ubuntu 默认桌面
我占用率大我先说话
Xfce
Xfce
稚晖君代言
比什么功能,我们比内存占用
i3
i3
i3 大法好
退 DE 保全家
语言中立
OOP 才是桌面环境开发的王道
KDE
KDE
钛山认证,ArchLinux 投票榜第一
是我,是我先,明明都是我先来的
LXQt
LXQt
会写桌面环境的内科医生
不是好的软件工程师
awesome
awesome
如果我拿出 lua
阁下又该如何应对呢
语言混乱
邪教
WSL2
WSL2
WSL2 也是 GNU/Linux ~的虚拟机~
Windows 才是最好的桌面环境
Android
Android
Android 也是 Android/Linux
Android 才是最好的桌面环境
OpenWrt
OpenWrt
OpenWrt 也是 musl/Linux
都有命令行了还要什么自行车?

桌面环境通常包含:

目前用户占有量最大的四大桌面:

重量级桌面通常功能多但耦合严重(例如 gnome 的登录管理器基本不能换成 gdm 以外的登录管理器), 轻量级桌面则倾向于所有部件都可更换。但功能少,例如:

四大桌面的历史有些颇有意思。例如内科医生写代码呀, qt 改许可证呀,在此不作赘述。

技术方案

TwinView 是一种操作模式,其中两个显示设备 (数字平板、CRT 和电视)可以显示任意配置中的单个 X 屏幕。 这种使用显示器的方法与其他技术相比,具有几个明显的优势: …

英伟达加速 Linux 图形驱动程序自述文件和安装指导

搜索手册不难发现解决问题的方法之一是 TwinView.

窗口管理器

进一步以 TwinView 为关键词搜索可以发现:

某些桌面环境尚不支持此功能。 Openbox 已经过测试并且可以使用此功能。

多显示器

笔者测试了四大桌面的结果也是如此。

lxqt 默认使用 openbox 作为窗口管理器,并在设置里提供了配置方法:

Monitor Settings

DE

登录管理器

lxqt 默认使用的登录管理器是不支持 TwinView 的。需要更换 xdm 。 xdm 没有图形化用户界面的配置方法。

此主机共有 4 个媒体接口。 2 台显示器被分别连接到了 DP-0 和 HDMI-1 。假设我们不知道 2 台显示器被连接到了哪里,我们可以通过以下方法查看:

$ xrandr
Screen 0: minimum 8 x 8, current 2880 x 2560, maximum 32767 x 32767
DVI-D-0 disconnected (normal left inverted right x axis y axis)
HDMI-0 disconnected (normal left inverted right x axis y axis)
DP-0 connected primary 1440x2560+0+0 left (normal left inverted right x axis y axis) 597mm x 336mm
2560x1440     59.95*+  74.97
1920x1080     74.97    60.00    59.94    50.00
1680x1050     59.95
1440x900      59.89
1280x1024     75.02    60.02
1280x960      60.00
1280x720      60.00    59.94    50.00
1024x768      75.03    70.07    60.00
800x600       75.00    72.19    60.32    56.25
720x576       50.00
720x480       59.94
640x480       75.00    72.81    59.94    59.93
DP-1 disconnected (normal left inverted right x axis y axis)
HDMI-1 connected 1440x2560+1440+0 right (normal left inverted right x axis y axis) 597mm x 336mm
2560x1440     59.95*+  74.97
1920x1080     74.97    60.00    59.94    50.00
1680x1050     59.95
1440x900      59.89
1280x1024     75.02    60.02
1280x960      60.00
1280x720      60.00    59.94    50.00
1024x768      75.03    70.07    60.00
800x600       75.00    72.19    60.32    56.25
720x576       50.00
720x480       59.94
640x480       75.00    72.81    59.94    59.93

修改 /etc/X11/xorg.conf.d/10-monitor.conf 去告诉 xdm 桌面的设置:

Section "Monitor"
    Identifier "DP-0"
    Option "Rotate" "left"
EndSection

Section "Monitor"
    Identifier "HDMI-1"
    Option "Rotate" "right"
    Option "RightOf" "DP-0"
EndSection

使能 TwinView :

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option "NoTwinViewXineramaInfo" "1"
EndSection

xdm

屏幕保护程序

目前没有任何屏幕保护程序支持 TwinView 。它们将分别对待两台显示器。以下是 lxqt 默认的屏幕保护程序 xscreensaver 显示的结果:

xscreensaver

问题

不能扫描位于屏幕中间的二维码:

qr

呃,笔者目前只能写了个用户脚本对每个网页符合某些条件的元素进行微调来尽可能让某些主要元素避开中间的分隔线:

qr-after

关于如何判断哪些元素是符合某些条件的要微调的元素充满了经验主义,如果有读者想到了更好的办法可以分享给笔者。 TIA!

https://user-images.githubusercontent.com/32936898/199681341-1c5cfa61-4411-4b67-b268-7cd87c5867bb.png https://user-images.githubusercontent.com/32936898/199681363-1094a0be-85ca-49cf-a410-19b3d7965120.png https://user-images.githubusercontent.com/32936898/199681368-c34c2be7-e0d8-43ea-8c2c-d3e865da6aeb.png