我正在运行 Fedora 33:
Linux mainoumi 5.14.18-100.fc33.x86_64 #1 SMP Fri Nov 12 17:38:44 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
我有一台运行 Xming(X11 服务器)7.7.0.85 和 PuTTy .78(都是相当新的)的电脑。
我的 Linux 机器的 .cshrc 将我的 DISPLAY 设置为指向我 PC 的 Xserver 192.168.11.17:0.0
。
当我启动xeyes
或时emacs
,窗口会正确地显示在我的 PC 上,但是当我启动 evince 时,由于某种原因,它会显示在 Linux 笔记本电脑上。 ldd /usr/bin/evince
显示它基于 X11 库。
我跑了strace /usr/bin/evince Hello.pdf >& evince.strace
我看到以下文字:
connect(11, {sa_family=AF_INET, sin_port=htons(6000), sin_addr=inet_addr("192.168.11.17")}, 16) = 0
X-server的端口号确实是6000,并且地址正确,因此它似乎正在尝试正确连接!
为什么不呢?
答案1
您需要设置GDK_BACKEND=x11
强制它使用 x11 而不是 Wayland。
Wayland 是 X11 的实际继承者,但使用了非常不同的架构。您可以在此处阅读相关内容:Wayland,第 3 章 Wayland 架构:X 与 Wayland 架构. 对于我们的目的来说,至关重要的是,Wayland 没有与 X11 的网络重定向等效的功能,并且该DISPLAY
变量没有意义。
Wayland 为无法原生理解 Wayland 的 X11 应用程序提供支持(记录在Wayland,第 5 章 X11 应用程序支持)。但是,许多应用程序(包括使用 GTK 工具包的现代应用程序)都是使用原生 Wayland 支持构建的,并且通常在 Wayland 可用时将其作为“首要任务”。
因此,当这些应用启动并找到 Wayland 时,它们就会运行。Wayland 并不关心DISPLAY
,然后……就这样。
但是,如果应用程序工具包也支持 x11,您可以告诉它改用 x11 — 这就是GDK_BACKEND=x11
GTK 应用程序所做的。对于 Qt 应用程序(如 KDE 中的应用程序),QT_QPA_PLATFORM=xcb
情况相同。