[Guix packaging] houmain/keymapper #127
Labels
No labels
accessibility
bug
category:ai-tool
category:browser
category:command-line-tool
category:compiler-toolchain
category:desktop-application
category:developer-tool
category:editor-extension
category:emulator
category:font
category:game
category:input-accessibility
category:library-framework
category:mud-client
category:multimedia
category:networking-client
category:programming-language
category:roguelike
category:storage-media-tool
category:system-tool
category:terminal-application
complexity:high
complexity:low
complexity:medium
difficulty:blocked
difficulty:easy
difficulty:hard
difficulty:moderate
documentation
duplicate
enhancement
good first issue
gooflow:guix-package-high
gooflow:guix-package-moderate
gooflow:guix-package-quality-gates
gooflow:guix-research-disposition
gooflow:guix-runtime-evidence-refresh
help wanted
invalid
kind:disposition
kind:packaging
needs:license-investigation
priority:quick
question
ready-for-agent
state:available-elsewhere
state:blocked
state:deferred
state:out-of-scope
state:ready
state:research
wontfix
No milestone
No project
No assignees
2 participants
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
tay/guix-channel#127
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Candidate
2ddd5cc3957f5faabb5232c13cb0c18f86d933cfonmain(default branch snapshot reviewed 2026-08-14).keymapperctlutilityCMakeLists.txt; platform-specific input backends)LICENSEcontains GPLv3 and README describes the cross-platform context-aware key remapper.Scope and blockers
Package the pinned upstream source as the stated deliverable, retaining upstream notices and making runtime services, credentials, downloaded assets, and optional integrations explicit. Package Linux input/uinput and desktop integration narrowly, keep macOS/Windows backends conditional, and avoid privileged device access during build tests.
Acceptance checks
guix lint -L. keymapperpasses with no new errors.guix build -L. keymappersucceeds from the pinned source with tests enabled where practical.keymapperctl --helpplus a non-privileged config parse smoke; test remapping only with a virtual input fixture.Imported from GitHub issue/PR. Originally posted by htayj on 2026-08-14T13:17:43Z.
Goocastle recorded disposition: implementation-ready.
Created implementation ticket: #747.
Delivery is ready for the ordinary upstream package, not an update to an existing installed package: the local channel has only source-only metadata (define-public houmain-keymapper-source at guix/tay/packages/starred-d-h.scm:373) and no public keymapper/keymapperd/keymapperctl package. Pin canonical Git origin https://github.com/houmain/keymapper at revision 2ddd5cc3957f5faabb5232c13cb0c18f86d933cf, the exact commit for upstream release 5.6.0, verified by fixed-revision fetch and tag ancestry. The main tree has GPLv3 LICENSE at this revision; separately vendored test-only src/test/catch.hpp is Catch v2.13.8 with an explicit Boost-1.0 distribution grant at the same revision. Therefore declare (license (list license:gpl3+ license:boost1.0)). The local repository convention does not include an upstream license-list exception, so the approved license list must supply its standard Boost spelling before lint. Implement in guix/tay/packages/keymapper.scm with package name keymapper, module name keymapper, and description/source strings sourced from the declared GitHub origin or homepage rather than copied upstream text. Use cmake-build-system with ENABLE_TEST=ON and RUN_TESTS_WITH_ASAN=OFF; build all three executables and test-keymapper, then run the test binary with --durations yes in the check phase without uinput or physical-device access. Build dependencies are cmake, ninja, gcc-toolchain, pkg-config; inputs/propagated-inputs should include libusb, libudev/eudev, dbus, glib, gtk+ and libayatana-appindicator for tray support, plus libx11, libx11-xcb, libxkbcommon and libxkbcommon-x11 for X11/xkbcommon, and wayland, wayland-protocols, libxkbcommon for Wayland support. Explicitly preserve conditional upstream handling by disabling optional integrations only when they cannot be declared cleanly, instead of relying on opaque host discovery. Install upstream's intended binaries and desktop integration files, but do not install a global udev rule or require build-time device access: wrap keymapper/keymapperd so their graphical/device runtime dependencies resolve, keep authorization explicit at user runtime, and package keymapperctl directly. The deterministic non-privileged runtime proof uses installed keymapperctl --print Goocastle-local --result. Upstream source at src/control/main.cpp lines 182-190 prints the requested string locally and the accumulated result without connecting before processing requests, so it emits exactly Goocastle-local and exits 0. Separately assert keymapper --check --no-notify --config exits 0. Capture the required .goocastle/evidence/issue-127.png using the same executable and argv. Research did not run daemon-backed guix lint/build because the host boundary prohibits Guix use; this is an evidence-limited implementation brief, not a package proof.
Completed by #747 in signed/authenticated commit
cc1c75a45c4244ce382fbc2c56545cc478b117c4. See full proof for source/license corrections, all upstream tests, reproducible build, offline lint, actual isolated valid/invalid config parsing and real PNG. Impossible device-free keymapperctl assumption corrected to genuine checker behavior; installation remains opt-in/inert.