-- Пример написания скрипта часов
-- Так как при выводе часов используются команды на языке cairo
-- необходимо указать программе об этом
require 'cairo'
-- создаем функцию для вывода изображения часов
function conky_clock ()
-- необходимые данные для вывода часов
clock_settings = {
{
-- x = 150, -- координаты часов по горизонтали
-- y = 150, -- координаты часов по вертикали
radius = 100, -- радиус часов
color = 0xffffff, -- цвет
alpha = 1, -- насыщенность цвета
font_size = 16,
bold = true,
}
}
-- проверяем, существует окно конки или нет, если нет, выходим из программы
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(clock_settings) do
cr = cairo_create (cs)
display_clock (v)
cairo_destroy (cr)
end
end
-- функция перекодировки цвета
function rgb_to_r_g_b(colour,alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
-- функция рисования часов
function display_clock (t)
-- производим проверку вводимых данных и задаем значения по умолчанию
if t.x == nil then t.x = conky_window.width/2 end
if t.y == nil then t.y = conky_window.height/2 end
if t.radius == nil then t.radius = 75 end
if t.color == nil then t.color = 0xffffff end
if t.alpha == nil then t.alpha = 1 end
if t.color_sec == nil then t.color_sec = 0xff0000 end
if t.alpha_sec == nil then t.alpha_sec = 1 end
if t.font_name == nil then t.font_name = "Ubuntu" end
if t.font_size == nil then t.font_size = 12 end
if t.italic == nil then t.italic = false end
if t.oblique == nil then t.oblique = false end
if t.bold == nil then t.bold = false end
-- шрифт
local slant = CAIRO_FONT_SLANT_NORMAL
local weight =CAIRO_FONT_WEIGHT_NORMAL
if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end
if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end
cairo_select_font_face(cr, t.font_name, slant, weight)
cairo_set_font_size(cr, t.font_size)
te=cairo_text_extents_t:create()
cairo_text_extents (cr,t.text,te)
-- начнем с вывода циферблата
-- сначала зададим цвет
cairo_set_source_rgba(cr, rgb_to_r_g_b(t.color, t.alpha))
-- и толщину линии
cairo_set_line_width(cr, 2)
-- рисуем окружность
cairo_arc (cr, t.x, t.y, t.radius, 0, 2*math.pi)
-- ----------------------------------------------------------------------------------------
-- добавляем часовые деления
-- сбрасываем счетчик делений на 0
local i = 0
-- задаем расстояние между делениями
local winkel = math.rad(30)
-- выводим 12 делений
for i= 0, 11, 1 do
cairo_move_to(cr, t.x - math.sin(winkel*i)*t.radius, t.y - math.cos(winkel*i)*t.radius)
-- длину делений берем равной 0.1 от длины радиуса
cairo_line_to(cr, t.x - math.sin(winkel*i)*(t.radius*0.85), t.y - math.cos(winkel*i)*(t.radius*0.85))
-- выводим изображение
cairo_stroke (cr)
end
-- -------------------------------------------------------------------------------------------
-- добавляем цифры
-- запоминаем данные
cairo_save (cr)
-- переносим значения координат
cairo_translate(cr, t.x, t.y)
-- сбрасываем координаты цифр
mx, my = 0, 0
-- сбрасываем счетчик делений на 0
local i = 0
-- задаем расстояние между цифрами
local winkel = math.rad(30)
-- необходимо вывести цифра начиная с 1 и заканчивая 12
for i = 1, 12, 1 do
-- расчитываем координаты цифр
mov_x = math.sin(winkel*i)*(t.radius*0.73)
mov_y = math.cos(winkel*i)*(t.radius*0.73)
-- расчитываем ширину и высоту цифр
te=cairo_text_extents_t:create()
cairo_text_extents (cr,i,te)
-- вносим поправку на половину ширины и половину высоты цифр
mx = -te.width/2
my = -te.height/2-te.y_bearing
-- задаем координаты цифр
cairo_move_to(cr, mx + mov_x, my - mov_y)
-- выводим цифры
cairo_show_text(cr, i)
end
-- восстанавливаем данные
cairo_restore (cr)
-- ------------------------------------------------------------------------------------------
-- добавляем минутные деления
-- сбрасываем счетчик делений на 0
local i = 0
-- задаем расстояние между делениями
local winkel = math.rad(6)
-- выводим 12 делений
for i=0, 59, 1 do
cairo_move_to(cr, t.x - math.sin(winkel * i) * t.radius, t.y - math.cos(winkel * i) * t.radius)
-- длину делений берем равной 0.1 от длины радиуса
cairo_line_to(cr, t.x - math.sin(winkel * i) * (t.radius * 0.9), t.y - math.cos(winkel * i) * (t.radius*0.9))
end
-- выводим изображение
cairo_stroke (cr)
-- ----------------------------------------------------------------------------------
-- для вывода стрелок необходимо забрать данные о времени из ОС
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
-- рисуем часовую стрелку
xh = t.x + 0.65*t.radius*math.sin(hours_arc)
yh = t.y - 0.65*t.radius*math.cos(hours_arc)
cairo_move_to(cr, t.x, t.y)
cairo_line_to(cr, xh, yh)
cairo_stroke(cr)
-- рисуем минутную стрелку
xm = t.x + 0.8*t.radius*math.sin(mins_arc)
ym = t.y - 0.8*t.radius*math.cos(mins_arc)
cairo_move_to(cr, t.x, t.y)
cairo_line_to(cr, xm, ym)
cairo_stroke(cr)
-- рисуем секундную стрелку
-- зададём цвет секундной стрелки
cairo_set_source_rgba(cr, rgb_to_r_g_b(t.color_sec, t.alpha_sec))
xs = t.x + 0.9*t.radius*math.sin(secs_arc)
ys = t.y - 0.9*t.radius*math.cos(secs_arc)
cairo_move_to(cr, t.x, t.y)
cairo_line_to(cr,xs,ys)
cairo_stroke (cr)
end