Guest

londonali1010

By: a guest on Oct 26th, 2009  |  syntax: Lua  |  size: 3.44 KB  |  hits: 382  |  expires: Never
download  |  raw  |  embed  |  report abuse
Copied
  1. --[[
  2. Calendar by londonali1010 (2009)
  3.  
  4. To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
  5.         lua_load ~/scripts/calendar.lua
  6.         lua_draw_hook_pre calendar
  7. ]]
  8.  
  9. colour = 0xFFFFCC
  10. alpha = 0.8
  11. font = "Sans"
  12. xc, yc = 150, 425
  13. size = 250
  14. bg_colour = 0xFFCC66
  15. bg_alpha = 0.2
  16.  
  17. require 'cairo'
  18.  
  19. function rgb_to_r_g_b(colour, alpha)
  20.         return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
  21. end
  22.  
  23. function draw_background()
  24.         local cr_bg = cairo_create(cs)
  25.         local r = size / 8
  26.  
  27.         cairo_translate(cr_bg, xc - size / 2, yc - size / 2)
  28.        
  29.         cairo_move_to(cr_bg, r, 0)
  30.         cairo_line_to(cr_bg, size - r, 0)
  31.         cairo_curve_to(cr_bg, size, 0, size, 0, size, r)
  32.         cairo_line_to(cr_bg, size, size - r)
  33.         cairo_curve_to(cr_bg, size, size, size, size, size - r, size)
  34.         cairo_line_to(cr_bg, r, size)
  35.         cairo_curve_to(cr_bg, 0, size, 0, size, 0, size - r)
  36.         cairo_line_to(cr_bg, 0, r)
  37.         cairo_curve_to(cr_bg, 0, 0, 0, 0, r, 0)
  38.         cairo_close_path(cr_bg)
  39.        
  40.         bgr, bgg, bgb, bga = rgb_to_r_g_b(bg_colour, bg_alpha)
  41.  
  42.         cairo_set_source_rgba(cr_bg, bgr, bgg, bgb, bga)
  43.         cairo_fill_preserve(cr_bg)
  44.  
  45.         cairo_destroy(cr_bg)   
  46. end
  47.  
  48. function get_days_in_month()
  49.         local month_days = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }
  50.         local d = month_days[month]
  51.        
  52.         if month == 2 and year % 4 == 0 and (year % 100 ~= 0 or year % 400 ~= 0) then d = 29 end
  53.                
  54.         return d
  55. end
  56.  
  57. function write_month_name()
  58.         local text = month_name .. " " .. year
  59.  
  60.         cairo_move_to(cr, xc - 3.5 * size / 8, yc - 2.5 * size / 8)
  61.         cairo_text_path(cr, text)
  62.         cairo_fill(cr)
  63. end
  64.  
  65. function write_day_headings()
  66.         local xi, yi = xc - 3.5 * size / 8, yc - 1.5 * size / 8
  67.        
  68.         for i = 1, 7 do
  69.                 cairo_move_to(cr, xi, yi)
  70.                 cairo_text_path(cr, days[i])
  71.                 cairo_fill(cr)
  72.                 xi = xi + size/8
  73.         end
  74. end    
  75.  
  76. function write_dates()
  77.         local xi = xc - 3.5 * size / 8 + (start_day - 1) * size / 8
  78.         local yi = yc - 0.5 * size / 8
  79.        
  80.         for i = 1, days_in_month do
  81.                 cairo_move_to(cr, xi, yi)
  82.                 cairo_text_path(cr, i)
  83.                 cairo_fill(cr)
  84.                 xi = xi + size / 8
  85.                 if xi == xc + size / 2 - size / 16 then
  86.                         xi = xc - 3.5*size / 8
  87.                         yi = yi + size / 8
  88.                        
  89.                         if yi > yc + size / 2 then
  90.                                 yi = yc - 0.5 * size / 8
  91.                         end
  92.                 end
  93.         end
  94. end
  95.  
  96. function conky_calendar()
  97.         if conky_window == nil then return end
  98.         cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
  99.        
  100.         cr = cairo_create(cs)
  101.        
  102.         draw_background()
  103.  
  104.         local day = tonumber(os.date("%w")) + 1
  105.         local day_num = tonumber(os.date("%d"))
  106.        
  107.         local remainder = day_num % 7
  108.         start_day = day - (day_num % 7) + 1
  109.         if start_day < 0 then start_day = 7 + start_day end
  110.        
  111.         month = tonumber(os.date("%m"))
  112.         month_name = os.date("%B")
  113.         year = tonumber(os.date("%Y"))
  114.  
  115.         days = { "S", "M", "T", "W", "T", "F", "S" }
  116.  
  117.         days_in_month = get_days_in_month()
  118.        
  119.         cairo_select_font_face(cr, font, CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL)
  120.         cairo_set_source_rgba(cr, rgb_to_r_g_b(colour, alpha))
  121.        
  122.         local dpi = tonumber(conky_parse('${exec xdpyinfo | grep resolution | cut -c 18-19}'))
  123.         local font_pixel_size = size / 8
  124.         local font_size = font_pixel_size * 72 / dpi -- 72 pt/in * 1/dpi
  125.        
  126.         cairo_set_font_size(cr, font_size * 1.2)
  127.         write_month_name()
  128.         cairo_set_font_size(cr, font_size * 1.0)
  129.         write_day_headings()
  130.         cairo_set_font_size(cr, font_size * 0.9)
  131.         write_dates()
  132. end