Advertisement
lswest

conky lua rings 1

Mar 5th, 2011
1,302
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 5.42 KB | None | 0 0
  1. --[[
  2. Ring Meters by londonali1010 (2009)
  3.  
  4. This script draws percentage meters as rings. It is fully customisable; all options are described in the script.
  5.  
  6. IMPORTANT: if you are using the 'cpu' function, it will cause a segmentation fault if it tries to draw a ring straight away. The if statement on line 145 uses a delay to make sure that this doesn't happen. It calculates the length of the delay by the number of updates since Conky started. Generally, a value of 5s is long enough, so if you update Conky every 1s, use update_num>5 in that if statement (the default). If you only update Conky every 2s, you should change it to update_num>3; conversely if you update Conky every 0.5s, you should use update_num>10. ALSO, if you change your Conky, is it best to use "killall conky; conky" to update it, otherwise the update_num will not be reset and you will get an error.
  7.  
  8. To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):
  9.     lua_load ~/scripts/rings-v1.2.lua
  10.     lua_draw_hook_pre ring_stats
  11.    
  12. Changelog:
  13. + v1.2 -- Added option for the ending angle of the rings (07.10.2009)
  14. + v1.1 -- Added options for the starting angle of the rings, and added the "max" variable, to allow for variables that output a numerical value rather than a percentage (29.09.2009)
  15. + v1.0 -- Original release (28.09.2009)
  16. ]]
  17.  
  18. settings_table = {
  19. --[[    {
  20.         -- Edit this table to customise your rings.
  21.         -- You can create more rings simply by adding more elements to settings_table.
  22.         -- "name" is the type of stat to display; you can choose from 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'.
  23.         name='time',
  24.         -- "arg" is the argument to the stat type, e.g. if in Conky you would write ${cpu cpu0}, 'cpu0' would be the argument. If you would not use an argument in the Conky variable, use ''.
  25.         arg='%I.%M',
  26.         -- "max" is the maximum value of the ring. If the Conky variable outputs a percentage, use 100.
  27.         max=12,
  28.         -- "bg_colour" is the colour of the base ring.
  29.         bg_colour=0xffffff,
  30.         -- "bg_alpha" is the alpha value of the base ring.
  31.         bg_alpha=0.1,
  32.         -- "fg_colour" is the colour of the indicator part of the ring.
  33.         fg_colour=0xffffff,
  34.         -- "fg_alpha" is the alpha value of the indicator part of the ring.
  35.         fg_alpha=0.2,
  36.         -- "x" and "y" are the x and y coordinates of the centre of the ring, relative to the top left corner of the Conky window.
  37.         x=165, y=170,
  38.         -- "radius" is the radius of the ring.
  39.         radius=50,
  40.         -- "thickness" is the thickness of the ring, centred around the radius.
  41.         thickness=5,
  42.         -- "start_angle" is the starting angle of the ring, in degrees, clockwise from top. Value can be either positive or negative.
  43.         start_angle=0,
  44.         -- "end_angle" is the ending angle of the ring, in degrees, clockwise from top. Value can be either positive or negative, but must be larger (e.g. more clockwise) than start_angle.
  45.         end_angle=360
  46.     }, ]]
  47.     {
  48.         name='time',
  49.         arg='%I',
  50.         max=12,
  51.         bg_colour=0xffffff,
  52.         bg_alpha=0.1,
  53.         fg_colour=0xffffff,
  54.         fg_alpha=0.4,
  55.         x=165, y=170,
  56.         radius=89,
  57.         thickness=7,
  58.         start_angle=0,
  59.         end_angle=360
  60.     },
  61.     {
  62.         name='time',
  63.         arg='%M',
  64.         max=60,
  65.         bg_colour=0xffffff,
  66.         bg_alpha=0.1,
  67.         fg_colour=0xffffff,
  68.         fg_alpha=0.4,
  69.         x=165, y=170,
  70.         radius=79,
  71.         thickness=7,
  72.         start_angle=0,
  73.         end_angle=360
  74.     },
  75.     {
  76.         name='time',
  77.         arg='%S',
  78.         max=60,
  79.         bg_colour=0xffffff,
  80.         bg_alpha=0.1,
  81.         fg_colour=0xffffff,
  82.         fg_alpha=0.4,
  83.         x=165, y=170,
  84.         radius=70,
  85.         thickness=5,
  86.         start_angle=0,
  87.         end_angle=360
  88.     },
  89. }
  90.  
  91. require 'cairo'
  92.  
  93. function rgb_to_r_g_b(colour,alpha)
  94.     return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
  95. end
  96.  
  97. function draw_ring(cr,t,pt)
  98.     local w,h=conky_window.width,conky_window.height
  99.     local port=pt['max']
  100.     local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']
  101.     local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']
  102.    
  103.     local arc_w = 2*math.pi/port -- Sets width of arc to 1/"max"nth of a circle
  104.     local angle_0 = sa*(2*math.pi/360)-math.pi/2 -- Converts the starting angle to radians & translates to starting from the top
  105.     local angle_f = ea*(2*math.pi/360)-math.pi/2
  106.     local t_arc = angle_0 + t*2*math.pi -- Converts the percentage to a part of 2*pi radians & adds the starting angle
  107.  
  108.     -- Draw background ring
  109.  
  110.     cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)
  111.     cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))
  112.     cairo_set_line_width(cr,ring_w)
  113.     cairo_stroke(cr)
  114.     -- Draw indicator ring
  115.     if pt['arg'] == '%S' then cairo_arc(cr, xc, yc, ring_r, angle_0, t_arc+arc_w) end
  116.     cairo_arc(cr, xc, yc, ring_r, t_arc-arc_w, t_arc+arc_w)
  117.     cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))
  118.     cairo_stroke(cr)
  119. end
  120. function conky_ring_stats()
  121.     local function setup_rings(cr,pt)
  122.         local str=''
  123.         local value=0
  124.        
  125.         str=string.format('${%s %s}',pt['name'],pt['arg'])
  126.         str=conky_parse(str)
  127.         value=tonumber(str)
  128.         pct=value/pt['max']
  129.    
  130.         draw_ring(cr,pct,pt)
  131.     end
  132.  
  133.     if conky_window==nil then return end
  134.     local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)
  135.    
  136.     local cr=cairo_create(cs)  
  137.    
  138.     local updates=conky_parse('${updates}')
  139.     update_num=tonumber(updates)
  140.    
  141.     if update_num>5 then
  142.         for i in pairs(settings_table) do
  143.             setup_rings(cr,settings_table[i])
  144.         end
  145.     end
  146. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement