108 lines
2.9 KiB
Lua
108 lines
2.9 KiB
Lua
local naughty = require("naughty")
|
|
local wibox = require("wibox")
|
|
local awful = require("awful")
|
|
|
|
local ret = {}
|
|
ret.text_widget = wibox.widget.textbox()
|
|
ret.text_widget:set_align("right")
|
|
ret.text_widget.font = "Ubuntu Mono"
|
|
|
|
ret.icon_widget = wibox.widget.textbox()
|
|
ret.icon_widget:set_align("right")
|
|
ret.icon_widget.font = "Ubuntu Mono"
|
|
|
|
|
|
local icon = ""
|
|
local total_text = ""
|
|
local position = 1
|
|
local width = 30
|
|
local dots = 3
|
|
|
|
local function string_starts_with(String,Start)
|
|
return string.sub(String,1,string.len(Start))==Start
|
|
end
|
|
|
|
local function string_split(str, delimiter)
|
|
if str == nil then
|
|
return {}
|
|
end
|
|
local ret = {''}
|
|
count = 1
|
|
for i = 1, string.len(str) do
|
|
local c = str:sub(i,i)
|
|
if c == delimiter then
|
|
count = count + 1
|
|
ret[count] = ''
|
|
else
|
|
ret[count] = ret[count] .. c
|
|
end
|
|
end
|
|
return ret
|
|
end
|
|
|
|
local function pad(str, len, char)
|
|
if char == nil then char = ' ' end
|
|
return str .. string.rep(char, len - #str)
|
|
end
|
|
|
|
local function set_text(text)
|
|
total_text = text
|
|
|
|
if string.len(total_text) >= width then
|
|
position = math.floor((width - string.len(total_text)) / 2)
|
|
end
|
|
end
|
|
|
|
ret.execute_command = function(command)
|
|
local fd = io.popen('music-client ' .. command)
|
|
local text = string_split(fd:read('*all'), '\n')
|
|
local rc = {fd:close()}
|
|
local active_command = string_starts_with(command, 'file') or string_starts_with(command, 'next') or string_starts_with(command, 'previous')
|
|
local start_server_command = active_command or string_starts_with(command, 'play') or string_starts_with(command, 'pause')
|
|
|
|
if rc[3] == 0 then
|
|
if active_command then
|
|
set_text(text[1])
|
|
elseif string_starts_with(command, 'noop') then
|
|
total_text = text[1]
|
|
position = math.floor((width - string.len(total_text)) / 2)
|
|
end
|
|
elseif start_server_command then
|
|
-- Start the server and re-exec the command
|
|
os.execute('music-server&')
|
|
os.execute('sleep 0.2')
|
|
ret.execute_command('noop')
|
|
else
|
|
set_text('music-server not running')
|
|
end
|
|
|
|
if text[2] ~= nil then
|
|
icon = text[2]
|
|
end
|
|
|
|
update_widget()
|
|
end
|
|
|
|
function update_widget()
|
|
ret.icon_widget:set_text(' ' .. icon .. ' ')
|
|
if string.len(total_text) < width then
|
|
ret.text_widget:set_text(' ' .. pad(total_text, width + 1, ' '))
|
|
else
|
|
local pos = math.min(position, string.len(total_text) - width)
|
|
pos = math.max(1, pos)
|
|
ret.text_widget:set_text(' ' .. string.sub(total_text, pos, pos + width))
|
|
position = position + 1
|
|
if position > string.len(total_text) then
|
|
position = math.floor((width - string.len(total_text)) / 2)
|
|
end
|
|
end
|
|
end
|
|
|
|
ret.execute_command('noop')
|
|
|
|
ret.timer = timer({timeout=0.2})
|
|
ret.timer:connect_signal("timeout", update_widget)
|
|
ret.timer:start()
|
|
|
|
return ret
|