如何让GTK4应用在关闭显示器后保持运行?
解决GTK4应用在Wayland下关闭显示器后自动退出的问题
问题本质
当在Wayland环境下关闭显示器时,GTK4应用的唯一窗口会收到destroy信号并被销毁,而GTK默认会在最后一个窗口关闭时终止应用,导致程序无输出且以返回码0退出。无显示器启动时还会触发报错:
Gdk-Message: 10:32:23.553: Error 22 (Bad argument) dispatching to Wayland display.
这并非GTK4的Bug,而是Wayland协议与GTK4交互的设计特性——Wayland compositor会在显示器移除时销毁窗口表面,GTK4遵循该逻辑处理窗口。
解决方案
核心思路是阻止窗口销毁直接终止应用,同时监听显示器状态变化,在显示器恢复时重建窗口。
1. 关闭“最后窗口关闭即退出”的默认行为
通过GTK应用的配置方法,禁用最后一个窗口关闭时自动退出的逻辑,让应用主循环在窗口销毁后继续运行。
以Python为例:
import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk def create_main_window(app): win = Gtk.ApplicationWindow(application=app) win.set_title("Persistent GTK4 App") win.present() app = Gtk.Application(application_id='com.example.PersistentApp') # 关闭最后窗口时不终止应用 app.set_quit_on_last_window_close(False) app.connect('activate', lambda app: create_main_window(app))
2. 监听显示器状态,自动重建窗口
监听Gdk.Display的monitor-added信号,当新显示器连接时自动创建窗口;同时处理无显示器启动的场景,等待显示器连接后再初始化UI。
完整Python示例:
import gi gi.require_version('Gtk', '4.0') from gi.repository import Gtk, Gdk def create_main_window(app): win = Gtk.ApplicationWindow(application=app) win.set_title("Persistent GTK4 App") win.present() def on_monitor_added(display, monitor, app): # 检查当前是否无窗口,无则创建 if not app.get_windows(): create_main_window(app) app = Gtk.Application(application_id='com.example.PersistentApp') app.set_quit_on_last_window_close(False) def on_activate(app): display = Gdk.Display.get_default() # 启动时若有显示器则直接创建窗口,否则等待信号 if display.get_n_monitors() > 0: create_main_window(app) app.connect('activate', on_activate) # 绑定显示器添加事件 display = Gdk.Display.get_default() display.connect('monitor-added', on_monitor_added, app) app.run(None)
3. 可选:处理显示器移除时的清理
若需要在显示器移除时做资源释放,可监听Gdk.Display的monitor-removed信号,执行自定义清理逻辑。
内容的提问来源于stack exchange,提问作者Dekakaruk
相关产品推荐
相关产品推荐

