но при запуске коньков на стол выводится карта погоды для Европы, которая обновляется каждые 15 минут. Ссылку на изображение прикладываю
--[[
При сборке скрипта использованы данные из следующих скриптов
Conky Widgets by londonali1010 (2009) - часы и кольца
Conky vertical bar graph by iggykoopa - горизонтальный бар
Shadowed clock by wlourf (10 jan. 2010) - стрелки часов с тенью
Собрал все это Борис Кринкель <olgmen> krinkel@rambler.ru
Для этого серипта требуется CONKY версии 1.7.2
Для вызова этого скрипта в Conky вставьте следующие строки до TEXT (при условии, что скрипт сохранен в ~/scripts/conky_widgets.lua):
lua_load ~/scripts/olgmen7.lua
lua_draw_hook_pre widgets
]]
require 'cairo'
--[[ AIR 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 w=conky_window.width
local h=conky_window.height
-- назначаем радиус закругления углов окна
local corner_r = (w+h)/2*0.04
-- назначаем цвет и прозрачность окна конки
local bg_colour=0xffffff -- белый цвет
local bg_alpha=0.4
-- выводим окно коньков на экран
cairo_move_to(cr,corner_r,0)
cairo_line_to(cr,w-corner_r,0)
cairo_curve_to(cr,w,0,w,0,w,corner_r)
cairo_line_to(cr,w,h-corner_r)
cairo_curve_to(cr,w,h,w,h,w-corner_r,h)
cairo_line_to(cr,corner_r,h)
cairo_curve_to(cr,0,h,0,h,0,h-corner_r)
cairo_line_to(cr,0,corner_r)
cairo_curve_to(cr,0,0,0,0,corner_r,0)
cairo_close_path(cr)
cairo_set_source_rgba(cr,rgb_to_r_g_b(bg_colour,bg_alpha))
cairo_fill(cr)
-- назначаем толщину выводимых линий
local s_th = 2
-- рисуем циферблат
local radius = s/2
local m_x,m_y = x + s/2, y + s/2
cairo_set_line_width(cr,6)
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)
-- прозрачный "корпус часов"
cairo_arc(cr, m_x, m_y, radius*1.25, 0, 2*math.pi)
cairo_set_source_rgba(cr, 0.5, 0.5, 0.5, 0.8)
cairo_set_line_width(cr,1)
cairo_stroke(cr)
local border_pat=cairo_pattern_create_linear(m_x, m_y - radius*1.25, 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.125, 0, 2*math.pi)
cairo_close_path(cr)
cairo_set_line_width(cr, radius*0.25)
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*1.3), m_y-math.cos(winkel*i)*(radius*1.3))
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)
-- часовые стрелки с тенью, взято из 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=true
-- Выводить ось стрелок в центре часов, Да - 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,{1,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)
-- тень от оси
gamma = -math.atan(1/lg_shadow_center)
ang0=ang-gamma
ang1=ang+gamma
-- тень от стрелок
if shadow_xoffset<0 and shadow_yoffset>0 then
ang0=ang0+math.pi
ang1=ang1+math.pi
ang=ang+math.pi
end
if shadow_yoffset<0 and shadow_xoffset>0 then
ang0=ang0-math.pi/2
ang1=ang1-math.pi/2
ang=ang-math.pi/2
end
if shadow_yoffset<0 and shadow_xoffset<0 then
ang0=ang0-math.pi/2
ang1=ang1-math.pi/2
ang=ang-math.pi/2
end
x0 = xc + radius*math.sin(ang0)
y0 = yc - radius*math.cos(ang0)
xx = xc + radius*math.sin(ang+math.pi/2)*lg_shadow_center
yy = yc - radius*math.cos(ang+math.pi/2)*lg_shadow_center
x1 = xc - radius*math.sin(ang1)
y1 = yc + radius*math.cos(ang1)
cairo_move_to(cr,x0,y0)
cairo_curve_to(cr,x0,y0,xx,yy,x1,y1)
pat = cairo_pattern_create_radial (xc, yc, 0, xc, yc, radius*4)
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)
ang = ang-math.pi/2
xshad = xc + radius*math.sin(ang)*.5
yshad = yc - radius*math.cos(ang)*.5
local ds_pat=cairo_pattern_create_radial(xc, yc, 0, xshad, yshad, radius)
cairo_pattern_add_color_stop_rgba(ds_pat,0,.9,.9,.9,1)
cairo_pattern_add_color_stop_rgba(ds_pat,1,0,0,0,1)
cairo_arc(cr,xc,yc,radius,0,2*math.pi)
cairo_set_source(cr,ds_pat)
cairo_fill(cr)
-- рисуем глянец на стекле
pat = cairo_pattern_create_radial (115.2, 102.4, 25.6, 102.4, 102.4, 128)
cairo_pattern_add_color_stop_rgba (pat, 0, 1, 1, 1, 0.1)
cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 0.4)
cairo_set_source (cr, pat)
cairo_arc (cr, xc, yc, s/2, 0, 2 * math.pi)
cairo_fill (cr)
cairo_pattern_destroy (pat)
end
--[[ END AIR CLOCK WIDGET ]]
-- ------------------------------------------------------------------
--[[ GRADIENT RING WIDGET ]]
-- В виджете задействована возможность выводить исчезающие со временем часовые деления.
-- У меня используется только вывод секундных делений
function gradient_ring(cr, name, arg, max, fgc, fga, xc, yc, ring_i, ring_o, frac, t, sa, ea)
-- функция перекодировки цвета
local function rgb_to_r_g_b(colour,alpha)
return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end
-- функция вывода делений часов
local function draw_gradient_ring(pct)
local angle_0=sa*(2*math.pi/360)-math.pi/2
local angle_f=ea*(2*math.pi/360)-math.pi/2
local pct_arc=pct*(angle_f-angle_0)
for i = 1,max/frac do
cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga*i/max))
cairo_move_to(cr,xc-ring_i*math.cos(angle_0+pct_arc+2*math.pi*i/max),yc-ring_i*math.sin(angle_0+pct_arc+2*math.pi*i/max))
cairo_line_to(cr,xc-ring_o*math.cos(angle_0+pct_arc+2*math.pi*i/max),yc-ring_o*math.sin(angle_0+pct_arc+2*math.pi*i/max))
cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND)
cairo_set_line_width(cr,t)
cairo_stroke(cr)
end
end
-- вывод делений
local function setup_gradient_ring()
local str = ''
local value = 0
-- забираем данные из ОС
str = string.format('${%s %s}', name, arg)
str = conky_parse(str)
value = tonumber(str)
if value == nil then value = 0 end
pct = value/max
draw_gradient_ring(pct)
end
local updates=conky_parse('${updates}')
update_num=tonumber(updates)
if update_num>5 then setup_gradient_ring() end
end
end
--[[ END GRADIENT RING WIDGET ]]
-- ---------------------------------------------------------------------------
--[[ HORIZ_BAR WIDGET ]]
function horiz(cr, name, arg, max, width, height, x, y, borderColor, borderAlpha, fillColor, fillColorTo, warn, danger, fillAlpha)
-- функция перекодировки цвета
local function rgb_to_r_g_b(color,alpha)
return ((color / 0x10000) % 0x100) / 255., ((color / 0x100) % 0x100) / 255., (color % 0x100) / 255., alpha
end
-- функция вывода горизонтального бара
function draw_bar(pct)
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)
cairo_set_source_rgba (cr, rgb_to_r_g_b(borderColor,borderAlpha))
cairo_set_line_width (cr, 1)
cairo_rectangle (cr, x, y, width, height)
cairo_stroke (cr)
cairo_rectangle (cr, x, (y) + .5, (width - .5) * pct, height - .5)
pat = cairo_pattern_create_linear (x - .5, y + .5, (width) * pct, y)
if pct >= .6 and pct < .8 then
cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(warn, fillAlpha))
elseif pct >= .8 then
cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(danger, fillAlpha))
else
cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(fillColor, fillAlpha))
end
cairo_pattern_add_color_stop_rgba (pat, .7, rgb_to_r_g_b(fillColorTo, fillAlpha))
cairo_set_source (cr, pat)
cairo_fill (cr)
cairo_pattern_destroy (pat)
cairo_destroy(cr)
cr = nil
end
local function setup_bars()
local str=''
local value=0
str=string.format('${%s %s}', name, arg)
str=conky_parse(str)
value=tonumber(str)
pct=value/max
draw_bar(pct)
end
local updates=conky_parse('${updates}')
update_num=tonumber(updates)
if update_num>5 then
setup_bars()
end
end
--[[ END HORIZ_BAR 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)
clock(cr, 40, 65, 150, 0xffffff, 1, 0x606070, 1)
cairo_destroy(cr)
--[[ Вывод секундных делений часов ]]
cr = cairo_create(cs)
gradient_ring(cr, 'time', '%S', 60, 0xff0000, 1, 115, 140, 75, 76, 2, 4, 0, 360)
cairo_destroy(cr)
-- [[ Вывод горизонтальных графиков ]]
cr = cairo_create(cs)
horiz(cr, 'cpu', 'cpu0', 100, 210, 20, 10, 260, 0x606070, 1, 0x3030ff, 0x2020bb, 0xffff00, 0xff0000,1)
--[[ Опции (name, arg, max, width, height, x, y, borderColor, borderAlpha, fillColor, fillColorTo, warn, danger, fillAlpha):
"name" наименование опции, можно выбрать из 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'.
"arg" аргумент, если в Conky вы пишите ${cpu cpu0}, то 'cpu0' будет аргументом. Если вы не используете аргумент в Conky, используйте ''.
"max" максимальная величина. Если в Conky величина выводится в %, пишите 100.
"width" ширина, в данном случае длина бара.
"height" высота, в данном случае толщина бара.
"x" координаты по горизонтали от левой границы окна conky до левого верхнего угла бара.
"y" координаты по вертикали от верхней границы окна conky до левого верхнего угла бара.
"borderColor" цвет бордюра бара.
"borderAlpha" насыщенность цвета бордюра бара, значения от 0 до 1.
"fillColor" начальный цвет выводимого параметра.
"fillColorTo" конечный цвет выводимого параметра.
"warn" цвет "предупреждения", в данном случае при нахождении выводимого параметра в диапазоне от 60 до 80%.
"danger" цвет "опасности", в данном случае при нахождении параметра в диапазоне свеше 80%.
"fillAlpha" насыщенность цвета выводимого параметра, значения от 0 до 1. ]]
cairo_destroy(cr)
cr = cairo_create(cs)
horiz(cr, 'cpu', 'cpu1', 100, 210, 20, 10, 285, 0x606070, 1, 0x3030ff, 0x2020bb, 0xffff00, 0xff0000,1)
cairo_destroy(cr)
cr = cairo_create(cs)
horiz(cr, 'memperc', '', 100, 210, 20, 10, 310, 0x606070, 1, 0x3030ff, 0x2020bb, 0xffff00, 0xff0000,1)
cairo_destroy(cr)
cr = cairo_create(cs)
horiz(cr, 'downspeedf', 'eth0', 1100, 210, 20, 10, 335, 0x606070, 1, 0x3030ff, 0x2020bb, 0xffff00, 0xff0000,1)
cairo_destroy(cr)
cr = cairo_create(cs)
horiz(cr, 'upspeedf', 'eth0', 150, 210, 20, 10, 360, 0x606070, 1, 0x3030ff, 0x2020bb, 0xffff00, 0xff0000,1)
cairo_destroy(cr)
end