Use on_properties_changed on device to update the widget
Instead of using Awesome's DBus api, use directly the on_properties_changed method on the device object. This change removes a lot of boilerplate code and makes the module much simpler!
This commit is contained in:
parent
584fb4b3f6
commit
14f0f5a962
|
@ -25,9 +25,6 @@ local power = require("upower_dbus")
|
|||
local WarningLevel = power.enums.BatteryWarningLevel
|
||||
local DeviceType = power.enums.DeviceType
|
||||
|
||||
-- Awesome DBus C API
|
||||
local cdbus = dbus -- luacheck: ignore
|
||||
|
||||
local spawn_with_shell = awful.spawn.with_shell or awful.util.spawn_with_shell
|
||||
local icon_theme_dirs = { -- The trailing slash is mandatory!
|
||||
"/usr/share/icons/Adwaita/scalable/status/",
|
||||
|
@ -67,54 +64,6 @@ function widget:update()
|
|||
end
|
||||
end
|
||||
|
||||
local function setup_signals(wdg)
|
||||
if wdg.device then
|
||||
-- Recent versions of UPower do not implement signals any more
|
||||
-- Use the PropertiesChanged signal instead.
|
||||
cdbus.add_match(
|
||||
"system",
|
||||
"type=signal" ..
|
||||
",interface=org.freedesktop.DBus.Properties" ..
|
||||
",member=PropertiesChanged" ..
|
||||
",path=" ..
|
||||
wdg.device.object_path
|
||||
)
|
||||
|
||||
cdbus.connect_signal("org.freedesktop.DBus.Properties",
|
||||
-- PropertiesChanged (STRING interface_name,
|
||||
-- DICT<STRING,VARIANT> changed_properties,
|
||||
-- ARRAY<STRING> invalidated_properties);
|
||||
function (info, interface, changed, _)
|
||||
if info.member == "PropertiesChanged"
|
||||
and interface == wdg.device.interface
|
||||
and info.path == wdg.device.object_path
|
||||
then
|
||||
for k, v in pairs(changed) do
|
||||
wdg.device[k] = v
|
||||
end
|
||||
wdg:update()
|
||||
end
|
||||
end)
|
||||
end
|
||||
end
|
||||
|
||||
-- Although it would be nice to use ctx = lgi.GLib.MainLoop:get_context() and
|
||||
-- then ctx:iteration() to update the proxy object, this causes a Lua Stack
|
||||
-- Dump in awesome. You will see a line saying "Something was left on the Lua
|
||||
-- stack, this is a bug!" in the stderr. Instead, copy over the values in a
|
||||
-- simple table and to be used when PropertiesChanged is emitted.
|
||||
local function get_data(device)
|
||||
device = device or {}
|
||||
local out = {}
|
||||
for k, v in pairs(device) do
|
||||
out[k] = v
|
||||
end
|
||||
for k, _ in pairs(device.accessors) do
|
||||
out[k] = device[k]
|
||||
end
|
||||
return out
|
||||
end
|
||||
|
||||
function widget:init()
|
||||
local manager = power.Manager
|
||||
self.manager = manager
|
||||
|
@ -123,15 +72,18 @@ function widget:init()
|
|||
for _, d in ipairs(self.manager.devices) do
|
||||
devices[d.type] = d
|
||||
end
|
||||
self.device = get_data(
|
||||
devices[DeviceType.Battery]
|
||||
or devices[DeviceType["Line Power"]])
|
||||
|
||||
self.device = devices[DeviceType.Battery] or devices[DeviceType["Line Power"]]
|
||||
|
||||
self.device:on_properties_changed(
|
||||
function ()
|
||||
self:update()
|
||||
end
|
||||
)
|
||||
|
||||
self.tooltip = awful.tooltip({ objects = { widget },})
|
||||
self.gui_client = ""
|
||||
|
||||
setup_signals(self)
|
||||
|
||||
self:update()
|
||||
|
||||
self:buttons(awful.util.table.join(
|
||||
|
|
|
@ -0,0 +1,27 @@
|
|||
package = "power_widget"
|
||||
version = "0.3.2-1"
|
||||
source = {
|
||||
url = "git://github.com/stefano-m/awesome-power_widget",
|
||||
tag = "v0.3.2"
|
||||
}
|
||||
description = {
|
||||
summary = "A Power widget for the Awesome Window Manager",
|
||||
detailed = [[
|
||||
Monitor your power devices in Awesome with UPower and DBus.
|
||||
]],
|
||||
homepage = "https://github.com/stefano-m/awesome-power_widget",
|
||||
license = "GPL v3"
|
||||
}
|
||||
supported_platforms = {
|
||||
"linux"
|
||||
}
|
||||
dependencies = {
|
||||
"lua >= 5.1",
|
||||
"upower_dbus >= 0.3.0, < 0.4"
|
||||
}
|
||||
build = {
|
||||
type = "builtin",
|
||||
modules = {
|
||||
power_widget = "power_widget.lua"
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue