You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 18:12:10