mirror of
https://github.com/Zedfrigg/ironbar.git
synced 2025-04-20 11:54:23 +02:00
Resolves #105 Co-authored-by: A-Cloud-Ninja <5809177+A-Cloud-Ninja@users.noreply.github.com>
215 lines
No EOL
5.4 KiB
Markdown
215 lines
No EOL
5.4 KiB
Markdown
Allows you to render custom content using the Lua and the Cairo drawing library.
|
|
This is an advanced feature which provides a powerful escape hatch, allowing you to fetch data and render anything
|
|
using an embedded scripting environment.
|
|
|
|
Scripts are automatically hot-reloaded.
|
|
|
|
> [!NOTE]
|
|
> The Lua engine uses LuaJIT 5.1, and requires the use of a library called `lgi`.
|
|
> Ensure you have the correct lua-lgi package installed.
|
|
|
|

|
|
|
|
## Configuration
|
|
|
|
> Type: `cairo`
|
|
|
|
| Name | Type | Default | Description |
|
|
|--------------------|-----------|---------|----------------------------------------------------|
|
|
| `path` | `string` | `null` | The path to the Lua script to load. |
|
|
| `frequency` | `float` | `200` | The number of milliseconds between each draw call. |
|
|
| `width` | `integer` | `42` | The canvas width in pixels. |
|
|
| `height` | `integer` | `42` | The canvas height in pixels. |
|
|
|
|
<details>
|
|
<summary>JSON</summary>
|
|
|
|
```json
|
|
{
|
|
"center": [
|
|
{
|
|
"type": "cairo",
|
|
"path": ".config/ironbar/clock.lua",
|
|
"frequency": 100,
|
|
"width": 300,
|
|
"height": 300
|
|
}
|
|
]
|
|
}
|
|
|
|
```
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary>TOML</summary>
|
|
|
|
```toml
|
|
[[center]]
|
|
type = "cairo"
|
|
path = ".config/ironbar/clock.lua"
|
|
frequency = 100
|
|
width = 300
|
|
height = 300
|
|
```
|
|
</details>
|
|
|
|
<details>
|
|
<summary>YAML</summary>
|
|
|
|
```yaml
|
|
center:
|
|
- type: cairo
|
|
path: .config/ironbar/clock.lua
|
|
frequency: 100
|
|
width: 300
|
|
height: 300
|
|
```
|
|
|
|
</details>
|
|
|
|
<details>
|
|
<summary>Corn</summary>
|
|
|
|
```corn
|
|
let {
|
|
$config_dir = ".config/ironbar"
|
|
$cairo = {
|
|
type = "cairo"
|
|
path = "$config_dir/clock.lua"
|
|
frequency = 100
|
|
width = 300
|
|
height = 300
|
|
}
|
|
} in {
|
|
center = [ $cairo ]
|
|
}
|
|
```
|
|
|
|
</details>
|
|
|
|
### Script
|
|
|
|
Every script must contain a function called `draw`.
|
|
This takes a single parameter, which is the Cairo context.
|
|
|
|
Outside of this, you can do whatever you like.
|
|
The full lua `stdlib` is available, and you can load in additional system packages as desired.
|
|
|
|
The most basic example, which draws a red square, can be seen below:
|
|
|
|
```lua
|
|
function draw(cr)
|
|
cr:set_source_rgb(1.0, 0.0, 0.0)
|
|
cr:paint()
|
|
end
|
|
```
|
|
|
|
A longer example, used to create the clock in the image at the top of the page, is shown below:
|
|
|
|
<details>
|
|
<summary>Circle clock</summary>
|
|
|
|
```lua
|
|
function get_ms()
|
|
local ms = tostring(io.popen('date +%s%3N'):read('a')):sub(-4, 9999)
|
|
return tonumber(ms) / 1000
|
|
end
|
|
|
|
function draw(cr)
|
|
local center_x = 150
|
|
local center_y = 150
|
|
local radius = 130
|
|
|
|
local date_table = os.date("*t")
|
|
|
|
local hours = date_table["hour"]
|
|
local minutes = date_table["min"]
|
|
local seconds = date_table["sec"]
|
|
local ms = get_ms()
|
|
|
|
|
|
local label_seconds = seconds
|
|
seconds = seconds + ms
|
|
|
|
local hours_str = tostring(hours)
|
|
if string.len(hours_str) == 1 then
|
|
hours_str = "0" .. hours_str
|
|
end
|
|
|
|
local minutes_str = tostring(minutes)
|
|
if string.len(minutes_str) == 1 then
|
|
minutes_str = "0" .. minutes_str
|
|
end
|
|
|
|
local seconds_str = tostring(label_seconds)
|
|
if string.len(seconds_str) == 1 then
|
|
seconds_str = "0" .. seconds_str
|
|
end
|
|
|
|
local font_size = radius / 5.5
|
|
|
|
cr:set_source_rgb(1.0, 1.0, 1.0)
|
|
|
|
cr:move_to(center_x - font_size * 2.5 + 10, center_y + font_size / 2.5)
|
|
cr:set_font_size(font_size)
|
|
cr:show_text(hours_str .. ':' .. minutes_str .. ':' .. seconds_str)
|
|
cr:stroke()
|
|
|
|
if hours > 12 then
|
|
hours = hours - 12
|
|
end
|
|
|
|
local line_width = radius / 8
|
|
local start_angle = -math.pi / 2
|
|
|
|
local end_angle = start_angle + ((hours + minutes / 60 + seconds / 3600) / 12) * 2 * math.pi
|
|
cr:set_line_width(line_width)
|
|
cr:arc(center_x, center_y, radius, start_angle, end_angle)
|
|
cr:stroke()
|
|
|
|
end_angle = start_angle + ((minutes + seconds / 60) / 60) * 2 * math.pi
|
|
cr:set_line_width(line_width)
|
|
cr:arc(center_x, center_y, radius * 0.8, start_angle, end_angle)
|
|
cr:stroke()
|
|
|
|
if seconds == 0 then
|
|
seconds = 60
|
|
end
|
|
|
|
end_angle = start_angle + (seconds / 60) * 2 * math.pi
|
|
cr:set_line_width(line_width)
|
|
cr:arc(center_x, center_y, radius * 0.6, start_angle, end_angle)
|
|
cr:stroke()
|
|
|
|
return 0
|
|
end
|
|
```
|
|
|
|
</details>
|
|
|
|
> [!TIP]
|
|
> The C documentation for the Cairo context interface can be found [here](https://www.cairographics.org/manual/cairo-cairo-t.html).
|
|
> The Lua interface provides a slightly friendlier API which restructures things slightly.
|
|
> The `cairo_` prefix is dropped, and the `cairo_t *cr` parameters are replaced with a namespaced call.
|
|
> For example, `cairo_paint (cairo_t *cr)` becomes `cr:paint()`
|
|
|
|
> [!TIP]
|
|
> Ironbar's Cairo module has similar functionality to the popular Conky program.
|
|
> You can often re-use scripts with little work.
|
|
|
|
### Initialization
|
|
|
|
You can optionally create an `init.lua` file in your config directory.
|
|
Any code in here will be executed once, on bar startup.
|
|
|
|
As variables and functions are global by default in Lua,
|
|
this provides a mechanism for sharing code between multiple modules.
|
|
|
|
## Styling
|
|
|
|
| Selector | Description |
|
|
|----------|-------------------------|
|
|
| `.cairo` | Cairo widget container. |
|
|
|
|
For more information on styling, please see the [styling guide](styling-guide). |