Window Rules
Window rules live in rules.toml. Aqueous watches the file, re-evaluates
managed windows after a change, and reloads it with the rest of the
configuration when you press Super+R.
Find a window’s identity
Section titled “Find a window’s identity”Use aqueousctl instead of guessing an application’s identifiers:
aqueousctl windowsaqueousctl windows --jsonaqueousctl inspect --ruleaqueousctl inspect --rule emits a ready-to-paste [[window]] block. Native
Wayland applications normally match by app_id; XWayland applications use
their WM_CLASS through class.
Matching behavior
Section titled “Matching behavior”Rules are checked from top to bottom and the first matching rule wins. Each
rule needs at least one of app_id, class, or title. When a rule has more
than one matcher, all of them must match.
Matchers are anchored, case-sensitive globs:
*matches any number of characters.?matches exactly one character.- A value without wildcards must match the entire identifier.
[[window]]app_id = "org.example.Editor"title = "Preferences*"layout = "float"floating = truewidth = 900height = 640Put narrow rules before broad ones:
[[window]]app_id = "org.example.Editor"title = "Preferences*"layout = "float"floating = truewidth = 900height = 640
[[window]]app_id = "org.example.Editor"layout = "tile"workspace = 2Floating placement
Section titled “Floating placement”[[window]]class = "Pavucontrol"title = "Volume Control"layout = "float"floating = trueworkspace = 2width = 960height = 640x = 80y = 60fullscreen = falseignore_struts = falseopacity = 0.96width and height are positive pixel dimensions. x and y are offsets
from the usable area’s origin; a zero value centers that axis. Setting
layout = "float" also enables floating placement, so the explicit
floating = true is optional but can make a complete rule easier to scan.
Rule-owned state and manual overrides
Section titled “Rule-owned state and manual overrides”Rules can set workspace, floating, and fullscreen, but Aqueous does not
fight the user. A manual workspace move, floating toggle, or fullscreen toggle
overrides that property until a different matcher becomes active.
[[window]]app_id = "org.example.Video"layout = "monocle"workspace = 4fullscreen = trueignore_struts = trueopacity = 1.0ignore_struts = true uses the full output instead of the configured usable
area. A fullscreen rule is treated as actual fullscreen rather than as a game
mode anchor.
Game mode
Section titled “Game mode”Game mode gives one matched window an anchor rectangle and arranges companion windows in the remaining left and right columns.
[game_mode]remainder_layout = "grid"fallback_layout = "tile"gaps_inner = 8
[[window]]app_id = "steam_app_*"title = "*"layout = "game-mode"workspace = 9anchor = "center"size = "0.70x0.80"scale = 1.0fullscreen = falseignore_struts = falseopacity = 1.0blur = falseAnchor options are:
anchor:center,top,bottom,left, orrightsize = "native": use the client’s requested sizesize = "2560x1440": request an exact pixel sizesize = "0.70x0.80": use fractions of the output areascale: multiply the resolved size by a positive factor
remainder_layout and fallback_layout accept any layout except game-mode.
The fallback is used when game mode is selected but no matching anchor is
present. If the anchor touches an edge, the column on that edge collapses and
all companion windows use the surviving column.
Reload only the rule file
Section titled “Reload only the rule file”reload_rules has no default chord. Bind it when you are iterating on rules and
do not want to run reload-time commands from wm.toml:
[keybinds]reload_rules = "Super+Shift+R"