我想编写一个函数,在退出之前关闭所有打开的应用程序。 这是为了确保我没有忘记保存修改过的文件。
如果我使用 Super+Shift+q 快捷键,awesome 会强制所有应用程序关闭,并且我会丢失所有未保存的更改。
这是我能做的:
awful.spawn.easy_async('/home/fabrice/.config/rofi/rofi-querry.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)
我不能做的就是等到所有窗户都关闭后再离开。 事实上,如果修改后的文件尚未保存,应用程序会询问我 如果我想在关闭应用程序之前保存它。 只有在我回答了所有未保存文件的申请后,我才会想退出awesome。
我尝试像这样处理“取消管理”信号(因为它是窗口关闭时发出的信号):
client.connect_signal("unmanage",
function ()
if client.instances() == 0 then
awesome.quit()
end
end)
但我不会离开真棒。 我的理解是,当处理unmanage信号时,总是有一个窗口打开。
是否有一个信号在所有窗口关闭后调用? 还是有另一种方法可以关闭所有窗口然后退出awesome?
我找到了解决方案:
awful.spawn.easy_async('/home/fabrice/.config/rofi/rofi-querry.sh "Eteindre ?"',
function(_, _, _, exitcode)
if exitcode == 0 then
local nb = 0
for _, c in ipairs(client.get()) do
nb = nb + 1
end
if nb == 0 then
awesome.quit()
else
client.connect_signal("unmanage",
function ()
local nb = 0
for _, c in ipairs(client.get()) do
nb = nb + 1
end
if nb == 0 then
awesome.quit()
end
end)
for _, c in ipairs(client.get()) do
c:kill()
end
end
end
end)
我犯的错误是使用 client.instances() 来获取打开窗口的数量。
其工作原理如下:
如果没有窗户打开,那么我立即退出真棒。 否则,我定义一个函数来处理窗口关闭时发出的信号(取消管理),然后请求关闭所有窗口。 在取消管理信号功能中,我计算仍然打开的窗口数量,当没有窗口打开时,我退出了。