如何使awesomewm textclock反映时区变化?

如何使awesomewm textclock反映时区变化?

我正在 Arch Linux 上使用awful.widget.textclock小部件来显示 Awesome WM 中的时间,并且我正在使用一个名为tzupdate根据地理位置定期自动更新系统时间的程序。

我经常出差,所以我认为将其自动化会很好。但是,除非我重新启动 Awesome(或重新登录/重新启动),否则文本时钟小部件不会更改时间。我可以在 lua 脚本中添加一些内容来使小部件刷新时区吗?

tzupdate工作正常。我有一个systemd计时器,每五分钟更新一次时区。这样系统的时区就修改成功了。的输出timedatectl立即显示更新的时区,并且 date 命令的输出正确显示正确的更新的本地时间。

但是,如上所述,Awesome 无法注意到此时区更改,直到我重新启动 ( CtrlModR) 或注销。

答案1

下面是一个更新的textclock.lua小部件,可在运行时响应时区更改。我替换了文件/usr/share/awesome/lib/awful/widget/textclock.lua。我还安装了该luatz模块这个 github 仓库并将luatz文件夹移动到,/usr/share/lua/5.2/luatz以便该lua require功能自动找到它。

/usr/share/awesome/lib/awful/widget/textclock.lua:

local setmetatable = setmetatable
local os = os
local textbox = require("wibox.widget.textbox")
local capi = { timer = timer }
local luatz = require("luatz")
local tzcache = require("luatz.tzcache")

--- Text clock widget.
-- awful.widget.textclock
local textclock = { mt = {} }

--- Create a textclock widget. It draws the time it is in a textbox.
-- @param format The time format. Default is " %a %b %d, %H:%M ".
-- @param timeout How often update the time. Default is 60.
-- @return A textbox widget.
function textclock.new(format, timeout)
    local format = format or " %a %b %d, %H:%M "
    local timeout = timeout or 60

    local w = textbox()
    local timer = capi.timer { timeout = timeout }
    timer:connect_signal("timeout", function() 
        tzcache.clear_tz_cache()
        w:set_markup(os.date("!"..format, luatz.time_in())) 
    end)
    timer:start()
    timer:emit_signal("timeout")
    return w
end

function textclock.mt:__call(...)
    return textclock.new(...)
end

return setmetatable(textclock, textclock.mt)

相关内容