ion3 (работящий карлик ;))

ion, dwm, wmii, awesome, xmonad и другие

Модератор: Модераторы разделов

ion3
Сообщения: 8
ОС: *nix

Re: ion3

Сообщение ion3 »

/dev/random писал(а):
05.07.2009 20:05
ion3 писал(а):
05.07.2009 19:56
/dev/random писал(а):
05.07.2009 19:20
Тире у них пропадают... Теперь вот вообще шрифт не находит... Блин, да поставьте XFTшный патч и не мучайтесь!!

Любопытно конечно у кого это "у них" ты пишешь. Стоит этот патч.

"У них" - это я вроде как "сказал в сторону".
Если патч стоит, то в теме иона установите иксэфтэшные шрифты, например:
xft:Terminus:pixelsize=8

(вместо всяких -*-helvetica-medium-r-normal-*-14-*-*-*-*-*-*-*)

Чего ж вы раньше то молчали, и квадратик тоже пропал. Узнать, что в ебилде юз ion3-voidupstreamsupport-truetype отвечает за патч шрифтов, не получилось ни интуитивно из названия, ни из отсутствующего описания юза, так что спасибо. А про "сказал в сторону" ничего не понял, вы умеете запутанно выражаться.
Спасибо сказали:
Аватара пользователя
_Andrey_
Сообщения: 17
ОС: Gentoo Linux
Контактная информация:

Re: ion3

Сообщение _Andrey_ »

Написал небольшой CPU-монитор для Ion3, т.к. ничего подходящего для себя не смог найти. Вчера собрался с силами и выложил в общий доступ. Может для кого то будет полезно:
http://www.ugolnik.info/?p=770

А тут можно посмотреть на мой скрин (монитор в статусбаре рядом с треем и часами):
http://www.ugolnik.info/?p=686
Regards, _Andrey_
http://www.wegroup.org
Спасибо сказали:
festin
Сообщения: 9
ОС: FreeBSD 7.1

Re: ion3

Сообщение festin »

Есть у меня пара показателей в статусбаре, которые работают подобным образом:

Код: Выделить всё

cmd_string = '/usr/local/bin/mocp -i | iconv -c -f utf-8 -t koi8-r'
local moc = io.popen(cmd_string, "r")

дальше все парсится и выводится.
Проблема в том, что иногда (сильно размыто, иногда раз в 5-7 секунд) выводится, что-нибудь вроде "(null)" или "disconnected". Это значит, что из потока прочитано nil.

Если команду, вывод которой парсит скрипт, многократно выполнять в консоли - никаких проблем нет.
В чем может быть причина "пустого вывода"?

Состояние программ при этом не меняется (плеер играет, соединения висят как надо).
Спасибо сказали:
Аватара пользователя
_Andrey_
Сообщения: 17
ОС: Gentoo Linux
Контактная информация:

Re: ion3

Сообщение _Andrey_ »

festin писал(а):
03.09.2009 16:29
Если команду, вывод которой парсит скрипт, многократно выполнять в консоли - никаких проблем нет.
В чем может быть причина "пустого вывода"?


А с какой частотой вызывается этот скрипт?
Regards, _Andrey_
http://www.wegroup.org
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

festin писал(а):
03.09.2009 16:29
Есть у меня пара показателей в статусбаре, которые работают подобным образом:

Код: Выделить всё

cmd_string = '/usr/local/bin/mocp -i | iconv -c -f utf-8 -t koi8-r'
local moc = io.popen(cmd_string, "r")

дальше все парсится и выводится.
Проблема в том, что иногда (сильно размыто, иногда раз в 5-7 секунд) выводится, что-нибудь вроде "(null)" или "disconnected". Это значит, что из потока прочитано nil.

Если команду, вывод которой парсит скрипт, многократно выполнять в консоли - никаких проблем нет.
В чем может быть причина "пустого вывода"?

Состояние программ при этом не меняется (плеер играет, соединения висят как надо).

Тоже наткнулись на эту проблему? В общем, причина такая.
Вы заметили у функций ввода-вывода в POSIX (read(), write(), ...) одну из возможных ошибок - EINTR, "Прервано сигналом"? При использовании этих функций, программа, получившая эту ошибку, просто делает ещё одну попытку чтения/записи. А теперь прочитайте описание функций ввода-вывода в C99 (scanf(), printf(), ...). Видите надпись о том, что в случае _любой_ ошибки дескриптор переводится в состояние ferror(), и даже после clearerr() состояние потока неопределено? Так вот, ошибка EINTR - не исключение. Поэтому, использование в одной программе сигналов и описанных в C99 функций ввода-вывода запрещено, вместо них нужно использовать функции ввода-вывода POSIX.

Lua, согласно их политике, не должен зависеть от ОС, а значит, должен использовать только функции, описанные в C99. Именно через них реализована и библиотека ввода-вывода в Lua. Как следствие, функции ввода-вывода Lua нельзя использовать в программе, использующей сигналы. Ion использует сигналы для реализации таймеров в статусбаре. Отсюда и проблемы - если сигнал срабатывает во время полученя данных от mocp, канал переходит в состояние ошибки, и дальнейшее чтение из него невозможно. Даже если сбросить ошибку (не уверен, что это реализовано в Lua), часть данных пропадёт.

Есть следующие решения проблемы.
1) Во всех таймерах сделать период обновления как можно более длительным, чтобы сигналы посылались как можно реже. Разумеется, это неудобно, т.к. это означает очень редкое обновление статусбара. Но это самое простое решение.
2) Не использовать ввод-вывод. Сделает невозможным отображение статуса moc.
3) При чтении ответа от mocp, определять, получен ли он полностью, и если нет, закрывать канал и вызывать io.popen() заново. При слишком частых сигналах таймера может приводить к подвисанию статусбара (т.к. никто не гарантирует, что сигнал не прервёт и следующую попытку, и идущую за следующей, и т.д.)
4) Переписать Ion3 так, чтобы он реализовывал таймеры каким-то другим способом, без сигналов. Бррр. Я пас.
5) Переписать библиотеку ввода-вывода Lua так, чтобы она использовала функции POSIX. Мой случай. Разумеется, в апстрим мои исправления не приняли (см. выше о политике Lua), но, если хотите, могу выложить здесь патч.
Спасибо сказали:
festin
Сообщения: 9
ОС: FreeBSD 7.1

Re: ion3

Сообщение festin »

_Andrey_ писал(а):
03.09.2009 18:11
А с какой частотой вызывается этот скрипт?

Раз в секунду (интервал - 1000).

/dev/random писал(а):
03.09.2009 19:20
Есть следующие решения проблемы.
1) Во всех таймерах сделать период обновления как можно более длительным, чтобы сигналы посылались как можно реже. Разумеется, это неудобно, т.к. это означает очень редкое обновление статусбара. Но это самое простое решение.
2) Не использовать ввод-вывод. Сделает невозможным отображение статуса moc.
3) При чтении ответа от mocp, определять, получен ли он полностью, и если нет, закрывать канал и вызывать io.popen() заново. При слишком частых сигналах таймера может приводить к подвисанию статусбара (т.к. никто не гарантирует, что сигнал не прервёт и следующую попытку, и идущую за следующей, и т.д.)
4) Переписать Ion3 так, чтобы он реализовывал таймеры каким-то другим способом, без сигналов. Бррр. Я пас.
5) Переписать библиотеку ввода-вывода Lua так, чтобы она использовала функции POSIX. Мой случай. Разумеется, в апстрим мои исправления не приняли (см. выше о политике Lua), но, если хотите, могу выложить здесь патч.

Против "посмотреть патч", конечно, ничего не имею.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

festin писал(а):
04.09.2009 01:58
Против "посмотреть патч", конечно, ничего не имею.

Спасибо сказали:
Аватара пользователя
_Andrey_
Сообщения: 17
ОС: Gentoo Linux
Контактная информация:

Re: ion3

Сообщение _Andrey_ »

/dev/random писал(а):
03.09.2009 19:20
5) Переписать библиотеку ввода-вывода Lua так, чтобы она использовала функции POSIX. Мой случай. Разумеется, в апстрим мои исправления не приняли (см. выше о политике Lua), но, если хотите, могу выложить здесь патч.


Почему не приняли?
Regards, _Andrey_
http://www.wegroup.org
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

_Andrey_ писал(а):
04.09.2009 02:09
Почему не приняли?



/dev/random писал(а):
03.09.2009 19:20
(см. выше о политике Lua)

/dev/random писал(а):
03.09.2009 19:20
Lua, согласно их политике, не должен зависеть от ОС, а значит, должен использовать только функции, описанные в C99

/dev/random писал(а):
03.09.2009 19:20
5) Переписать библиотеку ввода-вывода Lua так, чтобы она использовала функции POSIX.

Теперь понятно?
Спасибо сказали:
festin
Сообщения: 9
ОС: FreeBSD 7.1

Re: ion3

Сообщение festin »

А периодическое незапускание статусбара с сообщением "Failed to start ion-statusd" не связано с чем-то подобным?
При запуске статусбар никогда не загружается, а после - только после нескольких restart'ов сессии.

Еще вопрос: как прикрутить сигнализирование о чем либо, например, в статусбар? Конкретный пример: хочу сразу замечать, если кто-то или что-то упомянуло мой ник в BitchX. С чего начать, где почитать?
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

festin писал(а):
05.09.2009 17:12
А периодическое незапускание статусбара с сообщением "Failed to start ion-statusd" не связано с чем-то подобным?
При запуске статусбар никогда не загружается, а после - только после нескольких restart'ов сессии.

Не знаю, у меня такая проблема раньше была, но когда и из-за чего пропала - не обратил внимания.


festin писал(а):
05.09.2009 17:12
Еще вопрос: как прикрутить сигнализирование о чем либо, например, в статусбар? Конкретный пример: хочу сразу замечать, если кто-то или что-то упомянуло мой ник в BitchX. С чего начать, где почитать?

Плясать нужно от функциональности клиента.
Проще всего - настроить клиент так, чтобы он при возникновении события выводил сообщение в файл, а statusd просто время от времени проверял содержимое этого файла. Но я не знаю, поддерживает ли BitchX вывод в файл в качестве сигнализации.
Спасибо сказали:
Аватара пользователя
_Andrey_
Сообщения: 17
ОС: Gentoo Linux
Контактная информация:

Re: ion3

Сообщение _Andrey_ »

/dev/random писал(а):
07.09.2009 11:11
Проще всего - настроить клиент так, чтобы он при возникновении события выводил сообщение в файл, а statusd просто время от времени проверял содержимое этого файла. Но я не знаю, поддерживает ли BitchX вывод в файл в качестве сигнализации.


Мониторить изменения в файле по таймеру не лучший вариант, особенно на лэптопе. Лучше сигнализировать об изменениях. Но я не уверен, что Ion3 поддерживает подобное.
В awesome, к примеру, это легко делается через awesome-client, просто передав имя обработчика, который должен обработать событие:
echo "my_handler()" | awesome-client

Буду признателен, если кто то сможет подсказать подобное и для Ion3.

p.s. Стандартные модули я посмотрел - там везде таймер.
Regards, _Andrey_
http://www.wegroup.org
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

_Andrey_ писал(а):
07.09.2009 13:08
Мониторить изменения в файле по таймеру не лучший вариант, особенно на лэптопе. Лучше сигнализировать об изменениях. Но я не уверен, что Ion3 поддерживает подобное.
В awesome, к примеру, это легко делается через awesome-client, просто передав имя обработчика, который должен обработать событие:
echo "my_handler()" | awesome-client

Буду признателен, если кто то сможет подсказать подобное и для Ion3.

p.s. Стандартные модули я посмотрел - там везде таймер.

Есть официальный, но скачиваемый отдельно модуль-патч ionflux, он позволяет управлять ионом извне.
Если он установлен и загружен, то:
ionflux -e 'mod_statusbar.inform("name_of_statusfield", "some_text")' -- вывести текст в поле name_of_statusfield статусбара
ionflux -e 'mod_statusbar.inform("name_of_statusfield_hint", "important")' -- подсветить поле name_of_statusfield статусбара
ionflux -e 'mod_statusbar.inform("name_of_statusfield_hint", "normal")' -- убрать подсветку
Спасибо сказали:
Bender
Сообщения: 81
ОС: Ubuntu 11.04 amd64

Re: ion3

Сообщение Bender »

Запускаю ion3 через .xinitrc
Если написать exec ion3, то все запускается, но при этом куча сообщений, ошибок и т. п. все же есть (но работает ion нормально). Как-то можно эти сообщения от ion'a в файл перенаправить или вовсе избавиться? Пробую добавить >> /dev/null или >> error.log - ничего не выходит, все равно все в консоль отправляется.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

Bender писал(а):
27.11.2009 18:18
Запускаю ion3 через .xinitrc
Если написать exec ion3, то все запускается, но при этом куча сообщений, ошибок и т. п. все же есть (но работает ion нормально). Как-то можно эти сообщения от ion'a в файл перенаправить или вовсе избавиться? Пробую добавить >> /dev/null или >> error.log - ничего не выходит, все равно все в консоль отправляется.


... &> /dev/null
Спасибо сказали:
Аватара пользователя
Dunris
Сообщения: 295
Статус: ...
ОС: Archlinux

Re: ion3

Сообщение Dunris »

Здравствуйте.
Как в ion3 запретить удаление фрейма/рабочего стола? Иногда забываюсь (при закрытии нескольких окон) , жму meta+c несколько раз и удаляю воркспейс или фреймы или и то, и другое :-)
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1100
ОС: ArchLinux

Re: ion3

Сообщение Black »

Легко. В cfg_ioncore.lua надо найти строки

Код: Выделить всё

defbindings("WMPlex", {
    bdoc("Close current object."),
    kpress(META.."C", "WRegion.rqclose_propagate(_, _sub)"),

И поменять META.."C", например, на META..ALTMETA.."C". Потом в том же файле найти defbindings("WClientWin") и в неё дописать:

Код: Выделить всё

defbindings("WClientWin", {
    bdoc("Close current window."),
    kpress(META.."C", "WClientWin.rqclose_propagate(_, _sub)"),

META.."C" будет закрывать только приложения, а META..ALTMETA.."C" - и приложения, и фреймы.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
Dunris
Сообщения: 295
Статус: ...
ОС: Archlinux

Re: ion3

Сообщение Dunris »

Black писал(а):
25.12.2009 00:10
Легко. В cfg_ioncore.lua надо найти строки

Код: Выделить всё

defbindings("WMPlex", {
     bdoc("Close current object."),
     kpress(META.."C", "WRegion.rqclose_propagate(_, _sub)"),

И поменять META.."C", например, на META..ALTMETA.."C". Потом в том же файле найти defbindings("WClientWin") и в неё дописать:

Код: Выделить всё

defbindings("WClientWin", {
     bdoc("Close current window."),
     kpress(META.."C", "WClientWin.rqclose_propagate(_, _sub)"),

META.."C" будет закрывать только приложения, а META..ALTMETA.."C" - и приложения, и фреймы.

Благодарю, как раз то, что нужно :-)
Вопрос решен.
Спасибо сказали:
Аватара пользователя
Bluetooth
Сообщения: 4395
Статус: Блюзовый
ОС: Debian Squeeze amd64

Re: ion3

Сообщение Bluetooth »

Поставил ion на ноутбук с дебианом тестинг, подумал, что неплохо было бы мониторить батарейку.
Выложенные на сайте иона скрипты, работающие через apm, работать не захотели.
Наваял свой, взяв за основу скрипт для амарока :)
statusd_batt.lua:

Код: Выделить всё

-- statusd_batt.lua : Vladimir Ipatov

-- Display current state of power

if not statusd_batt then
   statusd_batt = { interval = 10*1000 }
end

local function batt_dcop()
   local f = io.popen('BatteryStatus', 'r')
   --local f = io.popen('acpi|awk \'{print $3 $4 $5}\'', 'r')
   local batt = f:read('*l')
   f:close()
   return batt
end

local function change_display()

      local batt = batt_dcop()

      return batt_dcop()
end

local batt_timer

local function update_batt()
   statusd.inform("batt", change_display())
   batt_timer:set(statusd_batt.interval, update_batt)
end

batt_timer = statusd.create_timer()
update_batt()


Для работы требует программу acpi. В дебиане она находится в одноименном пакете
Спасибо сказали:
tot-to
Сообщения: 23
ОС: Pygoscelis papua

Re: ion3

Сообщение tot-to »

У меня в статусбаре появляются артефакты из выступающих элементов символов при изменении текста в нём. Кто-нибудь сталкивался?
screen.png
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1100
ОС: ArchLinux

Re: ion3

Сообщение Black »

У вас там ttf что ли? Если я ничего не путаю, Туомо когда-то не очень прилично высказывался в адрес использования ttf в ion'е.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5281
ОС: Gentoo

Re: ion3

Сообщение /dev/random »

Black писал(а):
21.01.2010 21:03
У вас там ttf что ли? Если я ничего не путаю, Туомо когда-то не очень прилично высказывался в адрес использования ttf в ion'е.

Туомо вообще любит не очень прилично высказываться в адрес всего подряд. Сейчас, например, уже полгода как забросил ион, перешёл на винду и поносит последними словами линукс. Так что я бы не стал прислушиваться к его мнению.
Спасибо сказали:
tot-to
Сообщения: 23
ОС: Pygoscelis papua

Re: ion3

Сообщение tot-to »

Скорее всего... я в шрифтах не особо разбираюсь. Поставил arial.
Сейчас взял из дефолтного lookcommon_clean.lua строку
font="-misc-fixed-medium-r-*-*-13-*-*-*-*-60-*-*",
из секции de.defstyle("stdisp"). Да, артефакты пропали, но шрифт ужасен (см вложение). Подскажите пожалуйста, какой можно поставить из не-ttf? Я к шрифтам сильно не привередлив. Нужен просто какой-нибудь адекватно выглядящий шрифт, не моноширинный, пожалуй всё. Собирал я с флагом 'ion3-voidupstreamsupport-truetype'.
screen1.png
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1100
ОС: ArchLinux

Re: ion3

Сообщение Black »

Terminus, artwiz. Моё поделие - в подписи. Да и misc fixed вроде неплохо выглядят. Только вот pcf - они пропорциональными не бывают. Xfontsel в руки - и вперёд.
Кстати, этот оверлей ещё жив? Какая там версия сейчас?
/dev/random писал(а):
21.01.2010 21:19
Туомо вообще любит не очень прилично высказываться в адрес всего подряд. Сейчас, например, уже полгода как забросил ион, перешёл на винду и поносит последними словами линукс. Так что я бы не стал прислушиваться к его мнению.

Ion3+, как я понял, ещё пилит под cygwin'ом. А линукс он начал поносить гораздо раньше. И в основном, ИМХО, по делу.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 620
ОС: Debian GNU/Linux

Re: ion3

Сообщение minoru-kun »

Для меня остается открытым вопрос со шрифтами для символов, отличных от описанных в ASCII. После сборки с xft-патчем в дефолтной (моей любимой) теме начали глючить цвета. И я не настолько люблю сглаженные шрифты, чтобы у меня было желание с этим разбираться.
Насколько я понял, это - fallback-шрифт X-сервера. Можно ли как-нибудь скомандовать иксам, чтобы его изменить?

Black, сейчас пилят Tritium. По сути, тот же ion, только на питоне и без анальных проблем Туомо.
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1100
ОС: ArchLinux

Re: ion3

Сообщение Black »

По-моему, иксы просто подставляют первый попавшийся шрифт из FontPath. Соответственно чтобы изменить, надо подсунуть в FontPath первыми свои шрифты и сделать так, чтобы нужный был первым в fonts.dir.
Насчёт xft не знаю, всю жизнь собирал без всяких патчей. Просто заменял XLC_LOCALE и всё.

minoru-kun писал(а):
28.01.2010 21:06
Black, сейчас пилят Tritium. По сути, тот же ion, только на питоне и без анальных проблем Туомо.

А какие у него проблемы? Если имеется в виду xft и xinerama, то я бы сказал это не проблемы, а фичи.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
Bluetooth
Сообщения: 4395
Статус: Блюзовый
ОС: Debian Squeeze amd64

Re: ion3

Сообщение Bluetooth »

Сейчас наваял нову модификацию скриптика для ион :)
Изменил statusd_mpd-socket.lua. Аналогично тому, как прежде изменял statusd_mpd.lua - чтобы во время паузы вместо просто "paused" он писал все то же самое, как и во время проигрывания, но на конце писал " (paused)":

Код: Выделить всё

-- statusd for MPD (Music Player Daemon)
-- by Marc Hartstein <marc.hartstein@alum.vassar.edu>
--
-- version 1.0
--
-- Based on a script by delirium@hackish.org

-- Feel free to contact me with any bugs or suggestions for improvement.

-- requires LuaSocket
-- http://www.tecgraf.puc-rio.br/~diego/professional/luasocket/home.html

-- INSTALLATION
--
-- statusd_mpd-socket.lua is intended as a drop-in replacement for
-- statusd_mpd.lua.  It should work with your existing statusd_mpd.lua
-- configuration, if any.
--
-- To achieve this, statusd_mpd-socket.lua needs to be located by statusd as
-- statusd_mpd.lua
--
-- The easiest way to accomplish this is to create a symbolic link in your
-- ~/.ion3 directory from statusd_mpd.lua -> wherever you have placed
-- statusd_mpd-socket.lua
--
-- Don't forget to include %mpd in a statusbar template in cfg_statusbar.lua
--
-- CONFIGURATION
--
-- See the defaults table below for the configurable settings and their default
-- values.  You should create a mpd table in cfg_statusbar.lua to customize
-- these settings as for any other statusd plugin.

local defaults={
    -- 500 or less makes seconds increment relatively smoothly while playing
    update_interval = 500,

    -- how long to go to sleep when we can't talk to mpd so we don't spam the
    -- system with connection attempts every half-second
    retry_interval = 60*1000,           -- 1m

    -- mpd server info (localhost:6600 are mpd defaults)
    address = "localhost",
    port    = 6600,

    -- mpd password (if any)
    password = nil,

    -- display template
    -- ---
    -- can use the following:
    --   track metadata: %artist, %title, %num, %album, %year, %len
    --   conditional metadata: %artist_or_album
    --   current track position: %pos
    --   escape for the percent character: %%
    --
    --   %artist_or_album will display the artist if any, otherwise it will
    --   display the album name.  I find this useful for Broadway recordings.

    -- a default template
    template = "%artist - %title (%album - %year)"
}

local settings = table.join(statusd.get_config("mpd"), defaults)

local mpd_timer
local last_success

-- load namespace
local socket = require("socket")
local mpd_socket

-- set up a try function which closes the socket if there's an error
local try = socket.newtry(function() mpd_socket:close() end)

local open_socket = socket.protect(function()
    -- connect to the server
    mpd_socket = socket.try(socket.connect(settings.address, settings.port))

    mpd_socket:settimeout(100)

    local data                          -- buffer for reads

    data = try(mpd_socket:receive())
    if data == nil or string.sub(data,1,6) ~= "OK MPD" then
        mpd_socket:close()
        return nil, "mpd not running"
    end

    -- send password (if necessary)
    if settings.password ~= nil then
        try(mpd_socket:send("password " .. settings.password .. "\n"))

        repeat
            data = try(mpd_socket:receive())
        until data == nil or string.sub(data,1,2) == "OK" or string.sub(data,1,3) == "ACK"
        if data == nil or string.sub(data,1,2) ~= "OK" then
            mpd_socket:close()
            return nil, "bad mpd password"
        end
    end

    return true
end)


local get_mpd_status = socket.protect(function()

    local data                          -- buffer for reads
    local success = false
    local info = {}

    -- 'status'
    -- %pos, %len, and current state (paused/stopped/playing)
    try(mpd_socket:send("status\n"))
    repeat
        data = try(mpd_socket:receive())
        if data == nil then break end

        local _,_,attrib,val = string.find(data, "(.-): (.*)")
        if attrib == "time" then
            _,_,info.pos,info.len = string.find(val, "(%d+):(%d+)")
            info.pos = string.format("%d:%02d", math.floor(info.pos / 60), math.mod(info.pos, 60))
            info.len = string.format("%d:%02d", math.floor(info.len / 60), math.mod(info.len, 60))
        elseif attrib == "state" then
            info.state = val
        end
    until string.sub(data,1,2) == "OK" or string.sub(data,1,3) == "ACK"
    if data == nil or string.sub(data,1,2) ~= "OK" then
        mpd_socket:close()
        return nil, "error querying mpd status"
    end

    -- 'currentsong'
    -- song information
    try(mpd_socket:send("currentsong\n"))
    repeat
        data = try(mpd_socket:receive())
        if data == nil then break end

        local _,_,attrib,val = string.find(data, "(.-): (.*)")
        if     attrib == "Artist" then info.artist = val
        elseif attrib == "Title"  then info.title  = val
        elseif attrib == "Album"  then info.album  = val
        elseif attrib == "Track"  then info.num    = val
        elseif attrib == "Date"   then info.year   = val
        end
    until string.sub(data,1,2) == "OK" or string.sub(data,1,3) == "ACK"
    if data == nil or string.sub(data,1,2) ~= "OK" then
        mpd_socket:close()
        return nil, "error querying current song"
    end
    -- %artist_or_album
    if info.artist == nil then
        info.artist_or_album = info.album
    else
        info.artist_or_album = info.artist
    end

    success = true

        local mpd_st = settings.template
        -- fill in %values
        mpd_st = string.gsub(mpd_st, "%%([%w%_]+)", function (x) return(info[x]  or "") end)
        mpd_st = string.gsub(mpd_st, "%%%%", "%%")
    -- done querying; now build the string
    if info.state == "play" then
        return success, mpd_st
    elseif info.state == "pause" then
        return success, mpd_st.." (paused)"
    else
        return success, "No song playing"
    end
end)

local init_mpd                          -- forward declaration

local function update_mpd()
    -- update unless there's an error that's not yet twice in a row, to allow
    -- for transient errors due to load spikes
    local success, mpd_st = get_mpd_status()
    if success or not last_success then
        statusd.inform("mpd", mpd_st)
    end

    if not success and not last_success then
        -- something's wrong, try to reopen the connection
        init_mpd()
    else
        mpd_timer:set(settings.update_interval, update_mpd)
    end

    last_success = success
end

init_mpd = function ()
    -- Open the socket
    --statusd.inform("mpd","Opening connection...")
    success,errstr = open_socket()
    if not success then
        statusd.inform("mpd",errstr)
        -- go to sleep for a while, then try again
        mpd_timer:set(settings.retry_interval, init_mpd)
    else
        update_mpd()
    end
end

-- Initialize

-- Sending a template we don't honor just confuses the statusbar
--send_template()

-- Go to sleep immediately, so a slow connect doesn't break the whole statusbar
mpd_timer=statusd.create_timer()
mpd_timer:set(2000,init_mpd)
statusd.inform("mpd", "Initializing")


Для работы, в отличие от предыдущего скрипта, ему не требуется netcat и толпа соединений, но требуется luasocket. В дебиане нужный пакет называется liblua5.1-socket2.

Black, сейчас пилят Tritium. По сути, тот же ion, только на питоне и без анальных проблем Туомо.
Когда допилят?
А какие у него проблемы?

Ну, например, остановка разработки:
Сейчас, например, уже полгода как забросил ион
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1100
ОС: ArchLinux

Re: ion3

Сообщение Black »

Bluetooth писал(а):
31.01.2010 16:36
Ну, например, остановка разработки:

Даже если спирт замёрзнет...
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Аватара пользователя
minoru-kun
Сообщения: 620
ОС: Debian GNU/Linux

Re: ion3

Сообщение minoru-kun »

По-моему, иксы просто подставляют первый попавшийся шрифт из FontPath. Соответственно чтобы изменить, надо подсунуть в FontPath первыми свои шрифты и сделать так, чтобы нужный был первым в fonts.dir.

Код: Выделить всё

minoru@debian:/usr/share/fonts/X11$ find ./|grep fonts.dir
./Type1/fonts.dir
./75dpi/fonts.dir
./misc/fonts.dir

Осталось только выяснить, какой из них %)
Спасибо сказали:
Аватара пользователя
Black
Сообщения: 1100
ОС: ArchLinux

Re: ion3

Сообщение Black »

cat /etc/X11/xorg.conf | grep FontPath
Обычно первым там стоит misc.
Компьютер служит для решения тех проблем, которых до изобретения компьютера не существовало
Спасибо сказали:
Ответить