Решил выложить переделанный мной скрипт для вывода эквалайзеров.
Все пояснения для настройки скрипта находятся в шапке скрипта. Работает с CONKY-1.7 и выше.
Для демонстрации действия мной использован вывод секунд, для вывода необходимых данных необходимо заменить 'time' и '%S' например на 'cpu' 'cpu1'
В связи с тем, что в CONKY-1.8 имеется баг, не позволяющий выводить несколько ядер, необходимо выводить общие данные процессора включив строку
в .conkyrc, после этого возможно выводить данные отдельных ядер через этот скрипт.
--[[ EQUALIZER WIDGET
v1.0 by wlourf (10 Feb. 2010)
This widget draw a simple bar like (old) equalizers on hi-fi systems.
http://u-scripts.blogspot.com/
Перевод и переделка в виджет olgmen (25.03.2010) krinkel@rambler.ru
Данные для настройки вывода эквалайзеров:
Строка для образца
equalizer(cr, 10, 240, 'cpu', 'cpu1', 100, 25, CAIRO_LINE_CAP_SQUARE, 25, 2, 2, 0x606070, 1, 0xffdf00, 1, 0xff8700, 1, 80, true, 1, true, 0xff0000, 0.5, 0)
Расписываю в порядке следования значений в строке образца
10 - xb - координаты по горизонтали
240 - yb - координаты по вертикали
'cpu' - "name" тип выводимого параметра, обязательно в одинарных кавычках, можно использовать 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc', 'downspeed', 'upspeed' и т.д.
'cpu1' - "arg" аргумент используемый в Conky, например ${cpu cpu0}, 'cpu0' является аргументом.
Если аргумент не используется в Conky то необходимо поставить две одинарные кавычки ''.
100 - "max" максимальное значение выводимого параметра. Если выводятся проценты то max=100, для скорости интернета я беру для приема 1000, передача 100.
25 - "nb_blocks" количество выводимых делений эквалайзера
CAIRO_LINE_CAP_SQUARE - "cap" вид выводимых делений, в данном случае увеличеная высота по сравнению с заданной, возможны также
CAIRO_LINE_CAP_ROUND - закругленные концы, при малых размерах будет шар
CAIRO_LINE_CAP_BUTT - прямоугольные торцы, заданная высота. Вид можно посмотреть на
http://www.cairographics.org/samples/set_line_cap/
25 - "w" ширина деления эквалайзера
2 - "h" высота деления эквалайзера
2 - "space" расстояние между делениями, может быть 0 или отрицательным, не проверял.
0x606070 - "bgc" цвет фона
1 - "bga" насыщенность, значения от 0 до 1, чем меньше, тем прозрачней.
0xffdf00 - "fgc" основной цвет
1 - "fga" насыщенность, значения от 0 до 1, чем меньше, тем прозрачней.
0xff8700 - "alc" цвет превышения параметра, например перегрузка
1 - "ala" насыщенность, значения от 0 до 1, чем меньше, тем прозрачней.
80 - "alarm" значения от 0 до 100, в данном случае при превышении нагрузки процессора выше 80% цвет эквалайзера изменится.
true - "led_effect" значения true или false : блеск, дает ощущение блика
1 - "led_alpha" центр блика (блеска), значения от 0 до 1.
true - "smooth" значения true или false : colors in the bar has a smooth effect - не разобрался
0xff0000 - "mid_color" цвет центральной части эквалайзера, для отключения необходимо вместо значения цвета написать nil
0.5 - "mid_alpha" насыщенность, значения от 0 до 1, чем меньше, тем прозрачней.
0 - "rotation" угол поворота эквалайзера, значения от 0 до 360.
0 = вертикально, увеличение с низу вверх
90 = горизонтально, увеличение слева на право
180 = перевернут, увеличение сверху вниз
270 = горизонтально, увеличение с права на лево
Другие значения выводят эквалайзер под заданным углом
]]
require 'cairo'
function equalizer(cr, xb, yb, name, arg, max, nb_blocks, cap, w, h, space, bgc, bga, fgc, fga,alc,ala,alarm,led_effect,led_alpha,smooth,mid_color,mid_alpha,rotation)
-- функция перекодировки цвета
local function rgb_to_r_g_b(colour, alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
-- данные необходимые для вида выводимых делений эквалайзера
local cap_round = CAIRO_LINE_CAP_ROUND -- в виде кругов
local cap_square = CAIRO_LINE_CAP_SQUARE -- в виде прямоугольников
local cap_butt = CAIRO_LINE_CAP_BUTT -- в виде прямоугольников но других
local function setup_equalizer()
-- забираем данные из ОС
local str = conky_parse(string.format('${%s %s}', name, arg))
local value = tonumber(str)
if value == nil then value = 0 end
local pct = 100*value/max
local pcb = 100/nb_blocks
-- задаем размеры и вид делений
cairo_set_line_width (cr, h)
cairo_set_line_cap (cr, cap)
-- разворачиваем эквалайзер
local angle= rotation*math.pi/180
for pt = 1,nb_blocks do
local light_on=false
--set colors
local col,alpha = bgc,bga
if pct>=(100/nb_blocks/2) then --start after an half bloc
if pct>=(pcb*(pt-1)) then
light_on=true
col,alpha = fgc,fga
if pct>=alarm and (pcb*pt)>alarm then col,alpha = alc,ala end
end
end
--vertical points
local x1=xb
local y1=yb-pt*(h+space)
local radius0 = yb-y1
local x2=xb+radius0*math.sin(angle)
local y2=yb-radius0*math.cos(angle)
--line on angle
local a1=(y2-yb)/(x2-xb)
local b1=y2-a1*x2
--line perpendicular to angle
local a2=-1/a1
local b2=y2-a2*x2
--dots on perpendicular
local xx0,xx1,yy0,yy1=0,0,0,0
if rotation == 90 or rotation == 270 then
xx0,xx1=x2,x2
yy0=yb
yy1=yb+w
else
xx0,xx1=x2,x2+w*math.cos(angle)
yy0=xx0*a2+b2
yy1=xx1*a2+b2
end
--perpendicular segment
cairo_move_to (cr, xx0 ,yy0)
cairo_line_to (cr, xx1 ,yy1)
--colors
local xc,yc=(xx0+xx1)/2,(yy0+yy1)/2
if light_on and led_effect then
local pat = cairo_pattern_create_radial (xc, yc, 0, xc,yc,w/1.5)
cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(col,led_alpha))
cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(col,alpha))
cairo_set_source (cr, pat)
cairo_pattern_destroy(pat)
else
cairo_set_source_rgba(cr, rgb_to_r_g_b(col,alpha))
end
if light_on and smooth then
local radius = (nb_blocks+1)*(h+space)
if pt==1 then
xc0,yc0=xc,yc --remember the center of first block
end
cairo_move_to(cr,xc0,yc0)
local pat = cairo_pattern_create_radial (xc0, yc0, 0, xc0,yc0,radius)
cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(fgc,fga))
cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(alc,ala))
if mid_color ~=nil then
cairo_pattern_add_color_stop_rgba (pat, 0.5,rgb_to_r_g_b(mid_color,mid_alpha))
end
cairo_set_source (cr, pat)
cairo_pattern_destroy(pat)
end
cairo_stroke (cr);
end
end
--prevent segmentatioon error
local updates=tonumber(conky_parse('${updates}'))
setup_equalizer()
end
--[[ END WIDGET ]]
-- -------------------------------------------------------------------------------------
function conky_widgets()
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)
-- -------------------------------------------------------------------------------------
cr = cairo_create(cs)
equalizer(cr, 10, 30, 'time', '%S', 60, 60, CAIRO_LINE_CAP_SQUARE, 10, 2, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 90)
equalizer(cr, 10, 60, 'time', '%S', 60, 30, CAIRO_LINE_CAP_SQUARE, 10, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 90)
equalizer(cr, 10, 90, 'time', '%S', 60, 30, CAIRO_LINE_CAP_BUTT, 10, 5, 2, 0x606070, 1, 0xffdf00, 1, 0xff8700, 1, 80, true, 1, true, 0xff0000, 0.5, 90)
equalizer(cr, 10, 120, 'time', '%S', 60, 30, CAIRO_LINE_CAP_ROUND, 10, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 90)
equalizer(cr, 10, 150, 'time', '%S', 60, 30, CAIRO_LINE_CAP_ROUND, 1, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 90)
equalizer(cr, 0, 180, 'time', '%S', 60, 10, CAIRO_LINE_CAP_ROUND, 1, 20, 2, 0x606070, 1, 0xffdf00, 1, 0xff8700, 1, 80, true, 1, true, 0xff0000, 0.5, 90)
equalizer(cr, 0, 210, 'time', '%S', 60, 10, CAIRO_LINE_CAP_ROUND, 1, 20, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 90)
equalizer(cr, 240, 240, 'time', '%S', 60, 10, CAIRO_LINE_CAP_ROUND, 1, 20, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 270)
equalizer(cr, 20, 480, 'time', '%S', 60, 30, CAIRO_LINE_CAP_SQUARE, 10, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 0)
equalizer(cr, 60, 265, 'time', '%S', 60, 30, CAIRO_LINE_CAP_SQUARE, 10, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 180)
equalizer(cr, 80, 430, 'time', '%S', 60, 30, CAIRO_LINE_CAP_SQUARE, 10, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 45)
equalizer(cr, 240, 330, 'time', '%S', 60, 30, CAIRO_LINE_CAP_SQUARE, 10, 5, 2, 0x606070, 1, 0x00ccff, 1, 0xff0000, 1, 80, true, 1, true, 0x66ff00, 1, 225)
cairo_destroy(cr)
end