server-desktop-01/docs/hyprland/window-rules.md

88 lines
3.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Window Rules — Hyprland 0.480.51
Reference for the syntax currently used on this machine.
See [version-history.md](version-history.md) for what changes on upgrade.
## Syntax (current: 0.480.51)
```
windowrule = match:class classname, effect
windowrule = match:class classname, match:title titlepattern, effect1, effect2
```
Patterns are plain names or bare regexes. **Do NOT use `^(...)$` wrapping** — Hyprland 0.51
rejects it as "Invalid rulev2" (that was the old windowrulev2 class-matching format).
Anchors are fine without outer grouping: `^org\.gnome\.` matches any GNOME reverse-DNS class.
Multiple props and effects can be on one line, comma-separated, any order.
## Match props (filtering)
| Prop | Example | Notes |
|------|---------|-------|
| `match:class` | `match:class firefox` | Window class (app ID) |
| `match:title` | `match:title Picture-in-Picture` | Window title |
| `match:xwayland` | `match:xwayland true` | XWayland windows only |
| `match:float` | `match:float true` | Currently floating |
| `match:fullscreen` | `match:fullscreen true` | Currently fullscreen |
Use `hyprctl clients` to find a window's class and title.
## Static effects (applied once at window open)
| Effect | Example | Notes |
|--------|---------|-------|
| `float` | `float` | Force float |
| `tile` | `tile` | Force tile |
| `fullscreen` | `fullscreen` | Force fullscreen |
| `maximize` | `maximize` | Force maximize |
| `rounding` | `rounding 12` | Pixel rounding (overrides global) |
| `no_initial_focus` | `no_initial_focus` | Don't steal focus on open |
| `pin` | `pin` | Show on all workspaces (float only) |
| `move` | `move 100 200` | Position (float only) |
| `size` | `size 800 600` | Size (float only) |
| `workspace` | `workspace 2` | Open on specific workspace |
| `monitor` | `monitor 1` | Open on specific monitor |
| `suppress_event` | `suppress_event maximize` | Ignore window events |
## Dynamic effects (re-evaluated on change)
| Effect | Example |
|--------|---------|
| `opacity` | `opacity 0.9` or `opacity 0.9 0.7` (active inactive) |
| `border_color` | `border_color rgb(FF0000)` |
| `no_blur` | `no_blur` |
| `no_shadow` | `no_shadow` |
| `no_anim` | `no_anim` |
| `no_focus` | `no_focus` |
| `idle_inhibit` | `idle_inhibit always` |
## Our rules (reference)
```
# Force-tile apps that default to floating
windowrule = match:class gnome-control-center, tile
windowrule = match:class pavucontrol, tile
# Force-float small utilities
windowrule = match:class gnome-calculator, float
windowrule = match:class org\.gnome\.Nautilus, float
# Rounded corners for all GNOME apps (prefix match)
windowrule = match:class ^org\.gnome\., rounding 12
# Multi-prop (steam toasts)
windowrule = match:class steam, match:title notificationtoasts, no_initial_focus, pin
# Firefox PiP
windowrule = match:class firefox, match:title Picture-in-Picture, float
```
## Finding window class/title
```bash
hyprctl clients | grep -E "class:|title:"
# or run this in a terminal, then open the window:
hyprctl -j clients | jq '.[] | {class, title}'
```