<feed xmlns='http://www.w3.org/2005/Atom'>
<title>archsetup/dotfiles/hyprland/.config/hypr, branch main</title>
<subtitle>Builds a full dev workstation from a bare Arch Linux install.
</subtitle>
<id>https://git.cjennings.net/archsetup/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/archsetup/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/'/>
<updated>2026-06-02T17:16:38+00:00</updated>
<entry>
<title>refactor: drop in-repo dotfiles/, move stow tooling to the dotfiles repo</title>
<updated>2026-06-02T17:16:38+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-02T17:16:38+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=a816122f49d2c7e43e41308e251e133197a486bc'/>
<id>urn:sha1:a816122f49d2c7e43e41308e251e133197a486bc</id>
<content type='text'>
Since the installer clones DOTFILES_REPO into ~/.dotfiles and stows from there, the in-repo dotfiles/ tree was dead weight. Nothing reads it at install time. I removed it (831 files) now that both machines are migrated.

The Makefile's stow / restow / reset / unstow / import targets and the dotfile-script unit suites moved to the dotfiles repo. They sit alongside the scripts they manage and run standalone (cd ~/.dotfiles &amp;&amp; make ...). This Makefile keeps the VM-integration targets and the installer-helper suite (safe-rm-rf).

I updated CLAUDE.md and README.md so stow operations run from ~/.dotfiles, and the dotfile-management, theme, and unit-test sections point at the standalone repo. The README was already describing the old in-repo model from before the installer switched to cloning. This brings it in line.
</content>
</entry>
<entry>
<title>feat(hyprland): rebind monitor to Super+R, touchpad toggle to Super+M</title>
<updated>2026-05-21T02:04:17+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-21T02:04:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=187e175b13954584e772aa200d5939973b2dbf8f'/>
<id>urn:sha1:187e175b13954584e772aa200d5939973b2dbf8f</id>
<content type='text'>
Super+M now toggles the touchpad (M for Mouse), and the monitor scratchpad moves to Super+R (R for Resources, since btop is a resource monitor). The touchpad toggle was on Super+F9, which is now free. Super+Shift+M still switches to the monocle layout.
</content>
</entry>
<entry>
<title>feat(hyprland): add touchpad state indicator to waybar</title>
<updated>2026-05-21T01:55:13+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-21T01:55:13+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=b7e6728082ce9a5a010736cb08ca7f8bb64c7a58'/>
<id>urn:sha1:b7e6728082ce9a5a010736cb08ca7f8bb64c7a58</id>
<content type='text'>
The $mod+F9 toggle and the toggle-touchpad / touchpad-auto scripts already worked, but the scripts lived only in ~/.local/bin and were never committed, and there was no way to see the touchpad's state at a glance.

I committed both scripts into the repo so stow installs them, and added a waybar indicator: a waybar-touchpad status script and a custom/touchpad module that shows a mouse glyph when the touchpad is on and a mouse-off glyph (in the dupre orange) when it's off. The scripts signal the module with pkill -RTMIN+9 waybar after each state change, so the icon updates the moment the touchpad toggles. touchpad-auto now runs at login via exec-once.

The waybar-touchpad script has unit tests under tests/waybar-touchpad/ covering the enabled, disabled, and missing-state-file cases.
</content>
</entry>
<entry>
<title>fix(hyprland): paint scratchpad active border goldenrod</title>
<updated>2026-05-19T13:26:11+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-19T13:26:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=3d2b820f3b0204616a25d42d3b54005e71659edd'/>
<id>urn:sha1:3d2b820f3b0204616a25d42d3b54005e71659edd</id>
<content type='text'>
Pyprland 3.4+ applies `group deny` to scratchpads, which routes their
border through col.nogroup_border* instead of col.*_border. Set
col.nogroup_border_active to #daa520 (same as col.active_border) so
the scratchpad and tiled active borders read identically.

Also drop `pseudotile = true` from the unused dwindle{} block — this
config uses layout = master, so the dwindle settings never take effect.
</content>
</entry>
<entry>
<title>chore(hyprland): capture pypr output to a per-session log file</title>
<updated>2026-05-14T17:53:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-14T17:53:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=bc3fb235755f37d8f8b72a055a0c3800af393263'/>
<id>urn:sha1:bc3fb235755f37d8f8b72a055a0c3800af393263</id>
<content type='text'>
Pypr was sending stderr to /dev/null. So when its keybind clients
emitted red `hyprctl notify` banners after the daemon got stuck,
there was no trace to read. I followed the waybar / dunst /
hypridle / gammastep pattern already in the same exec-once block.
</content>
</entry>
<entry>
<title>feat(hyprland): hide cursor after 2 seconds of inactivity</title>
<updated>2026-05-13T15:30:58+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-13T15:30:58+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=32ef3ff747a5e295fd01dc0c62b7eda91a83a457'/>
<id>urn:sha1:32ef3ff747a5e295fd01dc0c62b7eda91a83a457</id>
<content type='text'>
I set cursor:inactive_timeout to 2.0 so the cursor disappears after a couple of seconds without motion and reappears on the next move.
</content>
</entry>
<entry>
<title>fix(hyprland): keep cursor in place on keyboard focus changes</title>
<updated>2026-05-13T15:11:31+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-13T15:11:31+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=61628faca8ccd0c32c7d63b94fbcc8c4e66ba45f'/>
<id>urn:sha1:61628faca8ccd0c32c7d63b94fbcc8c4e66ba45f</id>
<content type='text'>
I set cursor:no_warps to true so super+j/k and other keyboard focus moves stop teleporting the cursor to the center of the newly focused window.
</content>
</entry>
<entry>
<title>fix(hyprland): source conf.d at end so machine-local overrides win</title>
<updated>2026-05-08T00:03:46+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-08T00:03:46+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=fd363392bcd3dc2ab48e238310e57082fbdc1233'/>
<id>urn:sha1:fd363392bcd3dc2ab48e238310e57082fbdc1233</id>
<content type='text'>
The `source = $HOME/.config/hypr/conf.d/*.conf` line was at the top of `hyprland.conf` (line 9), before the `general`, `input`, `monitor`, and other blocks. Hyprland reads top to bottom, so anything later in the main file silently overrode whatever `conf.d/local.conf` set. `local.conf` exists so one machine can override the shared defaults, for instance a HiDPI laptop bumping its monitor scale or shrinking gaps. None of that worked.

I moved the source line to the end of the file behind a labeled section comment. Now per-machine overrides take effect. To verify, I dropped a `general { gaps_in = 99 }` into a temporary file in `conf.d/` and reloaded. `hyprctl getoption general:gaps_in` came back as 99 instead of the main file's 25. I removed the test file and the value went back to 25.
</content>
</entry>
<entry>
<title>fix(hyprland): natural-scroll the mouse, not just the touchpad</title>
<updated>2026-05-07T17:07:03+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-07T17:07:03+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=4d48e32c47f06a9d45baa8b1932958f223c8ce24'/>
<id>urn:sha1:4d48e32c47f06a9d45baa8b1932958f223c8ce24</id>
<content type='text'>
The `input` block had `natural_scroll = true` only inside its `touchpad` sub-block. The BT mouse fell back to Hyprland's default and scrolled the opposite way from the touchpad. Switching between input devices flipped scroll direction.

I added `natural_scroll = true` at the top level of the `input` block. The touchpad's own setting still applies because Hyprland scopes touchpad config separately. Touchpad behavior is unchanged.
</content>
</entry>
<entry>
<title>fix(hyprland): override nogroup_border so scratchpads aren't magenta</title>
<updated>2026-05-06T22:36:32+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-06T22:36:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/archsetup/commit/?id=6163a0c08af167f7f4febed1f7d2d07cf032c1a9'/>
<id>urn:sha1:6163a0c08af167f7f4febed1f7d2d07cf032c1a9</id>
<content type='text'>
Pyprland 3.4 started applying a `group deny` windowrule to every scratchpad. In Hyprland that flag routes the border through `col.nogroup_border` and `col.nogroup_border_active` instead of the regular `col.*_border` colors. Hyprland's defaults for those two are pink and bright magenta, so every scratchpad came up with a glaring magenta frame after the 3.4 upgrade.

I set `col.nogroup_border_active` to dupre blue (#67809c) and `col.nogroup_border` to the same dark grey the inactive border already uses. Focused scratchpads read as a deliberate accent, unfocused ones blend in. The two new lines sit next to the existing `col.*_border` entries with a comment naming the cause, so the next person reading this config doesn't have to re-derive it.
</content>
</entry>
</feed>
