104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			104 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| local naughty = require("naughty")
 | |
| local wibox = require("wibox")
 | |
| local awful = require("awful")
 | |
| local su = require('su')
 | |
| 
 | |
| 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 set_text(text)
 | |
|     total_text = text
 | |
| 
 | |
|     if string.len(total_text) >= width then
 | |
|         position = math.floor((width - string.len(total_text)) / 2)
 | |
|     end
 | |
| end
 | |
| 
 | |
| local function try_noop()
 | |
| 
 | |
|     awful.spawn.easy_async_with_shell('sleep 2s && music-client noop', function(stdout, stderr, reason, code)
 | |
| 
 | |
|         if code == 1 then
 | |
|             try_noop()
 | |
|         elseif code == 0 then
 | |
|             ret.execute_command('noop')
 | |
|         end
 | |
|     end);
 | |
| 
 | |
| end
 | |
| 
 | |
| ret.execute_command = function(command, arg)
 | |
| 
 | |
|     awful.spawn.easy_async({'music-client', command, arg}, function(stdout, stderr, reason, code)
 | |
| 
 | |
|         local text = su.split(stdout, '\n')
 | |
|         local active_command =
 | |
|             su.starts_with(command, 'file') or
 | |
|             su.starts_with(command, 'next') or
 | |
|             su.starts_with(command, 'previous')
 | |
| 
 | |
|         local start_server_command = active_command or
 | |
|             su.starts_with(command, 'play') or
 | |
|             su.starts_with(command, 'pause')
 | |
| 
 | |
|         if code == 0 then
 | |
| 
 | |
|             if active_command then
 | |
|                 set_text(text[1])
 | |
|             elseif su.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
 | |
|             awful.spawn.easy_async({'music-server', 'command', command, arg}, function(stdout, stderr, reason, code)
 | |
|             end)
 | |
|         else
 | |
|             set_text('music-server not running')
 | |
|         end
 | |
| 
 | |
|         if text[2] ~= nil then
 | |
|             icon = text[2]
 | |
|         end
 | |
| 
 | |
|     end)
 | |
| 
 | |
| end
 | |
| 
 | |
| function update_widget()
 | |
|     ret.icon_widget:set_text(' ' .. icon .. ' ')
 | |
|     if string.len(total_text) < width then
 | |
|         ret.text_widget:set_text(' ' .. su.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
 |