Some of my scripts for daily use on a linux desktop

Thursday, January 27, 2011

Box widget

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 ;-)

No comments:

Post a Comment