window:get_appearance()¶
NOTE: You probably want to use wezterm.gui.get_appearance() instead, as it is easier to use!
Since: Version 20210814-124438-54e29167
The functionality described in this section requires version 20210814-124438-54e29167 of wezterm, or a more recent version.
This method returns the appearance of the window environment. The appearance can be one of the following 4 values:
"Light"
- the normal appearance, with dark text on a light background"Dark"
- "dark mode", with predominantly dark colors and probably a lighter, lower contrasting, text color on a dark background"LightHighContrast"
- light mode but with high contrast colors (not reported on all systems)"DarkHighContrast"
- dark mode but with high contrast colors (not reported on all systems)
wezterm is able to detect when the appearance has changed and will generate a window-config-reloaded event for each window.
This example configuration shows how you can have your color scheme automatically adjust to the current appearance:
local wezterm = require 'wezterm'
function scheme_for_appearance(appearance)
if appearance:find 'Dark' then
return 'Builtin Solarized Dark'
else
return 'Builtin Solarized Light'
end
end
wezterm.on('window-config-reloaded', function(window, pane)
local overrides = window:get_config_overrides() or {}
local appearance = window:get_appearance()
local scheme = scheme_for_appearance(appearance)
if overrides.color_scheme ~= scheme then
overrides.color_scheme = scheme
window:set_config_overrides(overrides)
end
end)
return {}
Wayland GNOME Appearance¶
Since: Version 20220807-113146-c2fee766
The functionality described in this section requires version 20220807-113146-c2fee766 of wezterm, or a more recent version.
wezterm uses XDG Desktop Portal to determine the appearance.
In earlier versions you may wish to use an alternative method to determine the
appearance, as wezterm didn't know how to interrogate the appearance on Wayland
systems, and would always report "Light"
.
The GNOME desktop environment provides the gsettings
tool that can
inform us of the selected appearance even in a Wayland session. We can
substitute the call to window:get_appearance
above with a call to the
following function, which takes advantage of this:
function query_appearance_gnome()
local success, stdout = wezterm.run_child_process {
'gsettings',
'get',
'org.gnome.desktop.interface',
'gtk-theme',
}
-- lowercase and remove whitespace
stdout = stdout:lower():gsub('%s+', '')
local mapping = {
highcontrast = 'LightHighContrast',
highcontrastinverse = 'DarkHighContrast',
adwaita = 'Light',
['adwaita-dark'] = 'Dark',
}
local appearance = mapping[stdout]
if appearance then
return appearance
end
if stdout:find 'dark' then
return 'Dark'
end
return 'Light'
end
Since WezTerm will not fire a window-config-reloaded
event on Wayland for
older versions of wezterm, you will instead need to listen on the
update-right-status event, which
will essentially poll for the appearance periodically:
local wezterm = require 'wezterm'
function scheme_for_appearance(appearance)
if appearance:find 'Dark' then
return 'Builtin Solarized Dark'
else
return 'Builtin Solarized Light'
end
end
wezterm.on('update-right-status', function(window, pane)
local overrides = window:get_config_overrides() or {}
local appearance = query_appearance_gnome()
local scheme = scheme_for_appearance(appearance)
if overrides.color_scheme ~= scheme then
overrides.color_scheme = scheme
window:set_config_overrides(overrides)
end
end)
return {}