字词数:2232   ✧   阅读量:   ✧  

以下按钮可供你方便地引用本文。URL 中即使域名变化,其后的路径也将始终指向原本的内容。
https://css.celestialy.top/p/61781423b
[Hyprland 以平板/笔记本作扩展屏 | clsty 的网络空间站](https://css.celestialy.top/p/61781423b)
[[https://css.celestialy.top/p/61781423b][Hyprland 以平板/笔记本作扩展屏 | clsty 的网络空间站]]

闲置的平板电脑或者笔记本,都可以成为你的扩展屏。

设置虚拟屏幕,并使用 VNC 分享给同一局域网下的设备,这也是很经典的操作了。

相关的教程也较为丰富,但对于 Hyprland 这个相对较新的桌面环境1,截至撰此文时仍未见到介绍整个流程的资料,所以在此简单做个介绍。

前提

你需要:

  • 服务端设备:一台安装了 Hyprland,并可安装 wayvnc 的电脑。
    • 系统为 Linux 发行版之一,但其实只要你能装得上并可正常使用 Hyprland 和 wayvnc 理论上就足够了。本文以 Arch Linux 为例。
  • 客户端设备:可安装 VNC 客户端软件且带有屏幕的设备。
    • 比如安卓、iOS 的手机或平板,也可以是 Linux、Windows 或 MacOS 的笔记本。
  • 局域网,服务端设备与客户端设备都连接在此网络上,并处于同一网段。
    • 设备之间的网速,建议至少为 100 Mbps 即 10 MB/s。2

服务端设备上的准备

创建虚拟屏幕(虚拟输出)

Hyprland 提供了 hyprctl 以便在命令行与 Hyprland 交互,执行各种操作。3

根据 Hyprland Wiki,为了创建虚拟屏幕(即虚拟输出),运行以下命令:

1hyprctl output create headless

查看所创建的虚拟屏幕的名称,一般是 HEADLESS-<n> 这样的格式:

1hyprctl monitors|grep ^Monitor|grep HEADLESS

配置虚拟屏幕(可选)

下面利用 hyprctl keyword monitor 来设置虚拟屏幕的分辨率与位置等参数。

应当注意,在我们创建虚拟屏幕时,它已经有一套默认参数了,所以如果你实在无法完成这一步,可以先跳过,之后再设置。

请根据自己的情况与需求来决定具体的参数。

例如,假设:

  • 你的客户端设备的屏幕是 1600x900 的,因为我们待会想在客户端设备上全屏显示出这个虚拟屏幕,所以最好让虚拟屏幕是分辨率也是 1600x900。
  • 你的服务端已经有一个屏幕,它的分辨率是 3840x2160,配置的放大倍数是 2,左上角坐标为 (0,0)
    • 这就意味着在 Hyprland 的“Display”4中,你的主屏幕占据的矩形,它的横坐标区间为 [0,1920],而纵坐标区间为 [0,1080]
    • 因此,如果你想把客户端设备放到主屏幕下方,最好把虚拟屏幕的左上角定位在 (0,1080) 这个坐标处。
  • 综上,假设你的虚拟屏幕名为 HEADLESS-2,执行以下命令:
1hyprctl keyword monitor HEADLESS-2,1600x900@60,0x1080,1

安装并运行 wayvnc

安装 wayvnc。以 Arch Linux 为例,运行

1sudo pacman -S --noconfirm --needed wayvnc

再运行以下命令将虚拟屏幕 HEADLESS-2(据实际情况修改)分享出去:

1wayvnc -o=HEADLESS-2 --log-level=trace 0.0.0.0 5900

在需要时,按 Ctrl+C 终止。

这样,Hyprland 这边就准备好了。

客户端设备上的准备

安装 VNC 客户端

需要注意,不同的网络条件与不同的 VNC 客户端,可能得到相差甚远的画质或延迟。

Android

推荐安装 AVNC,因为它非常流畅,并且自由开源。

  • 若你直接用搜索引擎搜索 Android VNC client,你将很可能搜到某个闭源的客户端,并且它用起来不仅卡顿还画质极差。

Linux

对于 Linux,可安装 tigervnc,以 Arch Linux 为例:

1sudo pacman -S --noconfirm --needed tigervnc

其它 VNC 客户端理论上也可行。

Windows、MacOS 或 iOS

由于经验有限,本文暂不作推荐,请自行选择安装一个 VNC 客户端软件。

连接到服务端

确保服务端设备上的 wayvnc 正在运行。

打开 VNC 客户端,使用服务端设备的地址(Address)与端口(port)来连接。如果只有一个文本框,则一般用 地址:端口 这种格式来填写。

  • 端口:与在前面运行 wayvnc 时指定的相同,为 5900。
  • 地址:可以在服务端设备用命令 ip a 查看,也可在路由器管理界面上查看/配置,一般为 192.168.1.5 这种格式。

连接成功后,全屏运行 VNC 客户端,这样它就成为你的扩展屏了。

如果较为卡顿,可以考虑降低画质,一般可以在 VNC 客户端配置;或者尝试不同的客户端软件。

进阶

开机自动化

如果你想在服务端开机时自动化这个流程,你需要写一个脚本,并且在 Hyprland 的配置中用 exec-once 来自动运行它。

脚本的内容就是前文所说的部分命令。其中,因为每次重启时,用 hyprctl output create headless 所创建的虚拟屏幕都会被清空,因此需要再次创建。

例:5

1#!/bin/bash
2hyprctl output create headless
3hyprctl keyword monitor HEADLESS-2,1600x900@60,0x1080,1
4wayvnc -o=HEADLESS-2 --log-level=trace 0.0.0.0 5900

多个扩展屏

本文所述方法也当然适用于多个扩展屏,只要你有多个闲置设备以及足够的带宽。

思路:

  • 多次运行 hyprctl output create 以得到多个虚拟屏幕。
  • hyprctl keyword monitor 分别配置它们的尺寸与位置。
  • 用多个 wayvnc 进程,分别在不同的端口(比如 5901、5902 等)来共享这些屏幕,注意此时需要为不同的 wayvnc 进程用 --socket 指定不同的套接字路径,比如 --socket=/tmp/wayvnc.HEADLESS-3

其他

本文未能详尽之处,留待后续更新6,或由读者自行探索。

  • wayvnc 的进一步配置,比如降低画质以降低延迟、设置密码、键位布局等。
  • 网络的进一步配置,例如本地反代再加局域网内部的域名解析,用自定义域名(而不是 IP 加端口)作为服务端地址。
  • 作为对 VNC 音频传输短板的补充,使用 PulseAudio 来串流音频。
  • 作为对 VNC 的替代,使用其它远程桌面/视频串流的协议/软件来达成本文目的具体方法。
  • Multiseat。wayvnc 支持指定 seat,而如果通过 Hyprland 为每个 Seat 分配一套键盘、鼠标与显示器,就有希望实现一机多用,但目前似乎不支持(见 Hyprland#1731)。

  1. 严格来说,Hyprland 是 Wayland 合成器,即 Wayland Compositor。 ↩︎

  2. 可利用 iperf3 在不同设备之间测速。 ↩︎

  3. 这与 Sway 的 swaymsg 有些类似。 ↩︎

  4. Display 这个概念是我从某处借用来的,出处不详。可以简单地将 Display 理解为底层的“画布”。一个 Display 上,可以有多个 Monitor(显示器),排列在不同的位置。 ↩︎

  5. 当然,这个脚本还有改进的余地,比如处理 hyprctl monitors 获取的信息来自动提取所有可用的虚拟屏幕的名称,而不是固定为 HEADLESS-2 这样的值。 ↩︎

  6. 随缘。也可以在评论区给出建议,我会适当考虑。 ↩︎