--[[
Calendar by londonali1010 (2009)
To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
lua_load ~/scripts/calendar.lua
lua_draw_hook_pre calendar
]]
colour = 0xFFFFCC
alpha = 0.8
font = "Sans"
xc, yc = 150, 425
size = 250
bg_colour = 0xFFCC66
bg_alpha = 0.2
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_background()
local cr_bg = cairo_create(cs)
local r = size / 8
cairo_translate(cr_bg, xc - size / 2, yc - size / 2)
cairo_move_to(cr_bg, r, 0)
cairo_line_to(cr_bg, size - r, 0)
cairo_curve_to(cr_bg, size, 0, size, 0, size, r)
cairo_line_to(cr_bg, size, size - r)
cairo_curve_to(cr_bg, size, size, size, size, size - r, size)
cairo_line_to(cr_bg, r, size)
cairo_curve_to(cr_bg, 0, size, 0, size, 0, size - r)
cairo_line_to(cr_bg, 0, r)
cairo_curve_to(cr_bg, 0, 0, 0, 0, r, 0)
cairo_close_path(cr_bg)
bgr, bgg, bgb, bga = rgb_to_r_g_b(bg_colour, bg_alpha)
cairo_set_source_rgba(cr_bg, bgr, bgg, bgb, bga)
cairo_fill_preserve(cr_bg)
cairo_destroy(cr_bg)
end
function get_days_in_month()
local month_days = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
local d = month_days[month]
if month == 2 and year % 4 == 0 and (year % 100 ~= 0 or year % 400 ~= 0) then d = 29 end
return d
end
function write_month_name()
local text = month_name .. " " .. year
cairo_move_to(cr, xc - 3.5 * size / 8, yc - 2.5 * size / 8)
cairo_text_path(cr, text)
cairo_fill(cr)
end
function write_day_headings()
local xi, yi = xc - 3.5 * size / 8, yc - 1.5 * size / 8
for i = 1, 7 do
cairo_move_to(cr, xi, yi)
cairo_text_path(cr, days[i])
cairo_fill(cr)
xi = xi + size/8
end
end
function write_dates()
local xi = xc - 3.5 * size / 8 + (start_day - 1) * size / 8
local yi = yc - 0.5 * size / 8
for i = 1, days_in_month do
cairo_move_to(cr, xi, yi)
cairo_text_path(cr, i)
cairo_fill(cr)
xi = xi + size / 8
if xi == xc + size / 2 - size / 16 then
xi = xc - 3.5*size / 8
yi = yi + size / 8
if yi > yc + size / 2 then
yi = yc - 0.5 * size / 8
end
end
end
end
function conky_calendar()
if conky_window == nil then return end
cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
cr = cairo_create(cs)
draw_background()
local day = tonumber(os.date("%w")) + 1
local day_num = tonumber(os.date("%d"))
local remainder = day_num % 7
start_day = day - (day_num % 7) + 1
if start_day < 0 then start_day = 7 + start_day end
month = tonumber(os.date("%m"))
month_name = os.date("%B")
year = tonumber(os.date("%Y"))
days = { "S", "M", "T", "W", "T", "F", "S" }
days_in_month = get_days_in_month()
cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL)
cairo_set_source_rgba(cr, rgb_to_r_g_b(colour, alpha))
local dpi = tonumber(conky_parse('${exec xdpyinfo | grep resolution | cut -c 18-19}'))
local font_pixel_size = size / 8
local font_size = font_pixel_size * 72 / dpi -- 72 pt/in * 1/dpi
cairo_set_font_size(cr, font_size * 1.2)
write_month_name()
cairo_set_font_size(cr, font_size * 1.0)
write_day_headings()
cairo_set_font_size(cr, font_size * 0.9)
write_dates()
end