Name: xkeyboard-config-user-hw-extras Version: 0.2.3 Release: 1%{?dist} Summary: XKB extension: user-contributed hardware keyboard models and symbol options License: Apache-2.0 URL: https://gitlab.com/copr-projekte/user-hw-extras Source0: https://gitlab.com/copr-projekte/user-hw-extras/-/archive/%{version}/user-hw-extras-%{version}.tar.gz BuildArch: noarch Requires: libxkbcommon >= 1.13 Requires: xkeyboard-config >= 2.45 %define subs geometry keycodes rules symbols %define xkbextdir /usr/share/xkeyboard-config.d/user-hw-extras %define xkbsysdir %{_datadir}/X11/xkb %package compat Summary: xkbcomp compatibility for user-hw-extras (patches system evdev rules) Requires: %{name} = %{version}-%{release} Requires: xkeyboard-config %description User-contributed XKB extension: hardware keyboard models, geometry definitions, and symbol options not (yet) available in upstream xkeyboard-config. Currently includes: Models: cherrymx20s, cherrymx30s, cherrymxboard30 (Cherry MX family) Option: userhw:type_and_check Registered via libxkbregistry (libxkbcommon >= 1.13). Automatically discovered by KDE Plasma, GNOME Settings, and compatible desktops. %description compat Extends xkbcomp-based tools (keyboard geometry preview, setxkbmap) by: - symlinking userhw XKB data files into the system XKB path - appending model/geometry rules to the system evdev rules file WARNING: This subpackage patches /usr/share/X11/xkb/rules/evdev. A backup is kept at %{xkbextdir}/backup.evdev and restored on uninstall. This approach is not suitable for upstream inclusion. %prep %autosetup -n user-hw-extras-%{version} %build # nothing to build %files %dir %{xkbextdir} %{xkbextdir}/*.extra %doc %{_docdir}/%{name}/README.md %doc %{_docdir}/%{name}/Erkenntnisse.md %files compat %ghost %{xkbsysdir}/rules/userhw.xml %ghost %{xkbextdir}/backup.evdev %install # Install all .extra source files into the extension directory install -d %{buildroot}%{xkbextdir} install -m644 *.extra %{buildroot}%{xkbextdir}/ # as well as docs into the docs-folder install -d %{buildroot}%{_docdir}/%{name} install -m644 *.md %{buildroot}%{_docdir}/%{name}/ %post # create subfolders for libxkbcommon/libxkbregistry autodetection for sub in %{subs}; do mkdir -p %{xkbextdir}/$sub ; done # Construct rules/evdev from incl + body cat %{xkbextdir}/rules.evdev_incl.extra \ %{xkbextdir}/rules.evdev_body.extra \ > %{xkbextdir}/rules/evdev # Symlink .extra files into XKB subsystem structure # Convention: ..extra → / for sub in %{subs}; do for f in %{xkbextdir}/$sub.*.extra; do base=$(basename "$f" .extra) subdir=${base%%.*} name=${base#*.} case "$name" in evdev_incl|evdev_body|userhw.xml) continue ;; # handled otherwise esac ln -sf "$f" %{xkbextdir}/${sub}/${name} done done %preun # Remove constructed rules/evdev and symlinks for sub in %{subs} ; do rm -rf %{xkbextdir}/$sub ; done %post compat # Safety FIRST: # Backup + patch system evdev cp %{xkbsysdir}/rules/evdev %{xkbextdir}/backup.evdev # Install compat XML into system rules path (via scriptlet to avoid crossing package boundaries) cp %{xkbextdir}/rules.userhw.xml.extra %{xkbsysdir}/rules/userhw.xml cat %{xkbextdir}/rules.evdev_body.extra >> %{xkbsysdir}/rules/evdev # Symlink userhw data files into system XKB path ln -sf %{xkbextdir}/geometry.userhw.extra %{xkbsysdir}/geometry/userhw ln -sf %{xkbextdir}/keycodes.userhw.extra %{xkbsysdir}/keycodes/userhw ln -sf %{xkbextdir}/symbols.userhw.extra %{xkbsysdir}/symbols/userhw # Remove all subsystem linking (system evdev takes over) from main paket for sub in %{subs} ; do rm -rf %{xkbextdir}/$sub ; done %preun compat # Remove compat XML from system rules path rm -f %{xkbsysdir}/rules/userhw.xml # Restore system evdev from backup if [ -f %{xkbextdir}/backup.evdev ]; then cp %{xkbextdir}/backup.evdev %{xkbsysdir}/rules/evdev rm -f %{xkbextdir}/backup.evdev fi # Remove system symlinks rm -f %{xkbsysdir}/geometry/userhw rm -f %{xkbsysdir}/keycodes/userhw rm -f %{xkbsysdir}/symbols/userhw # create subfolders for libxkbcommon/libxkbregistry autodetection for sub in %{subs}; do mkdir -p %{xkbextdir}/$sub ; done # Construct rules/evdev from incl + body cat %{xkbextdir}/rules.evdev_incl.extra %{xkbextdir}/rules.evdev_body.extra \ > %{xkbextdir}/rules/evdev # Symlink .extra files into XKB subsystem structure # Convention: ..extra → / for sub in %{subs}; do for f in %{xkbextdir}/$sub.*.extra; do base=$(basename "$f" .extra) subdir=${base%%.*} name=${base#*.} case "$name" in evdev_incl|evdev_body|userhw.xml) continue ;; # handled otherwise esac ln -sf "$f" %{xkbextdir}/${sub}/${name} done done %filetriggerin compat -- %{xkbsysdir}/rules/evdev # Re-apply our rules after xkeyboard-config update if [ -f %{xkbextdir}/backup.evdev ]; then cp %{xkbsysdir}/rules/evdev %{xkbextdir}/backup.evdev cat %{xkbextdir}/rules.evdev_body.extra >> %{xkbsysdir}/rules/evdev fi %changelog * Thu May 29 2026 Stefan Kaps - 0.2.3-1 - compat: manage userhw.xml via scriptlet+ghost instead of %install to avoid crossing package boundaries * Fri May 29 2026 Stefan Kaps - 0.2.1-1 - ci: fix autosetup directory name to match GitLab archive structure * Thu May 28 2026 Stefan Kaps - 0.2-1 - Redesign: flat .extra source files, scriptlet-driven XKB structure - Split rules/evdev into evdev_incl + evdev_body - compat: filetriggerin for automatic re-patching after xkeyboard-config updates - compat: backup/restore instead of marker parsing * Thu May 28 2026 Stefan Kaps - 0.1-1 - Initial release