Back to basics with Lua and Cairo! This widget draws only a customizable box. It is inspired from Londonali's Background script.
The script can be downloaded on deviantArt :
here.
As usual, the widget uses a table to get the parameters :
boxes_settings
The minimum setup is an empty table :
local boxes_settings={
{},
}
This one draws a box with the default parameters : same size of the conky window, white background with opacity set to 50 %.
Parameters for positioning the box are
x
,
y
,
w
and
h
, relatives to the top-left corner of the Conky's window.
The same box as above but with a shorter height:
local boxes_settings={
{h=130},
}
Another box with the 4 parameters :
local boxes_settings={
{x=3,y=35,h=95,w=85},
}
It's quite easy to use more than one box :
local boxes_settings={
{x=3,y=35,h=95,w=85},
{x=92,y=35,h=95,w=117},
}
Tha
Lua API for Conky can get some informations about Conky's window, for example, to get the window's height or width, use
conky_window.height
or
conky_window.width
in the Lua scripts :
local boxes_settings={
{x=3,h=25,w=conky_window.width-6},
{x=3,y=35,h=95,w=85},
{x=92,y=35,h=95,w=117},
}
So, with the above code, when the Conky's window increases, the top box is still nice :
Each corner of a box can be set individually in a table
{shape,radius}
The four corners are join into a table named
corners
:
corners={ {shape-top-left,radius-top-left},
{shape-top-right,radius-top-right},
{shape-bottom-left,radius-bottom-left},
{shape-bottom-right,radius-bottom-right}
}
Available shapes are :
"curve"
,
"circle"
and
"line"
If the
corners
table has less than 4 elements, the last element is used for missing elements:
Box with one corner defined:
{w=400,h=120, corners={ {"circle",40} } }
The boxes can be draw with only a border if the
border
parameter is greater than zero :
Some dashes can be added to the border if the
dash
parameter is greater than zero:
The box can be rotated around his top-left corner with the
angle
parameter :
The rotation can be arround the x axis or the y axis with the
skew_x
and
skew_y
parameters :
An interesting feature of Cairo is the
compositing operator :
In this script, the compositing operator is called with the
operator
parameter, and the available arguments are
"clear"
,
"source"
,
"over"
,
"in"
,
"out"
,
"atop"
,
"dest"
,
"dest_over"
,
"dest_in"
,
"dest_out"
,
"dest_atop"
,
"xor"
,
"add"
,
"saturate"
. Default is
"over"
.
NOTE : in your conkyrc, you need the parameter
own_window_argb_visual yes
Let's start with theses two boxes :
{x=10,y=10,w=150,h=90, },
{x=50,y=20,w=60,h=150, corners={{ "curve",10}} },
for this output :
The
"clear"
operator :
{x=10,y=10,w=150,h=90, },
{x=50,y=20,w=60,h=150, corners={{ "curve",10}} , operator="clear" },
The
"out"
operator :
{x=10,y=10,w=150,h=90, },
{x=50,y=20,w=60,h=150, corners={{ "curve",10}} , operator="out" },
The
"add"
operator :
{x=10,y=10,w=150,h=90, },
{x=50,y=20,w=60,h=150, corners={{ "curve",10}} , operator="add" },
and so on ...
Last part of the boxes are the colour, colours are set in the
colour
tables.
Each "table colour" contains one or more tables which defines the colours of a gradient :
table={P,C,A}
P = position inside the linear gradient (0 = start of the gradient, 1= end of the gradient)
C = hexadecimal colour
A = alpha (opacity) of colour (0=invisible,1=opacity 100%)
For example, for a single colour table:
colour={{0,0x0000ff,1}}
for a 2-colours table :
colour={
{0,0x0000ff,1},
{1,0xff00ff,1}
}
for a 3-colours table:
colour={
{0,0x0000ff,1},
{0.5,0xff00ff,1},
{1,0xff00ff,1}
}
The output of this box :
{x=10,y=10,w=250,h=90, colour={ {0,0xFFFF00,1} } }
is a yellow rectangle :
The output of this box
{x=10,y=10,w=250,h=90, colour={ {0,0xFFFF00,1}, {1,0xFF0000,1} } }
is a yellow rectangle again because we haven't set up the gradient to use.
Gradients are defined with one of this parameters
linear_gradient
or
radial_gradient
linear_gradient - table with the coordinates of two points to define a linear gradient,
points are relative to top-left corner of the box, (not the conky's window)
{x1,y1,x2,y2}
radial_gradient - table with the coordinates of two circle to define a radial gradient,
points are relative to top-left corner of the box, (not the conky window)
{x1,y1,r1,x2,y2,r2} (r=radius)
This code :
{x=10,y=10,w=250,h=100,
colour={ {0,0xFFFF00,1}, {1,0xFF0000,1}} ,
linear_gradient={0,0,0,100} }
gives this output:
This code :
{x=10,y=10,w=250,h=100,
colour={ {0,0xFFFF00,1}, {1,0xFF0000,1}} ,
linear_gradient={0,0,0,50} }
gives this output:
This code :
{x=10,y=10,w=250,h=100,
colour={ {0,0xFFFF00,1}, {0.5,0xFF0000,1}} ,
linear_gradient={0,0,0,50} }
gives this output:
This code, with a radial gradient :
{x=10,y=10,w=250,h=90,
colour={ {0,0xFFFF00,1}, {1,0xFF0000,1}} ,
radial_gradient={0,0,0,0,0,90} }
gives this output :
This code:
{x=10,y=110,w=300,h=10,
colour={ {0,0x0000FF,0}, {0.5,0x00FF00,1}, {1,0x0000FF,0},} ,
radial_gradient={0,5,0,0,5,300} }
gives this output :
Other parameters added recently, while writing this note :
scale_x
and
scale_y
to rescale the box, useful for drawing elipses
draw_me
: if set to false, box is not drawn (default = true or 1)
it can be used with a conky string, if the string returns 1, the box is drawn :
example : "${if_empty ${wireless_essid wlan0}}${else}1$endif",
Some examples of amazing setup :
{x=300,y=70,w=250,h=100,
linear_gradient={0,80,0,100},
colour={{0,0x000000,1},{0.5,0xFFFFFF,1}},
},
{x=200,y=70,w=100,h=100,
radial_gradient={100,100,0,100,100,20},
colour={{0.5,0xFFFFFF,1},{1,0x000000,1}},
},
{x=200,y=170,w=100,h=100,
linear_gradient={80,0,100,0},
colour={{0.5,0xFFFFFF,1},{0,0x000000,1}},
},
{x=200,y=270,w=100,h=100,
radial_gradient={100,0,0,100,0,20},
colour={{0.5,0xFFFFFF,1},{1,0x000000,1}},
},
{x=300,y=270,w=250,h=100,
linear_gradient={0,0,0,20},
colour={{1,0x000000,1},{0.5,0xFFFFFF,1}},
},
{x=290,y=160,h=120,
corners={{"circle",10}},
operator="clear" }
for this output :
A button :
local gradient = { {0,0x858585,1}, {1,0x000000,1}}
local table_settings={
{w=200,h=200,
colour=gradient,
linear_gradient= {0,0,0,200} },
{x=10,y=10,w=180,h=180,
corners={ {"circle",90} },
colour=gradient ,
linear_gradient= {180,180,10,10} },
{x=20,y=20,w=160,h=160,
corners={ {"circle",80} },
colour=gradient ,
linear_gradient= {20,20,160,160} },
}
for this output :
If you create some nice conkys with this widget, or any other, feel free to post a link in the comments ;-)