SyncTERM themes are INI files which define user-interface styles and glyphs. The C host loads one theme for the process and exposes immutable snapshots of it to the menu, file-picker, and connected Wren VMs. All three VMs therefore start with the same program-wide theme.
Storage and Selection
Theme files use the .ini extension and live in the per-user themes
directory beside the per-user scripts directory. The exact path is shown
by SyncTERM Settings → File Locations. Typical locations are:
| Platform | Directory |
|---|---|
Windows |
|
macOS |
|
Unix |
|
Haiku |
The user’s settings directory followed by |
The selected basename is stored as ThemeFile in the [SyncTERM] section of
syncterm.ini. Paths are not accepted. Selecting the built-in Classic
Theme removes ThemeFile instead of storing a special name.
At startup, a missing or invalid selected file falls back to Classic Theme without deleting the configured filename. The Themes browser displays that file as invalid so it can be diagnosed after the file is restored or fixed. The browser previews valid themes as the highlight moves, saves a selection on Enter, and restores the committed theme on Escape. Invalid entries remain highlightable for their error text but cannot be selected.
The six settings under [ClassicTheme] affect only the built-in Classic
Theme. A file theme is a sparse overlay on SyncTERM’s compiled default and
does not inherit those six colour preferences.
File Structure
Metadata is written before any section header:
Name = Example Theme
Author = Example Author
Description = A short description shown in the Themes browser
Version = 1.0
[Style:default]
Foreground = 0xFFFFFF
Background = 0x000040
[Style:list.item.focused]
LegacyAttr = 0x70
Foreground = 0x000000
Background = 0xC0C0C0
[Glyph:scrollbar.thumb]
CP437 = 219
ASCII = 35
Name is required and must not be empty. Author, Description, and
Version are optional. Duplicate recognized metadata keys are errors.
Unrecognized metadata, sections, and keys are ignored for forward
compatibility.
Recognized section names and keys are case-insensitive. Two recognized sections with the same name, including names which differ only in case, make the file invalid. A malformed value or duplicate recognized key also makes the file invalid.
Styles
A [Style:role] section may contain these fields:
| Field | Range | Meaning |
|---|---|---|
|
|
Conio font slot. |
|
|
IBM text attribute used by legacy-colour backends. |
|
|
24-bit RGB foreground used by RGB-capable backends. |
|
|
24-bit RGB background used by RGB-capable backends. |
Numbers use C integer syntax, so decimal and 0x hexadecimal forms are
accepted. The case-insensitive value inherit clears a field and makes it
inherit through the Wren role cascade. Omitted fields retain the compiled
default value for an existing role; a new role starts with all fields set to
inherit.
Role lookup removes dotted suffixes until it reaches default. For example,
list.item.focused falls back through list.item, list, and default.
Roles ending in .inactive use the parallel inactive cascade before falling
back to default. The resulting default style must contain all four
fields, so a file which clears one of its fields without replacing it is
invalid.
The current role registry is:
| Role | Use |
|---|---|
|
Cascade terminators and general screen/pane colours. |
|
Pane and dialog borders. |
|
Pane and dialog border titles. |
|
Command-menu rows. |
|
List rows, including the selected row in an unfocused pane. |
|
Text-input fields. |
|
Button labels and their shortcut character. |
|
Status and help bars. |
|
Check-box controls. |
|
Radio-button rows. |
|
Numeric spin controls. |
|
Menu bars and their entries. |
|
Scrollbar track and position indicator. |
|
Filled portion of a progress bar. |
|
Transfer and diagnostic log severities. |
|
Markdown help content. |
|
Status and alert popups. |
|
Main-menu screen chrome. These roles are optional in file themes and
otherwise cascade to |
Scripts may use additional role names. A theme file may style such a role before it becomes part of the built-in registry.
Glyphs
A [Glyph:name] section uses numeric byte values:
-
CP437is0..255and identifies the primary CP437 glyph. -
ASCIIis a printable ASCII byte,32..126, used when the primary glyph cannot be rendered.
Literal characters are not accepted because many CP437 glyphs are control
codes, whitespace, or not representable in the theme file’s encoding. An
existing glyph may override either value. A new glyph name must provide both
CP437 and ASCII.
The built-in glyph registry is:
| Name | CP437 | ASCII |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Scripts may define and use additional glyph names, subject to the requirement that a new name supplies both byte values.
Compatibility
The role and glyph registries may grow as UI widgets are added. Unknown content is ignored so a file can include entries understood by newer SyncTERM versions, while sparse overlays automatically receive new compiled defaults. Theme authors should still test both RGB and legacy-colour output, because every visible style can be rendered through either representation.