Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Пример написания скрипта часов
- -- Так как при выводе часов используются команды на языке cairo
- -- необходимо указать программе об этом
- require 'cairo'
- -- создаем функцию для вывода изображения часов
- function conky_clock ()
- -- необходимые данные для вывода часов
- clock_settings = {
- {
- -- корпус часов
- width_housing_hours = 15, -- толщина корпуса часов
- color_housing_hours = 0x5b5b5b, -- цвет корпуса часов
- alpha_housing_hours = 1, -- насыщенность цвета
- -- циферблат
- -- x = 150, -- координаты часов по горизонтали
- y = 150, -- координаты часов по вертикали
- radius = 85, -- радиус часов
- color_dial = 0xffffff, -- цвет циферблата
- alpha_dial = 1, -- насыщенность цвета
- -- цифры
- font_size = 16, -- размер шрифта цифр
- bold = true,
- color_font = 0x000000, -- цвет цифр
- alpha_font = 1, -- насыщенность цвета
- -- стрелки
- border = true, -- контур стрелок Да - true, Нет - false.
- width_hour_hand = 2.5, -- ширина часовой стрелки
- length_hour_hand = 1.4, -- длина часовой стрелки
- color_hour_hand = 0xeeeeee, -- цвет часовой стрелки
- alpha_hour_hand = 1, -- насыщенность цвета
- color_border_hour = 0x000000, -- цвет контура часовой стрелки
- alpha_border_hour = 0.8, -- насыщенность цвета
- width_minute_hand = 2, -- ширина минутной стрелки
- length_minute_hand = 1.9, -- длина минутной стрелки
- color_minute_hand = 0xffffff, -- цвет минутной стрелки
- alpha_minute_hand = 0.8, -- насыщенность цвета
- color_border_minute = 0x000000, -- цвет контура минутной стрелки
- alpha_border_minute = 0.8, -- насыщенность цвета
- -- Выводить секундную стрелку, Да - true, Нет - false.
- -- При выводе секундной стрелки update_interval в .conkyrc должен быть менее 1 сек.
- show_seconds = true, -- вывод секундной стрелки
- width_second_hand = 1, -- ширина секундной стрелки
- length_second_hand = 1.9, -- длина секундной стрелки
- color_second_hand = 0xff0000, -- цвет секундной стрелки
- alpha_second_hand = 1, -- насыщенность цвета
- color_border_second = 0xff0000, -- цвет контура секундной стрелки
- alpha_border_second = 1, -- насыщенность цвета
- -- тень от стрелок и оси стрелок Да - true, Нет - false.
- shadow = false, -- вывод тени
- -- координаты источника света относительно центра часов, 0 - источник света над центром часов
- shadow_degree = -90, -- координаты источника света по горизонтали от -90 до 90
- shadow_height = 25, -- координаты источника света по вертикали от -90 до 90
- shadow_opacity = 0.5, -- прозрачность тени, значения от 0 до 1
- }
- }
- -- проверяем, существует окно конки или нет, если нет, выходим из программы
- 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 end
- if t.radius == nil then t.radius = 75 end
- if t.color_dial == nil then t.color_dial = 0xffffff end
- if t.alpha_dial == nil then t.alpha_dial = 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
- if t.color_font == nil then t.color = 0x000000 end
- if t.alpha_font == nil then t.alpha = 1 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, 1, 1, 1, 1)
- cairo_arc (cr, t.x, t.y, t.radius + t.width_housing_hours*1.2, 0, 2*math.pi)
- cairo_fill (cr)
- -- создаем радиальную градацию для внешней части корпуса
- pat_housing_hours1 = cairo_pattern_create_radial (t.x - t.radius*math.sin(math.rad(t.shadow_degree)), t.y - t.radius*math.sin(math.rad(t.shadow_height)), 0, t.x, t.y, t.radius + t.width_housing_hours*1.7)
- -- задаём цвет
- cairo_pattern_add_color_stop_rgba (pat_housing_hours1, 0.85, rgb_to_r_g_b(t.color_housing_hours, 0.2))
- cairo_pattern_add_color_stop_rgba (pat_housing_hours1, 1, rgb_to_r_g_b(t.color_housing_hours, t.alpha_housing_hours))
- -- закрашиваем корпус
- cairo_set_source (cr, pat_housing_hours1)
- cairo_set_line_width(cr, t.width_housing_hours/2)
- cairo_arc (cr, t.x, t.y, t.radius + t.width_housing_hours, 0, 2*math.pi)
- -- выводим изображение
- cairo_stroke (cr)
- cairo_fill (cr)
- cairo_pattern_destroy (pat_housing_hours1)
- -- создаём радиальную градацию для внутренней части корпуса
- pat_housing_hours2 = cairo_pattern_create_radial (t.x + t.radius*math.sin(math.rad(t.shadow_degree)), t.y + t.radius*math.sin(math.rad(t.shadow_height)), 0, t.x, t.y, t.radius + t.width_housing_hours*1.2)
- -- задаём цвет
- cairo_pattern_add_color_stop_rgba (pat_housing_hours2, 0.75, rgb_to_r_g_b(t.color_housing_hours, 0.2))
- cairo_pattern_add_color_stop_rgba (pat_housing_hours2, 1, rgb_to_r_g_b(t.color_housing_hours, t.alpha_housing_hours))
- -- закрашиваем корпус
- cairo_set_source (cr, pat_housing_hours2)
- cairo_set_line_width(cr, t.width_housing_hours/2)
- cairo_arc (cr, t.x, t.y, t.radius + t.width_housing_hours/2, 0, 2*math.pi)
- -- выводим изображение
- cairo_stroke (cr)
- cairo_fill (cr)
- cairo_pattern_destroy (pat_housing_hours2)
- -- вывод циферблата
- -- сначала зададим цвет
- cairo_set_source_rgba(cr, rgb_to_r_g_b(t.color_dial, t.alpha_dial))
- -- и толщину линии
- cairo_set_line_width(cr, 2)
- -- рисуем окружность
- cairo_arc (cr, t.x, t.y, t.radius, 0, 2*math.pi)
- -- закрашиваем циферблат
- cairo_fill (cr)
- -- ----------------------------------------------------------------------------------------
- -- добавляем часовые деления
- -- зададим цвет
- cairo_set_source_rgba(cr, rgb_to_r_g_b(t.color_font, t.alpha_font))
- -- сбрасываем счетчик делений на 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)
- -- сбрасываем координаты цифр
- local mx = 0
- local my = 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)
- -- ------------------------------------------------------
- -- рисуем стрелки. За основу взята разработка wlourf, полностью статью можно посмотреть http://u-scripts.blogspot.com/2010/01/shadowed-clock.html
- local function draw_hand(arc, arc0, arc1, length_hand, width_hand, color_border, alpha_border, color_hand, alpha_hand)
- -- расчет основных точек для прорисовки стрелок
- local xx = t.x + t.radius*math.sin(arc)*length_hand
- local yy = t.y - t.radius*math.cos(arc)*length_hand
- local x0 = t.x + width_hand*math.sin(arc0)
- local y0 = t.y - width_hand*math.cos(arc0)
- local x1 = t.x + width_hand*math.sin(arc1)
- local y1 = t.y - width_hand*math.cos(arc1)
- -- если необходимо нарисовать контуры стрелок тогда
- if t.border then
- -- назначаем толщину линий
- cairo_set_line_width(cr, 1)
- -- назначаем цвет и насыщенность линий контура стрелок
- cairo_set_source_rgba(cr, rgb_to_r_g_b(color_border, alpha_border))
- -- переходим в первую точку
- cairo_move_to (cr, x0, y0)
- -- рисуем кривые проходящие через три точки
- cairo_curve_to (cr, x0, y0, xx, yy, x1, y1)
- -- рисуем половину окружности основания стрелки
- cairo_arc(cr, t.x, t.y, width_hand, arc1 - math.pi/2, arc0 - math.pi/2)
- cairo_stroke(cr)
- end
- -- если необходимо вывести тень от стрелок, длина тени изменяется в зависимости от расположения "источника света"
- if t.shadow then
- -- переходим в первую точку
- cairo_move_to (cr, x0, y0)
- -- рисуем кривые через три точки со смещением зависищим от расположения "источника света"
- cairo_curve_to (cr, x0, y0, xx + t.shadow_degree, yy + t.shadow_height, x1, y1)
- -- рисуем половину окружности основания тени стрелки
- cairo_arc(cr, t.x, t.y, width_hand, arc1 - math.pi/2, arc0 - math.pi/2)
- -- для закрашивания тени от стрелок используем радиальную окраску
- pat = cairo_pattern_create_radial (t.x - math.sin(math.rad(t.shadow_degree))*length_hand, t.y + math.cos(math.rad(t.shadow_degree))*length_hand, 0, t.x, t.y, t.radius)
- -- цвет тени черный поэтому на темных циферблатах тень не очень заметна
- cairo_pattern_add_color_stop_rgba (pat, 0, 0, 0, 0, t.shadow_opacity)
- cairo_pattern_add_color_stop_rgba (pat, 1, 0, 0, 0, 0)
- cairo_set_source (cr, pat)
- cairo_fill (cr)
- end
- -- рисуем стрелки по тому же принципу, что и тень, но без смещения
- cairo_move_to (cr, x0, y0)
- cairo_curve_to (cr, x0, y0, xx, yy, x1, y1)
- cairo_arc(cr, t.x, t.y, width_hand, arc1 - math.pi/2, arc0 - math.pi/2)
- pat = cairo_pattern_create_radial (t.x, t.y, t.radius/10, t.x, t.y, t.radius*length_hand)
- cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(color_hand, alpha_hand))
- 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
- -- забираем данные из ОС
- local hours = os.date("%I")
- local mins = os.date("%M")
- local secs = os.date("%S")
- -- расчет угла движения стрелок
- local gamma = math.pi/2 - math.atan(t.width_second_hand / (t.radius * t.length_second_hand))
- local secs_arc = (2*math.pi/60)*secs
- local secs_arc0 = secs_arc - gamma
- local secs_arc1 = secs_arc + gamma
- local gamma = math.pi/2 - math.atan(t.width_minute_hand/(t.radius*t.length_minute_hand))
- local mins_arc = (2*math.pi/60)*mins + secs_arc/60
- local mins_arc0 = mins_arc - gamma
- local mins_arc1 = mins_arc + gamma
- local gamma = math.pi/2 - math.atan(t.width_hour_hand/(t.radius*t.length_hour_hand))
- local hours_arc = (2*math.pi/12)*hours + mins_arc/12
- local hours_arc0 = hours_arc - gamma
- local hours_arc1 = hours_arc + gamma
- -- вывод стрелок
- -- задаем данные для вывода часовой стрелки
- draw_hand(hours_arc, hours_arc0, hours_arc1, t.length_hour_hand, t.width_hour_hand, t.color_border_hour, t.alpha_border_hour, t.color_hour_hand, t.alpha_hour_hand)
- -- задаем данные для минутной стрелки
- draw_hand(mins_arc, mins_arc0, mins_arc1, t.length_minute_hand, t.width_minute_hand, t.color_border_minute, t.alpha_border_minute, t.color_minute_hand, t.alpha_minute_hand)
- -- если необходима секундная стрелка, то задаем данные
- if t.show_seconds then
- draw_hand(secs_arc, secs_arc0, secs_arc1, t.length_second_hand, t.width_second_hand, t.color_border_second, t.alpha_border_second, t.color_second_hand, t.alpha_second_hand)
- end
- -- рисуем ось стрелок
- -- расчитываем радиус оси стрелок
- local radius = math.min(t.width_hour_hand, t.width_minute_hand, t.width_second_hand)*0.75
- -- если радиус меньше 1, то устанавливаем радиус равный 1
- if radius < 1 then radius = 1 end
- -- рисуем ось
- cairo_arc(cr, t.x, t.y, radius, 0, 2*math.pi)
- cairo_set_source_rgba(cr, 0, 0, 0, 1)
- cairo_fill (cr)
- -- рисуем тень на стеклк часов
- pat_glass = cairo_pattern_create_radial (t.x + t.radius*math.sin(math.rad(t.shadow_degree)), t.y + t.radius*math.sin(math.rad(t.shadow_height)), 0, t.x, t.y, t.radius*1.2)
- cairo_pattern_add_color_stop_rgba (pat_glass, 0, 1,1,1,0)
- cairo_pattern_add_color_stop_rgba (pat_glass, 1, 0,0,0, 0.3)
- cairo_set_source (cr, pat_glass)
- cairo_arc (cr, t.x, t.y, t.radius+t.width_housing_hours/2, 0, 2*math.pi)
- cairo_fill (cr)
- cairo_pattern_destroy (pat_glass)
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement