Name: xkeyboard-config-user-hw-extras Version: 0.2.4 Release: 3%{?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 %define log logger -t %{name} %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 %{log} "post: start (action=$1)" %{log} "post: creating subsystem subdirs" for sub in %{subs}; do mkdir -p %{xkbextdir}/$sub ; done %{log} "post: constructing rules/evdev" cat %{xkbextdir}/rules.evdev_incl.extra \ %{xkbextdir}/rules.evdev_body.extra \ > %{xkbextdir}/rules/evdev %{log} "post: creating subsystem symlinks" 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 ;; esac ln -sf "$f" %{xkbextdir}/${sub}/${name} done done %{log} "post: done" %preun %{log} "preun: start (action=$1)" if [ $1 -eq 0 ]; then %{log} "preun: uninstall — removing subsystem dirs" for sub in %{subs} ; do rm -rf %{xkbextdir}/$sub ; done %{log} "preun: done" else %{log} "preun: upgrade — nothing to do" fi %post compat %{log} "post compat: start (action=$1)" # Backup pristine evdev and patch — only if not already patched (idempotent upgrade safety) if ! grep -q "BEGIN_USER_HW_EXTRAS" %{xkbsysdir}/rules/evdev; then %{log} "post compat: evdev pristine — creating backup and patching" cp %{xkbsysdir}/rules/evdev %{xkbextdir}/backup.evdev cat %{xkbextdir}/rules.evdev_body.extra >> %{xkbsysdir}/rules/evdev %{log} "post compat: evdev patched" else %{log} "post compat: evdev already patched — skipping (upgrade)" if [ ! -f %{xkbextdir}/backup.evdev ]; then %{log} "post compat: WARNING backup.evdev missing — uninstall restore will fail" fi fi %{log} "post compat: installing userhw.xml" cp %{xkbextdir}/rules.userhw.xml.extra %{xkbsysdir}/rules/userhw.xml %{log} "post compat: creating system symlinks" 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 %{log} "post compat: removing subsystem dirs (system evdev takes over)" for sub in %{subs} ; do rm -rf %{xkbextdir}/$sub ; done %{log} "post compat: done" %preun compat %{log} "preun compat: start (action=$1)" # $1=0: uninstall — full cleanup # $1=1: upgrade — new %post compat already handled setup, do nothing if [ $1 -eq 0 ]; then %{log} "preun compat: uninstall — removing userhw.xml and system symlinks" rm -f %{xkbsysdir}/rules/userhw.xml rm -f %{xkbsysdir}/geometry/userhw rm -f %{xkbsysdir}/keycodes/userhw rm -f %{xkbsysdir}/symbols/userhw if [ -f %{xkbextdir}/backup.evdev ]; then %{log} "preun compat: restoring evdev from backup" cp %{xkbextdir}/backup.evdev %{xkbsysdir}/rules/evdev rm -f %{xkbextdir}/backup.evdev %{log} "preun compat: evdev restored" else %{log} "preun compat: WARNING backup.evdev missing — evdev NOT restored" fi %{log} "preun compat: restoring subsystem for main package" for sub in %{subs}; do mkdir -p %{xkbextdir}/$sub ; done cat %{xkbextdir}/rules.evdev_incl.extra %{xkbextdir}/rules.evdev_body.extra \ > %{xkbextdir}/rules/evdev 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 ;; esac ln -sf "$f" %{xkbextdir}/${sub}/${name} done done %{log} "preun compat: done" else %{log} "preun compat: upgrade — nothing to do" fi %triggerpostun compat -- xkeyboard-config # Re-apply our rules after xkeyboard-config update # (%filetriggerin can't be used: RPM DB path is /usr/share/xkeyboard-config-2/..., not the symlink) if [ -f %{xkbextdir}/backup.evdev ]; then %{log} "triggerpostun: xkeyboard-config updated, re-patching evdev" cp %{xkbsysdir}/rules/evdev %{xkbextdir}/backup.evdev cat %{xkbextdir}/rules.evdev_body.extra >> %{xkbsysdir}/rules/evdev %{log} "triggerpostun: done" fi %changelog * Fri May 29 2026 Stefan Kaps - 0.2.4-1 - compat: replace filetriggerin with triggerpostun (filetriggerin path never matched xkeyboard-config RPM db path) - compat: add logger calls for upgrade debugging - compat: fix preun to check $1 — on upgrade ($1=1) do nothing; new %post already handled setup - compat: fix post to check for existing patch before patching — prevents double-application on upgrade - compat: comprehensive logger calls in post/preun/triggerpostun for auditability * Fri 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