Contenu | Rechercher | Menus

Annonce

DVD, clés USB et t-shirts Ubuntu-fr disponibles sur la boutique En Vente Libre

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1301 Le 14/01/2012, à 13:23

Keno40

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

En fait, elles apparaissent jusqu'au rafraîchissement puis redisparaissent.
Quand je lâche la sélection, elle réapparaissent une sec, puis redisparaissent.

Parfois, les autres à côté non sélectionnées apparaissent aussi une seconde. Bref, c'est la guirlande de noël!!!

Hors ligne

#1302 Le 14/01/2012, à 13:37

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Keno40 a écrit :

En fait, elles apparaissent jusqu'au rafraîchissement puis redisparaissent.
Quand je lâche la sélection, elle réapparaissent une sec, puis redisparaissent.

Parfois, les autres à côté non sélectionnées apparaissent aussi une seconde. Bref, c'est la guirlande de noël!!!

et tu peut cliquer dessus normalement ???

Hors ligne

#1303 Le 14/01/2012, à 13:42

Keno40

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Oui, quand elle est apparente et même quand elle disparait...

Hors ligne

#1304 Le 14/01/2012, à 13:50

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Keno40 a écrit :

Oui, quand elle est apparente et même quand elle disparait...

alors c'est certainement un conflit avec ton pilote d'affichage, désolé tu devait déja t'en douté, mais je suis sur la version ubuntu 11.10 et je ne connais pas suffisamment bien xubuntu pour pouvoir t'aider plus.

mais peut être en changeant la version de ton pilote d'affichage.

Hors ligne

#1305 Le 14/01/2012, à 14:04

Keno40

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Je suis sous le pilote par défaut.
Ma carte 'et tout l'ordi même...) est tellement out of age qu'il n'y en a pas d'adapté.

Hors ligne

#1306 Le 17/01/2012, à 05:22

Érotomania

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Salut,j'aimerais savoir si il y a une ligne de commande pour afficher la frequence du GPU en mode graphique j'ai cherché mais je n'ai pas trouvé,merci.


HP-Pavillon 6000        Processor: 4x AMD Athlon(tm) II X4 635 Processor       Mémoire : 6113MB
Operating System       Ubuntu 12.04.1 LTS
OpenGL Renderer      GeForce GTX 460 SE/PCIe/SSE2

Hors ligne

#1307 Le 18/01/2012, à 17:34

chepioq

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Érotomania a écrit :

Salut,j'aimerais savoir si il y a une ligne de commande pour afficher la frequence du GPU en mode graphique j'ai cherché mais je n'ai pas trouvé,merci.

Tu veux dire sous forme de graphe ?
Il y a dans conky la commande execgraph :

execgraph     (-t) (-l) command     Same as execbar, but graphs values. Uses a logaritmic scale when the log option (-l switch) is given (to see small numbers). Values still have to be between 0 and 100. The size for graphs can be controlled via the default_graph_size config setting. Takes the switch '-t' to use a temperature gradient, which makes the gradient values change depending on the amplitude of a particular graph value (try it and see). If -t or -l is your first argument, you may need to preceed it by a space (' '). You may also use double-quotes around the exec argument should you need to execute a command with spaces. For example, ${execgraph "date +'%S'"} to execute `date +'%S'` and graph the result. Without quotes, it would simply print the result of `date`. 

Voir ici pour l'ensemble des variables conky http://conky.sourceforge.net/variables.html


Tout est dans tout et réciproquement....

Hors ligne

#1308 Le 18/01/2012, à 17:41

Keno40

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Bon, ben personne ne voit d'où peut venir le problème sur mon cas avec Xorg?

C'est une vieille install mise à niveau. J'utilisais Compiz dessus, il y a longtemps. C'est peut être un fond de reste de config qui fout la m.....

Hors ligne

#1309 Le 21/01/2012, à 16:36

Sylvhem

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Bonjour à tous !

Bon, je n'ai pas trop eu le temps d'améliorer mon conky depuis la dernière fois, donc j'en suis grosso modo toujours au même point.

1. Je n'arrive toujours pas à utiliser la police Ubuntu-Title, que ça soit la version 3.0 ou une de celles que m'a passé Phyllinux. J'ai bien tenté de rafraîchir le cache des polices comme me l' suggéré Skubu mais ça n'a pas marché. Une dernière idée ? Ça serait dommage de ne pas pouvoir se servir de cette police, vu qu'elle a pas vraiment d'autre utilité...

2. ${battery_time} me renvoi toujours unknown, même quand je précise BAT0 pour la batterie. Un problème de compatibilité avec le matériel peut-être ? Qu'en pensez-vous ?

3. Je me suis aperçu que j'avais mal écrit la fonction own_window yes dans la partie avant TEXT. Je l'ai corrigé (et ajouté la semi-transparence au passage) mais les infos qui se trouvent dans les colonnes CPUID, CPU(%) et Mem(%) de la partie de mon conky consacré aux processus disparaissent. Je ne vois vraiment pas où se trouve le problème, si quelqu'un pouvait me renseigner.

4. J'aimerais faire en sorte que quand ma batterie soit presque vide ou que une de mes partitions soit presque pleine, la barre correspondante change de couleur. malheureusement, je n'ai vu aucune variable du type "SI variable1>x ALORS variable2". En regardant les anciens sujets, j'ai vu un conky de Vermouth utilisant LUA pour arriver à un résultat similaire. Je suis obligé d'utiliser LUA pour ça ? Je ne connais pas du tout ce langage et il ne me semble pas avoir de tutoriel pour débutant en français.

Voici le conky en question :

#Nombre de rafraichissement de Conky avant de quitter. 0 fait tourner Conky en permancence.
total_run_times 0

#Réglage de la mémoire.
double_buffer yes

#Intervalle de raffrachissement.
update_interval 3

#Fenêtre
own_window yes
own_window_transparent yes
own_window_type override
minimum_size 270 200
maximum_width 270

#Apparence.
use_xft yes
xftalpha 1
xftfont Ubuntu:size=10
override_utf8_locale yes

#Position.
alignment top_right

TEXT
${image $HOME/conky/images/logo_ubuntu.png -p 117,0}



${alignc}${font Ubuntu-Title:size=16}Ubuntu

#Affiche des informations sur l'ordinateur.
${font Ubuntu-Title:size=15}Ordinateur
${font}Nom : $nodename
Système : ${execi 86400 lsb_release -si} ${execi 86400 lsb_release -sr} ${execi 86400 lsb_release -sc}
Noyau : $sysname $kernel
Uptime : $uptime

#Affiche des informations sur l'état de la batterie.
${font Ubuntu-Title:size=15}Batterie
${font}État : $battery
Temps restant : ${battery_time}
${battery_bar 12}
${voffset -17}${alignc}${battery_percent} %

#Affiche des informations sur le processeur.
${font Ubuntu-Title:size=15}Processeur
${font}Pourcentage global : ${cpu 0} %
Premier coeur : ${cpu 1} %
Second coeur : ${cpu 2} %
Température : ${acpitemp} °C

#Affiche des informations sur l'état de la mémoire.
${font Ubuntu-Title:size=15}Mémoire
${font}Vive : $mem/$memmax 
${membar 12}
${voffset -17}${alignc}$memperc %
Virtuelle : $swap/$swapmax 
${swapbar 12}
${voffset -17}${alignc}$swapperc % 

#Affiche des informations sur l'état du disque dur.
${font Ubuntu-Title:size=15}Disque dur
${font}GNU/Linux : ${fs_used /}/${fs_size /} 
${fs_bar 12 /}
${voffset -17}${alignc}${fs_used_perc /} % 
Windows : ${fs_used /media/Windows}/${fs_size /media/Windows} 
${fs_bar 12 /media/Windows}
${voffset -17}${alignc}${fs_used_perc /media/Windows} % 
Documents : ${fs_used /media/Windocs}/${fs_size /media/Windocs} 
${fs_bar 12 /media/Windocs}
${voffset -17}${alignc}${fs_used_perc /media/Windocs} % 
Température : ${hddtemp /dev/sda} °C

#Affiche la liste des principaux processus.
${font Ubuntu-Title:size=15}Processus
${font}Nom ${goto 1450}PID     ${goto 1490}CPU (%)    ${goto 1543}Mém (%)
${color 2439d4}${top name 1} ${goto 1444}${top pid 1}     ${goto 1494}${top cpu 1}     ${goto 1545}${top mem 1}
${color 085f95}${top name 2} ${goto 1444}${top pid 2}     ${goto 1494}${top cpu 2}     ${goto 1545}${top mem 2}
${color 0788bf}${top name 3} ${goto 1444}${top pid 3}     ${goto 1494}${top cpu 3}     ${goto 1545}${top mem 3}
${color ffffff}${top name 4} ${goto 1444}${top pid 4}     ${goto 1494}${top cpu 4}     ${goto 1545}${top mem 4}
${top name 5} ${goto 1444}${top pid 5}     ${goto 1494}${top cpu 5}     ${goto 1545}${top mem 5}

PS : J'aime vraiment bien ton conky Ex0artefact smile.

PPS : Bonne année à tous !


Membre discret de la brigade des S

Hors ligne

#1310 Le 27/01/2012, à 18:37

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Bonjour Sylvhem,

pour les trois première question je ne sais pas, mais pour la quatrième tu peut regarder ceci, on te donne la solution en code conky, à toi d'adapter à tes besoins.

Hors ligne

#1311 Le 29/01/2012, à 21:16

Sylvhem

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Merci beaucoup pour le lien, je vais regarder ça.


Membre discret de la brigade des S

Hors ligne

#1312 Le 31/01/2012, à 02:10

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

salut les gens,

petite question ; mon processeur est un triple cœur débloquable.
suivant mes envies, j'active ou non le 4ème cœur.
Mais dans Conky, j'ai mis 4 CPU.
Or, quand il n'y a que trois cœurs actifs, il me renvoie ce message d'erreur :

Conky: obj->data.i 4 info.cpu_count 3
Conky: attempting to use more CPUs than you have!

ce qui est somme toute logique.

J'aimerai lui coller une condition du genre ${if_existing cpu4}__tout ce qui concerne l'affichage du 4ème cœur___${endif}
mais écrite telle quelle, cette commande ne marche qu'à moitié. En effet, avant, Conky refusait tout bonnement de se lancer. Avec cette commande, il se lance quelque temps, puis s'arrête lorsque le message d'erreur apparaît, mais il apparaît bien plus tard et laisse le temps à conky de se lancer.
Auriez-vous une idée ?
Je ne dois pas être loin du compte je pense, mais je sais pas comment faire...
Merci.

Dernière modification par Swiss_Knight (Le 31/01/2012, à 02:11)


xuniL

Hors ligne

#1313 Le 31/01/2012, à 02:10

Kamelot314

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Et voila le mien! Simple mais complet!

Screenshot-12-01-30-080858PM.png

background no
font Sans:size=8
#xftfont Sans:size=10
use_xft yes
xftalpha 0.9
update_interval 3.0
total_run_times 0
own_window yes
own_window_type normal
own_window_transparent yes
own_window_hints undecorated,below,sticky,skip_taskbar
own_window_argb_visual yes
own_window_argb_value 0
double_buffer yes
minimum_size 220 5
maximum_width 220
draw_shades yes
draw_outline no
draw_borders no
draw_graph_borders yes
default_color white
default_shade_color black
alignment top_left
gap_x 12
gap_y 35
no_buffers yes
cpu_avg_samples 2
uppercase no
text_buffer_size 1024
override_utf8_locale yes

TEXT
${color}SYSTEM ${color}${hr 1}

Hostname: $alignr$nodename
Kernel: $alignr$kernel
Uptime: $alignr$uptime
Machine: $alignr$machine
CPU: ${alignr}${freq} MHz
Temperature: $alignr$acpitemp
Processes: ${alignr}$processes ($running_processes running)
Load: ${alignr}$loadavg

CPU1 ${goto 65}${cpu cpu1}%${goto 117}CPU2 ${goto 180}${cpu cpu2}%
${color}${cpugraph cpu1 20,107 FFFF00 FF0000}$alignr${cpugraph cpu2 20,107 FFFF00 FF0000}

Battery    ${battery_time BAT0} ${alignr}(${battery BAT0})
${battery_bar 4 BAT0}

${color}Ram ${alignr}$mem / $memmax ($memperc%)
${color}${membar 4}
${color}Swap ${alignr}$swap / $swapmax ($swapperc%)
${color}${swapbar 4}

${color}Highest CPU ${goto 140}CPU%${alignr}MEM%
${color red}${top name 1}${goto 140}${top cpu 1}${alignr}${top mem 1} 
${color}${top name 2}${goto 140}${top cpu 2}${alignr}${top mem 2} 
${color}${top name 3}${goto 140}${top cpu 3}${alignr}${top mem 3}
${color}${top name 4}${goto 140}${top cpu 4}${alignr}${top mem 4}
${color}${top name 5}${goto 140}${top cpu 5}${alignr}${top mem 5}

${color}Highest MEM ${goto 140}CPU% ${alignr}MEM%
${color red}${top_mem name 1}${goto 140}${top_mem cpu 1}${alignr}${top_mem mem 1} 
${color}${top_mem name 2}${goto 140}${top_mem cpu 2}${alignr}${top_mem mem 2} 
${color}${top_mem name 3}${goto 140}${top_mem cpu 3}${alignr}${top_mem mem 3}
${color}${top_mem name 4}${goto 140}${top_mem cpu 4}${alignr}${top_mem mem 4}
${color}${top_mem name 5}${goto 140}${top_mem cpu 5}${alignr}${top_mem mem 5}

${color}FILESYSTEM & HARD DRIVES ${color}${hr 1}

File System:${alignr}Free Space: ${fs_free_perc /}%
${color}${fs_bar 4 /}
${color}Used: ${fs_used /}${alignr}Free: ${fs_free /}

Seagate:${alignr}Free Space: ${fs_free_perc /media/Seagate}%
${color}${fs_bar 4 /media/Seagate}
${color}Used: ${fs_used /media/Seagate}${alignr}Free: ${fs_free /media/Seagate}

Samsung:${alignr}Free Space: ${fs_free_perc /media/Samsung}%
${color}${fs_bar 4 /media/Samsung}
${color}Used: ${fs_used /media/Samsung}${alignr}Free: ${fs_free /media/Samsung}

${color}NETWORK ${color}${hr 1}

${color}Wlan0 Down ${downspeed wlan0}/s ${alignr}Up ${upspeed wlan0}/s
${color}${downspeedgraph wlan0 20,107 FFFF00 FF0000}$alignr${upspeedgraph wlan0 20,107 FFFF00 FF0000}
${color}Totals: Wlan0 ${totaldown wlan0} ${alignr}${totalup wlan0}
${color}Wlan0 Bitrate: ${wireless_bitrate wlan0}

${color}Eth0 Down ${downspeed eth0}/s ${alignr}Up ${upspeed eth0}/s
${color}${downspeedgraph eth0 20,107 FFFF00 FF0000}$alignr${upspeedgraph eth0 20,107 FFFF00 FF0000}
${color}Totals: Eth0  ${totaldown eth0} ${alignr}${totalup eth0}

Utilise [X]Ubuntu sur un Notebook Gateway NV-58 22H (nVidia G210M)

Hors ligne

#1314 Le 31/01/2012, à 02:17

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Sympa Kamelot314 wink
Tu penses qu'il serait possible d'aller grep le nom des disques durs quelque part ? dans une commande udevadm par exemple ? ou autre, je ne sais pas.


xuniL

Hors ligne

#1315 Le 31/01/2012, à 02:23

Kamelot314

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Swiss_Knight a écrit :

Sympa Kamelot314 wink
Tu penses qu'il serait possible d'aller grep le nom des disques durs quelque part ? dans une commande udevadm par exemple ? ou autre, je ne sais pas.

Merci a toi!

Avec simplement Gparted, tu peux les voirs! Mes 2 disques durs sont des USB donc je l'ai ait cree moi meme. Mais pour ceux qui ne savent pas, avec l'utilitaire Gparted, vous pouvez le savoir et meme les renommez si vous voulez. Et ensuite simplement a ecrire le nom que vous voulez dans le script!


Utilise [X]Ubuntu sur un Notebook Gateway NV-58 22H (nVidia G210M)

Hors ligne

#1316 Le 01/02/2012, à 13:19

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Salut tous,

mon CPU se débloque de 3 à 4 cœurs, mais parfois après un crash, il revient à 3, et là conky patauge dans la choucroute : il ne veut rien afficher parce qu'il ne trouve pas le bon nombre de CPU.
J'ai, je pense, résolu ça dans .conykrc de la sorte, en mettant une condition pour l'affichage du 4ème cœur :

${if_match ${tail ~/conkymeteo/cond_meteo 1 1}==4}${goto 5}${voffset 2}${font StyleBats:size=9.9}${color2}k${voffset -2}${font DroidSansFallback:size=8.4}${color3}${offset 2}CPU 4${offset 5}${font DroidSans:size=8.2}${cpu cpu4}%${font}${offset 8}${endif}

Mais ça bug toujours, sauf qu'il s'affiche quelques secondes quand même cette fois, donc le .conkyrc a l'air OK. En creusant, j'ai vu qu'il y avait aussi un appel au quatrième cœur dans un petit script Lua qui permet d'afficher les barres d'utilisation :

{    --[ Graph for CPU4 ]--
            name="cpu",
            arg="cpu4",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=217+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },

Sauf que là, je ne sais pas comment mettre une condition...
Il me faudrait une idée nouvelle, ceci ne fonctionnant pas (attempt to call a nil value) :

numCores = tonumber(conky_parse(string.format('${%s %s %s %s}', 'tail', '~/conkymeteo/cond_meteo', '1', '1')))
if numCores == 4 then

le reste du code ici


end

xuniL

Hors ligne

#1317 Le 01/02/2012, à 13:34

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Swiss_Knight a écrit :

Salut tous,

mon CPU se débloque de 3 à 4 cœurs, mais parfois après un crash, il revient à 3, et là conky patauge dans la choucroute : il ne veut rien afficher parce qu'il ne trouve pas le bon nombre de CPU.
...

tu peut tester cette ligne cher toi avec 3 puis 4 cœurs, pour voir ce que sa donne.
egrep -c '^processor' /proc/cpuinfo
si elle fonctionne correctement, je pourrais te donner une solution, pour ton affichage évolutif.

Hors ligne

#1318 Le 01/02/2012, à 14:02

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Salut Didier-T,
ça donne 3 ou 4 en fonction du nombre de cœurs actifs.

Et si jamais ça peut aider, j'ai mis dans mon script qui va prendre les informations sur la météo, une ligne comme suit :

grep -c processor /proc/cpuinfo >> ~/conkymeteo/cond_meteo

qui rajoute à la dernière ligne du fichier de sortie (cond_meteo), un chiffre qui indique le nombre de cœurs actifs. 3 ou 4.

Et c'est basé sur cette dernière ligne, que dans .conkyrc, je peux faire :

${if_match ${tail ~/conkymeteo/cond_meteo 1 1}==4}

le code qui concerne le 4ème cœur.

${endif}

Ça, ça a l'air de fonctionner.


Mais dans le code Lua (c.f. mon post précédent) je ne sais pas comment faire pour mettre le bloc de code qui concerne le 4ème cœur dans une condition du même genre.


xuniL

Hors ligne

#1319 Le 01/02/2012, à 14:20

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Swiss_Knight a écrit :

Salut Didier-T,
ça donne 3 ou 4 en fonction du nombre de cœurs actifs.

Et si jamais ça peut aider, j'ai mis dans mon script qui va prendre les informations sur la météo, une ligne comme suit :

grep -c processor /proc/cpuinfo >> ~/conkymeteo/cond_meteo

qui rajoute à la dernière ligne du fichier de sortie (cond_meteo), un chiffre qui indique le nombre de cœurs actifs. 3 ou 4.

Et c'est basé sur cette dernière ligne, que dans .conkyrc, je peux faire :

${if_match ${tail ~/conkymeteo/cond_meteo 1 1}==4}

le code qui concerne le 4ème cœur.

${endif}

Ça, ça a l'air de fonctionner.


Mais dans le code Lua (c.f. mon post précédent) je ne sais pas comment faire pour mettre le bloc de code qui concerne le 4ème cœur dans une condition du même genre.

en fait ce que tu montre dans ton précédent post est un bloc de variable, tu ne peut donc pas insérer une condition à cette endroit ci, tu peut coller le contenue total de ton lua. avec un peut de chance, je pourrai t'aider.

Hors ligne

#1320 Le 01/02/2012, à 14:23

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

ah ? D'accord...

Tu as déjà du en voir passer des pareils :

--[[
BARGRAPH WIDGET
v2.1 by wlourf (07 Jan. 2011)
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 colours 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, parallel, 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 available 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
            values 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()
i=0
    local bars_settings={
        {    --[ Graph for CPU1 ]--
            name="cpu",
            arg="cpu1",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=172+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for CPU2 ]--
            name="cpu",
            arg="cpu2",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=187+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for CPU3 ]--
            name="cpu",
            arg="cpu3",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=202+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
--numCores = tonumber(conky_parse(string.format('${%s %s %s %s}', 'tail', '~/conkymeteo/cond_meteo', '1', '1')))
--numCores = tonumber(conky_parse('${tail path_to_weather_log 1 1}')),
--if numCores == 4 then
        {    --[ Graph for CPU4 ]--
            name="cpu",
            arg="cpu4",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=217+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
--end
        {    --[ Graph for Memory ]--
            name="memperc",
            arg="",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=15,y=317+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for Root ]--
                        name="fs_used_perc",
            arg="/",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=15,y=355+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },    
        {    --[ Graph for Home ]--
            name="fs_used_perc",
            arg="/home",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=16,y=383+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },    
            {    --[ Graph for Swap ]--
                        name="swapperc",
            arg="",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=16,y=411+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for Network ]--
            name="downspeed wlan0",
            arg="",
            max=20,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=64,y=571+i,
            blocks=40,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },
         }    
-----------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

xuniL

Hors ligne

#1321 Le 01/02/2012, à 14:38

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Swiss_Knight a écrit :

ah ? D'accord...

Tu as déjà du en voir passer des pareils :

--[[
BARGRAPH WIDGET
v2.1 by wlourf (07 Jan. 2011)
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 colours 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, parallel, 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 available 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
            values 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()
i=0
    local bars_settings={
        {    --[ Graph for CPU1 ]--
            name="cpu",
            arg="cpu1",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=172+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for CPU2 ]--
            name="cpu",
            arg="cpu2",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=187+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for CPU3 ]--
            name="cpu",
            arg="cpu3",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=202+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
--numCores = tonumber(conky_parse(string.format('${%s %s %s %s}', 'tail', '~/conkymeteo/cond_meteo', '1', '1')))
--numCores = tonumber(conky_parse('${tail path_to_weather_log 1 1}')),
--if numCores == 4 then
        {    --[ Graph for CPU4 ]--
            name="cpu",
            arg="cpu4",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=82,y=217+i,
            blocks=62,
            space=0.96,
            height=2,width=5,
            angle=90,
            smooth=true
            },
--end
        {    --[ Graph for Memory ]--
            name="memperc",
            arg="",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=15,y=317+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for Root ]--
                        name="fs_used_perc",
            arg="/",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=15,y=355+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },    
        {    --[ Graph for Home ]--
            name="fs_used_perc",
            arg="/home",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=16,y=383+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },    
            {    --[ Graph for Swap ]--
                        name="swapperc",
            arg="",
            max=100,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=16,y=411+i,
            blocks=83,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },
        {    --[ Graph for Network ]--
            name="downspeed wlan0",
            arg="",
            max=20,
            alarm=50,
            alarm_colour={0xFF0000,0.72},
            bg_colour={0xFFFFFF,0.25},
            fg_colour={0x00FF00,0.55},
            mid_colour={{0.45,0xFFFF00,0.70}},
            x=64,y=571+i,
            blocks=40,
            space=1,
            height=2,width=5,
            angle=90,
            smooth=true
            },
         }    
-----------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

alors j'ai une bonne et une mauvaise nouvelle.
la bonne nouvelle c'est faisable sans soucis
la mauvaise, pour que sa puisse se faire il faut que les infos sur ton quatrièmes cœurs soit dans la dernière partie du tableau (la dernière section {})

il faut modifier cette partie ci

    if tonumber(conky_parse('${updates}'))>3 then
        for i in pairs(bars_settings) do
            
            draw_multi_bar_graph(bars_settings[i])
            
        end

en quelque chose comme ça

    if tonumber(conky_parse('${updates}'))>3 then
NbCoeur = conky_parse("egrep -c '^processor' /proc/cpuinfo")
        for i in ((pairs(bars_settings)-4)+NbCoeur) do
            
            draw_multi_bar_graph(bars_settings[i])
            
        end

a tester

Hors ligne

#1322 Le 01/02/2012, à 14:53

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Quand tu dis qu'il faut que la partie qui contient les infos sur le CPU 4 soit dans le dernier tableau... de quel tableau est-ce que tu parles ?
Est-ce que je dois déplacer le bloc que j'ai coller dans mon avant-dernier post, après celui qui concerne le réseau (--[ Graph for Network ]--)
dans les paramètres en haut du fichier ??

Même en faisant ça, j'obtiens cette erreur après :

Conky: llua_do_call: function conky_main_bars execution failed: /home/swissknight/.conky/bargraph_small.lua:254: attempt to perform arithmetic on a function value

xuniL

Hors ligne

#1323 Le 01/02/2012, à 14:56

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Swiss_Knight a écrit :

Quand tu dis qu'il faut que la partie qui contient les infos sur le CPU 4 soit dans le dernier tableau... de quel tableau est-ce que tu parles ?
Est-ce que je dois déplacer le bloc que j'ai coller dans mon avant-dernier post, après celui qui concerne le réseau (--[ Graph for Network ]--)
dans les paramètres en haut du fichier ??

Même en faisant ça, j'obtiens cette erreur après :

Conky: llua_do_call: function conky_main_bars execution failed: /home/swissknight/.conky/bargraph_small.lua:254: attempt to perform arithmetic on a function value

excuse moi j'ai oublié un détail dans le conky_parse

    if tonumber(conky_parse('${updates}'))>3 then
NbCoeur = conky_parse("${exec egrep -c '^processor' /proc/cpuinfo}")
        for i in ((pairs(bars_settings)-4)+NbCoeur) do
            
            draw_multi_bar_graph(bars_settings[i])
            
        end

pour le reste ce que tu as fait est bon.
en fait le but est de ne pas afficher le dernier graphique configuré.

Hors ligne

#1324 Le 01/02/2012, à 15:03

Swiss_Knight

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Même message d'erreur avec la correction
Il n'aime apparemment pas les expressions arithmétiques dans le if ...

le message d'erreur portant sur la ligne 254 qui est la suivante :

for i in ((pairs(bars_settings)-4)+NbCoeur) do

Dernière modification par Swiss_Knight (Le 01/02/2012, à 15:06)


xuniL

Hors ligne

#1325 Le 01/02/2012, à 15:15

Didier-T

Re : (4) Conky : Postez vos conkyrc ou certaines parties intéressantes

Swiss_Knight a écrit :

Même message d'erreur avec la correction
Il n'aime apparemment pas les expressions arithmétiques dans le if ...

le message d'erreur portant sur la ligne 254 qui est la suivante :

for i in ((pairs(bars_settings)-4)+NbCoeur) do

Bon et bien si il n'aime pas écrit comme sa ont vas changer un peut

    if tonumber(conky_parse('${updates}'))>3 then
local NbCoeur = conky_parse("${exec egrep -c '^processor' /proc/cpuinfo}")
local Nbgraph = pairs(bars_settings)
Nbgraph = Nbgraph-4
Nbgraph = Nbgraph+tonumber(NbCoeur)
        for i in Nbgraph do
            
            draw_multi_bar_graph(bars_settings[i])
            
        end

Hors ligne