--[[
Conky Widgets by olgmen (2010)
Скрипт позволяет выводить в окно CONKY часы с часовым механизмом
для запуска необходимо ввести до TEXT сдедующие строки
#--- LUA ---
lua_load ~/scripts/olgmen5.lua
lua_draw_hook_pre widgets
при условии, что скрипт olgmen5.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 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
local m_x,m_y = x + s/2, y + s/2
-- рисуем черный фон основы часов
-- задаем границы внешней окружности
cairo_arc(cr, m_x,m_y, radius, 0, math.rad(360))
-- задаем цвет
cairo_set_source_rgba(cr, 0, 0, 0, 1)
-- окрашиваем
cairo_fill_preserve(cr)
-- завершаем действие
cairo_stroke(cr)
-- ----------------------------------------------------------------
-- рисуем верхнюю шестерню
local i = 0
-- зубцы шестерни располагаем через 15 градусов
local winkel = math.rad(15)
-- рисуем обод шестерни
cairo_arc(cr, m_x,m_y-s*0.275, radius*0.26, 0, math.rad(360))
-- задаем ширину обода
cairo_set_line_width(cr,s_th*4)
-- задаем цвет
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
-- выводим рисунок
cairo_stroke(cr)
-- рисуем пустые места между зубцами шестерни, что бы показать сцепление зубцов
-- будем выводить 24 зубца
for i=0,23,1 do
-- задаем ширину
cairo_set_line_width(cr,5)
-- задаем начальные точки
cairo_move_to(cr, m_x-math.cos(secs+winkel*i)*(radius*0.25), m_y-s*0.275-math.sin(secs+winkel*i)*(radius*0.25))
-- задаем конечные точки
cairo_line_to(cr, m_x-math.cos(secs+winkel*i)*(radius*0.3), m_y-s*0.275-math.sin(secs+winkel*i)*(radius*0.3))
-- задаем цвет
cairo_set_source_rgba(cr, 0, 0, 0, 1)
-- выводим рисунок
cairo_stroke(cr)
end
-- рисуем спицы шестерни
local i = 0
-- спицы располагаем через 60 градусов
local winkel = math.rad(60)
-- будем выводить 6 спиц
for i=0,5,1 do
cairo_set_line_width(cr,s_th*1.5)
cairo_move_to(cr, m_x-math.cos(secs+winkel*i)*(radius*0.25), m_y-s*0.275-math.sin(secs+winkel*i)*(radius*0.25))
cairo_line_to(cr, m_x-math.cos(secs+winkel*i), m_y-s*0.275-math.sin(secs+winkel*i))
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
cairo_stroke(cr)
end
-- --------------------------------------------------
-- рисуем левую шестерню
local i = 0
local winkel = math.rad(15)
cairo_arc(cr, m_x-s*0.2,m_y+s*0.1, radius*0.3, 0, math.rad(360))
cairo_set_line_width(cr,s_th*4)
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
cairo_stroke(cr)
for i=0,23,1 do
cairo_set_line_width(cr,5)
cairo_move_to(cr, m_x-s*0.2-math.cos(secs+winkel*i)*(radius*0.29), m_y+s*0.1-math.sin(secs+winkel*i)*(radius*0.29))
cairo_line_to(cr, m_x-s*0.2-math.cos(secs+winkel*i)*(radius*0.34), m_y+s*0.1-math.sin(secs+winkel*i)*(radius*0.34))
cairo_set_source_rgba(cr, 0, 0, 0, 1)
cairo_stroke(cr)
end
local i = 0
local winkel = math.rad(60)
for i=0,5,1 do
cairo_set_line_width(cr,s_th*1.5)
cairo_move_to(cr, m_x-s*0.2-math.cos(secs+winkel*i)*(radius*0.29), m_y+s*0.1-math.sin(secs+winkel*i)*(radius*0.29))
cairo_line_to(cr, m_x-s*0.2-math.cos(secs+winkel*i), m_y+s*0.1-math.sin(secs+winkel*i))
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
cairo_stroke(cr)
end
-- -----------------------------------------------------
-- рисуем центральную шестерню
local i = 0
local winkel = math.rad(15)
-- рисуем обод
cairo_arc(cr, m_x,m_y, radius*0.24, 0, math.rad(360))
cairo_set_line_width(cr,s_th*2)
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
cairo_stroke(cr)
for i=0,23,1 do
cairo_set_line_width(cr,s_th)
cairo_move_to(cr, m_x-math.sin(secs+winkel*i)*(radius*0.25), m_y-math.cos(secs+winkel*i)*(radius*0.25))
cairo_line_to(cr, m_x-math.sin(secs+winkel*i)*(radius*0.3), m_y-math.cos(secs+winkel*i)*(radius*0.3))
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
cairo_stroke(cr)
end
local i = 0
local winkel = math.rad(60)
for i=0,5,1 do
cairo_set_line_width(cr,s_th*1.5)
cairo_move_to(cr, m_x-math.sin(secs+winkel*i)*(radius*0.25), m_y-math.cos(secs+winkel*i)*(radius*0.25))
-- рисуем спицы
cairo_line_to(cr, m_x-math.sin(secs+winkel*i), m_y-math.cos(secs+winkel*i))
cairo_set_source_rgba(cr, 1, 0.75, 0, 1)
cairo_stroke(cr)
end
-- ---------------------------------------
-- рисуем циферблат
-- задаем границы внешней окружности
cairo_arc(cr, m_x,m_y, radius, 0, math.rad(360))
-- начинаем новое задание
cairo_new_sub_path(cr)
-- задаем границы внутренней окружности
cairo_arc(cr, m_x,m_y, radius*0.5, 0, math.rad(360))
-- даем задание окрасить пространство между окружностями
cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD)
-- задаем цвет
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
-- окрашиваем
cairo_fill_preserve(cr)
-- завершаем действие
cairo_stroke(cr)
-- рисуем внешнюю окружность
cairo_arc(cr, m_x,m_y, radius, 0, math.rad(360))
-- задаем толщину линии
cairo_set_line_width(cr,6)
-- задаем цвет линии
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
-- рисуем
cairo_stroke(cr)
-- прозрачный "корпус часов"
cairo_arc(cr, m_x, m_y, radius*1.15, 0, 2*math.pi)
cairo_set_source_rgba(cr, 0.5, 0.5, 0.5, 0.
cairo_set_line_width(cr,1)
cairo_stroke(cr)
local border_pat=cairo_pattern_create_linear(m_x, m_y - radius*1.15, m_x, m_y + radius*1.25)
cairo_pattern_add_color_stop_rgba(border_pat,0,0,0,0,0.7)
cairo_pattern_add_color_stop_rgba(border_pat,0.3,1,1,1,0)
cairo_pattern_add_color_stop_rgba(border_pat,0.5,1,1,1,0)
cairo_pattern_add_color_stop_rgba(border_pat,0.7,1,1,1,0)
cairo_pattern_add_color_stop_rgba(border_pat,1,0,0,0,0.7)
cairo_set_source(cr,border_pat)
cairo_arc(cr, m_x, m_y, radius*1.1, 0, 2*math.pi)
cairo_close_path(cr)
cairo_set_line_width(cr, radius*0.15)
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
-- часовые стрелки с тенью, взято из Shadowed clock by wlourf (10 jan. 2010)
function draw_hand(a_trame,arc,arc0,arc1,lg,r,border,rgb)
xx = xc + clock_r*math.sin(arc)*lg
yy = yc - clock_r*math.cos(arc)*lg
x0 = xc + r*math.sin(arc0)
y0 = yc - r*math.cos(arc0)
x1 = xc + r*math.sin(arc1)
y1 = yc - r*math.cos(arc1)
if border ~= nil then
cairo_set_line_width(cr,1)
cairo_set_source_rgba(cr,border[1],border[2],border[3],0.5)
cairo_move_to (cr, x0, y0)
cairo_curve_to (cr, x0, y0, xx, yy, x1, y1)
cairo_arc(cr,xc,yc,r,arc1-math.pi/2,arc0-math.pi/2)
cairo_stroke(cr)
end
-- рисуем тень
cairo_move_to (cr, x0, y0)
cairo_curve_to (cr, x0, y0, xx+shadow_xoffset, yy+shadow_yoffset, x1, y1)
cairo_arc(cr,xc,yc,r,arc1-math.pi/2,arc0-math.pi/2)
pat = cairo_pattern_create_radial (xc, yc, 0, xc, yc, clock_r)
cairo_pattern_add_color_stop_rgba (pat, 0, 0, 0, 0, shadow_opacity)
cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 0)
cairo_set_source (cr, pat)
cairo_fill (cr)
-- рисуем стрелки
cairo_move_to (cr, x0, y0)
cairo_curve_to (cr, x0, y0, xx, yy, x1, y1)
cairo_arc(cr,xc,yc,r,arc1-math.pi/2,arc0-math.pi/2)
pat = cairo_pattern_create_radial (xc, yc, clock_r/10, xc, yc, clock_r*lg)
cairo_pattern_add_color_stop_rgba (pat,0, rgb[1], rgb[2], rgb[3], 1)
cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 1)
cairo_set_source (cr, pat)
cairo_fill (cr)
cairo_pattern_destroy (pat)
end
-- Здесь вводятся основные данные
-- радиус часов в пикселях, задаем половину диаметра часов
clock_r=s/2
-- координаты центра часов
xc = x+s/2
yc = y+s/2
-- координаты источника света относительно центра часов, 0 - источник света над центром
-- может быть положительным, источник света выше центра, или отрицательным
shadow_xoffset=70
shadow_yoffset=70
-- прозрачность тени, значения от 0 до 1
shadow_opacity=0.5
-- Выводить секундную стрелку, Да - true, Нет - false.
-- При выводе секундной стрелки update_interval в .conkyrc должен быть менее 1 сек.
show_seconds=false
-- Выводить ось стрелок в центре часов, Да - true, Нет - false.
show_dot = true
-- размеры стрелок, первая цифра ширина, вторая - длина
rh,lgh=3,1.2 -- часовая стрелка
rm,lgm=2,1.75 -- минутная стрелка
rs,lgs=1,1.9 -- секундная стрелка
-- забираем данные из ОС
-- local hours=os.date("%I")
-- local mins=os.date("%M")
-- local secs=os.date("%S")
-- расчет угла движения стрелок
gamma = math.pi/2-math.atan(rs/(clock_r*lgs))
secs_arc=(2*math.pi/60)*secs
secs_arc0=secs_arc-gamma
secs_arc1=secs_arc+gamma
gamma = math.pi/2-math.atan(rm/(clock_r*lgm))
mins_arc=(2*math.pi/60)*mins + secs_arc/60
mins_arc0=mins_arc-gamma
mins_arc1=mins_arc+gamma
gamma = math.pi/2-math.atan(rh/(clock_r*lgh))
hours_arc=(2*math.pi/12)*hours+mins_arc/12
hours_arc0=hours_arc-gamma
hours_arc1=hours_arc+gamma
-- вывод стрелок
draw_hand(alpha_trame,hours_arc,hours_arc0,hours_arc1,lgh,rh,{0,0,0},{1,1,1})
draw_hand(alpha_trame,mins_arc,mins_arc0,mins_arc1,lgm,rm,{0,0,0},{.9,.9,.9})
if show_seconds then
draw_hand(alpha_trame,secs_arc,secs_arc0,secs_arc1,lgs,rs,{0,0,0},{.8,.8,.8})
end
-- рисуем ось стрелок
if show_dot then
lg_shadow_center=3
radius=math.min(rh,rm,rs)*0.75
if radius<1 then radius=1 end
ang = math.atan(shadow_yoffset/shadow_xoffset)
-- тень от оси cairo_pattern_add_color_stop_rgba(border_pat,0,0,0,0,0.7)
cairo_pattern_add_color_stop_rgba(border_pat,0.3,0.5,1,1,0)
cairo_pattern_add_color_stop_rgba(border_pat,0.5,0.5,1,1,0)
cairo_pattern_add_color_stop_rgba(border_pat,0.7,0.5,1,1,0)
cairo_pattern_add_color_stop_rgba(border_pat,1,0,0,0,0.7)
cairo_set_source(cr,border_pat)
cairo_arc(cr, m_x, m_y, radius*1.125, 0, 2*math.pi)
cairo_close_path(cr)
cairo_set_line_width(cr, radius*0.25)
cairo_stroke(cr)
gamma = -math.atan(1/lg_shadow_center)
ang0=ang-gamma
ang1=ang+gamma
end
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, 25, 50, 200, 0xffffff, 0.9, 0x000000, 1)
-- опции: x, y, s, bgc, bga, fgc, fga
-- "x" координаты по горизонтали центра часов
-- "y" координаты по вертикали центра часов
-- "s" диаметр часов
-- "bgc" цвет фона
-- "bga" яркость фона
-- "fgc" цвет графики
-- "fga" яркость графики
cairo_destroy(cr)
end