updated version #, imlib2 fixed, i forgot when the window size changes we totally...
[monky] / lua_scripts / testCairo.lua
1 --[[\r
2 Ring Meters by londonali1010 (2009)\r
3 \r
4 This script draws percentage meters as rings. It is fully customisable; all options are described in the script.\r
5 \r
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.\r
7 \r
8 To call this script in Conky, use the following (assuming that you save this script to ~/scripts/rings.lua):\r
9     lua_load ~/scripts/rings-v1.2.1.lua\r
10     lua_draw_hook_pre ring_stats\r
11 \r
12 Changelog:\r
13 + v1.2.1 -- Fixed minor bug that caused script to crash if conky_parse() returns a nil value (20.10.2009)\r
14 + v1.2 -- Added option for the ending angle of the rings (07.10.2009)\r
15 + 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)\r
16 + v1.0 -- Original release (28.09.2009)\r
17 ]]\r
18 \r
19 settings_table = {\r
20     {\r
21         -- Edit this table to customise your rings.\r
22         -- You can create more rings simply by adding more elements to settings_table.\r
23         -- "name" is the type of stat to display; you can choose from 'cpu', 'memperc', 'fs_used_perc', 'battery_used_perc'.\r
24         name='time',\r
25         -- "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 ''.\r
26         arg='%I.%M',\r
27         -- "max" is the maximum value of the ring. If the Conky variable outputs a percentage, use 100.\r
28         max=12,\r
29         -- "bg_colour" is the colour of the base ring.\r
30         bg_colour=0xffffff,\r
31         -- "bg_alpha" is the alpha value of the base ring.\r
32         bg_alpha=0.1,\r
33         -- "fg_colour" is the colour of the indicator part of the ring.\r
34         fg_colour=0xffffff,\r
35         -- "fg_alpha" is the alpha value of the indicator part of the ring.\r
36         fg_alpha=0.2,\r
37         -- "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.\r
38         x=165, y=170,\r
39         -- "radius" is the radius of the ring.\r
40         radius=50,\r
41         -- "thickness" is the thickness of the ring, centred around the radius.\r
42         thickness=5,\r
43         -- "start_angle" is the starting angle of the ring, in degrees, clockwise from top. Value can be either positive or negative.\r
44         start_angle=0,\r
45         -- "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.\r
46         end_angle=360\r
47     },\r
48     {\r
49         name='time',\r
50         arg='%M.%S',\r
51         max=60,\r
52         bg_colour=0xffffff,\r
53         bg_alpha=0.1,\r
54         fg_colour=0xffffff,\r
55         fg_alpha=0.4,\r
56         x=165, y=170,\r
57         radius=56,\r
58         thickness=5,\r
59         start_angle=0,\r
60         end_angle=360\r
61     },\r
62     {\r
63         name='time',\r
64         arg='%S',\r
65         max=60,\r
66         bg_colour=0xffffff,\r
67         bg_alpha=0.1,\r
68         fg_colour=0xffffff,\r
69         fg_alpha=0.6,\r
70         x=165, y=170,\r
71         radius=62,\r
72         thickness=5,\r
73         start_angle=0,\r
74         end_angle=360\r
75     },\r
76     {\r
77         name='cpu',\r
78         arg='cpu0',\r
79         max=100,\r
80         bg_colour=0xffffff,\r
81         bg_alpha=0.1,\r
82         fg_colour=0xffffff,\r
83         fg_alpha=0.4,\r
84         x=165, y=170,\r
85         radius=84.5,\r
86         thickness=8,\r
87         start_angle=60,\r
88         end_angle=120\r
89     },\r
90     {\r
91         name='battery_percent',\r
92         arg='BAT1',\r
93         max=100,\r
94         bg_colour=0xffffff,\r
95         bg_alpha=0.1,\r
96         fg_colour=0xffffff,\r
97         fg_alpha=0.6,\r
98         x=165, y=170,\r
99         radius=72,\r
100         thickness=11,\r
101         start_angle=122,\r
102         end_angle=210\r
103     },\r
104     {\r
105         name='memperc',\r
106         arg='',\r
107         max=100,\r
108         bg_colour=0xffffff,\r
109         bg_alpha=0.1,\r
110         fg_colour=0xffffff,\r
111         fg_alpha=0.8,\r
112         x=165, y=170,\r
113         radius=83.5,\r
114         thickness=8,\r
115         start_angle=122,\r
116         end_angle=210\r
117     },\r
118     {\r
119         name='time',\r
120         arg='%d',\r
121         max=31,\r
122         bg_colour=0xffffff,\r
123         bg_alpha=0.1,\r
124         fg_colour=0xffffff,\r
125         fg_alpha=0.8,\r
126         x=165, y=170,\r
127         radius=70,\r
128         thickness=5,\r
129         start_angle=212,\r
130         end_angle=360\r
131     },\r
132     {\r
133         name='time',\r
134         arg='%m',\r
135         max=12,\r
136         bg_colour=0xffffff,\r
137         bg_alpha=0.1,\r
138         fg_colour=0xffffff,\r
139         fg_alpha=0.8,\r
140         x=165, y=170,\r
141         radius=76,\r
142         thickness=5,\r
143         start_angle=212,\r
144         end_angle=360\r
145     },\r
146     {\r
147         name='fs_used_perc',\r
148         arg='/',\r
149         max=150,\r
150         bg_colour=0xffffff,\r
151         bg_alpha=0.2,\r
152         fg_colour=0xffffff,\r
153         fg_alpha=0.3,\r
154         x=165, y=170,\r
155         radius=108.5,\r
156         thickness=3,\r
157         start_angle=-120,\r
158         end_angle=240\r
159     },\r
160     {\r
161         name='fs_used_perc',\r
162         arg='/',\r
163         max=100,\r
164         bg_colour=0xffffff,\r
165         bg_alpha=0.2,\r
166         fg_colour=0xffffff,\r
167         fg_alpha=0.3,\r
168         x=165, y=170,\r
169         radius=135,\r
170         thickness=50,\r
171         start_angle=-120,\r
172         end_angle=120\r
173     },\r
174 }\r
175 \r
176 require 'cairo'\r
177 \r
178 function rgb_to_r_g_b(colour,alpha)\r
179     return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha\r
180 end\r
181 \r
182 function draw_ring(cr,t,pt)\r
183     local w,h=conky_window.width,conky_window.height\r
184 \r
185     local xc,yc,ring_r,ring_w,sa,ea=pt['x'],pt['y'],pt['radius'],pt['thickness'],pt['start_angle'],pt['end_angle']\r
186     local bgc, bga, fgc, fga=pt['bg_colour'], pt['bg_alpha'], pt['fg_colour'], pt['fg_alpha']\r
187 \r
188     local angle_0=sa*(2*math.pi/360)-math.pi/2\r
189     local angle_f=ea*(2*math.pi/360)-math.pi/2\r
190     local t_arc=t*(angle_f-angle_0)\r
191 \r
192     -- Draw background ring\r
193 \r
194     cairo_arc(cr,xc,yc,ring_r,angle_0,angle_f)\r
195     cairo_set_source_rgba(cr,rgb_to_r_g_b(bgc,bga))\r
196     cairo_set_line_width(cr,ring_w)\r
197     cairo_stroke(cr)\r
198 \r
199     -- Draw indicator ring\r
200 \r
201     cairo_arc(cr,xc,yc,ring_r,angle_0,angle_0+t_arc)\r
202     cairo_set_source_rgba(cr,rgb_to_r_g_b(fgc,fga))\r
203     cairo_stroke(cr)        \r
204 end\r
205 \r
206 function conky_ring_stats()\r
207     local function setup_rings(cr,pt)\r
208         local str=''\r
209         local value=0\r
210 \r
211         str=string.format('${%s %s}',pt['name'],pt['arg'])\r
212         str=conky_parse(str)\r
213 \r
214         value=tonumber(str)\r
215         if value == nil then value = 0 end\r
216         pct=value/pt['max']\r
217 \r
218         draw_ring(cr,pct,pt)\r
219     end\r
220 \r
221     if conky_window==nil then return end\r
222     local cs=cairo_xlib_surface_create(conky_window.display,conky_window.drawable,conky_window.visual, conky_window.width,conky_window.height)\r
223 \r
224     local cr=cairo_create(cs)    \r
225 \r
226     local updates=conky_parse('${updates}')\r
227     update_num=tonumber(updates)\r
228 \r
229     if update_num>5 then\r
230         for i in pairs(settings_table) do\r
231             setup_rings(cr,settings_table[i])\r
232         end\r
233     end\r
234         cairo_surface_destroy(cs)\r
235     cairo_destroy(cr)\r
236 end\r