78 lines
2.4 KiB
Lua
78 lines
2.4 KiB
Lua
local wibox = require('wibox')
|
|
local awful = require('awful')
|
|
local lgi = require('lgi')
|
|
local theme = require('src.theme')
|
|
local mpris = require('src.util.mpris')
|
|
|
|
local mpris_icon = wibox.widget.imagebox(theme.widget_pause)
|
|
local mpris_widget = wibox.widget.textbox()
|
|
|
|
local function variant_strip(v)
|
|
if not tostring(v):find("GLib%.Variant$") then
|
|
if type(v) == "table" and #v > 0 then
|
|
v.n = nil
|
|
end
|
|
return v
|
|
end
|
|
|
|
if v:is_container() and not v:is_of_type(lgi.GLib.VariantType.VARIANT) then
|
|
local out = {}
|
|
local n_children = v:n_children()
|
|
local idx = 0
|
|
|
|
local is_dict = v:is_of_type(lgi.GLib.VariantType.DICTIONARY)
|
|
while idx < n_children do
|
|
local val = v:get_child_value(idx)
|
|
idx = idx + 1
|
|
if is_dict then
|
|
local key = val[1]
|
|
local value = variant_strip(val[2])
|
|
out[key] = variant_strip(value)
|
|
else
|
|
out[idx] = variant_strip(val)
|
|
end
|
|
end
|
|
|
|
return out
|
|
else
|
|
return variant_strip(v.value)
|
|
end
|
|
end
|
|
|
|
local function signal_cbk(_conn, _sender, _object_path, _interface_name, _signal_name, params, _user_data)
|
|
local data = variant_strip(params)
|
|
if type(data) ~= 'table' or type(data[2]) ~= 'table' then return end
|
|
data = data[2]
|
|
if data['PlaybackStatus'] then
|
|
if data['PlaybackStatus'] == 'Playing' then
|
|
mpris_icon:set_image(theme.widget_play)
|
|
elseif data['PlaybackStatus'] == 'Paused' then
|
|
mpris_icon:set_image(theme.widget_pause)
|
|
else
|
|
mpris_icon:set_image(theme.widget_stop)
|
|
mpris_widget.text = 'Nothing playing'
|
|
end
|
|
elseif data['Metadata'] then
|
|
data = data['Metadata']
|
|
local title = data['xesam:title'] or ''
|
|
local artist = (data['xesam:artist'] or {})[1] or ''
|
|
mpris_widget.text = artist .. ' | ' .. title
|
|
end
|
|
end
|
|
|
|
lgi.Gio.bus_get_sync(lgi.Gio.BusType.SESSION):signal_subscribe(
|
|
nil, 'org.freedesktop.DBus.Properties', 'PropertiesChanged', '/org/mpris/MediaPlayer2',
|
|
nil, lgi.Gio.DBusSignalFlags.NONE, signal_cbk
|
|
)
|
|
|
|
local mpris_buttons = awful.util.table.join(
|
|
awful.button({}, 1, mpris.play_pause),
|
|
awful.button({}, 2, mpris.previous),
|
|
awful.button({}, 3, mpris.skip)
|
|
)
|
|
|
|
mpris_icon:buttons(mpris_buttons)
|
|
mpris_widget:buttons(mpris_buttons)
|
|
|
|
return { wibox.layout.fixed.horizontal(mpris_icon, mpris_widget) }
|