[Guix packaging] houmain/keymapper #127

Closed
opened 2026-08-14 13:17:43 +00:00 by htayj · 2 comments
htayj commented 2026-08-14 13:17:43 +00:00 (Migrated from github.com)

Candidate

  • Upstream canonical URL: https://github.com/houmain/keymapper
  • Source pinned commit/release when known: 2ddd5cc3957f5faabb5232c13cb0c18f86d933cf on main (default branch snapshot reviewed 2026-08-14).
  • Target concrete installed deliverable: Keymapper context-aware keyboard remapper and keymapperctl utility
  • Primary category: input-accessibility
  • Tags: None
  • Primary language normalized: C++
  • Build system: CMake (CMakeLists.txt; platform-specific input backends)
  • SPDX expression: GPL-3.0
  • License status: confirmed-free
  • License evidence: LICENSE contains GPLv3 and README describes the cross-platform context-aware key remapper.
  • Difficulty: hard — Package Linux input/uinput and desktop integration narrowly, keep macOS/Windows backends conditional, and avoid privileged device access during build tests.
  • Workflow state: research
  • Existing Guix coverage: Checked 2026-08-14: GNU Guix, Nonguix, Guix Science, Guix HPC, Guix Past, Guix 'R Us, and RDE; no equivalent package with the same upstream origin was found.

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. keymapper passes with no new errors.
  • guix build -L. keymapper succeeds from the pinned source with tests enabled where practical.
  • App-specific offline smoke: Build offline and run keymapperctl --help plus 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.

## Candidate - Upstream canonical URL: https://github.com/houmain/keymapper - Source pinned commit/release when known: `2ddd5cc3957f5faabb5232c13cb0c18f86d933cf` on `main` (default branch snapshot reviewed 2026-08-14). - Target concrete installed deliverable: Keymapper context-aware keyboard remapper and `keymapperctl` utility - Primary category: input-accessibility - Tags: None - Primary language normalized: C++ - Build system: CMake (`CMakeLists.txt`; platform-specific input backends) - SPDX expression: GPL-3.0 - License status: confirmed-free - License evidence: `LICENSE` contains GPLv3 and README describes the cross-platform context-aware key remapper. - Difficulty: hard — Package Linux input/uinput and desktop integration narrowly, keep macOS/Windows backends conditional, and avoid privileged device access during build tests. - Workflow state: research - Existing Guix coverage: Checked 2026-08-14: GNU Guix, Nonguix, Guix Science, Guix HPC, Guix Past, Guix 'R Us, and RDE; no equivalent package with the same upstream origin was found. ## 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. keymapper` passes with no new errors. - `guix build -L. keymapper` succeeds from the pinned source with tests enabled where practical. - App-specific offline smoke: Build offline and run `keymapperctl --help` plus a non-privileged config parse smoke; test remapping only with a virtual input fixture. --- Imported from [GitHub issue/PR](https://github.com/htayj/guix-channel/issues/127). Originally posted by [htayj](https://github.com/htayj) on 2026-08-14T13:17:43Z.
Owner

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.

<!-- goocastle-disposition:sequential-reviewer:127:1:implementation-ready --> 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 <minimal valid temporary 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.
Owner

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.

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.
tay closed this issue 2026-09-29 23:00:55 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
tay/guix-channel#127
No description provided.