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

如何在退出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 20:25:05