воскресенье, 31 марта 2013 г.

Наброски бегущей строки на lua + awesome wm

Возникла проблема с отображением строк содержащих что-то UTF восьмое.

Пример ошибки:
W: awesome: draw_text_context_init:108: cannot parse pango markup: Error on line 1 char 39: Invalid UTF-8 encoded text in name - not valid '�к - Думай позити�'

На сайте lua предлагается скомпилировать и использовать модуль для работы с utf8 http://lua-users.org/wiki/ValidateUnicodeString

Лень

Код бегущей строки:

Несколько необходимых функций:

local clock = os.clock
function sleep(n)  -- seconds
  local t0 = clock()
  while clock() - t0 <= n do end
end

-- Count of elements in table
table.count = function(t)
    local c = 0
    for _ in pairs(t) do
        c = c + 1
    end
    return c
end

function trim(s)
  return (s:gsub("^%s*(.-)%s*$", "%1"))
end


Далее, непосредственно функция бегущей строки. Таблицу chars необходимо сделать НЕ ОБЩЕЙ, оставил так из-за какой-то возникшей проблемы.


chars = {}
function running_line(str, index, len, chars)

    if len >= string.len(str) then
        return str
    end

        local b = string.byte(str, index)
        local r_str = ""

        --FILO
        table.insert(chars, string.char(b))

        for _,b in pairs(chars) do
            r_str = r_str .. b
        end

        if table.count(chars) >= len then
            --FILO
            table.remove(chars, 1)
        end

        print ('return: ' .. trim(r_str))

        return r_str

end

В функции реализован обычный стек, первый пришёл, последний ушёл
Передаётся полная строка которая должна "бегать". Индекс последнего отображённого символа. Необходимая длинна бегущей строки. Стек символов



Пример использования с mpd и ncmpcpp, с помощью ncmpcpp получаем проигрываемую композицию:

--  {{ MPD

mpdwidget = {}
mpdwidget.widget = widget({ type = "textbox" })
mpdwidget.current_track = ""
mpdwidget.track_chars = {}
mpdwidget.timers = {}
mpdwidget.counter = 0

-- each N seconds we'll get current track
mpdwidget.get_track = function()
    ncmpcpp = io.popen('ncmpcpp --now-playing "%a - %t"')
    mpdwidget.current_track = ncmpcpp:read('*all')
    mpdwidget.current_track = ' ' .. trim(mpdwidget.current_track) .. ' '
    ncmpcpp:close()
end

-- main function that displays running line
mpdwidget.update_running_line = function()
       
        if mpdwidget.counter >= string.len(mpdwidget.current_track) then mpdwidget.counter = 1
        else mpdwidget.counter = mpdwidget.counter + 1 end

        if mpdwidget.current_track ~= false then          
            mpdwidget.widget.text = running_line(mpdwidget.current_track, mpdwidget.counter, 30, chars)
        end


--each N seconds start function that get current track
mpdwidget.timers.get_track = timer({ timeout = 10 })
mpdwidget.timers.get_track:add_signal("timeout", function() mpdwidget.get_track() end)
mpdwidget.timers.get_track:start()

--each N seconds start function that update running line
mpdwidget.timers.running_line = timer({ timeout = 0.2 })
mpdwidget.timers.running_line:add_signal("timeout", function() mpdwidget.update_running_line() end)
mpdwidget.timers.running_line:start()

-- get current track
mpdwidget.get_track()


-- MPD }}


Как работает:
Каждые 10 секунд получаем текущую композицию, сохраняем.
Каждые 0,2 секунды запускаем функцию бегущей строки

Пример вывода из нескольких иттераций с данной функцией:
powder! go away - File-Open-Tr
owder! go away - File-Open-Tro
wder! go away - File-Open-Troj
der! go away - File-Open-Troja
er! go away - File-Open-Trojan
r! go away - File-Open-Trojan3
! go away - File-Open-Trojan32
 go away - File-Open-Trojan32.
go away - File-Open-Trojan32.e
o away - File-Open-Trojan32.ex
 away - File-Open-Trojan32.exe
away - File-Open-Trojan32.exe
way - File-Open-Trojan32.exe 
ay - File-Open-Trojan32.exe  p
y - File-Open-Trojan32.exe  po
 - File-Open-Trojan32.exe  pow
- File-Open-Trojan32.exe  powd



Комментариев нет:

Отправить комментарий