LINUX.ORG.RU

luastatus — генератор данных для панелей состояния, поддерживающий i3bar и dwm

 , , , ,


5

4

Вышла первая версия luastatus — универсального генератора данных для панелей состояния, поддерживающего i3bar и dwm. Программа написана на C и распространяется под лицензией GNU LGPL v3.

Большинство генераторов данных для панелей состояния тайловых WM либо обновляют информацию по таймеру (например, conky), либо требуют сигнал для перерисовки (например, i3status). Панели же в составе окружений рабочего стола, как правило, обновляют информацию мгновенно и автоматически, как и luastatus.

luastatus работает с загружаемыми модулями двух типов: плагины (отвечают за работу с каким-либо источником событий) и так называемые barlib’ы (отвечают за работу с конкретной панелью состояния).

Схема работы luastatus следующая:

  • Один из плагинов сообщает, что произошло какое-то событие, и генерирует описывающий его Lua-объект.
  • Вызывается пользовательская функция (widget.cb) с этим объектом в качестве аргумента.
  • Возвращённое ей значение передаётся в barlib.

Также barlib может оповестить программу-виджет о том, что с виджетом произошло какое-либо событие. В таком случае barlib также генерирует Lua-объект, описывающий это событие, и пользовательская функция (widget.event) вызывается с ним в качестве аргумента. Например, barlib для i3 сообщает, когда пользователь нажал на виджет, а также передаёт информацию о том, какой кнопкой было сделано нажатие, и его координаты.

На данный момент реализованы следующие плагины:

  • alsa — следит за изменением громкости канала ALSA.
  • fs — генерирует события по таймеру, передаёт виджету информацию о количестве занятого места в файловой системе. Также поддерживается wake-up FIFO.
  • mpd — следит за громкостью и текущим плейлистом mpd.
  • pipe — запускает процесс и генерирует событие каждый раз, когда он выводит в stdout строку (можно указать другой разделитель вывода). Эта строка передаётся виджету.
  • timer — просто генерирует события по таймеру (например, для виджета-часов или виджетов, читающих какие-то файлы в /proc). Также поддерживается wake-up FIFO.
  • xkb — следит за текущей раскладкой клавиатуры и передаёт виджету номер группы активной раскладки и её имя.
  • xtitle — следит за текущим активным окном и сообщает его заголовок.

И следующие barlib’ы:

  • i3;
  • dwm.

>>> Страница проекта на GitHub

>>> Страница релиза



Проверено: anonymous_incognito ()
Последнее исправление: sudopacman (всего исправлений: 2)
Ответ на: комментарий от shdown

Добавил “lua” в список имён библиотек.

Я даже не знаю, как бы тебе помягче сказать...

usr/lib/pkgconfig/lua.pc

Я понимаю, что среднему цмейкеру это ни о чем не говорит, но https://cmake.org/cmake/help/v3.0/module/FindPkgConfig.html довольно распространено. Есть подозрения, что твои костыли с find_library убоги и должны быть заменены на общение с pkg-config (ну либо использовать костыли в качестве fallback-а).

Понял, что был неправ и речь об имени pkgconfig-модуля.

kawaii_neko ★★★★
()
Последнее исправление: kawaii_neko (всего исправлений: 1)
Ответ на: комментарий от vertexua

Как только будет достаточно плагинов, ничего писать будет не нужно. В крайнем случае — использовать плагин pipe. Такие дела.

shdown
() автор топика
Ответ на: комментарий от shdown

и кстати, так то все заработало, но очень не линейно считает громкость.

какую функцию в расчете вставить, что бы вернуть линейность?

а то получается чо на 50% по счетчику почти ничо не слышно, в пульсмиксере в ентот момент 29%

в amixer'e счет как я понял в децибелах, и уже от них высчитывается процент, но енто очень не линейно. нужна функция, которую использует пульса для просчета процента громкости.

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

Не знаю, у альсы вроде есть какие-то функции для получения нормализованной громкости. Потом посмотрю.

shdown
() автор топика
Ответ на: комментарий от shdown

лазил вчера в вики арча, ничо по ентому поводу не нашел, пичаль... пульса нормально изменяет и измеряет громкость.

пока что не доразобрался в lua, почитаю седня маны. хочу тада уж заменить нативные действия с альсой внешними данными из pamixer.

может рассказать кто, каким модулем енто можно сделать?

safocl ★★
()
Ответ на: комментарий от safocl

в общем решил енту проблему переписанием скрипта виджета, вставил в него проверку current volume из pamixer.

получилось вот так

для ентого мне пришлось подружиться с lua, в принцыпе оказался достаточно несложным языком, хотя и есть некоторые вопросы по нему.

safocl ★★
()
Ответ на: комментарий от safocl
luastatus.dollar{'pamixer', '--get-volume'}

вместо твоего pulse() же. А вообще — как-нибудь напишу плагин для пульсы, сейчас времени нет.

shdown
() автор топика
Ответ на: комментарий от shdown

еще нашел, чо свободную память измеряет не верно, ибо выводится значение «MemFree:» из файла «/proc/meminfo», а на самом деле свободная память там указана в строке «MemAvailable:», которое не учитывает занятую память кешем (соответственно енто и есть чистая свободная память).

думаю будет полезно для исправления

плюс посчитаю процент от общей памяти, выложу суда скриптик...

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 2)
Ответ на: комментарий от shdown

оу, чото не обращал внимания на енто... (про ссылку)

да, пишу всегда так, так мне удобне чем тянуться правым мизинцем до буквы Э

safocl ★★
()
Ответ на: комментарий от shdown

еще вопрос, а как сделать запуск с сепараторами? а то

status_command cd ~/.config/luastatus && exec luastatus-i3-wrapper -B separator=' ' mem-free.lua alsa.lua xkb.lua

выдает ошибку

safocl ★★
()
Ответ на: комментарий от shdown

а обработчик нажатия клавиш есть? надо, допустим обновлять виджет только после нажатия определенных клавиш

а еще лучше, что бы следить за изменением файла

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от shdown

приведи плз пример виджета с inotify плагином.

safocl ★★
()
Ответ на: комментарий от safocl

Если тебе нужно пинать файл, чтобы просто обновить виджет, то читай документацию. У плагинов fs и timer есть опция “fifo”, см. https://github.com/shdown/luastatus/blob/master/contrib/widget-examples/i3/up... (только делай touch не в event, а по нажатию клавиши).

inotify:

widget = {
    plugin = 'inotify',
    opts = {
        watch = {
            [os.getenv('HOME') .. '/file'] = 'modify,delete_self',
            ['/tmp/another_file'] = 'all_events',
        },
    },
    cb = function(t)
        local ev = {}
        for k, v in pairs(t.mask) do
            table.insert(ev, k)
        end
        print('-> path: ' .. t.path .. ', mask: ' .. table.concat(ev, ', '))
    end,
}
shdown
() автор топика
Ответ на: комментарий от shdown

аа епрст... до ентого создал

currency = assert(io.open(os.getenv('HOME')..'/.config/i3/currency', 'r'))
currency:setvbuf('no')

function get_curr()
    local result = '[-?-]'
    currency:seek('set', 0)
    if currency:read() ~= nil then
    currency:seek('set', 0)
    result = string.format('%s', currency:read())
    end
    return {full_text = result, color = '#ff8000'}
end

--[[
widget = {
    plugin = 'timer',
    opts = {period = 10},
    cb = function(t)
        return {get_curr()}
    end,
}
]]--

widget = {
    plugin = 'inotify',
    opts = {
        watch = {
            [os.getenv('HOME')..'/.config/i3/currency'] = 'modify'}
    },
    cb = function(t)
        return {get_curr()}
    end,
}

и не поставил запятую после блока opts и думал чо он не роббит...

в ентом файле содержатся текстовые данные о валюмах с сайта, которые обновляются по нажатии клавиш. оп ентому так вот пытался реализовать...

по поводу внедрения с timer и fs я даж хз как там подобное реализовать. читал, но немного не понял, timer все равно обновляется по указанной перодичности. а плагин fs срабатывает, как я понял если открыть и закрыть указанный файл.

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)

еще траббла — не могу никак допетрить, как мне без внедрения проги на C/C++ выводить стандартными средствами нагрузку ЦПУ в процентах, желательно одним числом сразу всех ядер.

нашел варианты в интернете только на Си...

safocl ★★
()
Ответ на: комментарий от safocl

думал чо он не роббит...

Разберись, почему у тебя в ~/.xsession-errors ничего не пишется. Или можешь запускать luastatus-i3-wrapper <виджеты> из консоли — оно же пишет, «чо он не роббит».

timer все равно обновляется по указанной перодичности

А ещё может обновляться тогда, когда пнёшь указанный опцией fifo файл.

shdown
() автор топика
Ответ на: комментарий от shdown

т.е. если я пропишу

widget = {
    plugin = 'timer',
    opts = {fifo = os.getenv('HOME')..'/.config/i3/currency'},
    cb = function(t)
        return {get_curr()}
    end,
}

то будет срабатывать только когда файл перезаписывается?

почему тогда в параметре period указано дефолт в 1 сек...?

safocl ★★
()
Ответ на: комментарий от shdown

Разберись, почему у тебя в ~/.xsession-errors ничего не пишется

вот енто я хз... файл пуст.

safocl ★★
()
Ответ на: комментарий от shdown

ну вот без запятой чо пишется в терминале

--> luastatus-i3-wrapper currency.lua 
luastatus: error: (lua) currency.lua:30: '}' expected (to close '{' at line 24) near 'cb'
luastatus: error: can't load widget 'currency.lua'
{"version":1,"click_events":true,"stop_signal":0,"cont_signal":0}
[
[{"full_text":"(Error)","color":"#ff0000"}],

safocl ★★
()
Ответ на: комментарий от safocl

то будет срабатывать только когда файл перезаписывается?

Нет, во-первых — файл должен быть именованным каналом (named pipe) (такой можно создать с помощью mkfifo), во-вторых — он будет срабатывать и когда его пинают, и по таймеру.

shdown
() автор топика
Ответ на: комментарий от shdown

а нее... мне вот так не надо... надо минимизировать его вызов наоборот...

вот терь кстати, наверно перепишу использование RAM на плагин notify

safocl ★★
()
Ответ на: комментарий от shdown

почему то

widget = {
    plugin = 'inotify',
    opts = {
        watch = {
            ['/proc/meminfo'] = 'modify'}
    },
    cb = function(t)
        return {get_mem_seg()}
    end,
}

не реагирует на постоянные изменения файла '/proc/meminfo'

т.е. cat'ом проверяю, файл каждый раз менятся, но плагин не срабатывает. просто висит на первой строчке с объявлением версии json

safocl ★★
()
Ответ на: комментарий от shdown

А кто обновляет файл currency? Просто лучше бы этот процесс в stdout писал, а ты плагин pipe использовал.

shdown
() автор топика
Ответ на: комментарий от safocl
widget = {
    plugin = 'timer',
    opts = {period = 999}, -- всё равно раз в день обновляется же
    cb = function()
        return {full_text=luastatus.dollar{os.getenv('HOME') .. '/.config/i3/currency.py'}, color='#ff8000'}
    end,
}
shdown
() автор топика

оо кстати, я чото савсем забыл... т.к. у меня арч, то я создал PKGBUILD

точно рабочий, ставлю себе с него

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

Он запускает процесс и «срабатывает», когда тот выводит строку в stdout. И передаёт эту строку виджету.

shdown
() автор топика
Ответ на: комментарий от shdown

ну смотри, если ты смотрел мой PKGBUIL то там устанавливается в /usr/local префикс по умолчанию, я хотел сделать, что бы устанавливалось в /usr, но при попытке установки:

cmake -DCMAKE_INSTALL_PREFIX=/usr .

пишет
ошибка: не удалось завершить транзакцию (конфликтующие файлы)
luastatus-git: '/usr/lib64' существует в файловой системе
Обнаружены ошибки, пакеты не обновлены.
==> ВНИМАНИЕ: Не удалось установить собранные пакеты.

я так думаю енто все из-за того чо lib64 енто ссылка... хотел поменять на /usr/lib путь

тоесть чо бы либы ставились не в /usr/lib64, а в /usr/lib, так то енто одна и та же дирректория, ибо /usr/lib64 ссылка на /usr/lib

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Ответ на: комментарий от safocl

-DCMAKE_INSTALL_LIBDIR=lib вот нашел опцию)) с ней все нормас

safocl ★★
()
Ответ на: комментарий от safocl

Чего за pkgconfig? Замени его на cmake. Еще можно добавить 'i686' в arch (которую скоро дропнут, да). Для проверки подлинности чаще используют md5.

$ namcap PKGBUILD
PKGBUILD (luastatus-git) W: Missing Maintainer tag

anonymous
()
Ответ на: комментарий от anonymous

ну на счет

PKGBUILD (luastatus-git) W: Missing Maintainer tag

я хз енто не ко мне) не я гитом руковожу, только сам файлик для makepkg сделал...

по ентому вопросу к ТСу надо

safocl ★★
()
Ответ на: комментарий от anonymous

исправил... конечно же имелось ввиду pkg-config

safocl ★★
()

хотел создать вычисление нагрузки на ЦПУ.

сделал скрипт, только он неправильно почему то считает, получается больше почти в два раза нагрузка, чем на представленном тут баш скрипте, ну и соответственно в системном мониторе

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

safocl ★★
()
Ответ на: комментарий от safocl

в общем получилось что то вроде этого

жалобы, предложения?

П.С. лучше наверна убрать параметр fifo в настройках плагина timer, а то luastatus, либо псевдофайловая система начинает подвисать, тестил на смене расскладки (начинает переключаться иногда с задержкой), хотя если выключить браузер, потребление ресурсов проца не превышает 2-4%

safocl ★★
()
Последнее исправление: safocl (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.