<feed xmlns='http://www.w3.org/2005/Atom'>
<title>dotfiles/etc/udev, branch master</title>
<subtitle>My linux config and rc files</subtitle>
<id>https://git.sommerfeld.dev/dotfiles/atom/etc/udev?h=master</id>
<link rel='self' href='https://git.sommerfeld.dev/dotfiles/atom/etc/udev?h=master'/>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/'/>
<updated>2026-05-13T12:43:39Z</updated>
<entry>
<title>refactor(udev): drop hand-rolled ZSA rule, install qmk package instead</title>
<updated>2026-05-13T12:43:39Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:39Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=2d70af4ae06e1a528cf3b49e0249ea27fe9c8df2'/>
<id>urn:sha1:2d70af4ae06e1a528cf3b49e0249ea27fe9c8df2</id>
<content type='text'>
The qmk Arch package ships /usr/lib/udev/rules.d/50-qmk.rules covering
all major mech-keyboard vendors including ZSA's VID 3297, with the
same TAG+=uaccess semantics. Prefer that over maintaining our own
rules file.

- meta/base.txt: + qmk
- etc/udev/rules.d/50-zsa.rules: removed
- etc deploy script: drop the udevadm reload (only existed to support
  our custom rule; pacman handles reloads for package-shipped rules).
</content>
</entry>
<entry>
<title>feat(udev,flatpak): allow ungoogled-chromium to talk to ZSA keyboards</title>
<updated>2026-05-13T12:43:39Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:39Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=6ab4b0faef22b4fda4b6a3b45dca4c3858eb8802'/>
<id>urn:sha1:6ab4b0faef22b4fda4b6a3b45dca4c3858eb8802</id>
<content type='text'>
usevia.app uses WebHID to talk to /dev/hidraw* directly. Two layers
were blocking it:

1. Host: no udev rule existed for ZSA boards, so /dev/hidraw nodes
   were root-only. Add etc/udev/rules.d/50-zsa.rules covering the ZSA
   VID 3297 (ErgoDox EZ / Moonlander / Voyager) with TAG+=uaccess so
   logind grants the active session user access. Also include the two
   bootloader VIDs used during firmware flashing for completeness.

2. Sandbox: the chromium flatpak only sees /dev/dri by default. Add a
   --device=all override (flatpak has no finer-grained device knob).
   The host udev rule still gates which hidraw nodes the user can
   actually open, so this isn't a meaningful escalation.

Also wire `udevadm control --reload &amp;&amp; udevadm trigger` into the etc
deploy script so rule changes apply without a reboot or replug.
</content>
</entry>
<entry>
<title>fix(logind): ignore KEY_POWER short-press to stop Shokz dongle shutdowns</title>
<updated>2026-05-13T12:43:33Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:33Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=120ee3a0712594fb0c4fdf99c04f0e9d8874335d'/>
<id>urn:sha1:120ee3a0712594fb0c4fdf99c04f0e9d8874335d</id>
<content type='text'>
The Shokz OpenMeet dongle (3511:2EF2) emits KEY_POWER on USB
enumeration and on headset power transitions, which logind handles
with HandlePowerKey=poweroff and immediately shuts the host down.

The previous attempt — an hwdb scancode remap of c0030 to reserved —
sets the udev property correctly but the kernel does not honor
EVIOCSKEYCODE for this device's HID consumer-page mapping (verified:
KEY_POWER 116 still appears in the evdev keymap after udevadm trigger
and libinput still reports it). Drop the hwdb file and the
systemd-hwdb hooks from the etc deploy script.

Replace with a logind drop-in that sets HandlePowerKey=ignore and
HandlePowerKeyLongPress=poweroff. Single-tap power events from any
source become no-ops; a 5s hold still shuts the machine down, so the
real hardware-power-button safety net is preserved. Add a HUP to
systemd-logind in the deploy script so the change takes effect
without restarting the daemon.
</content>
</entry>
<entry>
<title>feat(udev): replace shokz blacklist with hwdb keycode override</title>
<updated>2026-05-13T12:43:33Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-05-13T12:43:33Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=66427c37fcc05ffbecde726aeea77ccfb1b860de'/>
<id>urn:sha1:66427c37fcc05ffbecde726aeea77ccfb1b860de</id>
<content type='text'>
The previous /etc/udev/rules.d/80-shokz-blacklist.rules deauthorized the
entire usbhid interface for the Shokz OpenMeet dongle (3511:2EF2) to stop
the host from powering off when the headset is turned off. That also
killed mic-mute, volume, and media keys on the same HID Consumer Control
node.

Replace it with a narrow hwdb override that remaps just the offending
scancode (Consumer page Power, c0030 -&gt; KEY_POWER) to reserved on that
specific vendor/product. KEY_MUTE / volume / media keys keep working.

Add 'systemd-hwdb update' + an input-subsystem udevadm trigger to the
etc deploy hook so new hwdb files take effect immediately.
</content>
</entry>
<entry>
<title>feat(etc): track drifted host configs</title>
<updated>2026-04-21T00:23:55Z</updated>
<author>
<name>sommerfeld</name>
<email>sommerfeld@sommerfeld.dev</email>
</author>
<published>2026-04-21T00:23:55Z</published>
<link rel='alternate' type='text/html' href='https://git.sommerfeld.dev/dotfiles/commit/?id=c4b67e9fcc126c3e358462051b78b6a2cdec40de'/>
<id>urn:sha1:c4b67e9fcc126c3e358462051b78b6a2cdec40de</id>
<content type='text'>
Adopted via 'just etc-add' after 'just etc-drift' surfaced them:
locale.conf, locale.gen, mkinitcpio.conf, mkinitcpio.d/linux.preset,
pacman.conf, resolved.conf, systemd/network/30-bond*, and the shokz
udev blacklist rule.
</content>
</entry>
</feed>
