You are not logged in.

#121 2016-04-21 06:21:33

arti
Member
Registered: 2015-12-02
Posts: 73

Re: Show us your conky

Hipparkhia wrote:

I've been playing with Conky today and incorporated a Diary and ToDo list:


http://i.imgur.com/0nzQYgSm.png


I adapted the code for the diary from this conky_todo.sh by Magyar  on the Arch Forum . Feeling quite pleased with myself as I haven't got a clue what I'm doing. Anyway, this is what I came up with:


#!/bin/bash

IFS=$'\n'

for i in `seq 0 5`
do
    if [ $i -eq 0 ]
    then
        printf "${color}$(date "+%A")"
    else
        printf "${color}$(date -d "$i day" "+%A")"
    fi   
    
    TODO="$(grep `date -d "$i day" +%d/%m/%y` ~/Documents/diary.txt | sort -k2,1n)"
    
    for WORD in $TODO
    do

    DATE="$(echo $WORD | awk '{print $1}')"
    TIME="$(echo $WORD | awk '{print $2}')"
    TASK="$(echo $WORD | cut -c21-57)"
  
      printf "\n$TASK"
    
    done
    
    printf "\n\n"
done

Edit: I did come across a problem - when I replaced the short diary entries shown in the Conky with real, longer entries they got cut off after the first half a dozen. I had to increase text_buffer_size in the Conkyrc and that seems to have fixed it.

What a neat idea. Nice job.

Offline

#122 2016-05-30 17:22:21

ninlith
Member
Registered: 2016-05-30
Posts: 5

Re: Show us your conky

forum.th.jpg

https://github.com/ninlith/subsolar

Mod Note: Oversized image replaced with thumbnail link, please limit images to ~250x250px
-HoaS

Offline

#123 2016-05-30 18:31:29

ohnonot
...again
Registered: 2015-09-29
Posts: 5,592

Re: Show us your conky

^ ninlith, welcome to the forums!
you made a grand entrance, it seems. i'll have to check that out.

Last edited by ohnonot (2021-07-03 10:32:03)

Offline

#124 2016-05-30 19:56:06

ninlith
Member
Registered: 2016-05-30
Posts: 5

Re: Show us your conky

Thanks :) Mrpeachy's guide got me started when there was still CrunchBang. Inland: Hämeenlinna.

Offline

#125 2016-05-30 20:03:24

ohnonot
...again
Registered: 2015-09-29
Posts: 5,592

Re: Show us your conky

Greetings!

Last edited by ohnonot (2021-07-03 10:30:46)

Offline

#126 2016-05-30 22:08:44

ututo
Member
Registered: 2015-09-29
Posts: 326

Re: Show us your conky


BunsenLabs on deviantArt
Don't touch my git!

Offline

#127 2016-05-30 22:29:55

Sector11
Mod Squid Tpyo Knig
From: Upstairs
Registered: 2015-08-20
Posts: 8,008

Re: Show us your conky

@ninlith

I'm getting old, I can't see it ... but what I can see I like!


Debian 12 Beardog, SoxDog and still a Conky 1.9er

Offline

#128 2016-05-31 08:42:15

ragamatrix
Member
Registered: 2015-10-04
Posts: 427

Re: Show us your conky

wow I'm agree that's a beautifull piece of conky, I would like to try it but unfortunately some packages missing with bunsen... (python3-ephem gcalcli...)

Offline

#129 2016-05-31 09:02:58

Eraph
Member
From: /au/qld/bne
Registered: 2016-02-29
Posts: 282
Website

Re: Show us your conky

This Conky just keeps growing. Looking good though, individual processor bars for each core, and a status indicator at the bottom for my cloud server.

Rakhama2Conkyth.png

default_color FF9F00	# Orange
color0		  DF4F00	# Darker Orange
color1		  009FFF	# Blue
color2		  9FFF00	# Green
color3		  8F8F8F	# Grey
color4		  CE0000	# Red

TEXT
$color1$alignc> > > $color2${exec whoami}@$nodename$color1 < < <
$color3$hr
${color}Kernel:${alignr}${kernel}
Uptime:${alignr}${uptime}
Time:${alignr}${time %H:%M}
UTC:${alignr}${utime %H:%M}
Volume:${alignr}${exec amixer -c 0 get Master | grep Mono: | cut -d " " -f6}

$color1$alignc> > >$color2 P O W E R$color1 < < <
$color3$hr
${color}Power:${alignr}${battery BAT1}
$color0${battery_bar BAT1}
${color}Remaining:${alignr}${battery_time BAT1}

${color1}${alignc}> > >$color2 M E M O R Y$color1 < < <
$color3$hr
${color}${goto 60}Used${alignr}Size
SSD${goto 60}${fs_used /}${alignr}${fs_size /}
$color0${fs_bar /}

$color${goto 60}MEM${alignr}MAX
RAM${goto 60}${mem}${alignr}${memmax}
$color0$membar
$swapbar
${color}Swap${goto 60}${swap}${alignr}${swapmax}

${color1}${alignc}> > >$color2 C P U$color1 < < <
$color3$hr
${color}CPU:${alignr}Intel Core i7-3537U
${goto 60}Used${alignr 30}GHz${alignr}Temp
Avg${goto 60}${if_match ${cpu cpu0}<10}  ${cpu cpu0}\
${else}${if_match ${cpu cpu0}<100} ${cpu cpu0}\
${else}${cpu cpu0}${endif}${endif}%${alignr 30}${freq_g}\
${alignr}${hwmon 0 temp 1}°C
${color0}${cpugraph cpu0}
${cpubar cpu1 6,48}${goto 57}${cpubar cpu2 6,48}${goto 107}${cpubar cpu3 6,48}${goto 157}${cpubar cpu4 6,48}
${color}Process: $alignr PID:    CPU:
${top name 1} $alignr ${top pid 1} ${top cpu 1}%
${top name 2} $alignr ${top pid 2} ${top cpu 2}%
${top name 3} $alignr ${top pid 3} ${top cpu 3}%
${top name 4} $alignr ${top pid 4} ${top cpu 4}%
${top name 5} $alignr ${top pid 5} ${top cpu 5}%
${top name 6} $alignr ${top pid 6} ${top cpu 6}%
${top name 7} $alignr ${top pid 7} ${top cpu 7}%
${top name 8} $alignr ${top pid 8} ${top cpu 8}%

${color1}${alignc}> > >$color2 N E T W O R K$color1 < < <
$color3$hr
${color}Internal IP:${alignr}${addr wlan0}
External IP:${alignr}${execi 300 wget -q -O - http://icanhazip.com}
SSID:${alignr}${wireless_essid wlan0}
${color0}${wireless_link_bar wlan0}
${color}Download:${alignr}${downspeed wlan0}
${color0}${downspeedgraph wlan0}
${upspeedgraph wlan0}
${color}Upload:${alignr}${upspeed wlan0}
Pumarax Status:${if_match "${execi 60 ssh -p 1234 fakeuser@someaddress.com du -hs}"==""}${alignr}${color4}Offline${else}${alignr}${color2}Online${endif}

Lenovo IdeaPad Yoga 13 | BunsenLabs Hydrogen (x64)
Intel Core i7-3537U | Intel HD4000 | 8GB DDR3 | 256GB SSD

Offline

#130 2016-05-31 20:59:54

ninlith
Member
Registered: 2016-05-30
Posts: 5

Re: Show us your conky

ragamatrix wrote:

wow I'm agree that's a beautifull piece of conky, I would like to try it but unfortunately some packages missing with bunsen... (python3-ephem gcalcli...)

The latest revision should partly work without the missing packages (use the old_syntax configs).

Offline

#131 2016-06-03 10:55:36

ninlith
Member
Registered: 2016-05-30
Posts: 5

Re: Show us your conky

ninlith wrote:
ragamatrix wrote:

wow I'm agree that's a beautifull piece of conky, I would like to try it but unfortunately some packages missing with bunsen... (python3-ephem gcalcli...)

The latest revision should partly work without the missing packages (use the old_syntax configs).

And here's one way to get everything running:

sudo sh -c "test -e /etc/apt/sources.list.d/debian-jessie-backports.list \
|| echo 'deb http://httpredir.debian.org/debian jessie-backports main' \
> /etc/apt/sources.list.d/debian-jessie-backports.list"
sudo apt-get update
sudo apt-get -t jessie-backports install gmt gmt-gshhg
sudo apt-get install virtualenv python-dev gcc qdbus librsvg2-bin xmlstarlet \
fonts-cantarell geoclue-2.0 geographiclib-tools gnome-icon-theme-symbolic \
conky-all inxi git
git clone https://github.com/ninlith/subsolar.git ~/.conky/subsolar
sudo /usr/sbin/geographiclib-get-magnetic wmm2010
cd ~/.conky/subsolar
virtualenv venv
source venv/bin/activate
pip install pyephem gcalcli
gcalcli agenda    # set up gcalcli if applicable
deactivate

# run:
source ~/.conky/subsolar/venv/bin/activate
conky -c ~/.conky/subsolar/subsolar.conkyrc-old_syntax &
conky -c ~/.conky/subsolar/bottom.conkyrc-old_syntax &
deactivate

0ph52Ukt.png

Offline

#132 2016-06-04 14:00:22

damo
....moderator....
Registered: 2015-08-20
Posts: 6,734

Re: Show us your conky

Conky to suit 1366x768 screens

Electro Conky: zipfile with lua and weather scripts, as well as a README.
e-conky-1366-screenshot.th.jpg


Be Excellent to Each Other...
The Bunsenlabs Lithium Desktop » Here
FORUM RULES and posting guidelines «» Help page for forum post formatting
Artwork on DeviantArt  «» BunsenLabs on DeviantArt

Offline

#133 2016-06-04 14:15:40

Sector11
Mod Squid Tpyo Knig
From: Upstairs
Registered: 2015-08-20
Posts: 8,008

Re: Show us your conky

^ Very nice damo.  Do I detect a touch of falldown in there?


Debian 12 Beardog, SoxDog and still a Conky 1.9er

Offline

#134 2016-06-04 14:51:57

damo
....moderator....
Registered: 2015-08-20
Posts: 6,734

Re: Show us your conky

Sector11 wrote:

^ Very nice damo.  Do I detect a touch of falldown in there?

That gave me the idea wink


Be Excellent to Each Other...
The Bunsenlabs Lithium Desktop » Here
FORUM RULES and posting guidelines «» Help page for forum post formatting
Artwork on DeviantArt  «» BunsenLabs on DeviantArt

Offline

#135 2016-06-04 16:46:23

Sector11
Mod Squid Tpyo Knig
From: Upstairs
Registered: 2015-08-20
Posts: 8,008

Re: Show us your conky

It shows.  smile


Debian 12 Beardog, SoxDog and still a Conky 1.9er

Offline

#136 2016-06-06 10:14:31

ragamatrix
Member
Registered: 2015-10-04
Posts: 427

Re: Show us your conky

Hi ninlith,
Thanks so much trying to help me (eternal noob)... I got errors when launching conkys... The bottom one make my screen x11 buggy... blinking screen ?? For the subsolar conky I got the lua drawings, no earth map and this error message:

conky -c ~/.conky/subsolar/subsolar.conkyrc-old_syntax
Conky: desktop window (b5) is root window
Conky: window type - desktop
Conky: drawing to created window (0x2c00001)
Conky: drawing to double buffer
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
WARNING: Time 2016.43 outside allowed range [2010,2015]
Conky: received SIGINT or SIGTERM to terminate. bye!

Offline

#137 2016-06-06 20:16:42

ninlith
Member
Registered: 2016-05-30
Posts: 5

Re: Show us your conky

The warning messages are from geographiclib-tools/MagneticField and can be ignored.

As for blinking, I have no clue. Try adding minimum_size or experimenting with own_window_type parameters or something. What window manager, etc., are you using?

Does the following produce an earth map (/tmp/earth.png)?

gmt pscoast --MAP_ORIGIN_X=0i --MAP_ORIGIN_Y=0i --PS_MEDIA=1ix1i -Rg \
-JG0/0/1i -Dc -A1000 -G0/0/0 -P > /tmp/earth.ps \
&& gmt psconvert /tmp/earth.ps -E200 -TG -F/tmp/earth.png

Offline

#138 2016-06-07 06:00:17

ragamatrix
Member
Registered: 2015-10-04
Posts: 427

Re: Show us your conky

Thanks, these lines code gives me an earth.png in the tmp folder, I'll check today for the rest and I'll post again if I have problem again. My WM is openbox (bunsenlabs) wink

Offline

#139 2016-06-07 08:24:05

ragamatrix
Member
Registered: 2015-10-04
Posts: 427

Re: Show us your conky

Finally, its working... thanks ninlith. smile
1465287446.png
I like these kind of stuffs, I'm also an xplanet user wink
1465287826.png

Last edited by ragamatrix (2016-06-07 08:27:19)

Offline

#140 2016-06-10 08:58:22

ragamatrix
Member
Registered: 2015-10-04
Posts: 427

Re: Show us your conky

Hi!
@Sector11>
conky-girlytime-sys:

#============================================#
#	ragamatrix'
#
#============================================#
#  Settings                                  
#============================================#
background yes
#font -*-snap-normal-*-*-*-10-*-*-*-*-*-iso10646-*
use_xft yes
xftfont Zero Twos:pixelsize=12
xftalpha 0.8
update_interval 1.0
total_run_times 0
own_window yes
own_window_transparent yes
own_window_colour 222222
own_window_type desktop
own_window_title Conky Quadrat
double_buffer yes
## taille ##
minimum_size 250 250
maximum_width 250
##        ##
draw_shades no
draw_outline no
draw_borders no
border_inner_margin 5
border_width 1
draw_graph_borders no
default_bar_size 60 10
default_color 3D3DFD
#default_color 005885
color1 DBDBDB
color2 ABABAB
color3 7D7D7D
default_shade_color black
default_outline_color white
alignment tr
gap_x 15
gap_y 10
no_buffers yes
uppercase no
text_buffer_size 1024
top_name_width 10
imlib_cache_size 0
cpu_avg_samples 2
show_graph_scale no
show_graph_range no
short_units yes
override_utf8_locale yes
use_spacer none
if_up_strictness address
##############################################
#  Output                                    #
##############################################

# -- Lua load -- #
lua_load /your/path/.conky/timesys/call_multi.lua
lua_draw_hook_pre main

#at least one line (empty or not) after TEXT
TEXT

call_multi.lua: < the path must be the complete one, not $HOME or ~/ >

function conky_main()
    dofile ('/your/path/.conky/timesys/conky_8.lua')
    dofile ('/your/path/.conky/timesys/textsys.lua')
    dofile ('/your/path/.conky/timesys/netgraph.lua')
    
    
    conky_main_bars()
    conky_draw_text()
    conky_main_graph()
    
end

conky_8.lua:

--[[ BARGRAPH WIDGET
	v2.1 by wlourf (07 Jan. 2011)
	edited by Caymus
	this widget draws a bargraph with different effects 
	http://u-scripts.blogspot.com/2010/07/bargraph-widget.html
	
To call the script in a conky, use, before TEXT
	lua_load /path/to/the/script/bargraph.lua
	lua_draw_hook_pre main_rings
and add one line (blank or not) after TEXT

	
Parameters are :
3 parameters are mandatory
name	- the name of the conky variable to display, for example for {$cpu cpu0}, just write name="cpu"
arg		- the argument of the above variable, for example for {$cpu cpu0}, just write arg="cpu0"
		  arg can be a numerical value if name=""
max		- the maximum value the above variable can reach, for example, for {$cpu cpu0}, just write max=100
	
Optional parameters:
x,y		- coordinates of the starting point of the bar, default = middle of the conky window
cap		- end of cap line, ossibles values are r,b,s (for round, butt, square), default="b"
		  http://www.cairographics.org/samples/set_line_cap/
angle	- angle of rotation of the bar in degress, default = 0 (i.e. a vertical bar)
		  set to 90 for an horizontal bar
skew_x	- skew bar around x axis, default = 0
skew_y	- skew bar around y axis, default = 0
blocks  - number of blocks to display for a bar (values >0) , default= 10
height	- height of a block, default=10 pixels
width	- width of a block, default=20 pixels
space	- space between 2 blocks, default=2 pixels
angle_bar	- this angle is used to draw a bar on a circular way (ok, this is no more a bar !) default=0
radius		- for cicular bars, internal radius, default=0
			  with radius, parameter width has no more effect.

Colours below are defined into braces {colour in hexadecimal, alpha}
fg_colour	- colour of a block ON, default= {0x00FF00,1}
bg_colour	- colour of a block OFF, default = {0x00FF00,0.5}
alarm		- threshold, values after this threshold will use alarm_colour colour , default=max
alarm_colour - colour of a block greater than alarm, default=fg_colour
smooth		- (true or false), create a gradient from fg_colour to bg_colour, default=false 
mid_colour	- colours to add to gradient, with this syntax {position into the gradient (0 to1), colour hexa, alpha}
			  for example, this table {{0.25,0xff0000,1},{0.5,0x00ff00,1},{0.75,0x0000ff,1}} will add
			  3 colurs to gradient created by fg_colour and alarm_colour, default=no mid_colour
led_effect	- add LED effects to each block, default=no led_effect
			  if smooth=true, led_effect is not used
			  possibles values : "r","a","e" for radial, parallelel, perdendicular to the bar (just try!)
			  led_effect has to be used with theses colours :
fg_led		- middle colour of a block ON, default = fg_colour
bg_led		- middle colour of a block OFF, default = bg_colour
alarm_led	- middle colour of a block > ALARM,  default = alarm_colour

reflection parameters, not avaimable for circular bars
reflection_alpha    - add a reflection effect (values from 0 to 1) default = 0 = no reflection
                      other values = starting opacity
reflection_scale    - scale of the reflection (default = 1 = height of text)
reflection_length   - length of reflection, define where the opacity will be set to zero
					  calues from 0 to 1, default =1
reflection			- position of reflection, relative to a vertical bar, default="b"
					  possibles values are : "b","t","l","r" for bottom, top, left, right
draw_me     - if set to false, text is not drawn (default = true or 1)
              it can be used with a conky string, if the string returns 1, the text is drawn :
              example : "${if_empty ${wireless_essid wlan0}}${else}1$endif",

v1.0 (10 Feb. 2010) original release
v1.1 (13 Feb. 2010) numeric values can be passed instead conky stats with parameters name="", arg = numeric_value	
v1.2 (28 Feb. 2010) just renamed the widget to bargraph
v1.3 (03 Mar. 2010) added parameters radius & angle_bar to draw the bar in a circular way
v2.0 (12 Jul. 2010) rewrite script + add reflection effects and parameters are now set into tables
v2.1 (07 Jan. 2011) Add draw_me parameter and correct memory leaks, thanks to "Creamy Goodness"

--      This program is free software; you can redistribute it and/or modify
--      it under the terms of the GNU General Public License as published by
--      the Free Software Foundation version 3 (GPLv3)
--     
--      This program is distributed in the hope that it will be useful,
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      GNU General Public License for more details.
--     
--      You should have received a copy of the GNU General Public License
--      along with this program; if not, write to the Free Software
--      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
--      MA 02110-1301, USA.		

]]

require 'cairo'

----------------START OF PARAMETERS ----------
function conky_main_bars()
	local bars_settings={
		{
			name="fs_used_perc",
			arg="/home",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=97,
			blocks=25,
			height=3,width=3,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=5,
			mid_colour={{0.5,0xD04BFF,1}},
		},
		--sda3		
	{
			name="fs_used_perc",
			arg="/your/path",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=117,
			blocks=25,
			height=3,width=3,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=5,
			mid_colour={{0.5,0xD04BFF,1}},
		},
--sdb1
{
			name="fs_used_perc",
			arg="/your/path/disk",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=137,
			blocks=25,
			height=3,width=3,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=5,
			mid_colour={{0.5,0xD04BFF,1}},
		},
--sdb3
{
			name="fs_used_perc",
			arg="/your/path/disk2",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=157,
			blocks=25,
			height=3,width=3,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=5,
			mid_colour={{0.5,0xD04BFF,1}},
		},				
		{
			name="cpu",
			arg="cpu1",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=177,
			blocks=25,
			height=3,width=3,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=5,
			mid_colour={{0.5,0xD04BFF,1}},
		},				
		
		{
			name="memperc",
			arg="%S",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=197,
			blocks=20,
			height=3,width=3,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=5,
			mid_colour={{0.5,0xD04BFF,1}},
		},		
		--[[{
			name="fs_used_perc",
			arg="/home",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=50,y=8,
			blocks=20,
			height=3,width=9,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=15,
			mid_colour={{0.5,0x00ff00,1}},
		},

			
		{
			name="downspeedf",
			arg="eth0",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=800,y=35,
			blocks=20,
			height=3,width=9,
			angle=-90,
			smooth=true,
			cap="e",
			skew_y=15,
			mid_colour={{0.5,0x00ff00,1}},
		},
		{
			name="upspeedf",
			arg="eth0",
			max=100,
			alarm=80,
			bg_colour={0x3D3DFD,0.25},
			fg_colour={0x3D3DFD,1},
			alarm_colour={0xff0000,1},
			x=890,y=25,
			blocks=20,
			height=3,width=9,
			angle=90,
			smooth=true,
			cap="e",
			skew_y=-15,
			mid_colour={{0.5,0x00ff00,1}}
		},--]]
		
		
						
	}
	
-----------END OF PARAMETERS--------------


    
	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)
	
	cr = cairo_create(cs)    
	--prevent segmentation error when reading cpu state
    if tonumber(conky_parse('${updates}'))>3 then
        for i in pairs(bars_settings) do
        	
        	draw_multi_bar_graph(bars_settings[i])
        	
        end
    end
	cairo_destroy(cr)
	cairo_surface_destroy(cs)
	cr=nil

end



function draw_multi_bar_graph(t)
	cairo_save(cr)
	--check values
	if t.draw_me == true then t.draw_me = nil end
	if t.draw_me ~= nil and conky_parse(tostring(t.draw_me)) ~= "1" then return end	
	if t.name==nil and t.arg==nil then 
		print ("No input values ... use parameters 'name' with 'arg' or only parameter 'arg' ") 
		return
	end
	if t.max==nil then
		print ("No maximum value defined, use 'max'")
		return
	end
	if t.name==nil then t.name="" end
	if t.arg==nil then t.arg="" end

	--set default values	
	if t.x == nil		then t.x = conky_window.width/2 end
	if t.y == nil		then t.y = conky_window.height/2 end
	if t.blocks == nil	then t.blocks=10 end
	if t.height == nil	then t.height=10 end
	if t.angle == nil 	then t.angle=0 end
	t.angle = t.angle*math.pi/180
	--line cap style
	if t.cap==nil		then t.cap = "b" end
	local cap="b"
	for i,v in ipairs({"s","r","b"}) do 
		if v==t.cap then cap=v end
	end
	local delta=0
	if t.cap=="r" or t.cap=="s" then delta = t.height end
	if cap=="s" then 	cap = CAIRO_LINE_CAP_SQUARE
	elseif cap=="r" then
		cap = CAIRO_LINE_CAP_ROUND
	elseif cap=="b" then
		cap = CAIRO_LINE_CAP_BUTT
	end
	--end line cap style
	--if t.led_effect == nil	then t.led_effect="r" end
	if t.width == nil	then t.width=20 end
	if t.space == nil	then t.space=2 end
	if t.radius == nil	then t.radius=0 end
	if t.angle_bar == nil	then t.angle_bar=0 end
	t.angle_bar = t.angle_bar*math.pi/360 --halt angle
	
	--colours
	if t.bg_colour == nil 	then t.bg_colour = {0x00FF00,0.5} end
	if #t.bg_colour~=2 		then t.bg_colour = {0x00FF00,0.5} end
	if t.fg_colour == nil 	then t.fg_colour = {0x00FF00,1} end
	if #t.fg_colour~=2 		then t.fg_colour = {0x00FF00,1} end
	if t.alarm_colour == nil 	then t.alarm_colour = t.fg_colour end
	if #t.alarm_colour~=2 		then t.alarm_colour = t.fg_colour end

	if t.mid_colour ~= nil then	
		for i=1, #t.mid_colour do    
		    if #t.mid_colour[i]~=3 then 
		    	print ("error in mid_color table")
		    	t.mid_colour[i]={1,0xFFFFFF,1} 
		    end
		end
    end
    
	if t.bg_led ~= nil and #t.bg_led~=2	then t.bg_led = t.bg_colour end
	if t.fg_led ~= nil and #t.fg_led~=2	then t.fg_led = t.fg_colour end
	if t.alarm_led~= nil and #t.alarm_led~=2 then t.alarm_led = t.fg_led end
	
	if t.led_effect~=nil then
		if t.bg_led == nil then t.bg_led = t.bg_colour end
		if t.fg_led == nil 	then t.fg_led = t.fg_colour end
		if t.alarm_led == nil  then t.alarm_led = t.fg_led end
	end
	

	if t.alarm==nil then t.alarm = t.max end --0.8*t.max end
	if t.smooth == nil then t.smooth = false end

	if t.skew_x == nil then 
		t.skew_x=0 
	else
		t.skew_x = math.pi*t.skew_x/180	
	end
	if t.skew_y == nil then 
		t.skew_y=0
	else
		t.skew_y = math.pi*t.skew_y/180	
	end
	
	if t.reflection_alpha==nil then t.reflection_alpha=0 end
	if t.reflection_length==nil then t.reflection_length=1 end
	if t.reflection_scale==nil then t.reflection_scale=1 end
	
	--end of default values
	

 	local function rgb_to_r_g_b(col_a)
		return ((col_a[1] / 0x10000) % 0x100) / 255., ((col_a[1] / 0x100) % 0x100) / 255., (col_a[1] % 0x100) / 255., col_a[2]
	end
	
	
	--functions used to create patterns

	local function create_smooth_linear_gradient(x0,y0,x1,y1)
		local pat = cairo_pattern_create_linear (x0,y0,x1,y1)
		cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(t.fg_colour))
		cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(t.alarm_colour))
		if t.mid_colour ~=nil then
			for i=1, #t.mid_colour do
				cairo_pattern_add_color_stop_rgba (pat, t.mid_colour[i][1], rgb_to_r_g_b({t.mid_colour[i][2],t.mid_colour[i][3]}))
			end
		end
		return pat
	end

	local function create_smooth_radial_gradient(x0,y0,r0,x1,y1,r1)
		local pat =  cairo_pattern_create_radial (x0,y0,r0,x1,y1,r1)
		cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(t.fg_colour))
		cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(t.alarm_colour))
		if t.mid_colour ~=nil then
			for i=1, #t.mid_colour do
				cairo_pattern_add_color_stop_rgba (pat, t.mid_colour[i][1], rgb_to_r_g_b({t.mid_colour[i][2],t.mid_colour[i][3]}))
			end
		end
		return pat
	end
	
	local function create_led_linear_gradient(x0,y0,x1,y1,col_alp,col_led)
		local pat = cairo_pattern_create_linear (x0,y0,x1,y1) ---delta, 0,delta+ t.width,0)
		cairo_pattern_add_color_stop_rgba (pat, 0.0, rgb_to_r_g_b(col_alp))
		cairo_pattern_add_color_stop_rgba (pat, 0.5, rgb_to_r_g_b(col_led))
		cairo_pattern_add_color_stop_rgba (pat, 1.0, rgb_to_r_g_b(col_alp))
		return pat
	end

	local function create_led_radial_gradient(x0,y0,r0,x1,y1,r1,col_alp,col_led,mode)
		local pat = cairo_pattern_create_radial (x0,y0,r0,x1,y1,r1)
		if mode==3 then
			cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(col_alp))				
			cairo_pattern_add_color_stop_rgba (pat, 0.5, rgb_to_r_g_b(col_led))
			cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(col_alp))				
		else
			cairo_pattern_add_color_stop_rgba (pat, 0, rgb_to_r_g_b(col_led))
			cairo_pattern_add_color_stop_rgba (pat, 1, rgb_to_r_g_b(col_alp))				
		end
		return pat
	end






	local function draw_single_bar()
		--this fucntion is used for bars with a single block (blocks=1) but 
		--the drawing is cut in 3 blocks : value/alarm/background
		--not zvzimzblr for circular bar
		local function create_pattern(col_alp,col_led,bg)
			local pat
			
			if not t.smooth then
				if t.led_effect=="e" then
					pat = create_led_linear_gradient (-delta, 0,delta+ t.width,0,col_alp,col_led)
				elseif t.led_effect=="a" then
					pat = create_led_linear_gradient (t.width/2, 0,t.width/2,-t.height,col_alp,col_led)
				elseif  t.led_effect=="r" then
					pat = create_led_radial_gradient (t.width/2, -t.height/2, 0, t.width/2,-t.height/2,t.height/1.5,col_alp,col_led,2)
				else
					pat = cairo_pattern_create_rgba  (rgb_to_r_g_b(col_alp))
				end
			else
				if bg then
					pat = cairo_pattern_create_rgba  (rgb_to_r_g_b(t.bg_colour))
				else
					pat = create_smooth_linear_gradient(t.width/2, 0, t.width/2,-t.height)
				end
			end
			return pat
		end
		
		local y1=-t.height*pct/100
		local y2,y3
		if pct>(100*t.alarm/t.max) then 
			y1 = -t.height*t.alarm/100
			y2 = -t.height*pct/100
			if t.smooth then y1=y2 end
		end
		
		if t.angle_bar==0 then
		
			--block for fg value
			local pat = create_pattern(t.fg_colour,t.fg_led,false)
			cairo_set_source(cr,pat)
			cairo_rectangle(cr,0,0,t.width,y1)
			cairo_fill(cr)
			cairo_pattern_destroy(pat)
		
			-- block for alarm value			
			if not t.smooth and y2 ~=nil then 
				pat = create_pattern(t.alarm_colour,t.alarm_led,false)
				cairo_set_source(cr,pat)
				cairo_rectangle(cr,0,y1,t.width,y2-y1)
				cairo_fill(cr)
				y3=y2
				cairo_pattern_destroy(pat)
			else
				y2,y3=y1,y1
			end
			-- block for bg value
			cairo_rectangle(cr,0,y2,t.width,-t.height-y3)
			pat = create_pattern(t.bg_colour,t.bg_led,true)
			cairo_set_source(cr,pat)
			cairo_pattern_destroy(pat)
			cairo_fill(cr)
		end		
	end  --end single bar
	





	local function draw_multi_bar()
		--function used for bars with 2 or more blocks
		for pt = 1,t.blocks do 
			--set block y
			local y1 = -(pt-1)*(t.height+t.space)
			local light_on=false
			
			--set colors
			local col_alp = t.bg_colour
			local col_led = t.bg_led
			if pct>=(100/t.blocks) or pct>0 then --ligth on or not the block
				if pct>=(pcb*(pt-1))  then 
					light_on = true
					col_alp = t.fg_colour
					col_led = t.fg_led
					if pct>=(100*t.alarm/t.max) and (pcb*pt)>(100*t.alarm/t.max) then 
						col_alp = t.alarm_colour 
						col_led = t.alarm_led 
					end
				end
			end

			--set colors
			--have to try to create gradients outside the loop ?
			local pat 
			
			if not t.smooth then
				if t.angle_bar==0 then
					if t.led_effect=="e" then
						pat = create_led_linear_gradient (-delta, 0,delta+ t.width,0,col_alp,col_led)
					elseif t.led_effect=="a" then
						pat = create_led_linear_gradient (t.width/2, -t.height/2+y1,t.width/2,0+t.height/2+y1,col_alp,col_led)					
					elseif  t.led_effect=="r" then
						pat = create_led_radial_gradient (t.width/2, y1, 0, t.width/2,y1,t.width/1.5,col_alp,col_led,2)	
					else
						pat = cairo_pattern_create_rgba  (rgb_to_r_g_b(col_alp))
					end
				else
					 if t.led_effect=="a"  then
						 pat = create_led_radial_gradient (0, 0, t.radius+(t.height+t.space)*(pt-1),
														 0, 0, t.radius+(t.height+t.space)*(pt),						 
											 col_alp,col_led,3)	
					else
						pat = cairo_pattern_create_rgba  (rgb_to_r_g_b(col_alp))					
					end
					
				end
			else
				
				if light_on then
					if t.angle_bar==0 then
						pat = create_smooth_linear_gradient(t.width/2, t.height/2, t.width/2,-(t.blocks-0.5)*(t.height+t.space))
					else
						pat = create_smooth_radial_gradient(0, 0, (t.height+t.space),  0,0,(t.blocks+1)*(t.height+t.space),2)
					end
				else		
					pat = cairo_pattern_create_rgba  (rgb_to_r_g_b(t.bg_colour))
				end
			end
			cairo_set_source (cr, pat)
			cairo_pattern_destroy(pat)

			--draw a block
			if t.angle_bar==0 then
				cairo_move_to(cr,0,y1)
				cairo_line_to(cr,t.width,y1)
			else		
				cairo_arc( cr,0,0,
					t.radius+(t.height+t.space)*(pt)-t.height/2,
					 -t.angle_bar -math.pi/2 ,
					 t.angle_bar -math.pi/2)
			end
			cairo_stroke(cr)
		end	
	end
	
	
	
	
	local function setup_bar_graph()
		--function used to retrieve the value to display and to set the cairo structure
		if t.blocks ~=1 then t.y=t.y-t.height/2 end
		
		local value = 0
		if t.name ~="" then
			value = tonumber(conky_parse(string.format('${%s %s}', t.name, t.arg)))
			--$to_bytes doesn't work when value has a decimal point,
			--https://garage.maemo.org/plugins/ggit/browse.php/?p=monky;a=commitdiff;h=174c256c81a027a2ea406f5f37dc036fac0a524b;hp=d75e2db5ed3fc788fb8514121f67316ac3e5f29f
			--http://sourceforge.net/tracker/index.php?func=detail&aid=3000865&group_id=143975&atid=757310
			--conky bug?
			--value = (conky_parse(string.format('${%s %s}', t.name, t.arg)))
			--if string.match(value,"%w") then
			--	value = conky_parse(string.format('${to_bytes %s}',value))
			--end
		else
			value = tonumber(t.arg)
		end

		if value==nil then value =0 end
		
		pct = 100*value/t.max
		pcb = 100/t.blocks
		
		cairo_set_line_width (cr, t.height)
		cairo_set_line_cap  (cr, cap)
		cairo_translate(cr,t.x,t.y)
		cairo_rotate(cr,t.angle)

		local matrix0 = cairo_matrix_t:create()
		tolua.takeownership(matrix0)
		cairo_matrix_init (matrix0, 1,t.skew_y,t.skew_x,1,0,0)
		cairo_transform(cr,matrix0)

	
		
		--call the drawing function for blocks
		if t.blocks==1 and t.angle_bar==0 then
			draw_single_bar()
			if t.reflection=="t" or t.reflection=="b" then cairo_translate(cr,0,-t.height) end
		else
			draw_multi_bar()
		end

		--dot for reminder
		--[[
		if t.blocks ~=1 then
			cairo_set_source_rgba(cr,1,0,0,1)
			cairo_arc(cr,0,t.height/2,3,0,2*math.pi)
			cairo_fill(cr)
		else
			cairo_set_source_rgba(cr,1,0,0,1)
			cairo_arc(cr,0,0,3,0,2*math.pi)
			cairo_fill(cr)
		end]]
		
		--call the drawing function for reflection and prepare the mask used		
		if t.reflection_alpha>0 and t.angle_bar==0 then
			local pat2
			local matrix1 = cairo_matrix_t:create()
			tolua.takeownership(matrix1)
			if t.angle_bar==0 then
				pts={-delta/2,(t.height+t.space)/2,t.width+delta,-(t.height+t.space)*(t.blocks)}
				if t.reflection=="t" then
					cairo_matrix_init (matrix1,1,0,0,-t.reflection_scale,0,-(t.height+t.space)*(t.blocks-0.5)*2*(t.reflection_scale+1)/2)
					pat2 = cairo_pattern_create_linear (t.width/2,-(t.height+t.space)*(t.blocks),t.width/2,(t.height+t.space)/2)
				elseif t.reflection=="r" then
					cairo_matrix_init (matrix1,-t.reflection_scale,0,0,1,delta+2*t.width,0)
					pat2 = cairo_pattern_create_linear (delta/2+t.width,0,-delta/2,0)
				elseif t.reflection=="l" then
					cairo_matrix_init (matrix1,-t.reflection_scale,0,0,1,-delta,0)
					pat2 = cairo_pattern_create_linear (-delta/2,0,delta/2+t.width,-0)
				else --bottom
					cairo_matrix_init (matrix1,1,0,0,-1*t.reflection_scale,0,(t.height+t.space)*(t.reflection_scale+1)/2)
					pat2 = cairo_pattern_create_linear (t.width/2,(t.height+t.space)/2,t.width/2,-(t.height+t.space)*(t.blocks))
				end
			end
			cairo_transform(cr,matrix1)

			if t.blocks==1 and t.angle_bar==0 then
				draw_single_bar()
				cairo_translate(cr,0,-t.height/2) 
			else
				draw_multi_bar()
			end
			
			
			cairo_set_line_width(cr,0.01)
			cairo_pattern_add_color_stop_rgba (pat2, 0,0,0,0,1-t.reflection_alpha)
			cairo_pattern_add_color_stop_rgba (pat2, t.reflection_length,0,0,0,1)
			if t.angle_bar==0 then
				cairo_rectangle(cr,pts[1],pts[2],pts[3],pts[4])
			end
			cairo_clip_preserve(cr)
			cairo_set_operator(cr,CAIRO_OPERATOR_CLEAR)
			cairo_stroke(cr)
			cairo_mask(cr,pat2)
			cairo_pattern_destroy(pat2)
			cairo_set_operator(cr,CAIRO_OPERATOR_OVER)
			
		end --reflection
		pct,pcb=nil
	end --setup_bar_graph()
	
	--start here !
	setup_bar_graph()
	cairo_restore(cr)
end

function conky_main_box()

    if conky_window==nil then return end
    
	---------------------- PARAMETERS BEGIN HERE
    local boxes_settings={
	{x=0,y=50,w=200,h=60, corners={ {"circle",10} },colour={ {0,0x1F1F1F,0.5} },operator="atop" } ,
	{x=0,y=195,w=200,h=60, corners={ {"circle",10} },colour={ {0,0x1F1F1F,0.5} },operator="atop" } ,
	{x=0,y=320,w=200,h=60, corners={ {"circle",10} },colour={ {0,0x1F1F1F,0.5} },operator="atop" } ,
	{x=0,y=410,w=200,h=60, corners={ {"circle",10} },colour={ {0,0x1F1F1F,0.5} },operator="atop" } ,
	{x=0,y=520,w=200,h=60, corners={ {"circle",10} },colour={ {0,0x1F1F1F,0.5} },operator="atop" } ,
	{x=0,y=615,w=200,h=150, corners={ {"circle",10} },colour={ {0,0x1F1F1F,0.5} },operator="atop" } ,
    }


    ---------------------------- PARAMETERS END HERE
    
    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)
    
    if tonumber(conky_parse("$updates"))<5 then return end
    for i in pairs(boxes_settings) do
        draw_box (cr,boxes_settings[i])
    end
    cairo_destroy(cr)
    cairo_surface_destroy(cs)    
end

    
function draw_box(cr,t)

	if t.draw_me == true then t.draw_me = nil end
	if t.draw_me ~= nil and conky_parse(tostring(t.draw_me)) ~= "1" then return end	

    local table_corners={"circle","curve","line"}

    local t_operators={
        clear   = CAIRO_OPERATOR_CLEAR,
        source  = CAIRO_OPERATOR_SOURCE,
        over    = CAIRO_OPERATOR_OVER,
        ["in"]      = CAIRO_OPERATOR_IN,
        out     = CAIRO_OPERATOR_OUT,
        atop    = CAIRO_OPERATOR_ATOP,
        dest    = CAIRO_OPERATOR_DEST,
        dest_over   = CAIRO_OPERATOR_DEST_OVER,
        dest_in = CAIRO_OPERATOR_DEST_IN,
        dest_out = CAIRO_OPERATOR_DEST_OUT,
        dest_atop = CAIRO_OPERATOR_DEST_ATOP,
        xor = CAIRO_OPERATOR_XOR,
        add = CAIRO_OPERATOR_ADD,
        saturate =  CAIRO_OPERATOR_SATURATE,
    }
        
    function rgba_to_r_g_b_a(tc)
        --tc={position,colour,alpha}
        local colour = tc[2]
        local alpha = tc[3]
        return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
    end

    function table.copy(t)
      local t2 = {}
      for k,v in pairs(t) do
       t2[k] = {v[1],v[2]}
      end
      return t2
    end

    function draw_corner(num,t)
        local shape=t[1]
        local radius=t[2]
        local x,y = t[3],t[4]
        if shape=="line" then
            if num == 1 then cairo_line_to(cr,radius,0) 
                elseif num == 2 then cairo_line_to(cr,x,radius) 
                elseif num == 3 then cairo_line_to(cr,x-radius,y)
                elseif num == 4 then cairo_line_to(cr,0,y-radius)
            end
        end
        if shape=="circle" then
		    local PI = math.pi
           if num == 1 then cairo_arc(cr,radius,radius,radius,-PI,-PI/2)
                elseif num == 2 then cairo_arc(cr,x-radius,y+radius,radius,-PI/2,0)
                elseif num == 3 then cairo_arc(cr,x-radius,y-radius,radius,0,PI/2) 
                elseif num == 4 then cairo_arc(cr,radius,y-radius,radius,PI/2,-PI)
            end
        end
        if shape=="curve" then
            if num == 1 then cairo_curve_to(cr,0,radius ,0,0 ,radius,0) 
                elseif num == 2 then cairo_curve_to(cr,x-radius,0, x,y, x,radius)
                elseif num == 3 then cairo_curve_to(cr,x,y-radius, x,y, x-radius,y)
                elseif num == 4 then cairo_curve_to(cr,radius,y, x,y, 0,y-radius)
            end
        end        
    end   

    --check values and set default values
    if t.x == nil then t.x = 0 end
    if t.y == nil then t.y = 0 end
    if t.w == nil then t.w = conky_window.width end
    if t.h == nil then t.h = conky_window.height end
    if t.radius == nil then t.radius = 0 end
    if t.border == nil then t.border = 0 end
    if t.colour==nil then t.colour={{1,0xFFFFFF,0.5}} end
    if t.linear_gradient ~= nil then 
        if #t.linear_gradient ~= 4 then
            t.linear_gradient = {t.x,t.y,t.width,t.height}
        end
    end 
    if t.angle==nil then t.angle = 0 end

	if t.skew_x == nil then t.skew_x=0  end
	if t.skew_y == nil then  t.skew_y=0 end
	if t.scale_x==nil then t.scale_x=1 end
	if t.scale_y==nil then t.scale_y=1 end	
	if t.rot_x == nil then t.rot_x=0  end
	if t.rot_y == nil then  t.rot_y=0 end
    
    if t.operator == nil then t.operator = "over" end
    if (t_operators[t.operator]) == nil then
        print ("wrong operator :",t.operator)
        t.operator = "over"
    end
    
    if t.radial_gradient ~= nil then 
        if #t.radial_gradient ~= 6 then
            t.radial_gradient = {t.x,t.y,0, t.x,t.y, t.width}
        end
    end 
    
    for i=1, #t.colour do    
        if #t.colour[i]~=3 then 
            print ("error in color table")
            t.colour[i]={1,0xFFFFFF,1} 
        end
    end

    if t.corners == nil then t.corners={ {"line",0} } end
    local t_corners = {}
    local t_corners = table.copy(t.corners)
    --don't use t_corners=t.corners otherwise t.corners is altered

    --complete the t_corners table if needed
    for i=#t_corners+1,4 do    
        t_corners[i]=t_corners[#t_corners]
        local flag=false
        for j,v in pairs(table_corners) do flag=flag or (t_corners[i][1]==v) end 
        if not flag then print ("error in corners table :",t_corners[i][1]);t_corners[i][1]="curve"  end
    end

    --this way :    
    --    t_corners[1][4]=x    
    --    t_corners[2][3]=y
    --doesn't work
    t_corners[1]={t_corners[1][1],t_corners[1][2],0,0}
    t_corners[2]={t_corners[2][1],t_corners[2][2],t.w,0}
    t_corners[3]={t_corners[3][1],t_corners[3][2],t.w,t.h}    
    t_corners[4]={t_corners[4][1],t_corners[4][2],0,t.h}        

    t.no_gradient = (t.linear_gradient == nil ) and (t.radial_gradient == nil )

    cairo_save(cr)
    cairo_translate(cr, t.x, t.y)
    if t.rot_x~=0 or t.rot_y~=0 or t.angle~=0 then
        cairo_translate(cr,t.rot_x,t.rot_y)
        cairo_rotate(cr,t.angle*math.pi/180)
        cairo_translate(cr,-t.rot_x,-t.rot_y)
    end
    if t.scale_x~=1 or t.scale_y~=1 or t.skew_x~=0 or t.skew_y~=0 then
	    local matrix0 = cairo_matrix_t:create()
	    tolua.takeownership(matrix0)
	    cairo_matrix_init (matrix0, t.scale_x,math.pi*t.skew_y/180	, math.pi*t.skew_x/180	,t.scale_y,0,0)
	    cairo_transform(cr,matrix0)    
    end
    
    local tc=t_corners
    cairo_move_to(cr,tc[1][2],0)
    cairo_line_to(cr,t.w-tc[2][2],0)
    draw_corner(2,tc[2])
    cairo_line_to(cr,t.w,t.h-tc[3][2])
    draw_corner(3,tc[3])
    cairo_line_to(cr,tc[4][2],t.h)
    draw_corner(4,tc[4])
    cairo_line_to(cr,0,tc[1][2])
    draw_corner(1,tc[1])
    
    if t.no_gradient then
        cairo_set_source_rgba(cr,rgba_to_r_g_b_a(t.colour[1]))
    else
        if t.linear_gradient ~= nil then
            pat = cairo_pattern_create_linear (t.linear_gradient[1],t.linear_gradient[2],t.linear_gradient[3],t.linear_gradient[4])
        elseif t.radial_gradient ~= nil then
            pat = cairo_pattern_create_radial (t.radial_gradient[1],t.radial_gradient[2],t.radial_gradient[3],
            	t.radial_gradient[4],t.radial_gradient[5],t.radial_gradient[6])
        end
        for i=1, #t.colour do
            cairo_pattern_add_color_stop_rgba (pat, t.colour[i][1], rgba_to_r_g_b_a(t.colour[i]))
        end
        cairo_set_source (cr, pat)
        cairo_pattern_destroy(pat)
    end 
     
    cairo_set_operator(cr,t_operators[t.operator]) 

    if t.border>0 then
        cairo_close_path(cr)
        if t.dash ~= nil then cairo_set_dash(cr, t.dash, 1, 0.0) end
        cairo_set_line_width(cr,t.border)
        cairo_stroke(cr)
    else
        cairo_fill(cr)
    end

    cairo_restore(cr)
end

textsys.lua:

--[[TEXT WIDGET v1.42 by Wlourf 07 Feb. 2011

This widget can drawn texts set in the "text_settings" table with some parameters
http://u-scripts.blogspot.com/2010/06/text-widget.html

To call the script in a conky, use, before TEXT
	lua_load /path/to/the/script/graph.lua
	lua_draw_hook_pre main_graph
and add one line (blank or not) after TEXT

The parameters (all optionals) are :
text        - text to display, default = "Conky is good for you"
              it can be used with conky variables, i.e. text="my cpu1 is ${cpu cpu1} %")
            - coordinates below are relative to top left corner of the conky window
x           - x coordinate of first letter (bottom-left), default = center of conky window
y           - y coordinate of first letter (bottom-left), default = center of conky window
h_align		- horizontal alignement of text relative to point (x,y), default="l"
			  available values are "l": left, "c" : center, "r" : right
v_align		- vertical alignment of text relative to point (x,y), default="b"
			  available values "t" : top, "m" : middle, "b" : bottom
font_name   - name of font to use, default = Free Sans
font_size   - size of font to use, default = 14
italic      - display text in italic (true/false), default=false
oblique     - display text in oblique (true/false), default=false (I don' see the difference with italic!)
bold        - display text in bold (true/false), default=false
angle       - rotation of text in degrees, default = 0 (horizontal)
colour      - table of colours for text, default = plain white {{1,0xFFFFFF,1}}
			  this table contains one or more tables with format {P,C,A}
              P=position of gradient (0 = beginning of text, 1= end of text)
              C=hexadecimal colour 
              A=alpha (opacity) of color (0=invisible,1=opacity 100%)
              Examples :
              for a plain color {{1,0x00FF00,0.5}}
              for a gradient with two colours {{0,0x00FF00,0.5},{1,0x000033,1}}
              or {{0.5,0x00FF00,1},{1,0x000033,1}} -with this one, gradient will start in the middle of the text
              for a gradient with three colours {{0,0x00FF00,0.5},{0.5,0x000033,1},{1,0x440033,1}}
			  and so on ...
orientation	- in case of gradient, "orientation" defines the starting point of the gradient, default="ww"
			  there are 8 available starting points : "nw","nn","ne","ee","se","ss","sw","ww"
			  (n for north, w for west ...)
			  theses 8 points are the 4 corners + the 4 middles of text's outline
			  so a gradient "nn" will go from "nn" to "ss" (top to bottom, parallele to text)
			  a gradient "nw" will go from "nw" to "se" (left-top corner to right-bottom corner)
radial		- define a radial gradient (if present at the same time as "orientation", "orientation" will have no effect)
			  this parameter is a table with 6 numbers : {xa,ya,ra,xb,yb,rb}
			  they define two circle for the gradient :
			  xa, ya, xb and yb are relative to x and y values above
reflection_alpha    - add a reflection effect (values from 0 to 1) default = 0 = no reflection
                      other values = starting opacity
reflection_scale    - scale of the reflection (default = 1 = height of text)
reflection_length   - length of reflection, define where the opacity will be set to zero
					  calues from 0 to 1, default =1
skew_x,skew_y    - skew text around x or y axis
draw_me     - if set to false, text is not drawn (default = true or 1)
              it can be used with a conky string, if the string returns 1, the text is drawn :
              example : "${if_empty ${wireless_essid wlan0}}${else}1$endif",
              


v1.0	07/06/2010, Original release
v1.1	10/06/2010	Add "orientation" parameter
v1.2	15/06/2010  Add "h_align", "v_align" and "radial" parameters
v1.3	25/06/2010  Add "reflection_alpha", "reflection_length", "reflection_scale", 
                    "skew_x" et "skew_y"
v1.4    07/01/2011  Add draw_me parameter and correct memory leaks, thanks to "Creamy Goodness"
                    text is parsed inside the function, not in the array of settings
v1.41   26/01/2011  Correct bug for h_align="c"    
v1.42   09/02/2011  Correct bug for orientation="ee"                

--      This program is free software; you can redistribute it and/or modify
--      it under the terms of the GNU General Public License as published by
--      the Free Software Foundation version 3 (GPLv3)
--     
--      This program is distributed in the hope that it will be useful,
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      GNU General Public License for more details.
--     
--      You should have received a copy of the GNU General Public License
--      along with this program; if not, write to the Free Software
--      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
--      MA 02110-1301, USA.		

]]
require 'cairo'


function conky_draw_text()
	--BEGIN OF PARAMETRES
	local ts=os.date("*t")
    local text_settings={
--sda1
{    
			text=conky_parse("home: "),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=7,
			y=100,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
		},
    
{
			text=conky_parse("${fs_used_perc /home}% / ${fs_size /}"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=190,
			y=100,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		
--======================================================================
--==TIME==--
{
			text=conky_parse("${time %H:%M}"),
			font_name="Zero Twos",
			font_size=80,
			bold=true,
			x=7,
			y=70,
			--reflection_alpha=0.7,
			--reflection_length=0.7,
			colour={{0,0x3D3DFD,1},{1,0xD04BFF,1}},
			radial={0,-550,500,00,-4995,5000},
		},		
		{
			text=conky_parse("sda3:"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=7,
			y=120,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		{
			text=conky_parse("${fs_used_perc /media/stock2}% / ${fs_size /media/stock2}"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=190,
			y=120,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
--sdb1
{
			text=conky_parse("sdb1:"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=7,
			y=140,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		{
			text=conky_parse("${fs_used_perc /media/raphix/share}% / ${fs_size /media/raphix/share}"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=190,
			y=140,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
--sdb3

{
			text=conky_parse("sdb3:"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=7,
			y=160,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		{
			text=conky_parse("${fs_used_perc /media/raphix/stock}% / ${fs_size /media/raphix/stock}"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=190,
			y=160,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},	
--cpu		
		{
			text=conky_parse("${cpu}%"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=190,
			y=180,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		{
			text=conky_parse("cpu:"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=7,
			y=180,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		
--temp: ${hwmon 0 temp 1}°
{
			text=conky_parse("${hwmon 0 temp 1}°"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=235,
			y=180,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},

		{
			text=conky_parse("$memperc% $mem/$memmax"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=170,
			y=200,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
		{
			text=conky_parse("ram:"),
			font_name="Hack",
			font_size=10,
			bold=true,
			x=7,
			y=200,
			--reflection_alpha=0.9,
			--reflection_length=0.7,			
			colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			--radial={0,-550,500,00,-4995,5000},
		},
---Down_up
        {
		    text='dl|ul',
		    y=230,
		    x=120,
		    font_name="Hack",
		    font_size=12,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,			
        },  
        {
		    text=conky_parse('${downspeed eth0} / ${totaldown eth0}'),
		    y=230,
		    x=7,
		    font_name="Hack",
		    font_size=7,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,			
        },  
        {
		    text=conky_parse('${upspeed eth0} / ${totalup eth0}'),
		    y=230,
		    x=210,
		    font_name="Hack",
		    font_size=7,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,			
        },  
        
        {
		    text=conky_parse("topcpu:"),
		    y=243,
		    x=7,
		    font_name="Hack",
		    font_size=8,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,			
        },  
        
        {
		    text=conky_parse("topram:"),
		    y=253,
		    x=7,
		    font_name="Hack",
		    font_size=8,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,			
        },  
        {
		    text=conky_parse("${top name 1}${top cpu 1}%"),
		    y=243,
		    x=160,
		    font_name="Hack",
		    font_size=8,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,
        },
    	{
    		text=conky_parse("${top_mem name 1}${top_mem mem 1}%"),
    		y=253,
		    x=160,
		    font_name="Hack",
		    font_size=8,
		    bold=true,
		   	colour={{0,0x3D3DFD,0.7},{0.5,0x7474B6,1},{1,0x5656EA,0.7}},
			orientation="nn",
    		--reflection_alpha=0.9,
    		--reflection_length=0.7,
        },
 
    	}
	   
--------------END OF PARAMETERES----------------

    if conky_window == nil then return end
    if tonumber(conky_parse("$updates"))<3 then return end
       
    local cs = cairo_xlib_surface_create(conky_window.display, conky_window.drawable, conky_window.visual, conky_window.width, conky_window.height)
		
    for i,v in pairs(text_settings) do    
        cr = cairo_create (cs)
        display_text(v)
        cairo_destroy(cr)
	    cr = nil
    end
    
    cairo_surface_destroy(cs)
		
end

function rgb_to_r_g_b2(tcolour)
    local colour,alpha=tcolour[2],tcolour[3]
    return ((colour / 0x10000) % 0x100) / 255., ((colour / 0x100) % 0x100) / 255., (colour % 0x100) / 255., alpha
end

function display_text(t)
    if t.draw_me==true then t.draw_me = nil end
    if t.draw_me~=nil and conky_parse(tostring(t.draw_me)) ~= "1" then return end
    local function set_pattern(te)
        --this function set the pattern
        if #t.colour==1 then 
            cairo_set_source_rgba(cr,rgb_to_r_g_b2(t.colour[1]))
        else
            local pat
            
            if t.radial==nil then
                local pts=linear_orientation(t,te)
                pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4])
            else
                pat = cairo_pattern_create_radial (t.radial[1],t.radial[2],t.radial[3],t.radial[4],t.radial[5],t.radial[6])
            end
        
            for i=1, #t.colour do
                cairo_pattern_add_color_stop_rgba (pat, t.colour[i][1], rgb_to_r_g_b2(t.colour[i]))
            end
            cairo_set_source (cr, pat)
            cairo_pattern_destroy(pat)
        end
    end
    
    --set default values if needed
    if t.text==nil then t.text="Conky is good for you !" end
    if t.x==nil then t.x = conky_window.width/2 end
    if t.y==nil then t.y = conky_window.height/2 end
    if t.colour==nil then t.colour={{1,0xFFFFFF,1}} end
    if t.font_name==nil then t.font_name="Arial" end
    if t.font_size==nil then t.font_size=14 end
    if t.angle==nil then t.angle=0 end
    if t.italic==nil then t.italic=false end
    if t.oblique==nil then t.oblique=false end
    if t.bold==nil then t.bold=false end
    if t.radial ~= nil then
        if #t.radial~=6 then 
            print ("error in radial table")
            t.radial=nil 
        end
    end
    if t.orientation==nil then t.orientation="ww" end
    if t.h_align==nil then t.h_align="l" end
    if t.v_align==nil then t.v_align="b" end    
    if t.reflection_alpha == nil then t.reflection_alpha=0 end
    if t.reflection_length == nil then t.reflection_length=1 end
    if t.reflection_scale == nil then t.reflection_scale=1 end
    if t.skew_x==nil then t.skew_x=0 end
    if t.skew_y==nil then t.skew_y=0 end    
    cairo_translate(cr,t.x,t.y)
    cairo_rotate(cr,t.angle*math.pi/180)
    cairo_save(cr)       
     
    local slant = CAIRO_FONT_SLANT_NORMAL
    local weight = CAIRO_FONT_WEIGHT_NORMAL
    if t.italic then slant = CAIRO_FONT_SLANT_ITALIC end
    if t.oblique then slant = CAIRO_FONT_SLANT_OBLIQUE end
    if t.bold then weight = CAIRO_FONT_WEIGHT_BOLD end
    
    cairo_select_font_face(cr, t.font_name, slant,weight)
 
    for i=1, #t.colour do    
        if #t.colour[i]~=3 then 
            print ("error in color table")
            t.colour[i]={1,0xFFFFFF,1} 
        end
    end

    local matrix0 = cairo_matrix_t:create()
    tolua.takeownership(matrix0) 
    local skew_x,skew_y=t.skew_x/t.font_size,t.skew_y/t.font_size
    cairo_matrix_init (matrix0, 1,skew_y,skew_x,1,0,0)
    cairo_transform(cr,matrix0)
    cairo_set_font_size(cr,t.font_size)
    local te=cairo_text_extents_t:create()
    tolua.takeownership(te) 
    local text=conky_parse(t.text)
    if text~="" then t.text = text end
    cairo_text_extents (cr,t.text,te)
    set_pattern(te)
            
    local mx,my=0,0
    
    if t.h_align=="c" then
        mx=-te.width/2-te.x_bearing
    elseif t.h_align=="r" then
        mx=-te.width
    end
    if t.v_align=="m" then
        my=-te.height/2-te.y_bearing
    elseif t.v_align=="t" then
        my=-te.y_bearing
    end
    cairo_move_to(cr,mx,my)
    
    cairo_show_text(cr,t.text)

     
        
        
   if t.reflection_alpha ~= 0 then 
        local matrix1 = cairo_matrix_t:create()
		tolua.takeownership(matrix1)         
        cairo_set_font_size(cr,t.font_size)

        cairo_matrix_init (matrix1,1,0,0,-1*t.reflection_scale,0,(te.height+te.y_bearing+my)*(1+t.reflection_scale))
        cairo_set_font_size(cr,t.font_size)
        te=nil
        local te=cairo_text_extents_t:create()
        tolua.takeownership(te) 
        cairo_text_extents (cr,t.text,te)
        
                
        cairo_transform(cr,matrix1)
        set_pattern(te)
        cairo_move_to(cr,mx,my)
        cairo_show_text(cr,t.text)

        local pat2 = cairo_pattern_create_linear (0,
                                        (te.y_bearing+te.height+my),
                                        0,
                                        te.y_bearing+my)
        cairo_pattern_add_color_stop_rgba (pat2, 0,1,0,0,1-t.reflection_alpha)
        cairo_pattern_add_color_stop_rgba (pat2, t.reflection_length,0,0,0,1)    
        
        --line is not drawn but with a size of zero, the mask won't be nice
        cairo_set_line_width(cr,1)
        local dy=te.x_bearing
        if dy<0 then dy=dy*(-1) end
        cairo_rectangle(cr,mx+te.x_bearing,te.y_bearing+te.height+my,te.width+dy,-te.height*1.05)
        cairo_clip_preserve(cr)
        cairo_set_operator(cr,CAIRO_OPERATOR_CLEAR)
        --cairo_stroke(cr)
        cairo_mask(cr,pat2)
        cairo_pattern_destroy(pat2)
        cairo_set_operator(cr,CAIRO_OPERATOR_OVER)
        te=nil
    end
    
end


function linear_orientation(t,te)
    local w,h=te.width,te.height
    local xb,yb=te.x_bearing,te.y_bearing
    
    if t.h_align=="c" then
        xb=xb-w/2
    elseif t.h_align=="r" then
        xb=xb-w
       end    
    if t.v_align=="m" then
        yb=-h/2
    elseif t.v_align=="t" then
        yb=0
       end    
    local p=0
    if t.orientation=="nn" then
        p={xb+w/2,yb,xb+w/2,yb+h}
    elseif t.orientation=="ne" then
        p={xb+w,yb,xb,yb+h}
    elseif t.orientation=="ww" then
        p={xb,h/2,xb+w,h/2}
    elseif vorientation=="se" then
        p={xb+w,yb+h,xb,yb}
    elseif t.orientation=="ss" then
        p={xb+w/2,yb+h,xb+w/2,yb}
    elseif t.orientation=="ee" then
        p={xb+w,h/2,xb,h/2}        
    elseif t.orientation=="sw" then
        p={xb,yb+h,xb+w,yb}
    elseif t.orientation=="nw" then
        p={xb,yb,xb+w,yb+h}
    end
    return p
end

netgraph.lua:

--[[ GRAPH widget v1.1 by wlourf (07.01.2011)
        this widget draws some graphs with some effects
        http://u-scripts.blogspot.com/2010/10/graph-widget.html

To call the script in a conky, use, before TEXT
        lua_load /path/to/the/script/graph.lua
        lua_draw_hook_pre main_graph
and add one line (blank or not) after TEXT


Parameters are :
3 parameters are mandatory
name            - the name of the conky variable to display,
                          for example for {$cpu cpu0}, just write name="cpu"
arg                     - the argument of the above variable,
                          for example for {$cpu cpu1}, just write arg="cpu1"
                          arg can be a numerical value if name=""
max                     - the maximum value the above variable can reach,
                          for example for {$cpu cpu1}, just write max=100 or less or more

Optional parameters:
x,y             - coordinates of the bottom-left corner of the graph,
              relative to the top-left corner of the conky window
                          default =  bottom-left corner of the conky window
width       - width of the graph, default = 100 pixels
height      - height of the graph, default = 20 pixels
nb_values   - number of values to display in the graph, default=width
              i.e. 1 pixel for 1 value
autoscale   - if set to true, calculate the max valeu of the y axis and
              doesn't use the max parameter above, default=false
skew_x      - skew graph around x axis, défaut = 0
skew_y      - skew graph around y axis, défaut = 0
angle       - angle of rotation of the graph in degress, default = 0
              i.e. a horizontal graph)
inverse     - if set to true, graph are draw from right to left, default=false
background  - if set to false, background is not drawn, default=true
foreground  - if set to false, foreground is not drawn, default=true
              foreground = plain graph
bg_bd_size  - size of the border of the background, default=0=no border
fg_bd_size  - size of the border of the foreground, default=0=no border


Colours tables below are defined into braces :
{position in the gradient (0 to 1), colour in hexadecimal, alpha (0 to 1)}
example for a single colour table :
{{0,0xFFAA00,1}} position parameter doesn't matter
example for a two-colours table :
{{0,0xFFAA00,1},{1,0x00AA00,1}} or {{0.5,0xFFAA00,1},{1,0x00AA00,1}}
example for a three-colours table :
{{0,0xFFAA00,1},{0.5,0xFF0000,1},{1,0x00AA00,1}}

bg_colour       - colour table for background,
                          default = {{0,0x000000,.5},{1,0xFFFFFF,.5}}
fg_colour       - colour table for foreground,
                          default = {{0,0x00FFFF,1},{1,0x0000FF,1}}
bg_bd_colour- colour table for background border,
                          default = {{1,0xFFFFFF,1}}
fg_bd_colour- colour table for foreground border,
                          default = {{1,0xFFFF00,1}}

bg_orientation, bg_bd_orientation, fg_orientation, fg_bd_orientation,
                - "orientation" defines the starting point of the gradient,
                  default="nn"
                          there are 8 available starting points :
                          "nw","nn","ne","ee","se","ss","sw","ww"
                          (n for north, w for west ...)
                          theses 8 points are the 4 corners + the 4 middles of graph
                          so a gradient "nn" will go from "nn" to "ss"
                          a gradient "nw" will go from "nw" to "se"

draw_me     - if set to false, graph is not drawn (default = true)
              it can be used with a conky string, if the string returns 1, the graph is drawn :
              example : "${if_empty ${wireless_essid wlan0}}${else}1$endif",

v1.0 (31/10/2010) original release
v1.1 (07/01/2011) Add draw_me parameter and correct memory leaks, thanks to "Creamy Goodness"
                  text is parsed inside the function, not in the array of settings

--      This program is free software; you can redistribute it and/or modify
--      it under the terms of the GNU General Public License as published by
--      the Free Software Foundation version 3 (GPLv3)
--
--      This program is distributed in the hope that it will be useful,
--      but WITHOUT ANY WARRANTY; without even the implied warranty of
--      MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
--      GNU General Public License for more details.
--
--      You should have received a copy of the GNU General Public License
--      along with this program; if not, write to the Free Software
--      Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
--      MA 02110-1301, USA.

]]


require 'cairo'


function set_settings()
        graph_settings={

           --[[background {
            name="",
            arg=0,
            max=1,
            x=0,
        y=38,
        width=1920,
        height=40,
        foreground=false,
        bg_colour=col_bg,
            },]]----test
            
            --##left cpu graphes##--
            ---bleu

{
            name="upspeedf",
            arg="eth0",
            max=100,
        y=230,
        x=160,
        autoscale=true,
        inverse=true,
        width=40,
        height=10,
        nb_values=50,
        background=false,
        fg_bd_size=.5,
        foreground=false,
        --fg_colour={{0.5,0xFFAA00,1},{1,0x00AA00,1}},
        fg_bd_colour = { {0.5,0xD04BFF,1},{.75,0x3D3DFD,1},
                     },
            },
            
--violet
        {
            name="downspeedf",
            arg="eth0",
            max=100,
        y=230,
        x=73,
        autoscale=true,
        --inverse=true,
        width=40,
        height=10,
        nb_values=50,
        background=false,
        fg_bd_size=.5,
        foreground=false,
        --fg_colour={{0.5,0xFFAA00,1},{1,0x00AA00,1}},
        fg_bd_colour = { {0.5,0xD04BFF,1},{.75,0x3D3DFD,1},
                     },
            },
            --##right cpu graphes##--
            {
            name="cpu",
            arg="cpu1",
            max=100,
        y=255,
        x=45,
        autoscale=true,
        inverse=true,
        width=105,
        height=20,
        nb_values=100,
        background=false,
        fg_bd_size=.7,
        foreground=false,
        --fg_colour={{0.5,0xFFAA00,1},{1,0x00AA00,1}},
        fg_bd_colour = { {0.5,0xD04BFF,1},{.75,0x3D3DFD,1},
                     },
            },
--[[{
            name="memperc",
            arg="%S",
            max=100,
        y=255,
        x=45,
        autoscale=true,
        inverse=true,
        width=105,
        height=10,
        nb_values=55,
        background=false,
        fg_bd_size=.5,
        foreground=false,
        --fg_colour={{0.5,0xFFAA00,1},{1,0x00AA00,1}},
        fg_bd_colour = { {0.5,0xD04BFF,1},{.75,0x3D3DFD,1},
                     },
            },

       {
            name="cpu",
            arg="cpu",
            max=100,
        y=50,
        x=1010,
        autoscale=true,
        width=200,
        height=20,
        nb_values=200,
        --angle=180,
        inverse=true,
        background=false,
        fg_bd_size=1.5,
        foreground=false,
        --fg_colour={{0.5,0xFF1A00,1},{1,0x01AA00,1}},
        fg_bd_colour = { {0.5,0x00EE00,1},{.75,0x008B00,1},
                     },
            },--]]
            
       }
end

---END OF PARAMETERS ---

function check_settings(t)
    --tables are check only when conky start
        if t.name==nil and t.arg==nil then
                print ("No input values ... use parameters 'name'" ..
                        " with 'arg' or only parameter 'arg' ")
                return 1
        end

        if t.max==nil then
                print ("No maximum value defined, use 'max'")
                print ("for name=" .. t.name .. " with arg=" .. t.arg)
                return 1
        end
        if t.name==nil then t.name="" end
        if t.arg==nil then t.arg="" end
        return 0
end

function conky_main_graph()

    if conky_window == nil then return end

    local w=conky_window.width
    local h=conky_window.height
    local cs=cairo_xlib_surface_create(conky_window.display,
            conky_window.drawable, conky_window.visual, w, h)
    cr=cairo_create(cs)

    updates=tonumber(conky_parse('${updates}'))
    --start drawing after "updates_gap" updates
    --prevent segmentation error for cpu
    updates_gap=5
    if updates==1 then
        set_settings()

            flagOK=0
                for i in pairs(graph_settings) do
                        if graph_settings[i].width==nil then graph_settings[i].width=100 end
                if graph_settings[i].nb_values==nil then
                    graph_settings[i].nb_values= graph_settings[i].width
                end
                        --create an empty table to store values
                        graph_settings[i]["values"]={}
                        --beginning point
                        graph_settings[i].beg = graph_settings[i].nb_values
                        --graph_settings[i].beg = 0
                        for j =1, graph_settings[i].nb_values do
                            graph_settings[i].values[j]=0
                        end
                    graph_settings[i].flag_init=true
                    flagOK=flagOK + check_settings(graph_settings[i])

                end
    end

    if flagOK>0 then
        --abort script if error in one of the tables
        print ("ERROR : Check the graph_setting table")
        return
    end

    --drawing process
    if updates > updates_gap then
                for i in pairs(graph_settings) do
                    if graph_settings[i].draw_me==true then graph_settings[i].draw_me = nil end
                        if (graph_settings[i].draw_me==nil or conky_parse(tostring(graph_settings[i].draw_me)) == "1") then
                            local nb_values=graph_settings[i].nb_values
                            graph_settings[i].automax=0
                            for j =1, nb_values do
                                    if graph_settings[i].values[j+1]==nil then
                                        graph_settings[i].values[j+1]=0
                                    end

                                    graph_settings[i].values[j]=graph_settings[i].values[j+1]
                                    if j==nb_values then
                                            --store value
                                            if graph_settings[i].name=="" then
                                                value=graph_settings[i].arg
                                            else
                                                value=tonumber(conky_parse('${' ..
                                                    graph_settings[i].name .. " " ..
                                                    graph_settings[i].arg ..'}'))
                                    end
                                        if value==nil then
                                            graph_settings[i].values[nb_values]=0
                                        else
                                            graph_settings[i].values[nb_values]=value
                                        end
                                    end
                                    graph_settings[i].automax=math.max(graph_settings[i].automax,
                                                                       graph_settings[i].values[j])
                                --should stop weird glitches at beginning when no values reported yet for upspeed or diskio
                    if graph_settings[i].automax == 0 then graph_settings[i].automax = 1 end
                end
                            draw_graph(graph_settings[i])
                    end
                end
    end

    cairo_destroy(cr)
    cairo_surface_destroy(cs)
        updates=nil
        updates_gap=nil
end


function draw_graph(t)
    --drawing function

    local function rgb_to_r_g_b(colour)
        return ((colour[2] / 0x10000) % 0x100) / 255., ((colour[2] / 0x100) % 0x100) / 255., (colour[2] % 0x100) / 255., colour[3]
    end

        local function linear_orientation(o,w,h)
            --set gradient for bg and bg border
            local p
                if o=="nn" then
                        p={w/2,h,w/2,0}
                elseif o=="ne" then
                        p={w,h,0,0}
                elseif o=="ww" then
                        p={0,h/2,w,h/2}
                elseif o=="se" then
                        p={w,0,0,h}
                elseif o=="ss" then
                        p={w/2,0,w/2,h}
                elseif o=="ee" then
                        p={w,h/2,0,h/2}
                elseif o=="sw" then
                        p={0,0,w,h}
                elseif o=="nw" then
                        p={0,h,w,0}
                end
                return p
        end

        local function linear_orientation_inv(o,w,h)
            --set gradient for fg and fg border
            local p
                if o=="ss" then
                        p={w/2,h,w/2,0}
                elseif o=="sw" then
                        p={w,h,0,0}
                elseif o=="ee" then
                        p={0,h/2,w,h/2}
                elseif o=="nw" then
                        p={w,0,0,h}
                elseif o=="nn" then
                        p={w/2,0,w/2,h}
                elseif o=="ww" then
                        p={w,h/2,0,h/2}
                elseif o=="ne" then
                        p={0,0,w,h}
                elseif o=="se" then
                        p={0,h,w,0}
                end
                return p
        end


        --set default values

    --cancel drawing if not needed
        if t.draw_me~=nil and conky_parse(tostring(t.draw_me)) ~= "1" then
                return
        end



        if t.height==nil        then t.height=20 end
        --checked in previous part : width and nb_values

        if t.background==nil    then t.background=true end
        if t.bg_bd_size==nil    then t.bg_bd_size=0 end
        if t.x==nil                 then t.x=t.bg_bd_size end
        if t.y==nil                 then t.y=conky_window.height -t.bg_bd_size end
        if t.bg_colour==nil     then t.bg_colour={{0,0x000000,.5},{1,0xFFFFFF,.5}} end
        if t.bg_bd_colour==nil  then t.bg_bd_colour={{1,0xFFFFFF,1}} end

        if t.foreground==nil    then t.foreground=true end
        if t.fg_colour==nil     then t.fg_colour={{0,0x00FFFF,1},{1,0x0000FF,1}} end

        if t.fg_bd_size==nil    then t.fg_bd_size=0 end
        if t.fg_bd_colour==nil  then t.fg_bd_colour={{1,0xFFFF00,1}} end

        if t.autoscale==nil     then t.autoscale=false end
        if t.inverse==nil       then t.inverse=false end
        if t.angle==nil         then t.angle=0 end

        if t.bg_bd_orientation==nil then t.bg_bd_orientation="nn" end
        if t.bg_orientation==nil then t.bg_orientation="nn" end
        if t.fg_bd_orientation==nil then t.fg_bd_orientation="nn" end
        if t.fg_orientation==nil then t.fg_orientation="nn" end

    --check colours tables
        for i=1, #t.fg_colour do
        if #t.fg_colour[i]~=3 then
                print ("error in fg_colour table")
                t.fg_colour[i]={1,0x0000FF,1}
        end
    end

        for i=1, #t.fg_bd_colour do
        if #t.fg_bd_colour[i]~=3 then
                print ("error in fg_bd_colour table")
                t.fg_bd_colour[i]={1,0x00FF00,1}
        end
    end

        for i=1, #t.bg_colour do
        if #t.bg_colour[i]~=3 then
                print ("error in background color table")
                t.bg_colour[i]={1,0xFFFFFF,0.5}
        end
    end

        for i=1, #t.bg_bd_colour do
        if #t.bg_bd_colour[i]~=3 then
                print ("error in background border color table")
                t.bg_bd_colour[i]={1,0xFFFFFF,1}
        end
    end

    --calculate skew parameters if needed
    if t.flag_init then
            if t.skew_x == nil then
                    t.skew_x=0
            else
                    t.skew_x = math.pi*t.skew_x/180
            end
            if t.skew_y == nil then
                    t.skew_y=0
            else
                    t.skew_y = math.pi*t.skew_y/180
            end
            t.flag_init=false
        end

    cairo_set_line_cap(cr,CAIRO_LINE_CAP_ROUND)
    cairo_set_line_join(cr,CAIRO_LINE_JOIN_ROUND)

    local matrix0 = cairo_matrix_t:create()
    tolua.takeownership(matrix0)
    cairo_save(cr)
    cairo_matrix_init (matrix0, 1,t.skew_y,t.skew_x,1,0,0)
    cairo_transform(cr,matrix0)

        local ratio=t.width/t.nb_values

        cairo_translate(cr,t.x,t.y)
        cairo_rotate(cr,t.angle*math.pi/180)
        cairo_scale(cr,1,-1)

        --background
        if t.background then
            local pts=linear_orientation(t.bg_orientation,t.width,t.height)
                local pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4])
                for i=1, #t.bg_colour do
                        --print ("i",i,t.colour[i][1], rgb_to_r_g_b(t.colour[i]))
                    cairo_pattern_add_color_stop_rgba (pat, t.bg_colour[i][1], rgb_to_r_g_b(t.bg_colour[i]))
                end
                cairo_set_source (cr, pat)
                cairo_rectangle(cr,0,0,t.width,t.height)
                cairo_fill(cr)
                cairo_pattern_destroy(pat)
        end

    --autoscale
    cairo_save(cr)
        if t.autoscale then
                t.max= t.automax*1.1
        end

    local scale_x = t.width/(t.nb_values-1)
        local scale_y = t.height/t.max

    --define first point of the graph
        if updates-updates_gap <t.nb_values then
                t.beg = t.beg - 1
        --next line prevent segmentation error when conky window is redraw
                --quicly when another window "fly" over it
                if t.beg<0 then t.beg=0 end
        else
                t.beg=0
        end
    if t.inverse then cairo_scale(cr,-1,1)
    cairo_translate(cr,-t.width,0) end

        --graph foreground
        if t.foreground then
            local pts_fg=linear_orientation_inv(t.fg_orientation,t.width,t.height)
            local pat = cairo_pattern_create_linear (pts_fg[1],pts_fg[2],pts_fg[3],pts_fg[4])
                for i=1,#t.fg_colour,1 do
                        cairo_pattern_add_color_stop_rgba (pat, 1-t.fg_colour[i][1], rgb_to_r_g_b(t.fg_colour[i]))
                end
                cairo_set_source (cr, pat)

                cairo_move_to(cr,t.beg*scale_x,0)
                cairo_line_to(cr,t.beg*scale_x,t.values[t.beg+1]*scale_y)
                for i=t.beg, t.nb_values-1 do
                        cairo_line_to(cr,i*scale_x,t.values[i+1]*scale_y)
                end
                cairo_line_to(cr,(t.nb_values-1)*scale_x,0)
                cairo_close_path(cr)
                cairo_fill(cr)
                cairo_pattern_destroy(pat)
        end

        --graph_border
        if t.fg_bd_size>0 then
        local pts=linear_orientation_inv(t.fg_bd_orientation,t.width,t.height)
                local pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4])
                for i=1,#t.fg_bd_colour,1 do
                        cairo_pattern_add_color_stop_rgba (pat, 1-t.fg_bd_colour[i][1], rgb_to_r_g_b(t.fg_bd_colour[i]))
                end
                cairo_set_source (cr, pat)
                cairo_move_to(cr,t.beg*scale_x,t.values[t.beg+1]*scale_y)
                for i=t.beg, t.nb_values-1 do
                        cairo_line_to(cr,i*scale_x,t.values[i+1]*scale_y)
                end
                cairo_set_line_width(cr,t.fg_bd_size)
                cairo_stroke(cr)
                cairo_pattern_destroy(pat)
        end
        cairo_restore(cr)

        --background border
        if t.bg_bd_size>0 then
        local pts=linear_orientation(t.bg_bd_orientation,t.width,t.height)
                local pat = cairo_pattern_create_linear (pts[1],pts[2],pts[3],pts[4])
                for i=1, #t.bg_bd_colour do
                        --print ("i",i,t.colour[i][1], rgb_to_r_g_b(t.colour[i]))
                    cairo_pattern_add_color_stop_rgba (pat, t.bg_bd_colour[i][1], rgb_to_r_g_b(t.bg_bd_colour[i]))
                end
                cairo_set_source (cr, pat)
                cairo_rectangle(cr,0,0,t.width,t.height)
                cairo_set_line_width(cr,t.bg_bd_size)
                cairo_stroke(cr)
                cairo_pattern_destroy(pat)
        end

        cairo_restore(cr)

end

RE-EDITED I hope it's ok... if not I will restart posting from 0...
Sorry...

Last edited by ragamatrix (2016-06-10 13:13:38)

Offline

Board footer

Powered by FluxBB