You are not logged in.

#1 2017-04-27 14:13:58

o9000
tint2 developer
From: Network Neighborhood
Registered: 2015-10-24
Posts: 398
Website

Conky - full screen width bar ?

Dear conky experts,

Check out the screenshot from this feature request: https://gitlab.com/o9000/tint2/issues/637

The user wants a bar on the entire screen edge, filled with some value (in this case the battery level).

Could conky be configured to show just a bar, no padding, no border, full screen size, with vertical orientation?

In addition to that, if conky could create a window for each monitor without hard coding geometry based on the resolution, it would be awesome.

Is this possible?

Thanks.

Offline

#2 2017-04-27 14:32:21

Sector11
The Tpyo Knig Mod
From: 77345 ¡#
Registered: 2015-08-20
Posts: 5,454

Re: Conky - full screen width bar ?

Short answer: Yes.
Long answer: Yes, with LUA.  smile

Since I see this:

If you can give me a few directions on how to best implement it I could also do it myself.

I'll just leave this here for Alex if he happens to drop by.  wink

bargraph_widget_for_conky_2_1_by_wlourf.th.png

Questions?

EDIT:  Or you could post a reply over there.

Last edited by Sector11 (2017-04-27 14:41:31)


BunsenLabs Forum Rules ---== I'm a Conky 1.9'er ==---
System:    Host: d67 Kernel: 4.9.0-9-amd64 x86_64 (64 bit gcc: 6.3.0)
Desktop: Openbox 3.6.1 Distro: Debian GNU/Linux 9 (stretch)

Offline

#3 2017-04-27 15:16:33

o9000
tint2 developer
From: Network Neighborhood
Registered: 2015-10-24
Posts: 398
Website

Re: Conky - full screen width bar ?

Thanks! I had a feeling you knew a thing or two about that smile

Offline

#4 2017-04-27 15:39:32

Sector11
The Tpyo Knig Mod
From: 77345 ¡#
Registered: 2015-08-20
Posts: 5,454

Re: Conky - full screen width bar ?

Don't have a battery in this desktop (obviously) but you got me thinking about wlourf's script for my machine:
cpu % usage - I have 3 + 0 for total/average
cpu fan
temps (use 100°C for a max) -> CPU, M|B, HDD & GPU
and a frequency monitor

Maybe even memory as well.

Off to work on it.  Could be interesting


BunsenLabs Forum Rules ---== I'm a Conky 1.9'er ==---
System:    Host: d67 Kernel: 4.9.0-9-amd64 x86_64 (64 bit gcc: 6.3.0)
Desktop: Openbox 3.6.1 Distro: Debian GNU/Linux 9 (stretch)

Offline

#5 2017-04-27 20:33:02

Sector11
The Tpyo Knig Mod
From: 77345 ¡#
Registered: 2015-08-20
Posts: 5,454

Re: Conky - full screen width bar ?

Here's a test package using CPU 1,2,3 & 0 - screen is 1920x1080
2017-04-27_171542_Scrot11.th.png
It's a bar, it's vertical and it goes from top to bottom ... or bottom to top if you wish. smile
The conky (v1.9)

## pkill -xf "conky -c /media/5/Conky/bargraph-vert.test.conky" &

## ---------- Begin Window Settings
own_window yes
own_window_type normal
own_window_transparent yes
own_window_hints skip_taskbar,skip_pager,undecorated,below
own_window_colour 000000
own_window_class Conky
own_window_title bargraph-vert.test.conky
## ARGB can be used for real transparencyown_window_hints
#own_window_argb_visual yes ## Options: yes or no
## Valid range is 0-255, where 0 is 0% opacity, and 255 is 100% opacity.
#own_window_argb_value 80

#minimum_size 300 0
#maximum_width 300

gap_x 10	## l|r
gap_y 10	## u|d

minimum_size 750 1080
maximum_width 750

alignment tl

## ---------- End Window Settings
## ---------- Font Settings

## Force UTF8? requires XFT
override_utf8_locale yes

## Use Xft (anti-aliased font and stuff)
use_xft yes
#xftfont Liberation Mono:bold:size=11
#xftfont Fantasque Sans Mono:bold:size=12
#xftfont Monofur:bold:size=10
#xftfont DejaVu Sans Mono:bold:size=10
xftfont Fira Mono:bold:size=10

## Alpha of Xft font. Must be a value at or between 1 and 0
xftalpha 1.0

## --------- End Font Settings
## --------- Color Settings
draw_shades yes
default_shade_color 000000
draw_outline no
default_outline_color 000000

default_color 00BFFF #DeepSkyBlue ## DCDCDC #Gainsboro
color0 C0C0C0 #Silver
color1 778899 #LightSlateGray
color2 FAEBD7 #AntiqueWhite
color3 87CEFA #LightSkyBlue
color4 48D1CC #MediumTurquoise
color5 FFDEAD #NavajoWhite
color6 00BFFF #DeepSkyBlue
color7 B0E0E6 #PowderBlue
color8 FFD700 #Gold
color9 CD5C5C #IndianRed
## ---------- End Color Settings
## ---------- Begin Borders Section
draw_borders no
## Stippled borders?
stippled_borders 5
## border margins
border_inner_margin 0
border_outer_margin 0
## border width
border_width 0
## graph borders
draw_graph_borders no
## default_graph_size 15 40
## ---------- End Borders Secton
## ---------- Begin Miscellaneous Section
## Boolean value, if true, Conky will be forked to background when started.
background no ## yes

## Adds spaces around certain objects to stop them from moving other things
## around, this only helps if you are using a mono font
## Options: right, left or none
use_spacer none

## Default and Minimum size is 256 - needs more for single commands that
## "call" a lot of text IE: bash scripts
#text_buffer_size 3072

## Subtract (file slystem) buffers from used memory?
no_buffers yes

## change GiB to G and MiB to M
#short_units yes

## Like it says, ot pads the decimals on % values
## doesn't seem to work since v1.7.1
#pad_percents 2

# Imlib2 image cache size, in bytes. Defaults to 4MiB. Increase this value if
# you use $image lots. Set to 0 to disable the image cache.
imlib_cache_size 0

# Interval (in seconds) to flush Imlib2 cache.
#imlib_cache_flush_interval 900

## default_bar_size 0 10

## Use the Xdbe extension? (eliminates flicker)
## It is highly recommended to use own window with this one
## so double buffer won't be so big.
double_buffer yes

## Maximum size of user text buffer, i.e. layout below TEXT line in config file
## default is 16384 bytes)
##max_user_text 16384

## Desired output unit of all objects displaying a temperature. Parameters are
## either "fahrenheit" or "celsius". The default unit is degree Celsius.
## temperature_unit Fahrenheit

#top_name_width 8
## ---------- End Miscellaneous Section

## ---------- LUA Stuff

#lua_load /media/5/Conky/LUA/colorfill.test.2.lua
#lua_draw_hook_pre main

## wlourf

#	lua_load /media/5/Conky/LUA/bargraph.lua ## no work
	lua_load /media/5/Conky/LUA/bargraph-vert.test.lua
#	lua_load /media/5/Conky/LUA/bargraph-small-2.lua
#	lua_load /media/5/Conky/LUA/bargraph_test.lua
	lua_draw_hook_pre main_bars

## ---------- End LUA Stuff
update_interval 1
TEXT
${goto 7}CPU
${goto 1}${color FF0000}1${goto 11}${color 5F9EA0}2${goto 21}${color 7FFF00}3${goto 31}${color FFFF00}0${color}

${goto 5}${color FF0000}${cpu cpu1}
${goto 5}${color 5F9EA0}${cpu cpu2}
${goto 5}${color 7FFF00}${cpu cpu3}
${goto 5}${color FFFF00}${cpu cpu0}${color}




${goto 1}${color FF0000}1${goto 11}${color 5F9EA0}2${goto 21}${color 7FFF00}3${goto 31}${color FFFF00}0${color}









${goto 1}${color FF0000}1${goto 11}${color 5F9EA0}2${goto 21}${color 7FFF00}3${goto 31}${color FFFF00}0${color}









${goto 1}${color FF0000}1${goto 11}${color 5F9EA0}2${goto 21}${color 7FFF00}3${goto 31}${color FFFF00}0${color}









${goto 1}${color FF0000}1${goto 11}${color 5F9EA0}2${goto 21}${color 7FFF00}3${goto 31}${color FFFF00}0${color}









${goto 1}${color FF0000}1${goto 11}${color 5F9EA0}2${goto 21}${color 7FFF00}3${goto 31}${color FFFF00}0${color}

lua_load /media/5/Conky/LUA/bargraph-vert.test.lua

--[[
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, possible 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()
	local bars_settings={
		{	--[ Bar for CPU1 ]--
			name="cpu",
			arg="cpu1",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.10},
			fg_colour={0xFF0000,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=0,y=1073,   -- x = l|r y = u|d
			blocks=1073,
			space=0,
			height=1,width=10,
			angle=0,
			smooth=true
			},
		{	--[ Bar for CPU2 ]--
			name="cpu",
			arg="cpu2",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.10},
			fg_colour={0x5F9EA0,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=10,y=1073,   -- x = l|r y = u|d
			blocks=1073,
			space=0,
			height=1,width=10,
			angle=0,
			smooth=true
			},
		{	--[ Bar for CPU3 ]--
			name="cpu",
			arg="cpu3",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.10},
			fg_colour={0x7FFF00,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=20,y=1073,   -- x = l|r y = u|d
			blocks=1073,
			space=0,
			height=1,width=10,
			angle=0,
			smooth=true
			},
		{	--[ Bar for CPU0 ]--
			name="cpu",
			arg="cpu0",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.10},
			fg_colour={0xFFFF00,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=30,y=1073,   -- x = l|r y = u|d
			blocks=1073,
			space=0,
			height=1,width=10,
			angle=0,
			smooth=true
			},

--[[		{	--[ Bar for Memory ]--
			name="memperc",
			arg="",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.05},
			fg_colour={0x00FF00,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=55,y=295,   -- x = l|r y = u|d
			blocks=50,
			space=1,
			height=3,width=12,
			angle=90,
			smooth=true
			},
		{	--[ Bar for Root ]--
         name="fs_used_perc",
			arg="/",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.05},
			fg_colour={0x00FF00,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=45,y=379,   -- x = l|r y = u|d
			blocks=50,
			space=1,
			height=2,width=11,
			angle=90,
			smooth=true
			},
		{	--[ Bar for Home ]--
			name="fs_used_perc",
			arg="/home",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.05},
			fg_colour={0x00FF00,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=45,y=395,   -- x = l|r y = u|d
			blocks=50,
			space=1,
			height=2,width=11,
			angle=90,
			smooth=true
			},
		{	--[ Bar for M/5 ]--
			name="fs_used_perc",
			arg="/media/5",
			max=100,
			alarm=50,
			alarm_colour={0xFF0000,0.50},
			bg_colour={0xFFFFFF,0.05},
			fg_colour={0x00FF00,0.55},
			mid_colour={{0.45,0xFFFF00,0.70}},
			x=45,y=411,   -- x = l|r y = u|d
			blocks=50,
			space=1,
			height=2,width=11,
			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

All KUDOS belong to wlourf for the great script!


BunsenLabs Forum Rules ---== I'm a Conky 1.9'er ==---
System:    Host: d67 Kernel: 4.9.0-9-amd64 x86_64 (64 bit gcc: 6.3.0)
Desktop: Openbox 3.6.1 Distro: Debian GNU/Linux 9 (stretch)

Offline

#6 2017-04-27 20:43:12

o9000
tint2 developer
From: Network Neighborhood
Registered: 2015-10-24
Posts: 398
Website

Re: Conky - full screen width bar ?

Awesome!

Offline

#7 2017-04-27 21:24:06

Sector11
The Tpyo Knig Mod
From: 77345 ¡#
Registered: 2015-08-20
Posts: 5,454

Re: Conky - full screen width bar ?

Well, now we know .. Yup, it'd doable.


BunsenLabs Forum Rules ---== I'm a Conky 1.9'er ==---
System:    Host: d67 Kernel: 4.9.0-9-amd64 x86_64 (64 bit gcc: 6.3.0)
Desktop: Openbox 3.6.1 Distro: Debian GNU/Linux 9 (stretch)

Offline

Board footer

Powered by FluxBB