local naughty = require("naughty") local wibox = require("wibox") local awful = require("awful") local ret = {} ret.widget = wibox.widget.textbox() ret.widget:set_align("right") ret.widget.font = "Ubuntu Mono" local total_text = "" local position = 1 local width = 30 local dots = 3 local last_notification = nil 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[1] if last_notification ~= nil then naughty.destroy(last_notification) end if text[2] == nil then return end elts = string_split(text[1], '-') artist = string.sub(elts[1], 1, -1) album = string.sub(elts[2], 2, -1) song = string.sub(elts[3], 2) notification_text = '\n' .. album .. '\n' .. song .. '\n' if string.len(total_text) >= width then position = math.floor((width - string.len(total_text)) / 2) end update_widget() 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()} if rc[3] == 0 then if string_starts_with(command, 'file') or string_starts_with(command, 'next') or string_starts_with(command, 'previous') then set_text(text) elseif string_starts_with(command, 'noop') then total_text = text[1] position = math.floor((width - string.len(total_text)) / 2) end else set_text({'music-server not running'}) end end function update_widget() if string.len(total_text) < width then ret.widget:set_text(pad(total_text, width, ' ')) else local pos = math.min(position, string.len(total_text) - width) pos = math.max(1, pos) ret.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.widget.timer = timer({timeout=0.2}) ret.widget.timer:connect_signal("timeout", update_widget) ret.widget.timer:start() ret.widget = ret.widget return ret