Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --[[
- Colour Change Rings by mrmrwat (24.03.2013)
- based on Ring Meters v.1.2.1 by londonali1010 (20.10.2009)
- and inspired by PolarClock by pixelbreaker
- New features include support for color-change rings
- and millisecond precision for smooth ring movement
- NB. Requires lua socket for socket.gettime() function
- --]]
- settings_table = {
- {
- name = 'time',
- arg = '%I',
- max = 12,
- bg_colour = 0xffffff,
- bg_alpha = 0.1,
- fg_colour = 'rainbow_bgr',
- fg_alpha = 0.6,
- x = 146, y = 165,
- radius = 75,
- thickness = 12,
- start_angle = 0,
- end_angle = 360
- },
- -- Uncomment below and comment above for 24 hour clock instead of 12 hour clock
- --[[{
- name = 'time',
- arg = '%H',
- max = 24,
- bg_colour = 0xffffff,
- bg_alpha = 0.1,
- fg_colour = 'rainbow_bgr',
- fg_alpha = 0.6,
- x = 146, y = 165,
- radius = 75,
- thickness = 12,
- start_angle = 0,
- end_angle = 360
- },]]
- {
- name = 'time',
- arg = '%M',
- max = 60,
- bg_colour = 0xffffff,
- bg_alpha = 0.1,
- fg_colour = 'rainbow_bgr',
- fg_alpha = 0.6,
- x = 146, y = 165,
- radius = 90,
- thickness = 7,
- start_angle = 0,
- end_angle = 360
- },
- {
- name = 'time',
- arg = '%S',
- max = 60,
- bg_colour = 0xffffff,
- bg_alpha = 0.1,
- fg_colour = 'rainbow_bgr',
- fg_alpha = 0.6,
- x = 146, y = 165,
- radius = 120,
- thickness = 4,
- start_angle = 0,
- end_angle = 360
- },
- }
- require 'cairo'
- require 'socket'
- 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)
- -- Draw background ring
- 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)
- -- Draw indicator ring
- cairo_arc(cr, xc, yc, ring_r, angle_0, angle_0+t_arc)
- -- New if statement holds colour change logic
- local r = 0
- local g = 0
- local b = 0
- if fgc == 'rainbow_rgb' then
- if t < 1 / 6 then
- r, g, b = 1, t * 6, 0
- elseif t < 2 / 6 then
- r, g, b = 1 - ((t * 6) - 1), 1, 0
- elseif t < 3 / 6 then
- r, g, b = 0, 1, (t * 6) - 2
- elseif t < 4 / 6 then
- r, g, b = 0, 1 - ((t * 6) - 3), 1
- elseif t < 5 / 6 then
- r, g, b = (t * 6) - 4, 0, 1
- elseif t < 6 / 6 then
- r, g, b = 1, 0, 1 - ((t * 6) - 5)
- end
- cairo_set_source_rgba(cr, r, g, b, fga)
- elseif fgc == 'rainbow_bgr' then
- if t < 1 / 6 then
- r, g, b = 0, t * 6, 1
- elseif t < 2 / 6 then
- r, g, b = 0, 1, 1 - ((t * 6) - 1)
- elseif t < 3 / 6 then
- r, g, b = (t * 6) - 2, 1, 0
- elseif t < 4 / 6 then
- r, g, b = 1, 1 - ((t * 6) - 3), 0
- elseif t < 5 / 6 then
- r, g, b = 1, 0, (t * 6) - 4
- elseif t < 6 / 6 then
- r, g, b = 1 - ((t * 6) - 5), 0, 1
- end
- cairo_set_source_rgba(cr, r, g, b, fga)
- elseif fgc == 'traffic' then
- if t < 1 / 3 then
- r, g, b = 0, 1, 0
- elseif t < 2 / 3 then
- r, g, b = (t * 3) - 1, 1, 0
- elseif t < 3 / 3 then
- r, g, b = 1, 1 - ((t * 3) - 2), 0
- end
- cairo_set_source_rgba(cr, r, g, b, fga)
- elseif fgc == 'traffic_rev' then
- if t < 1 / 3 then
- r, g, b = 1, 0, 0
- elseif t < 2 / 3 then
- r, g, b = 1, (t * 3) - 1, 0
- elseif t < 3 / 3 then
- r, g, b = 1 - ((t * 3) - 2), 1, 0
- end
- cairo_set_source_rgba(cr, r, g, b, fga)
- else
- -- Original set_source code
- cairo_set_source_rgba(cr, rgb_to_r_g_b(fgc, fga))
- end
- cairo_stroke(cr)
- end
- function conky_ring_stats()
- local function setup_rings(cr, pt)
- local str = ''
- local value = 0
- -- New if statement holds millisecond precision clock logic
- if pt['name'] == 'time' then
- local epoch_time = os.time()
- local mils = socket.gettime() - epoch_time
- local secs = conky_parse('${time %S}')
- secs = tonumber(secs) + mils
- local mins = conky_parse('${time %M}')
- mins = tonumber(mins)
- local hrs = conky_parse('${time %I}')
- hrs = tonumber(hrs)
- if pt['arg'] == '%I' then
- value = (hrs % 12) + (mins / 60) + (secs / 3600)
- elseif pt['arg'] == '%H' then
- value = hrs + (mins / 60) + (secs / 3600)
- elseif pt['arg'] == '%M' then
- value = mins + (secs / 60)
- elseif pt['arg'] == '%S' then
- value = secs
- else
- -- Original conky_parse code replicated here to prevent
- -- breakages in times which don't use %I, %H, %M, or %S
- str = string.format('${%s %s}', pt['name'], pt['arg'])
- str = conky_parse(str)
- value = tonumber(str)
- end
- else
- -- Original conky_parse code
- str = string.format('${%s %s}', pt['name'], pt['arg'])
- str = conky_parse(str)
- value = tonumber(str)
- 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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement