Поздравляю всех с Новым годом и выкладываю очередное произведение.
Все сделано в одном скрипте, правда при снимке не додумался запустить что-нибудь на закачку, "приборы" все работают.
--[[
Conky Widgets by olgmen (2009)
Скрипт позволяет выводить в окно CONKY часы, cpu, eth0
для запуска необходимо ввести до TEXT сдедующие строки
#--- LUA ---
lua_load ~/scripts/olgmen2.lua
lua_draw_hook_pre widgets
при условии, что скрипт olgmen2.lua сохранен в папке ~/scripts
]]
require 'cairo'
--[[ CLOCK WIDGET ]]
function clock(cr, x, y, s, bgc, bga, fgc, fga)
function rgb_to_r_g_b(colour,alpha) -- функция перекодировки цвета
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
-- назначаем базовые настройки
local s_th = 2 -- базовая толщина выводимых линий
local w = s
local h = s
local r = (w+h)/2*0.04
-- перехватываем данные часы, минуты, секунды
local hours=os.date("%I")
local mins=os.date("%M")
local secs=os.date("%S")
-- назначаем максимальные значения
secs_arc=(2*math.pi/60)*secs
mins_arc=(2*math.pi/60)*mins
hours_arc=(2*math.pi/12)*hours+mins_arc/12
-- рисуем циферблат
local radius = s/2*0.9
local m_x,m_y = x + s/2, y + s/2
cairo_set_line_width(cr,s_th)
cairo_arc(cr, m_x,m_y, radius, 0, math.rad(360)) -- выводим циферблат
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
cairo_fill_preserve(cr) -- окрашиваем циферблат
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
cairo_stroke(cr)
-- шкала cpu0
local radius1 = s/2*0.25
local m_x_up = x + s*0.31
local m_y_up = y + s*0.31
cairo_set_line_width(cr,s_th)
cairo_arc(cr, m_x_up, m_y_up, radius1, 0, math.rad(360))
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
cairo_fill_preserve(cr)
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
local i = 0
local winkel = math.rad(30)
-- вывод делений шкалы
for i=-4,6,1 do
cairo_move_to(cr, m_x_up - math.sin(winkel*i)*radius1, m_y_up - math.cos(winkel*i)*radius1)
cairo_line_to(cr, m_x_up-math.sin(winkel*i)*(radius1*0.8), m_y_up - math.cos(winkel*i)*(radius1*0.8))
end
cairo_stroke(cr)
-- цветная шкала
cairo_set_line_width(cr,s_th*2) -- ширина шкалы
cairo_arc(cr, m_x_up, m_y_up, radius1, -4.7, -1.55) -- зеленый сектор
cairo_set_source_rgba(cr, 0, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -1.55, -0.52) -- желтый сектор
cairo_set_source_rgba(cr, 1, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -0.51, 0.52) -- красный сектор
cairo_set_source_rgba(cr, 1, 0, 0, 0.4)
cairo_stroke(cr)
-- выводим текст
local wa = s/13
local ha = s/30
local ra = (wa+ha)/2*0.04
cairo_set_font_size(cr, (ha - 2 * ra)*(15/11))
cairo_move_to(cr, m_x_up - wa, m_y_up - ha)
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_show_text(cr, " CPU0")
local i = 0
local str=''
local value=0
str=string.format('${%s %s}','cpu', 'cpu0')
str=conky_parse(str)
value=tonumber(str)
-- вывод стрелки
local length = radius1*0.65 -- длина стрелки
cairo_set_line_width(cr,s_th)
cairo_move_to(cr, m_x_up, m_y_up)
cairo_line_to(cr, m_x_up - math.sin(math.rad((value/100)*300))*length, m_y_up + math.cos(math.rad((value/100)*300))*length)
cairo_stroke(cr)
-- шкала cpu1
local radius1 = s/2*0.25
local m_x_up = x + s*0.69
local m_y_up = y + s*0.31
cairo_set_line_width(cr,s_th)
cairo_arc(cr, m_x_up, m_y_up, radius1, 0, math.rad(360))
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
cairo_fill_preserve(cr)
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
local i = 0
local winkel = math.rad(30)
-- вывод делений шкалы
for i=-4,6,1 do
cairo_move_to(cr, m_x_up - math.sin(winkel*i)*radius1, m_y_up - math.cos(winkel*i)*radius1)
cairo_line_to(cr, m_x_up-math.sin(winkel*i)*(radius1*0.8), m_y_up - math.cos(winkel*i)*(radius1*0.8))
end
cairo_stroke(cr)
-- цветная шкала
cairo_set_line_width(cr,s_th*2) -- ширина шкалы
cairo_arc(cr, m_x_up, m_y_up, radius1, -4.7, -1.55) -- зеленый сектор
cairo_set_source_rgba(cr, 0, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -1.55, -0.52) -- желтый сектор
cairo_set_source_rgba(cr, 1, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -0.51, 0.52) -- красный сектор
cairo_set_source_rgba(cr, 1, 0, 0, 0.4)
cairo_stroke(cr)
-- выводим текст
local wa = s/13
local ha = s/30
local ra = (wa+ha)/2*0.04
cairo_set_font_size(cr, (ha - 2 * ra)*(15/11))
cairo_move_to(cr, m_x_up - wa, m_y_up - ha)
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_show_text(cr, " CPU1")
local i = 0
local str=''
local value=0
str=string.format('${%s %s}','cpu', 'cpu1')
str=conky_parse(str)
value=tonumber(str)
-- вывод стрелки
local length = radius1*0.65 -- длина стрелки
cairo_set_line_width(cr,s_th)
cairo_move_to(cr, m_x_up, m_y_up)
cairo_line_to(cr, m_x_up - math.sin(math.rad((value/100)*300))*length, m_y_up + math.cos(math.rad((value/100)*300))*length)
cairo_stroke(cr)
-- шкала down
local radius1 = s/2*0.25
local m_x_up = x + s*0.31
local m_y_up = y + s*0.69
cairo_set_line_width(cr,s_th)
cairo_arc(cr, m_x_up, m_y_up, radius1, 0, math.rad(360))
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
cairo_fill_preserve(cr)
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
local i = 0
local winkel = math.rad(30)
-- вывод делений шкалы
for i=-4,6,1 do
cairo_move_to(cr, m_x_up - math.sin(winkel*i)*radius1, m_y_up - math.cos(winkel*i)*radius1)
cairo_line_to(cr, m_x_up-math.sin(winkel*i)*(radius1*0.8), m_y_up - math.cos(winkel*i)*(radius1*0.8))
end
cairo_stroke(cr)
-- цветная шкала
cairo_set_line_width(cr,s_th*2) -- ширина шкалы
cairo_arc(cr, m_x_up, m_y_up, radius1, -4.7, -1.55) -- зеленый сектор
cairo_set_source_rgba(cr, 0, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -1.55, -0.52) -- желтый сектор
cairo_set_source_rgba(cr, 1, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -0.51, 0.52) -- красный сектор
cairo_set_source_rgba(cr, 1, 0, 0, 0.4)
cairo_stroke(cr)
-- выводим текст
local wa = s/13
local ha = s/30
local ra = (wa+ha)/2*0.04
cairo_set_font_size(cr, (ha - 2 * ra)*(15/11))
cairo_move_to(cr, m_x_up - wa, m_y_up - ha)
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_show_text(cr, " DOWN")
local i = 0
local str=''
local value=0
str=string.format('${%s %s}','downspeedf', 'eth0')
str=conky_parse(str)
value=tonumber(str)
-- вывод стрелки
local length = radius1*0.65 -- длина стрелки
cairo_set_line_width(cr,s_th)
cairo_move_to(cr, m_x_up, m_y_up)
cairo_line_to(cr, m_x_up - math.sin(math.rad((value/1000)*300))*length, m_y_up + math.cos(math.rad((value/1000)*300))*length)
cairo_stroke(cr)
-- шкала up
local radius1 = s/2*0.25
local m_x_up = x + s*0.69
local m_y_up = y + s*0.69
cairo_set_line_width(cr,s_th)
cairo_arc(cr, m_x_up, m_y_up, radius1, 0, math.rad(360))
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
cairo_fill_preserve(cr)
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
local i = 0
local winkel = math.rad(30)
-- вывод делений шкалы
for i=-4,6,1 do
cairo_move_to(cr, m_x_up - math.sin(winkel*i)*radius1, m_y_up - math.cos(winkel*i)*radius1)
cairo_line_to(cr, m_x_up-math.sin(winkel*i)*(radius1*0.8), m_y_up - math.cos(winkel*i)*(radius1*0.8))
end
cairo_stroke(cr)
-- цветная шкала
cairo_set_line_width(cr,s_th*2) -- ширина шкалы
cairo_arc(cr, m_x_up, m_y_up, radius1, -4.7, -1.55) -- зеленый сектор
cairo_set_source_rgba(cr, 0, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -1.55, -0.52) -- желтый сектор
cairo_set_source_rgba(cr, 1, 1, 0, 0.6)
cairo_stroke(cr)
cairo_arc(cr, m_x_up, m_y_up, radius1, -0.51, 0.52) -- красный сектор
cairo_set_source_rgba(cr, 1, 0, 0, 0.4)
cairo_stroke(cr)
-- выводим текст
local wa = s/13
local ha = s/30
local ra = (wa+ha)/2*0.04
cairo_set_font_size(cr, (ha - 2 * ra)*(15/11))
cairo_move_to(cr, m_x_up - wa, m_y_up - ha)
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_show_text(cr, " UP")
local i = 0
local str=''
local value=0
str=string.format('${%s %s}','upspeedf', 'eth0')
str=conky_parse(str)
value=tonumber(str)
-- вывод стрелки
local length = radius1*0.65 -- длина стрелки
cairo_set_line_width(cr,s_th)
cairo_move_to(cr, m_x_up, m_y_up)
cairo_line_to(cr, m_x_up - math.sin(math.rad((value/1000)*300))*length, m_y_up + math.cos(math.rad((value/1000)*300))*length)
cairo_stroke(cr)
-- вывод часовых делений
local i = 0
local winkel = math.rad(30)
for i=0,11,1 do
cairo_set_line_width(cr,s_th*1.5)
cairo_move_to(cr, m_x-math.sin(winkel*i)*radius, m_y-math.cos(winkel*i)*radius)
cairo_line_to(cr, m_x-math.sin(winkel*i)*(radius*0.9), m_y-math.cos(winkel*i)*(radius*0.9))
cairo_fill_preserve(cr)
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
cairo_stroke(cr)
end
-- вывод минутных делений
local i = 0
local winkel = math.rad(6)
for i=0,59,1 do
cairo_set_line_width(cr,1)
cairo_move_to(cr, m_x-math.sin(winkel*i)*radius, m_y-math.cos(winkel*i)*radius)
cairo_line_to(cr, m_x-math.sin(winkel*i)*(radius*0.9), m_y-math.cos(winkel*i)*(radius*0.9))
cairo_stroke(cr)
end
-- рисуем деления 3, 6, 9 и 12 часовые
cairo_set_line_width(cr,s_th/2) -- устанавливаем толщину линий
cairo_move_to (cr, x + 0.15*s, y + 0.5*s)
cairo_line_to (cr, x + 0.45*s, y + 0.5*s)
cairo_move_to (cr, x + 0.55*s, y + 0.5*s)
cairo_line_to (cr, x + 0.85*s, y + 0.5*s)
cairo_move_to (cr, x + 0.5*s, y + 0.15*s)
cairo_line_to (cr, x + 0.5*s, y + 0.45*s)
cairo_move_to (cr, x + 0.5*s, y + 0.55*s)
cairo_line_to (cr, x + 0.5*s, y + 0.85*s)
cairo_stroke(cr)
-- ОКНО ВЫВОДА ДАТЫ
-- задаем размер окна
local wo = s/6
local ho = s/12
local ro = (wo+ho)/2*0.04
local xo = x+0.2*s
local yo = y+0.45*s
-- рисуем окно
cairo_move_to(cr, xo + ro, yo)
cairo_line_to(cr, xo + wo - ro, yo)
cairo_arc(cr, xo + wo - ro, yo + ro, ro, -math.pi/2,0)
cairo_line_to(cr, xo + wo, yo + ho - ro)
cairo_arc(cr, xo + wo - ro, yo + ho - ro, ro, 0, math.pi/2)
cairo_line_to(cr, xo + ro, yo + ho)
cairo_arc(cr, xo + ro, yo + ho - ro, ro, math.pi/2, math.pi)
cairo_line_to(cr, xo, yo + ro)
cairo_arc(cr, xo + ro, yo + ro, ro, math.pi, math.pi*1.5)
-- закрашиваем в черный цвет
cairo_set_source_rgba(cr, 0,0,0,1)
cairo_fill(cr)
-- выводим в окно дату
local value = conky_parse("${time %b}")
cairo_set_font_size(cr, (ho - 2 * ro)*(15/11))
cairo_move_to(cr, xo + ro, yo + ho - ro)
-- задаем белый цвет цифрам даты
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_show_text(cr, value)
-- задаем размер окна
local wo = s/6
local ho = s/12
local ro = (wo+ho)/2*0.04
local xo = x+0.62*s
local yo = y+0.45*s
-- рисуем окно
cairo_move_to(cr, xo + ro, yo)
cairo_line_to(cr, xo + wo - ro, yo)
cairo_arc(cr, xo + wo - ro, yo + ro, ro, -math.pi/2,0)
cairo_line_to(cr, xo + wo, yo + ho - ro)
cairo_arc(cr, xo + wo - ro, yo + ho - ro, ro, 0, math.pi/2)
cairo_line_to(cr, xo + ro, yo + ho)
cairo_arc(cr, xo + ro, yo + ho - ro, ro, math.pi/2, math.pi)
cairo_line_to(cr, xo, yo + ro)
cairo_arc(cr, xo + ro, yo + ro, ro, math.pi, math.pi*1.5)
-- закрашиваем в черный цвет
cairo_set_source_rgba(cr, 0,0,0,1)
cairo_fill(cr)
-- выводим в окно дату
local value = conky_parse("${time %d}")
cairo_set_font_size(cr, (ho - 2 * ro)*(15/11))
cairo_move_to(cr, xo + ro, yo + ho - ro)
-- задаем белый цвет цифрам даты
cairo_set_source_rgba(cr, 1, 1, 1, 1)
cairo_show_text(cr, value)
local clock_r = s/2
local xc = x + s/2
local yc = y + s/2
-- вывод часовой стрелки
xh=xc+0.6*clock_r*math.sin(hours_arc)
yh=yc-0.6*clock_r*math.cos(hours_arc)
cairo_move_to(cr,xc,yc)
cairo_line_to(cr,xh,yh)
cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND)
cairo_set_line_width(cr,5)
cairo_stroke(cr)
-- вывод минутной стрелки
xm=xc+0.7*clock_r*math.sin(mins_arc)
ym=yc-0.7*clock_r*math.cos(mins_arc)
cairo_move_to(cr,xc,yc)
cairo_line_to(cr,xm,ym)
cairo_set_line_width(cr,3)
cairo_stroke(cr)
-- вывод секундной стрелки
xs=xc+0.75*clock_r*math.sin(secs_arc)
ys=yc-0.75*clock_r*math.cos(secs_arc)
cairo_move_to(cr,xc,yc)
cairo_line_to(cr,xs,ys)
cairo_set_line_width(cr,1)
cairo_stroke(cr)
end
--[[ END CLOCK ]]
-------------------
--------------------------------
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)
---------------------------------
--[[ CLOCK ]]
cr = cairo_create(cs)
clock(cr, 10, 10, 200, 0x151515, 1, 0xc0c0c0, 1)
-- опции: x, y, s, bgc, bga, fgc, fga
-- "x" координаты по горизонтали центра часов
-- "y" координаты по вертикали центра часов
-- "s" диаметр часов
-- "bgc" цвет фона
-- "bga" яркость фона
-- "fgc" цвет графики
-- "fga" яркость графики
cairo_destroy(cr)
end