如何让gtk4-rs程序的本地X11显示正常工作?
问题描述
本地为Ubuntu 22.04,远程开发机是Ubuntu 23.04(beta)或Ubuntu 22.04虚拟机。使用ssh -Y启用可信X11转发登录后,DISPLAY变量设置正常,xterm、gvim等程序均可在本地弹出窗口,但运行GTK4-RS编写的Hello World程序时出现异常:
- 远程机已登录桌面时,程序窗口直接显示在远程机本地
- 远程机未登录桌面时,本地需等待约30秒,且出现libEGL错误后,窗口才会显示
期望实现:该GTK4程序能像xterm、gvim一样,无论远程机是否登录桌面,都能在本地快速显示。
示例代码
main.rs
use gtk::prelude::*; use gtk::{Application, ApplicationWindow}; fn main() { let app = Application::builder() .application_id("org.example.HelloWorld") .build(); app.connect_activate(|app| { // 创建主窗口 let window = ApplicationWindow::builder() .application(app) .default_width(320) .default_height(200) .title("Hello, World!") .build(); // 显示窗口 window.show(); }); app.run(); }
Cargo.toml
[package] name = "gtk_helloworld" version = "0.1.0" edition = "2021" [dependencies] gtk = { version = "0.6.1", package = "gtk4", features = ["v4_8"] }
解决方案
GTK4默认优先使用Wayland后端,而Wayland对X11转发的支持不如X11后端直接,这是导致问题的核心原因。强制GTK4使用X11后端即可解决:
单次运行时生效:
在远程机执行程序前指定环境变量:GDK_BACKEND=x11 cargo run当前SSH会话永久生效:
先导出环境变量,再运行程序:export GDK_BACKEND=x11 cargo run远程机用户全局生效:
编辑远程机用户目录下的~/.bashrc或~/.profile文件,添加以下内容:export GDK_BACKEND=x11保存后执行
source ~/.bashrc使设置立即生效,后续新的SSH会话会自动应用该配置。
补充说明:
- 远程机已登录桌面时,GTK4会优先适配远程的桌面会话(Wayland或X11),导致窗口显示在远程;强制X11后端后,程序会严格遵循
DISPLAY变量指向的本地X转发服务器。 - 未登录时的30秒等待是GTK4尝试连接Wayland后端失败后的超时重试逻辑,强制使用X11后端可跳过该过程,直接连接本地X服务器,消除延迟和libEGL错误。
内容的提问来源于stack exchange,提问作者Dave Compton
相关产品推荐
相关产品推荐

