From e875f0ee97388ad17a510c0ee395ab08137dc972 Mon Sep 17 00:00:00 2001 From: jared Date: Thu, 7 May 2026 09:43:43 -0400 Subject: [PATCH] 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. --- CLAUDE.md | 46 +++++++++++++++ docs/hyprland/README.md | 24 ++++++++ docs/hyprland/layer-rules.md | 37 ++++++++++++ docs/hyprland/version-history.md | 78 ++++++++++++++++++++++++++ docs/hyprland/window-rules.md | 87 +++++++++++++++++++++++++++++ docs/window-manager/cheatsheet.pdf | Bin 0 -> 32898 bytes docs/window-manager/progress.md | 8 +++ 7 files changed, 280 insertions(+) create mode 100644 CLAUDE.md create mode 100644 docs/hyprland/README.md create mode 100644 docs/hyprland/layer-rules.md create mode 100644 docs/hyprland/version-history.md create mode 100644 docs/hyprland/window-rules.md create mode 100644 docs/window-manager/cheatsheet.pdf diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..a6fc601 --- /dev/null +++ b/CLAUDE.md @@ -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) diff --git a/docs/hyprland/README.md b/docs/hyprland/README.md new file mode 100644 index 0000000..4cb74ba --- /dev/null +++ b/docs/hyprland/README.md @@ -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. diff --git a/docs/hyprland/layer-rules.md b/docs/hyprland/layer-rules.md new file mode 100644 index 0000000..c0bb61f --- /dev/null +++ b/docs/hyprland/layer-rules.md @@ -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 +} +``` diff --git a/docs/hyprland/version-history.md b/docs/hyprland/version-history.md new file mode 100644 index 0000000..9784875 --- /dev/null +++ b/docs/hyprland/version-history.md @@ -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 diff --git a/docs/hyprland/window-rules.md b/docs/hyprland/window-rules.md new file mode 100644 index 0000000..98ed3f3 --- /dev/null +++ b/docs/hyprland/window-rules.md @@ -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}' +``` diff --git a/docs/window-manager/cheatsheet.pdf b/docs/window-manager/cheatsheet.pdf new file mode 100644 index 0000000000000000000000000000000000000000..01e553b05fb1f22baa65c6e67ec8591b08cc55a7 GIT binary patch literal 32898 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 literal 0 HcmV?d00001 diff --git a/docs/window-manager/progress.md b/docs/window-manager/progress.md index 52daaa6..f05f7ac 100644 --- a/docs/window-manager/progress.md +++ b/docs/window-manager/progress.md @@ -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.