如何在退出AwesomeWM前关闭所有应用并等待保存确认?
需求与问题描述
我希望编写一个函数,在退出AwesomeWM前关闭所有已打开的应用,以此确保不会忘记保存修改过的文件。使用Super+Shift+q快捷键时,AwesomeWM会强制关闭所有应用,导致未保存的更改丢失。
我已完成部分代码:
awful.spawn.easy_async('/home/fabrice/.config/rofi/rofi-query.sh "Eteindre ? "', function(_, _, _, exitcode) if exitcode == 0 then for _, c in ipairs(client.get()) do c:kill() end end -- Wait for all windows to close -- Then exit AwesomeWM end)
但我无法实现等待所有窗口关闭后再退出的功能。实际上,若存在未保存的修改文件,应用会询问是否保存,我希望在处理完所有应用的保存确认后再退出AwesomeWM。
我尝试处理unmanage信号(窗口关闭时触发的信号),代码如下:
client.connect_signal("unmanage", function () if client.instances() == 0 then awesome.quit() end end)
但无法成功退出AwesomeWM。我理解是处理unmanage信号时,始终还有窗口处于打开状态。请问是否存在所有窗口关闭后触发的信号?或者是否有其他方法可以关闭所有窗口后再退出AwesomeWM?
解决方案
方法一:改进unmanage信号的检查逻辑
问题出在client.instances()在unmanage信号触发时,刚关闭的客户端还没从实例列表中移除。改用client.get()获取当前活跃客户端列表,并加入短暂延迟确保窗口完全退出:
client.connect_signal("unmanage", function(c) -- 延迟100ms检查,确保客户端完全从管理列表中移除 gears.timer.start_new(0.1, function() if #client.get() == 0 then awesome.quit() return false -- 停止定时器 end return true -- 继续轮询检查 end) end)
方法二:主动轮询客户端数量
在触发关闭所有应用的逻辑后,启动定时器定期检查客户端数量,直到所有窗口关闭再退出:
awful.spawn.easy_async('/home/fabrice/.config/rofi/rofi-query.sh "Eteindre ? "', function(_, _, _, exitcode) if exitcode == 0 then -- 关闭所有客户端 for _, c in ipairs(client.get()) do c:kill() end -- 启动定时器检查窗口状态 local check_timer = gears.timer({ timeout = 0.2, autostart = true, callback = function() if #client.get() == 0 then awesome.quit() check_timer:stop() end end }) end end)
关键说明
client.get()返回当前所有已管理的客户端窗口,比client.instances()更适合实时检查活跃窗口数量。- 添加定时器延迟是为了给应用留出处理时间(比如弹出保存确认对话框),避免过早判定窗口已全部关闭。
- 不要在
unmanage信号中直接调用awesome.quit(),此时可能还有窗口在处理关闭流程,或当前窗口未完全从AwesomeWM的管理列表中移除。
内容的提问来源于stack exchange,提问作者user24473340
相关产品推荐
相关产品推荐

