从 awful.spawn.easy_async 添加小部件?

Add a widget from awful.spawn.easy_async?

我想添加一个电源状态小部件,但前提是系统支持它(我 运行 在台式机上使用与笔记本电脑相同的配置)。显然我可以检查主机名,但我宁愿只检查 acpi 是否可用。目前我有这个:

mybattery = nil    
awful.spawn.easy_async("acpi",
                           function(stdout, stderr, reason, exit_code)
                               if string.find(stdout, "^Battery") then
                                   mybattery = batteryarc_widget{
                                       show_current_level = true,
                                       arc_thickness = 1
                                   }
                               end
                           end
    )

然后 mybattery 添加为小部件。这失败了,大概是因为稍后更新 mybattery 不会更新 wibar。事后如何添加小部件?或者有更好的方法吗?我不想同步调用 acpi

跟进: 由于此小部件会定期轮询 acpi 并在找不到电池时弹出警告,所以我根本不想创建该小部件,除非它可以工作。因此,根据 Emmanuel 的其他建议,这就是我的最终结果。 vert_sep 只是一个分隔符小部件,mybattery 稍后在配置中添加到 wibar。

mybattery = wibox.container.background()
awful.spawn.easy_async("acpi",
                       function(stdout, stderr, reason, exit_code)
                           if string.find(stdout, "^Battery") then
                               local batteryarc_widget =
                                   require("awesome-wm-widgets.batteryarc-widget.batteryarc")
                               local w = wibox.layout.fixed.horizontal()
                               w:add(batteryarc_widget{
                                         show_current_level = true,
                                         arc_thickness = 1})
                               w:add(vert_sep)
                               mybattery.widget = w
                           end
                       end
)

有多种方法。您可以使用布局 :add():insert() 方法 [1]。也可以创建小部件,即使它不会被使用。使用 visible = falseforced_width = 0 以确保它不显示。这具有微观性能损失,但比使用命令式布局方法更简单。第三种方法是添加占位符容器并稍后设置其 .widget 。然而在这一点上,visible 技巧似乎更简单。

[1] https://awesomewm.org/apidoc/widget_layouts/wibox.layout.fixed.html#insert