удивительный виджет wm/vicious: использование функции форматирования вызывает ошибку неверного аргумента

Я настраиваю виджеты в awesome wm (v3.5.5-1), используя vicious (v2.1.3-1). Я хочу показать время в виджете. А потом показывать дату во всплывающей подсказке, когда я навожу курсор на виджет времени.

Следующий код, использующий vicious в моем файле rc.lua, отлично работает:

myclock = wibox.widget.textbox()
vicious.register(myclock, vicious.widgets.date, " <span color='#ffffff'>%H:%M</span> ") 
myclock_tooltip =  awful.tooltip ({ objects = { myclock } })
vicious.register(myclock_tooltip, vicious.widgets.date, " %a %d %b ", 60)

Однако, когда я пытаюсь объединить два оператора vicious.register (на основе раздела Функции формата в порочный файл readme):

myclock = wibox.widget.textbox()
myclock_tooltip =  awful.tooltip ({ objects = { myclock } })
vicious.register(myclock, vicious.widgets.date, 
    function (widget, args)
        myclock_tooltip.set_text(" %a %d %b ")
        return " <span color='#ffffff'>%H:%M</span> "
    end)

Я получаю следующую ошибку:

/usr/share/lua/5.2/vicious/widgets/date.lua:23: bad argument #1 to 'date' (string expected, got function)

Любые предложения, где я ошибаюсь?


person maninashed    schedule 23.09.2014    source источник


Ответы (2)


Зачем вообще нужна эта функция форматирования? Не работает следующее?

myclock = wibox.widget.textbox()
myclock_tooltip =  awful.tooltip ({ objects = { myclock } })
vicious.register(myclock, vicious.widgets.date, " <span color='#fffff'>%H:%M</span> ")
myclock_tooltip_timer = timer({ timeout = 3600 })
myclock_tooltip_timer:connect_signal("timeout", function()
    myclock_tooltip:set_text(os.date(" %a %d %b "))
end)
myclock_tooltip_timer:start()
myclock_tooltip_timer:emit_signal("timeout")

Это использует «обычный» порочный материал для виджета и обновляет вашу всплывающую подсказку с помощью отдельного таймера, который срабатывает один раз в час.

person Uli Schlachter    schedule 24.09.2014
comment
Спасибо за пример кода. Я начал изучать использование таймеров, и это дает мне хорошее начало. Однако этот код просто устанавливает всплывающую подсказку на строку %a %d %b . Кроме того, он не инициализирует всплывающую подсказку и должен быть myclock_tooltip:set_text. - person maninashed; 25.09.2014
comment
Для инициализации всплывающей подсказки и ее обновления можно использовать следующую строку: myclock_tooltip:set_text(os.date(" %a %d %b ")). - person maninashed; 25.09.2014
comment
Упс и спасибо. Добавлен отсутствующий вызов os.date, переключен на :set_text и добавлен новый :emit_signal() в конце, чтобы изначально установить текст всплывающей подсказки. - person Uli Schlachter; 25.09.2014

Я не верю, что вы делаете что-то неправильно с технической точки зрения. Я думаю (и быстрый взгляд на источник подтверждает), что этот виджет просто не принимает формат функции.

Похоже, что некоторые виджеты принимают строки формата (для использования функцией виджета), а некоторые принимают функции формата (для вызова с результатом функции виджета), но я не вижу в этом README четкого указания, что есть что.

Сравните функцию worker в date.lua с функцией worker в uptime.lua, например.

Функция date.lua использует аргумент format в вызове os.date (это то, что генерирует ошибку, которую вы получаете, попробуйте вызвать os.date(function()end) локально).

Функция uptime.lua вообще не использует аргумент format (предположительно, она вызывается vicious внутри для возвращаемого значения этой функции.

Вероятно, стоит попросить обновить документацию, чтобы сделать это более понятным (или исправить документацию самостоятельно и представить для нее патч).

person Etan Reisner    schedule 23.09.2014
comment
Спасибо за руководство - очень полезно. Я новичок в Lua, поэтому все еще привыкаю к ​​синтаксису. - person maninashed; 25.09.2014