2017-01-10 16:34:48 +00:00
|
|
|
# Theme format 3.0
|
|
|
|
|
|
|
|
Rofi is now at the 3rd version of it theming format. Where previous formats was a basic version with an extension. This
|
|
|
|
is a full rewrite. The new format is loosely modelled after [css](https://en.wikipedia.org/wiki/Cascading_Style_Sheets).
|
|
|
|
This will hopefully be familiar and make it easier for people to get started with theming.
|
|
|
|
|
|
|
|
This file is organized as follow, first we give the specification of the file format.
|
|
|
|
In the second part we will list the possible options. In the final section a few examples are shown.
|
|
|
|
|
|
|
|
## File Format Specification
|
|
|
|
|
|
|
|
### Encoding
|
|
|
|
|
|
|
|
The encoding of the file is ascii.
|
|
|
|
Both unix ('\n') and windows ('\r\n') newlines format are supported. But unix is preferred.
|
|
|
|
|
|
|
|
### Comments
|
|
|
|
|
|
|
|
C and C++ file comments are support.
|
|
|
|
|
|
|
|
* Anything after `// ` and before a newline is considered a comment.
|
|
|
|
* Everything between `/*` and `*/` are a comment.
|
|
|
|
|
|
|
|
Comments can be nested and inline.
|
|
|
|
|
|
|
|
The following is valid:
|
|
|
|
```css
|
2017-01-10 17:32:59 +00:00
|
|
|
// Magic comment.
|
2017-01-10 16:34:48 +00:00
|
|
|
property: /* comment */ value;
|
|
|
|
```
|
|
|
|
|
|
|
|
However this is not:
|
|
|
|
```css
|
|
|
|
prop/*comment*/erty: value;
|
|
|
|
```
|
|
|
|
|
|
|
|
### White space
|
|
|
|
|
|
|
|
White space and newlines, like comments, are ignored by the parser.
|
|
|
|
|
|
|
|
This:
|
|
|
|
|
|
|
|
```css
|
|
|
|
property: name;
|
|
|
|
```
|
|
|
|
|
|
|
|
Is identical to:
|
|
|
|
|
|
|
|
```css
|
|
|
|
property :
|
|
|
|
name
|
|
|
|
|
|
|
|
;
|
|
|
|
```
|
|
|
|
|
|
|
|
### Basic Structure
|
|
|
|
|
|
|
|
The file is structured like:
|
|
|
|
|
|
|
|
```
|
|
|
|
/* Global properties section */
|
|
|
|
* {
|
|
|
|
{list of properties}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Element theme section. */
|
|
|
|
#{element path} {
|
|
|
|
{list of properties}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
#### Global properties section
|
|
|
|
|
|
|
|
Each theme has one, optional, global properties list.
|
|
|
|
If present, the global properties section has the be the first section in the file.
|
|
|
|
|
|
|
|
The global properties section is special, as the properties here denote the defaults for each element.
|
|
|
|
Reference properties (see properties section) can only link to properties in this section.
|
|
|
|
|
|
|
|
The section may only contain a '*' before the brace open..
|
|
|
|
|
|
|
|
#### Element theme section
|
|
|
|
|
|
|
|
A theme can have multiple element theme sections.
|
|
|
|
|
|
|
|
The element path can consist of multiple names separated by whitespace or dots.
|
|
|
|
Each element may contain any number of letters, numbers and '-'.
|
|
|
|
The first element should always start with a '#'.
|
|
|
|
|
|
|
|
This is a valid element name:
|
|
|
|
|
|
|
|
```css
|
|
|
|
#window mainbox listview element normal.normal {
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
And is identical to:
|
|
|
|
|
|
|
|
```css
|
|
|
|
#window.mainbox.listview.element normal.normal {
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Each section inherits the properties of it parents and it own properties are added. If the property is specified both in
|
|
|
|
the parent as in the child, the childs property has priority.
|
|
|
|
So `#window mainbox` will contain all properties of `#window` and `#window mainbox`.
|
|
|
|
|
|
|
|
In the following example:
|
|
|
|
```css
|
|
|
|
#window {
|
|
|
|
a: 1;
|
|
|
|
b: 2;
|
|
|
|
}
|
|
|
|
#window mainbox {
|
|
|
|
b: 4;
|
|
|
|
c: 8;
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
The element `#window mainbox` will have the following set of properties:
|
|
|
|
|
|
|
|
```css
|
|
|
|
a: 1;
|
|
|
|
b: 4;
|
|
|
|
c: 8;
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
#### Properties
|
|
|
|
|
|
|
|
The properties in a section consist of:
|
|
|
|
|
|
|
|
```css
|
|
|
|
{identifier}: {value};
|
|
|
|
```
|
|
|
|
|
|
|
|
The `identifier` names the property specified. Identifier can consist of any combination of numbers, letters and '-'. It
|
|
|
|
may not contain any whitespace.
|
|
|
|
|
|
|
|
The current theme format support different type of properties:
|
|
|
|
|
|
|
|
* a string.
|
|
|
|
* an integer positive number.
|
|
|
|
* a positive fractional number.
|
|
|
|
* a boolean value.
|
|
|
|
* a color.
|
|
|
|
* text style.
|
|
|
|
* line style.
|
|
|
|
* a distance.
|
|
|
|
* a padding.
|
|
|
|
* a border.
|
|
|
|
* a position.
|
|
|
|
* a reference.
|
|
|
|
|
|
|
|
##### String
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: `"[:print:]"`
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
A string is always surrounded by quotes ('"'), between the quotes it can have any printable character.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```css
|
|
|
|
font: "Awasome 12";
|
|
|
|
```
|
|
|
|
|
|
|
|
###### Integer
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: "[:digit:]"
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
An integer may contain any number.
|
|
|
|
|
|
|
|
For examples:
|
|
|
|
|
|
|
|
```css
|
|
|
|
lines: 12;
|
|
|
|
```
|
|
|
|
|
|
|
|
##### Real
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: `[:digit:]+(\.[:digit:]+)?`
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
A real is an integer with an optional fraction.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```css
|
|
|
|
real: 3.4;
|
|
|
|
```
|
|
|
|
|
|
|
|
##### Boolean
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: `(true|false)`
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```css
|
|
|
|
dynamic: false;
|
|
|
|
```
|
|
|
|
|
|
|
|
##### Color
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: '#{HEX}{6}'
|
|
|
|
* Format: '#{HEX}{8}'
|
|
|
|
* Format: 'argb:{HEX}{8}'
|
|
|
|
* Format: 'rgb({INTEGER},{INTEGER},{INTEGER})'
|
|
|
|
* Format: 'rgba({INTEGER},{INTEGER},{INTEGER}, {REAL})'
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
Where '{HEX}' is a hexidecimal number ('0-9a-f'). The '{INTEGER}' value can be between 0 and 255, the '{Real}' value
|
|
|
|
between 0.0 and 1.0.
|
|
|
|
|
|
|
|
|
|
|
|
The first formats specify the color as RRGGBB (R = red, G = green, B = Blue), the second adds an alpha (A) channel:
|
|
|
|
AARRGGB.
|
|
|
|
|
|
|
|
For example:
|
|
|
|
|
|
|
|
```css
|
|
|
|
background: #FF0000;
|
|
|
|
foreground: rgba(0,0,1, 0.5);
|
|
|
|
```
|
|
|
|
|
|
|
|
##### Text style
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: (bold|italic|underline|none)
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
Text style indicates how the text should be displayed. None indicates no style should be applied.
|
|
|
|
|
|
|
|
##### Line style
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: `(dash|solid)`
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
Indicates how a line should be drawn.
|
|
|
|
|
|
|
|
|
|
|
|
##### Distance
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: '{Integer}px'
|
|
|
|
* Format: '{Real}em'
|
|
|
|
* Format: '{Real}%'
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
##### Padding
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: '{Integer}'
|
|
|
|
* Format: '{Distance}'
|
|
|
|
* Format: '{Distance} {Distance}'
|
|
|
|
* Format: '{Distance} {Distance} {Distance}'
|
|
|
|
* Format: '{Distance} {Distance} {Distance} {Distance}'
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
###### Border
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: '{Integer}'
|
|
|
|
* Format: '{Distance}'
|
|
|
|
* Format: '{Distance} {Distance}'
|
|
|
|
* Format: '{Distance} {Distance} {Distance}'
|
|
|
|
* Format: '{Distance} {Distance} {Distance} {Distance}'
|
|
|
|
* Format: '{Distance} {Line style}'
|
|
|
|
* Format: '{Distance} {Line style} {Distance} {Line style}'
|
|
|
|
* Format: '{Distance} {Line style} {Distance} {Line style} {Distance} {Line style}'
|
|
|
|
* Format: '{Distance} {Line style} {Distance} {Line style} {Distance} {Line style} {Distance} {Line style}'
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
###### Position
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: '(center|east|north|west|northeast|northweast|south|southwest|southeast)'
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
###### Reference
|
|
|
|
|
2017-01-10 17:32:59 +00:00
|
|
|
* Format: '@{PROPERTY NAME}'
|
2017-01-10 16:34:48 +00:00
|
|
|
|
|
|
|
A reference can point to another reference. Currently the maximum number of redirects is 20.
|
|
|
|
|
|
|
|
> REST NEEDS updating.
|
2017-01-10 17:32:59 +00:00
|
|
|
|
2016-12-19 07:10:33 +00:00
|
|
|
# Basic Organization
|
2016-12-09 18:49:49 +00:00
|
|
|
|
|
|
|
Each widget has:
|
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
## Name
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Name: Internal name of the widget.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Sub-widgets are {Parent}.{Child}.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
Example: window, window.mainbox.listview, window.mainbox.listview.element
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Names are prefixed with a `#`
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
List of names in **rofi**:
|
|
|
|
|
2016-12-20 08:17:19 +00:00
|
|
|
* `#window`
|
2017-01-05 08:40:10 +00:00
|
|
|
* `#window.overlay`: The overlay widget.
|
|
|
|
* `#window.mainbox`
|
|
|
|
* `#window.mainbox.box`: The main vertical @box
|
|
|
|
* `#window.mainbox.inputbar`
|
|
|
|
* `#window.mainbox.inputbar.box`: The horizontal @box packing the widgets.
|
|
|
|
* `#window.mainbox.inputbar.case-indicator`: The case/sort indicator @textbox
|
|
|
|
* `#window.mainbox.inputbar.prompt`: The prompt @textbox
|
|
|
|
* `#window.mainbox.inputbar.entry`: The main entry @textbox
|
|
|
|
* `#window.mainbox.listview`
|
2017-01-08 15:09:24 +00:00
|
|
|
* `#window.mainbox.listview.box`: The listview container.
|
2017-01-05 08:40:10 +00:00
|
|
|
* `#window.mainbox.listview.scrollbar`: The listview scrollbar
|
|
|
|
* `#window.mainbox.listview.element`: The entries in the listview
|
|
|
|
* `#window.mainbox.sidebar`
|
|
|
|
* `#window.mainbox.sidebar.box`: The main horizontal @box packing the buttons.
|
|
|
|
* `#window.mainbox.sidebar.button`: The buttons @textbox for each mode.
|
|
|
|
* `#window.mainbox.message`
|
|
|
|
* `#window.mainbox.message.textbox`: The message textbox.
|
2017-01-05 17:33:57 +00:00
|
|
|
* `#window.mainbox.message.box`: The box containing the message.
|
2016-12-13 17:05:40 +00:00
|
|
|
|
|
|
|
## State
|
|
|
|
|
|
|
|
State: State of widget
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-19 07:10:33 +00:00
|
|
|
Optional flag(s) indicating state.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
These are appended after the name or class of the widget.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
`#window.mainbox.sidebar.button selected.normal { }`
|
2016-12-13 17:10:42 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
`#window.mainbox.listview.element selected.urgent { }`
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
Currently only the entrybox and scrollbar has states:
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
`{visible modifier}.{state}`
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Where `visible modifier` can be:
|
|
|
|
* normal: No modification.
|
|
|
|
* selected: The entry is selected/highlighted by user.
|
2016-12-19 07:10:33 +00:00
|
|
|
* alternate: The entry is at an alternating row. (uneven row)
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Where `state` is:
|
2016-12-13 17:10:42 +00:00
|
|
|
* normal: No modification.
|
|
|
|
* urgent: This entry is marked urgent.
|
|
|
|
* activE: This entry is marked active.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
These can be mixed.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Example:
|
2016-12-13 17:10:42 +00:00
|
|
|
```
|
2017-01-05 08:40:10 +00:00
|
|
|
#name.to.textbox selected.active {
|
2016-12-13 17:05:40 +00:00
|
|
|
background: #003642;
|
|
|
|
foreground: #008ed4;
|
|
|
|
}
|
2016-12-13 17:10:42 +00:00
|
|
|
```
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
Sets all selected textboxes marked active to the given foreground and background color.
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
The scrollbar when drawing uses the `handle` state when drawing the small scrollbar handle.
|
|
|
|
Allowing overriding of color.
|
|
|
|
|
2016-12-13 17:05:40 +00:00
|
|
|
# File structure
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2016-12-13 17:10:42 +00:00
|
|
|
The file is structured as follows
|
|
|
|
|
|
|
|
```
|
2016-12-13 17:05:40 +00:00
|
|
|
/* Global properties, that apply as default to all widgets. */
|
|
|
|
{list of properties}
|
2016-12-09 18:49:49 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
#{name} {optional state} {
|
2016-12-13 17:05:40 +00:00
|
|
|
{list of properties}
|
|
|
|
}
|
2017-01-05 08:40:10 +00:00
|
|
|
#{name}.{optional state} {
|
2016-12-13 17:05:40 +00:00
|
|
|
{list of properties}
|
2016-12-09 18:49:49 +00:00
|
|
|
}
|
2016-12-13 17:10:42 +00:00
|
|
|
```
|
2016-12-13 17:05:40 +00:00
|
|
|
|
2016-12-16 08:28:13 +00:00
|
|
|
The global properties an freeĺy be mixed between entries.
|
2017-01-05 08:40:10 +00:00
|
|
|
Name and state can be separated by a comman, or joined using a dot.
|
2016-12-13 17:20:09 +00:00
|
|
|
|
|
|
|
Each property is constructed like:
|
|
|
|
```
|
|
|
|
{key} : {value} ;
|
|
|
|
```
|
|
|
|
Key is a simple ascii string.
|
|
|
|
Separated from value by a colon ':';
|
|
|
|
Value supports the following formats:
|
|
|
|
|
|
|
|
* string: `"{string}"`
|
|
|
|
* integer: `[0-9]+`
|
|
|
|
* double: `[0-9]+\.[0-9]`
|
|
|
|
* boolean: `true|false`
|
2016-12-19 07:10:33 +00:00
|
|
|
* color:
|
2016-12-13 17:20:09 +00:00
|
|
|
* `#[0-9a-fA-F]{6}`: hexidecimal rgb color.
|
|
|
|
* `#[0-9a-fA-F]{8}`: hexidecimal argb color.
|
2016-12-19 07:10:33 +00:00
|
|
|
* `argb:[0-0a-fA-F]{8}`: Old **rofi** argb color style.
|
2016-12-13 17:20:09 +00:00
|
|
|
* `rgba\([0-9]{1,3},[0-9]{1,3}, [0-9]{1,3}, {double}\)`: css style rgba color.
|
|
|
|
* `rgb\([0-9]{1,3},[0-9]{1,3}, [0-9]{1,3}\)`: css style rgb color.
|
2017-01-05 08:40:10 +00:00
|
|
|
* distance:
|
|
|
|
* `{size}{unit} {line-style}`
|
|
|
|
* unit can be px,em,%. for px `{size}` is an integer number, for %,em it is a positive real.
|
|
|
|
* {line-style} can be `dash` or `solid` and is optional.
|
|
|
|
* padding: `({distance}){1,4}`
|
2017-01-06 18:04:25 +00:00
|
|
|
* position: (center|north|south|east|west|northeast|northwest|southwest|southeast)
|
2017-01-08 23:09:02 +00:00
|
|
|
* highlight-style: (none|bold|underline|italic)
|
2016-12-13 17:21:31 +00:00
|
|
|
|
|
|
|
Each property is closed by a semi-colon `;`;
|
2016-12-19 07:10:33 +00:00
|
|
|
|
|
|
|
The following properties are currently supports:
|
|
|
|
|
2017-01-03 13:25:24 +00:00
|
|
|
* all widgets:
|
|
|
|
* padding: distance
|
2017-01-05 08:40:10 +00:00
|
|
|
* margin: distance
|
|
|
|
* border: distance
|
|
|
|
* background: color
|
|
|
|
* foreground: color
|
|
|
|
* end: boolean
|
2017-01-03 13:25:24 +00:00
|
|
|
|
2016-12-19 07:10:33 +00:00
|
|
|
* window:
|
|
|
|
* font: string
|
2016-12-19 16:49:52 +00:00
|
|
|
* transparency: string
|
|
|
|
- real
|
|
|
|
- background
|
|
|
|
- screenshot
|
|
|
|
- Path to png file
|
2017-01-06 18:04:25 +00:00
|
|
|
* position: position
|
|
|
|
The place of the anchor on the monitor.
|
|
|
|
* anchor: anchor
|
|
|
|
The anchor position on the window.
|
2016-12-19 07:10:33 +00:00
|
|
|
|
|
|
|
* scrollbar
|
|
|
|
* foreground: color
|
2017-01-06 14:36:06 +00:00
|
|
|
* handle-width: distance
|
|
|
|
* handle-color: color
|
2017-01-05 08:40:10 +00:00
|
|
|
* foreground: color
|
2016-12-19 07:10:33 +00:00
|
|
|
|
|
|
|
* box
|
2017-01-05 08:40:10 +00:00
|
|
|
* spacing: distance
|
2016-12-19 07:10:33 +00:00
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
* textbox:
|
|
|
|
* background: color
|
|
|
|
* foreground: color
|
2017-01-08 19:39:37 +00:00
|
|
|
* text: The text color to use (falls back to foreground if not set)
|
2017-01-08 23:09:02 +00:00
|
|
|
* highlight: highlight {color}
|
2016-12-19 07:10:33 +00:00
|
|
|
|
|
|
|
* listview:
|
|
|
|
* columns: integer
|
|
|
|
* fixed-height: boolean
|
2017-01-03 13:25:24 +00:00
|
|
|
* dynamic: boolean
|
2016-12-19 07:10:33 +00:00
|
|
|
* scrollbar: boolean
|
2017-01-05 08:40:10 +00:00
|
|
|
* scrollbar-width: distance
|
2016-12-19 07:10:33 +00:00
|
|
|
* cycle: boolean
|
2017-01-05 08:40:10 +00:00
|
|
|
* spacing: distance
|
2016-12-20 08:17:19 +00:00
|
|
|
|
|
|
|
|
|
|
|
## Resolving properties
|
|
|
|
|
2017-01-05 08:40:10 +00:00
|
|
|
It tries to find the longest match down the dependency tree.
|
2016-12-20 08:17:19 +00:00
|
|
|
|