-
Notifications
You must be signed in to change notification settings - Fork 1
Theming
Since the widget toolkit is GTK3 theming is done with CSS.
Warning
GTK is not the web
While most features are implemented in GTK, you can't assume anything that works on the web will work with GTK.
Refer to the GTK docs to see what is available.
So far every widget you made used your default GTK3 theme. To make them more custom, you can apply stylesheets to them.
You can pass a path to a file or css as a string in App:start
local inline_css = [[
window {
background-color: transparent;
}
]]
App:start {
css = inline_css,
css = '/path/to/style.css',
css = './style.css',
}Warning
When using relative paths, for example ./style.css keep in mind that they will be relative to the current working directory.
Widget.Label {
css = 'color: blue; padding: 1em;',
label = 'hello',
}Note
The css property of a widget will not cascade to its children.
You can apply additional styles at runtime.
App:apply_css('/path/to/file.css')App:apply_css([[
window {
background-color: transparent;
}
]])App:reset_css() -- reset if needWarning
App:apply_css will apply on top of other stylesheets applied before.
You can reset stylesheets with App:reset_css or by passing true as a second parameter to App:apply_css.
If you are not sure about the widget hierarchy or any CSS selector, you can use the GTK inspector
# to bring up the inspector run
astal-lua request --inspectorGtk's CSS only supports a subset of what the web offers. Most notably nested selectors are unsupported by Gtk, but this can be workaround by using preprocessors like SCSS.
local scss = './style.scss'
local css = '/tmp/style.css'
astal.exec(string.format('sass %s %s', scss, css))
App:start {
css = css,
}This snippet compiles your SCSS to CSS and automatically applies it to the Gtk app, using the async api
local App = require('astal.gtk4.app')
local async_exec = require('astal.process').async_exec
local monitor_file = require('astal.file').monitor_file
local HOME = os.getenv('HOME')
local CONFIG = HOME .. '/.config/astal'
local CACHE = HOME .. '/.cache/astal'
local styles = CONFIG .. '/styles.scss'
local styles_dir = CONFIG .. '/scss'
local styles_cache = CACHE .. '/styles.css'
return async(function()
local function compile()
local _, stderr = async_exec { 'sass', styles, styles_cache }
if stderr then
io.stdout:write(stderr .. '\n')
return false
end
io.stdout:write(string.format('%s -> %s\n', styles, styles_cache))
return true
end
local function apply()
if compile() then App:apply_css(styles_cache, true) end
end
local function watch(path, recursive)
monitor_file(path, recursive, function(_, event)
if event == 'CHANGES_DONE_HINT' then apply() end
end)
end
watch(styles)
watch(styles_dir, true)
apply()
end)