docs(wm): Phase 4 progress, Hyprland config reference, and keybindings
Add Phase 4 progress entry documenting windowrule syntax fix for Hyprland 0.51 (stripping invalid ^(...)$ wrapping). Include CLAUDE.md project instructions, version-aware Hyprland config reference docs, and keybindings cheatsheet PDF for future reference.
This commit is contained in:
parent
6d2638a3f4
commit
e875f0ee97
|
|
@ -0,0 +1,46 @@
|
|||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## What this repo is
|
||||
|
||||
Documentation and planning for a GNOME → Hyprland migration on Fedora 43. No build system, no tests, no executables. The actual system configuration lives in `~/.dotfiles/` (separate Forgejo repo), managed with GNU Stow.
|
||||
|
||||
## Key locations outside this repo
|
||||
|
||||
| What | Where |
|
||||
|------|-------|
|
||||
| Hyprland config | `~/.dotfiles/hypr/.config/hypr/hyprland.conf` |
|
||||
| DMS source configs | `~/.dotfiles/hypr/.config/hypr/dms/` |
|
||||
| Symlink target | `~/.config/hypr/` → symlinked via `stow hypr` |
|
||||
| Hyprland log | `~/.cache/hyprland/hyprland.log` |
|
||||
| Dotfiles remote | `git@forgejo.swansoncloud.com:jared/dotfiles.git` |
|
||||
|
||||
## Hyprland configuration
|
||||
|
||||
**Installed version:** 0.51.1 (Fedora 43). See `docs/hyprland/version-history.md` before applying patterns from the official wiki — the wiki tracks git HEAD, which is ahead of the installed version.
|
||||
|
||||
**Window rule syntax for 0.48–0.51** (not the block syntax shown in current wiki):
|
||||
```
|
||||
windowrule = match:class classname, effect
|
||||
windowrule = match:class classname, match:title titlepattern, effect1, effect2
|
||||
```
|
||||
Do NOT use `^(...)$` wrapping — Hyprland 0.51 rejects it as "Invalid rulev2". Use plain names or bare regexes (e.g. `^org\.gnome\.` for a prefix match).
|
||||
|
||||
**Block syntax** (`windowrule { }`) is 0.52+ only — do not use until after a Fedora upgrade.
|
||||
|
||||
## Docs structure
|
||||
|
||||
- `docs/window-manager/` — migration plan, phased progress log, keybindings cheatsheet
|
||||
- `docs/hyprland/` — version-aware Hyprland config reference; update these when Hyprland is upgraded
|
||||
|
||||
## Project status
|
||||
|
||||
Phases 0–3 complete (install, config, dotfiles integration). Phase 4 (first successful Hyprland login and smoke tests) is in progress. Phase 5 (tuning) is deferred.
|
||||
|
||||
Known workaround in place: `hyprpolkitagent` replaced with `lxpolkit` due to Qt 6 ABI issue on Fedora 43.
|
||||
|
||||
## Hardware
|
||||
|
||||
- AMD Vega iGPU (primary display, Wayland)
|
||||
- NVIDIA RTX 3060 dGPU (unused — `akmod-nvidia` intentionally not installed)
|
||||
|
|
@ -0,0 +1,24 @@
|
|||
# Hyprland Reference
|
||||
|
||||
Quick-access docs for AI-assisted config work. Covers the version installed on this machine.
|
||||
Update this index when upgrading Hyprland.
|
||||
|
||||
**Installed version:** 0.51.1 (Fedora 43, Sept 2025)
|
||||
**Next expected upgrade path:** Fedora 44 → likely Hyprland 0.54+
|
||||
|
||||
## Index
|
||||
|
||||
| File | What it covers |
|
||||
|------|---------------|
|
||||
| [window-rules.md](window-rules.md) | windowrule syntax, effects, props — with version notes |
|
||||
| [layer-rules.md](layer-rules.md) | layerrule syntax for bars, wallpapers, launchers |
|
||||
| [version-history.md](version-history.md) | Breaking syntax changes across versions |
|
||||
|
||||
## Official sources (always check version)
|
||||
|
||||
- Wiki: https://wiki.hypr.land/Configuring/
|
||||
- Example conf (HEAD/latest): https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf
|
||||
- Window Rules wiki: https://wiki.hypr.land/Configuring/Window-Rules/
|
||||
|
||||
> **Warning:** The wiki and example conf track the latest git HEAD, not the installed version.
|
||||
> Always cross-reference with [version-history.md](version-history.md) before applying patterns from the wiki.
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
# Layer Rules — Hyprland 0.48–0.51
|
||||
|
||||
Layers are non-window surfaces: status bars, wallpapers, launchers, notifications.
|
||||
|
||||
## Syntax (current: 0.48–0.51)
|
||||
|
||||
```
|
||||
layerrule = match:namespace ^(regex)$, effect
|
||||
```
|
||||
|
||||
Use `hyprctl layers` to find a layer's namespace.
|
||||
|
||||
## Effects
|
||||
|
||||
| Effect | Notes |
|
||||
|--------|-------|
|
||||
| `no_anim` | Disable animations |
|
||||
| `blur` | Enable blur |
|
||||
| `blur_popups` | Blur popups too |
|
||||
| `dim_around` | Dim everything behind layer |
|
||||
| `animation style` | Override animation style |
|
||||
|
||||
## Our rules
|
||||
|
||||
```
|
||||
layerrule = match:namespace ^(quickshell)$, no_anim
|
||||
layerrule = match:namespace ^dms:.*, no_anim
|
||||
```
|
||||
|
||||
## 0.52+ block syntax (not yet installed)
|
||||
|
||||
```
|
||||
layerrule {
|
||||
match:namespace = ^(quickshell)$
|
||||
no_anim = on
|
||||
}
|
||||
```
|
||||
|
|
@ -0,0 +1,78 @@
|
|||
# Hyprland Version History — Breaking Config Changes
|
||||
|
||||
Focus: syntax changes that affect our config. Not a full changelog.
|
||||
|
||||
## Installed: 0.51.1 (Sept 2025)
|
||||
|
||||
## windowrule syntax timeline
|
||||
|
||||
### Pre-0.48 (old — do not use)
|
||||
```
|
||||
windowrule = float, ^(class-regex)$ # v1: positional class, no prefix
|
||||
windowrulev2 = float, class:^(regex)$ # v2: explicit class: prefix
|
||||
```
|
||||
|
||||
### 0.48–0.51 (CURRENT — use this)
|
||||
Both `windowrule` and `windowrulev2` keywords work, but `windowrulev2` is deprecated.
|
||||
Use `windowrule` with `match:` prefixed props. Patterns are plain strings or bare regexes —
|
||||
do NOT use the old rulev2 `^(...)$` wrapping; Hyprland 0.51 rejects it as "Invalid rulev2".
|
||||
```
|
||||
windowrule = match:class classname, effect
|
||||
windowrule = match:class classname, match:title titlepattern, effect1, effect2
|
||||
windowrule = match:class ^org\.gnome\., rounding 12 # prefix regex — anchor ok, no outer ()
|
||||
```
|
||||
Props can come in any order relative to effects.
|
||||
Boolean effects: `float`, `tile`, `pin`, `no_initial_focus` (no "on" suffix needed)
|
||||
Value effects: `rounding 12`, `opacity 0.9`
|
||||
|
||||
### 0.52+ (not yet installed — do not use until upgrade)
|
||||
Block syntax introduced:
|
||||
```
|
||||
windowrule {
|
||||
name = optional-name
|
||||
match:class = ^(regex)$
|
||||
float = yes
|
||||
rounding = 12
|
||||
}
|
||||
```
|
||||
Anonymous flat block syntax also available:
|
||||
```
|
||||
windowrule = match:class regex, effect value
|
||||
```
|
||||
|
||||
## layerrule syntax timeline
|
||||
|
||||
### Pre-0.48 (old)
|
||||
```
|
||||
layerrule = no_anim, ^(namespace)$ # positional namespace
|
||||
```
|
||||
|
||||
### 0.48–0.51 (CURRENT — use this)
|
||||
```
|
||||
layerrule = match:namespace namespacename, no_anim
|
||||
```
|
||||
Same rule as windowrule: plain string or bare regex, no `^(...)$` wrapping.
|
||||
|
||||
### 0.52+ (block syntax)
|
||||
```
|
||||
layerrule {
|
||||
match:namespace = ^(regex)$
|
||||
no_anim = on
|
||||
}
|
||||
```
|
||||
|
||||
## Other notable changes
|
||||
|
||||
| Version | Change |
|
||||
|---------|--------|
|
||||
| 0.48 | `windowrulev2` deprecated; new `windowrule` with `match:` prefix |
|
||||
| 0.48 | `layerrule` updated to use `match:namespace` prefix |
|
||||
| 0.52+ | Block syntax for `windowrule` and `layerrule` |
|
||||
|
||||
## Upgrade checklist
|
||||
|
||||
When upgrading Hyprland:
|
||||
1. Check `hyprland --version` (or `rpm -q hyprland`)
|
||||
2. Scan release notes for "windowrule", "layerrule", "deprecated"
|
||||
3. Update this file
|
||||
4. Update the comment in `hyprland.conf` window rules section
|
||||
|
|
@ -0,0 +1,87 @@
|
|||
# Window Rules — Hyprland 0.48–0.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.48–0.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}'
|
||||
```
|
||||
Binary file not shown.
|
|
@ -81,3 +81,11 @@ GNOME and Sway stay installed as GDM fallback sessions.
|
|||
- Created ~/.config/hypr/hyprpaper.conf; hyprpaper added to autostart; ~/Pictures/wallpapers/ created (drop default.jpg there before first login)
|
||||
- Moved hypr config into ~/.dotfiles/hypr stow package; symlink verified; committed 60f57df to dotfiles repo
|
||||
- DMS config will be added to stow after confirming dms setup output is stable (per plan note)
|
||||
|
||||
## 2026-04-19 — Phase 4: windowrule syntax fix
|
||||
|
||||
- On first Hyprland login: config errors on all windowrule lines — "Invalid rulev2 found: match:class ^(...)$"
|
||||
- Root cause: `^(...)$` wrapping was the old windowrulev2 regex format; Hyprland 0.51 explicitly rejects it even with the new `windowrule` keyword. Correct 0.51 syntax uses plain names or bare regexes with no outer grouping parens.
|
||||
- Fixed all windowrule and layerrule patterns in hyprland.conf (stripped `^(...)$`; kept `^org\.gnome\.` prefix anchor without outer group).
|
||||
- Updated docs: CLAUDE.md, docs/hyprland/version-history.md, docs/hyprland/window-rules.md all corrected to show actual 0.51 syntax.
|
||||
- Noted: solopasha COPR still at 0.51.1 for Fedora 43; upstream latest is 0.54.0. Upgrade deferred until COPR catches up.
|
||||
|
|
|
|||
Loading…
Reference in New Issue