суббота, 7 января 2012 г.

Как я делаю conky


   Все conky имеют одинаковый набор команд, но, используя эти команды, можно создать очень разные conky.
Я делаю это так.


   Существуют много скриптов написанные любителями conky. Я использую некоторые из них как основные. К ним относятся скрипты написанные французским любителем conky пишущим под ником wlourf, его блог http://u-scripts.blogspot.com/ У него я взял несколько скриптов, это скрипты:

выводящие тексты - http://wlourf.deviantart.com/#/d36njc0
выводящий бары - http://u-scripts.blogspot.com/2010/07/bargraph-widget.html
выводящий круговые бары - http://wlourf.deviantart.com/art/Rings-And-Sectors-for-Conky-2-174493100
выводящий фон (подложку) - http://wlourf.deviantart.com/art/Box-widget-for-conky-1-1-195130450 
выводящий графики - http://wlourf.deviantart.com/art/Graph-Widget-for-Conky-1-184541530

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

Эти скрипты у меня храняться в папке ~/scripts, что бы не искать пути, да и путаницы меньше.

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

Итак conkyrc и скрипты у нас есть, дело за малым, придумать, что-то новенькое. Покажу на примере маленьких conky выводящие время работы. В классических conky это просто команда

${uptime}

Выглядит это так



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

Можно конечно использовать скрипт text.lua от wlourf, и это будет выглядеть так


вариантов раскраски и наклонов, поворотов текста у скрипта очень много, но остается во первых

Но мы не ищем простых путей и создаем новый скрипт, который я обычно называю main.lua и в котором находятся все настройки того, что будет выведено в окно conky.

Начало у всех скриптов одинаковое, шапку скрипта мы пропускаем, и начинаются все скрипты строкой

require "cairo"

Для того, чтобы скрипт можно было запускать из под любого пользователя, я даю определение домашней директории, даже не я, это будет делать сама программа

usrhome = os.getenv("HOME")

и даем знать программе какие скрипты понадобятся для выполнения программы и где их взять

dofile (usrhome .. "/scripts/text.lua")

таким образом нет необходимости другому пользователю лезть в скрипт и искать, где и что заменить, чтобы программа заработала. К тому же, как известно, conky позволяют подключать только два скрипта LUA, а таким образом можно запустить очень много необходимых скриптов.

далее следует название функции, оно может быть любым, но лучше, что бы оно имело отношение к этому скрипту. Назовем функцию conky_operation_time, значит следующая строка будет такой

function conky_operation_time()

Теперь пишем саму программу. Необходим счетчик секунд, его можно взять из самих conky. В conkyrc есть строка задающая время обновления conky, обычно время обновления равно 1 секунде. Это команда

update_interval 1

Значит используем эту возможность и пишем в функции

local updates = conky_parse('${updates}')

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

updates = tonumber(updates)

Итак секунды мы берём, теперь делаем счетчик секунд

local timer_seconds = (updates % 60) + 1

Отсчитав 60 секунд счетчик сбрасывается на 0. Но, т.к. счет начинается с 1, то последняя выданная счетчиком цифра будет 60, а мы привыкли видеть 0. Пишем

if timer_seconds > 59 then timer_seconds = 0 end

и получаем цифры от 0 до 59, маленькое но, когда выводятся то однозначные цифры, то двухзначные, начинает дергаться картинка, избавляемся от этого добавлением 0 перед однозначными цифрами

if timer_seconds < 10 then 
text_seconds = "0" .. timer_seconds
else
text_seconds = timer_seconds
end

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

local timer_minutes = math.floor(((updates % (60 * 60)+1))/60)

Прописные истины, в минуте 60 секунд, в часе 60 минут, но счетчик об этом не знает, поэтому умножаем счетчик секунд на 60 и получаем счетчик минут. Всё кажется хорошо, но счетчик считает и считает, а результат растет и растет. Счетчик честно досчитав до 3600 секунд сбросится на 0, но нам от этого не легче. Делим выводимые значения счетчика на 60, получаем значения минут, но с десятыми и тысячными. Выход из этого положения в команде math.floor которая сокращает число до наименьшего целого. Ну а дальше по аналогии с секундами

if timer_minutes > 59 then timer_minutes = 0 end

if timer_minutes < 10 then 
text_minutes = "0" .. timer_minutes
else
text_minutes = timer_minutes
end

Переходим к выводу часов. Например нам необходимо, чтобы счетчик часов сбрасывал показания на 0 через 10 часов, тогда вывод часов будет выглядеть так

local timer_hours = math.floor(((updates % (60 * 600)+1))/3600)

if timer_hours < 10 then
text_hours = "00" .. timer_hours
elseif timer_hours < 100 then
text_hours = "0" .. timer_hours
else
text_hours = timer_hours
end

Здесь я зделал запас для выводимых значений. Ничто не стоит на месте и вдруг потребуется вывод 999 часов 59 минут 59 секунд, поэтому будем выводить 3-х значные числа

Программа счетчика закончена, займемся выводом на экран. В начале программы мы указали, что будет задействован скрипт вывода текстов. Готовим для него данные. Можно конечно подключить другой скрипт и выводить показания в виде колец или баров, но я предпочитаю текст, т.к. привычнее

Открываем блок данных

timer_settings = {

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

{
text = "Время работы",
x = 130, -- координаты x
y = 50, -- координаты y
font_size = 14, -- размер шрифта
bold = true, -- шрифт "толстый"
h_align = "c", -- координаты х проходит по центру текста
v_align = "m", -- координата y проходит по центру текста
colour = {{0, 0x555555, 1},{0.5, 0xcfcfcf, 1},{1, 0x555555, 1}},
orientation="nn",
},

немного о последних двух строках. В скрипте text.lua, да и в других скриптах, написанных wlourf, таким образом задаётся градация цвета. В данном случае выводится 3 цвета, по краям темно-серый, посередине - серебристый. Возможно задавать от одного до трех цветов, подробности описаны в блоге wlourf и в шапке его скриптов. Последний пункт указывается как распределяется градация. "nn" - сверху вниз, подробности смотрите там же.

Теперь вывод счетчика

{
text = text_hours .. " ч  " .. text_minutes .. " м  " .. text_seconds .. " с",
x = 130,
y = 70,
font_size = 18,
bold = true,
h_align = "c",
v_align = "m",
colour = {{0, 0x555555, 1},{0.5, 0xcfcfcf, 1},{1, 0x555555, 1}},
orientation="nn",
},

строка

text = text_hours .. " ч  " .. text_minutes .. " м  " .. text_seconds .. " с",

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

        }

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

        font_name = "название шрифта",

На этом заканчивается блок выводимых данных.

Проверяем, существует ли окно conky, если нет, выходим из программы

if conky_window == nil then return end

Забираем данные об окне conky

local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)

Забираем данные из блока данных и запускаем скрипт text.lua

for i,v in pairs(timer_settings) do
cr = cairo_create (cs)
display_text(v)
cairo_destroy(cr)
end

Закрываем программу

end

ПРОГРАММА НАПИСАНА.

Сохраняем скрипт в папке со скриптами под именем main.lua и даем ему права. Я не помню консольную команду потому что мне легче в менеджере файлов целкнуть правой кнопкой мыши на файле, в "Свойства" выбрать вкладку "Права" и отметить "Разрешить запуск этого файла в качестве программы".

Прописываем в conkyrc выше слова ТЕХТ следующие строки

lua_load ~/scripts/uptime.lua
lua_draw_hook_pre operation_time

Первая строка загружает скрипт, вторая - запускает

Ниже слова TEXT , при отсутствии текста, должна быть хотя бы одна пустая строка, иначе скрипты не работают. Это относится ко всем conky без команд ниже слова TEXT.

Получаем



Текст скрипта без комментариев

require "cairo"


usrhome = os.getenv("HOME")


dofile (usrhome .. "/scripts/text.lua")


function conky_operation_time()


local updates = conky_parse('${updates}')
updates = tonumber(updates)


local timer_seconds = (updates % 60) + 1 -- счетчик секунд
if timer_seconds > 59 then timer_seconds = 0 end

if timer_seconds < 10 then 
text_seconds = "0" .. timer_seconds
else
text_seconds = timer_seconds
end

local timer_minutes = math.floor(((updates % (60 * 60)+1))/60) -- счетчик минут
if timer_minutes > 59 then timer_minutes = 0 end

if timer_minutes < 10 then 
text_minutes = "0" .. timer_minutes
else
text_minutes = timer_minutes
end


local timer_hours = math.floor(((updates % (60 * 600)+1))/3600) -- счетчик часов

if timer_hours < 10 then
text_hours = "00" .. timer_hours
elseif timer_hours < 100 then
text_hours = "0" .. timer_hours
else
text_hours = timer_hours
end

timer_settings = { -- таймер
{
text = "Время работы",
x = 130,
y = 50,
font_size = 14,
bold = true,
h_align = "c",
v_align = "m",
colour = {{0, 0x555555, 1},{0.5, 0xcfcfcf, 1},{1, 0x555555, 1}},
orientation="nn",
},


{
text = text_hours .. " ч  " .. text_minutes .. " м  " .. text_seconds .. " с",
x = 130,
y = 70,
font_size = 18,
bold = true,
h_align = "c",
v_align = "m",
colour = {{0, 0x555555, 1},{0.5, 0xcfcfcf, 1},{1, 0x555555, 1}},
orientation="nn",
},
}

--[[ здесь заканчивается ввод всех данных ]]


if conky_window == nil then return end

local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)

for i,v in pairs(timer_settings) do
cr = cairo_create (cs)
display_text(v)
cairo_destroy(cr)
end
end

Текст набирался на редакторе Geany, в кранче установлен по умолчанию, мне он нравится больше, чем Gedit.

Надеюсь, что этот пост поможет разобраться и с другими скриптами.

Удачных коньков.

2 комментария:

  1. Неплохо бы ещё screenshot показать.

    ОтветитьУдалить
  2. Небольшой скриншот находится выше строки

    Текст скрипта без комментариев

    ОтветитьУдалить