Аналоговые часы при помощи luaЧасы можно вывести и без использования lua с помощью шрифтов clockfaces и скриптов выводящих стрелки часов, но это другая тема.
Скрипт выводит изображение простых аналоговых часов в окно conky. Написан londonali1010 на языке lua и cairo и взят с её блога
http://blog.conky.be/Я перевел его и отредактировал в силу своих возможностей. То, что мне было понятно, попробовал объяснить как можно проще, сам только приступил к изучению lua и cairo, так что не судите строго.
ПРИМЕЧАНИЯ:
Изображение выводится вне зависимости от того, что сейчас находится в окне, т. к. координаты задаются скриптом.
Примечания отделяются от текста знаком двойное тире -- и действуют до конца предложения.
Если примечания больше одного предложения, то они начинаются со знака --[[ и заканчиваются ]]
Все размеры в скрипте задаются в точках, т. е. Радиус = 150 это размер радиуса в точках.
Расчет длины стрелок ведется от длины минутной стрелки, читайте примечания в скрипте.
Цвета задаются в формате 0x006fff, другой формат не признается, т.е. black не пройдет.
Обычно я вывожу кольца в пустое окно conky, мне кажется, что так легче перемещать, ничего не мешает, а затем подгоняю текст в нужные места. Но т. к. без команд записанных ниже TEXT conky не запустить, я вписываю одну строку
${voffset 600}
если число меньше 600, то изображение часов может быть обрезано нижней кромкой окна.
Скрипт clock.lua скопируйте, лучше в созданную в домашней директории папку scripts и сделайте его исполняемым. В дальнейшем этот скрипт будет редактироваться.
В тексте скрипта мной внесены примечания в свободном переводе
Выше TEXT поместите строки, при условии, что скрипт сохранен в папке ~/scripts
# --- LUA ---
lua_load ~/scripts/clock.lua
lua_draw_hook_pre conky_clock_rings
Ниже TEXT поместите строку
${voffset 600}
если в TEXT имеются записи, то эта строка должна быть последней, впоследствии, после заполнения TEXT командами, эту строку можно будет убрать. Но необходимо помнить, что граница окна conky должна быть ниже выводимых скриптом объектов.
После запуска conky часы появляются сразу, а кольца с запозданием примерно на пять секунд.
Может появиться отставание кольца часовой стрелки, которое пропадает с наступлением следующего часа.
Скрипт clock.lua
--[[
Ring Meters by londonali1010 (2009)
Перевел и отредактировал Борис Кринкель <olgmen> krinkel@rambler.ru
Этот скрипт выводит в окно conky только часы.
Для запуска скрипта необходимо выше TEXT добавить две строки, при условии, что этот скрипт clock.lua находится в папке scripts вашей домашней директории
lua_load ~/scripts/clock.lua
lua_draw_hook_pre conky_clock_rings
]]
settings_table = {
{
-- В этом разделе редактируются выводимые кольца
-- "name" название элемента, в данном случае выводим часы
name='time',
-- "arg" название элемента который выводим, в данном случае часовое кольцо
arg='%I.%M',
-- "max" максимальное значение выводимого элемента
max=12,
-- "bg_colour" цвет фона
bg_colour=0x006fff,
-- "bg_alpha" прозрачность фона
bg_alpha=0.2,
-- "fg_colour" основной цвет
fg_colour=0x006fff,
-- "fg_alpha" прозрачность основного цвета
fg_alpha=0.8,
-- "x" and "y" координаты центра кольца
x=155, y=350,
-- "radius" радиус кольца
radius=90,
-- "thickness" толщина кольца
thickness=1,
-- "start_angle" с какого значения начинается вывод кольца
start_angle=0,
-- "end_angle" на каком значении заканчивается вывод кольца
end_angle=360
},
{
name='time',
-- минутное кольцо
arg='%M.%S',
max=60,
bg_colour=0x006fff,
bg_alpha=0.2,
fg_colour=0x006fff,
fg_alpha=0.8,
x=155, y=350,
radius=125,
thickness=1,
start_angle=0,
end_angle=360
},
{
name='time',
-- секундное кольцо
arg='%S',
max=60,
bg_colour=0x006ff0,
bg_alpha=0.2,
fg_colour=0x006ff0,
fg_alpha=0.8,
x=155, y=350,
radius=137,
thickness=1,
start_angle=0,
end_angle=360
},
}
-- радиус часов, задается по длине минутной стрелки
clock_r=125
-- "clock_x" and "clock_y" координаты центра часов, должен совпадать с центром колец
clock_x=155
clock_y=350
-- цвет и прозрачность стрелок часов
hour_colour=0x006fff
minute_colour=0x006fff
second_colour=0x006fff
clock_alpha=0.6
-- показывать секундную стрелку?
show_seconds=true
-- далее следует программа на языке cairo, которое это все и выводит в окно conky
require 'cairo'
function rgb_to_r_g_b(colour,alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
function draw_ring(cr,t,pt)
local w,h=conky_window.width,conky_window.height
local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']
local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']
local angle_0=sa*(2*math.pi/360)-math.pi/2
local angle_f=ea*(2*math.pi/360)-math.pi/2
local t_arc=t*(angle_f-angle_0)
-- загрузка фона кольца
cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)
cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
cairo_set_line_width(cr,ring_w)
cairo_stroke(cr)
-- загрузка кольца
cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc)
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
cairo_stroke(cr)
end
function conky_ring_stats()
local function setup_rings(cr,pt)
local str=''
local value=0
str=string.format('${%s %s}',pt['name'],pt['arg'])
str=conky_parse(str)
value=tonumber(str)
if value == nil then value = 0 end
pct=value/pt['max']
draw_ring(cr,pct,pt)
end
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)
local cr=cairo_create(cs)
local updates=conky_parse('${updates}')
update_num=tonumber(updates)
if update_num>5 then
for i in pairs(settings_table) do
setup_rings(cr,settings_table[i])
end
end
end
function draw_clock_hands(cr,xc,yc)
local secs,mins,hours,secs_arc,mins_arc,hours_arc
local xh,yh,xm,ym,xs,ys
secs=os.date("%S")
mins=os.date("%M")
hours=os.date("%I")
secs_arc=(2*math.pi/60)*secs
mins_arc=(2*math.pi/60)*mins+secs_arc/60
hours_arc=(2*math.pi/12)*hours+mins_arc/12
-- вывод часовой стрелки
-- изменение yh изменяет длину часовой стрелки относительно минутной
xh=xc+0.7*clock_r*math.sin(hours_arc)
yh=yc-0.7*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_set_source_rgba(cr,rgb_to_r_g_b(hour_colour,clock_alpha))
cairo_stroke(cr)
-- вывод минутной стрелки
xm=xc+clock_r*math.sin(mins_arc)
ym=yc-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_set_source_rgba(cr,rgb_to_r_g_b(minute_colour,clock_alpha))
cairo_stroke(cr)
-- вывод секундной стрелки
-- изменение ys изменяет длину секундной стрелки относительно минутной
if show_seconds then
xs=xc+1.1*clock_r*math.sin(secs_arc)
ys=yc-1.1*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_set_source_rgba(cr,rgb_to_r_g_b(second_colour,clock_alpha))
cairo_stroke(cr)
end
end
function conky_clock_rings()
local function setup_rings(cr,pt)
local str=''
local value=0
str=string.format('${%s %s}',pt['name'],pt['arg'])
str=conky_parse(str)
value=tonumber(str)
pct=value/pt['max']
draw_ring(cr,pct,pt)
end
-- Проверка, что conky работают последнии 5 секунд
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)
local cr=cairo_create(cs)
local updates=conky_parse('${updates}')
update_num=tonumber(updates)
if update_num>5 then
for i in pairs(settings_table) do
setup_rings(cr,settings_table[i])
end
end
draw_clock_hands(cr,clock_x,clock_y)
end