inpmap 0.2.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- inpmap-0.2.0/CHANGELOG.md +35 -0
- inpmap-0.2.0/LICENSE +21 -0
- inpmap-0.2.0/MANIFEST.in +5 -0
- inpmap-0.2.0/PKG-INFO +157 -0
- inpmap-0.2.0/README.md +124 -0
- inpmap-0.2.0/docs/configuration.md +1173 -0
- inpmap-0.2.0/docs/development.md +129 -0
- inpmap-0.2.0/docs/installation.md +223 -0
- inpmap-0.2.0/docs/manual-tests.md +106 -0
- inpmap-0.2.0/docs/roadmap.md +125 -0
- inpmap-0.2.0/docs/usage.md +473 -0
- inpmap-0.2.0/pyproject.toml +72 -0
- inpmap-0.2.0/setup.cfg +4 -0
- inpmap-0.2.0/src/inpmap/__init__.py +3 -0
- inpmap-0.2.0/src/inpmap/__main__.py +5 -0
- inpmap-0.2.0/src/inpmap/_linux_codes.py +1275 -0
- inpmap-0.2.0/src/inpmap/axes.py +92 -0
- inpmap-0.2.0/src/inpmap/axis_triggers.py +119 -0
- inpmap-0.2.0/src/inpmap/backends/__init__.py +1 -0
- inpmap-0.2.0/src/inpmap/backends/linux.py +178 -0
- inpmap-0.2.0/src/inpmap/backends/linux_input.py +656 -0
- inpmap-0.2.0/src/inpmap/backends/linux_service.py +105 -0
- inpmap-0.2.0/src/inpmap/backends/linux_setup.py +208 -0
- inpmap-0.2.0/src/inpmap/cli.py +829 -0
- inpmap-0.2.0/src/inpmap/codes.py +96 -0
- inpmap-0.2.0/src/inpmap/config.py +828 -0
- inpmap-0.2.0/src/inpmap/config_macros.py +545 -0
- inpmap-0.2.0/src/inpmap/data/example.inpmap +95 -0
- inpmap-0.2.0/src/inpmap/data/syntax/inpmap.nanorc +20 -0
- inpmap-0.2.0/src/inpmap/data/syntax/inpmap.xml +115 -0
- inpmap-0.2.0/src/inpmap/data_files.py +19 -0
- inpmap-0.2.0/src/inpmap/detect.py +86 -0
- inpmap-0.2.0/src/inpmap/dsl/__init__.py +0 -0
- inpmap-0.2.0/src/inpmap/dsl/compiler.py +1079 -0
- inpmap-0.2.0/src/inpmap/dsl/formatter.py +491 -0
- inpmap-0.2.0/src/inpmap/dsl/inpmap.lark +112 -0
- inpmap-0.2.0/src/inpmap/dsl/parser.py +131 -0
- inpmap-0.2.0/src/inpmap/engine.py +501 -0
- inpmap-0.2.0/src/inpmap/input.py +103 -0
- inpmap-0.2.0/src/inpmap/input_config.py +472 -0
- inpmap-0.2.0/src/inpmap/loading.py +25 -0
- inpmap-0.2.0/src/inpmap/macro_runtime.py +540 -0
- inpmap-0.2.0/src/inpmap/macros.py +287 -0
- inpmap-0.2.0/src/inpmap/models.py +265 -0
- inpmap-0.2.0/src/inpmap/modifiers.py +82 -0
- inpmap-0.2.0/src/inpmap/output.py +197 -0
- inpmap-0.2.0/src/inpmap/profiles.py +48 -0
- inpmap-0.2.0/src/inpmap/runtime.py +388 -0
- inpmap-0.2.0/src/inpmap/state.py +46 -0
- inpmap-0.2.0/src/inpmap/trace.py +176 -0
- inpmap-0.2.0/src/inpmap.egg-info/PKG-INFO +157 -0
- inpmap-0.2.0/src/inpmap.egg-info/SOURCES.txt +84 -0
- inpmap-0.2.0/src/inpmap.egg-info/dependency_links.txt +1 -0
- inpmap-0.2.0/src/inpmap.egg-info/entry_points.txt +2 -0
- inpmap-0.2.0/src/inpmap.egg-info/requires.txt +8 -0
- inpmap-0.2.0/src/inpmap.egg-info/top_level.txt +1 -0
- inpmap-0.2.0/tests/data/json_era_example.inpmap +69 -0
- inpmap-0.2.0/tests/fakes.py +210 -0
- inpmap-0.2.0/tests/golden_example_traces.py +322 -0
- inpmap-0.2.0/tests/test_axis_triggers.py +159 -0
- inpmap-0.2.0/tests/test_blocks.py +109 -0
- inpmap-0.2.0/tests/test_cli.py +336 -0
- inpmap-0.2.0/tests/test_codes.py +59 -0
- inpmap-0.2.0/tests/test_config.py +393 -0
- inpmap-0.2.0/tests/test_config_macros.py +403 -0
- inpmap-0.2.0/tests/test_detect.py +50 -0
- inpmap-0.2.0/tests/test_docs.py +95 -0
- inpmap-0.2.0/tests/test_dsl_compiler.py +356 -0
- inpmap-0.2.0/tests/test_dsl_parser.py +146 -0
- inpmap-0.2.0/tests/test_engine.py +375 -0
- inpmap-0.2.0/tests/test_example.py +59 -0
- inpmap-0.2.0/tests/test_formatter.py +152 -0
- inpmap-0.2.0/tests/test_input_config.py +353 -0
- inpmap-0.2.0/tests/test_layers.py +166 -0
- inpmap-0.2.0/tests/test_linux_backend.py +228 -0
- inpmap-0.2.0/tests/test_linux_input.py +957 -0
- inpmap-0.2.0/tests/test_linux_service.py +53 -0
- inpmap-0.2.0/tests/test_linux_setup.py +98 -0
- inpmap-0.2.0/tests/test_macro_runtime.py +660 -0
- inpmap-0.2.0/tests/test_modifiers.py +338 -0
- inpmap-0.2.0/tests/test_output.py +187 -0
- inpmap-0.2.0/tests/test_profiles.py +22 -0
- inpmap-0.2.0/tests/test_runtime.py +750 -0
- inpmap-0.2.0/tests/test_state.py +32 -0
- inpmap-0.2.0/tests/test_trace.py +154 -0
- inpmap-0.2.0/tools/gen_codes.py +93 -0
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to InpMap. Versions follow [semantic versioning](https://semver.org/);
|
|
4
|
+
before 1.0, minor versions may change the configuration language (the
|
|
5
|
+
`version` line in configuration files guards against incompatible changes).
|
|
6
|
+
|
|
7
|
+
## 0.2.0 (first public release)
|
|
8
|
+
|
|
9
|
+
InpMap is a configuration-driven input remapper for Linux: one key or
|
|
10
|
+
button can drive keys, buttons and sticks on several virtual devices at
|
|
11
|
+
once.
|
|
12
|
+
|
|
13
|
+
- **Configuration language** (`.inpmap` files, version 1), with errors
|
|
14
|
+
reported as `FILE:LINE:COLUMN` before any device is touched.
|
|
15
|
+
- **Virtual keyboard and gamepad** outputs (buttons, D-pad, sticks,
|
|
16
|
+
triggers); unmapped input passes through unchanged; LEDs keep working;
|
|
17
|
+
devices that are unplugged are picked up again.
|
|
18
|
+
- **Mappings:** hold, tap, chords, sequences with waits and random waits,
|
|
19
|
+
loops, autofire, toggles, parallel branches, stick movements with ramps,
|
|
20
|
+
variables, conditions (tap vs. hold, double tap, long press, "pressed
|
|
21
|
+
alone", lock LEDs), modifiers (`modifiers(ctrl, shift)`), mappings for one
|
|
22
|
+
device or for every input, `disable`.
|
|
23
|
+
- **Sticks, analog triggers and the D-pad as triggers**
|
|
24
|
+
(`map pad.ABS_RZ above 0.5`), including two-stage triggers.
|
|
25
|
+
- **Layers** (`layer NAME { … }`, `hold layer`, `layer NAME toggle`) and
|
|
26
|
+
**reusable blocks** (`block` / `call`).
|
|
27
|
+
- **Profiles** in `~/.config/inpmap/`; a systemd **user service**
|
|
28
|
+
(`inpmap@NAME`); an **emergency stop** (Backspace + Escape + Enter).
|
|
29
|
+
- **Tools:** `input-config` (pick devices, also by pressing a key; starts
|
|
30
|
+
from the built-in example for the profile `example`), `detect` (presses
|
|
31
|
+
shown as triggers), `axes`, `codes`, `check`, `macro-trace`, `fmt`,
|
|
32
|
+
`devices`, `udev-rules`, `service-unit`, `syntax-file`, `test-outputs`.
|
|
33
|
+
|
|
34
|
+
Tested on CachyOS with KDE Plasma (Wayland); other distributions and
|
|
35
|
+
desktops are not tested yet.
|
inpmap-0.2.0/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 unoctanium
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
inpmap-0.2.0/MANIFEST.in
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# The source distribution: everything needed to build, read and test InpMap.
|
|
2
|
+
include CHANGELOG.md
|
|
3
|
+
recursive-include docs configuration.md installation.md usage.md development.md roadmap.md manual-tests.md
|
|
4
|
+
recursive-include tests *.py *.inpmap
|
|
5
|
+
include tools/gen_codes.py
|
inpmap-0.2.0/PKG-INFO
ADDED
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: inpmap
|
|
3
|
+
Version: 0.2.0
|
|
4
|
+
Summary: Configuration-driven input remapper (own configuration language, multiple virtual output devices)
|
|
5
|
+
Author: unoctanium
|
|
6
|
+
License-Expression: MIT
|
|
7
|
+
Project-URL: Homepage, https://github.com/unoctanium/InpMap
|
|
8
|
+
Project-URL: Documentation, https://github.com/unoctanium/InpMap/blob/main/docs/usage.md
|
|
9
|
+
Project-URL: Changelog, https://github.com/unoctanium/InpMap/blob/main/CHANGELOG.md
|
|
10
|
+
Project-URL: Issues, https://github.com/unoctanium/InpMap/issues
|
|
11
|
+
Keywords: input,remapper,keyboard,gamepad,evdev,uinput,macros,linux
|
|
12
|
+
Classifier: Development Status :: 3 - Alpha
|
|
13
|
+
Classifier: Environment :: Console
|
|
14
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
15
|
+
Classifier: Operating System :: POSIX :: Linux
|
|
16
|
+
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
20
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
21
|
+
Classifier: Topic :: Games/Entertainment
|
|
22
|
+
Classifier: Topic :: System :: Hardware
|
|
23
|
+
Classifier: Topic :: Utilities
|
|
24
|
+
Requires-Python: >=3.11
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
26
|
+
License-File: LICENSE
|
|
27
|
+
Requires-Dist: lark<2,>=1.2
|
|
28
|
+
Requires-Dist: evdev; sys_platform == "linux"
|
|
29
|
+
Provides-Extra: dev
|
|
30
|
+
Requires-Dist: pytest; extra == "dev"
|
|
31
|
+
Requires-Dist: ruff; extra == "dev"
|
|
32
|
+
Dynamic: license-file
|
|
33
|
+
|
|
34
|
+
# InpMap
|
|
35
|
+
|
|
36
|
+
[](https://github.com/unoctanium/InpMap/actions/workflows/ci.yml)
|
|
37
|
+
|
|
38
|
+
InpMap is an input remapper for Linux. It takes over your physical keyboard
|
|
39
|
+
or gamepad and turns its keys and buttons into whatever you describe in a
|
|
40
|
+
small configuration file: other keys, gamepad buttons, stick movements, or
|
|
41
|
+
whole timed sequences ("macros"). One key can act on **several virtual
|
|
42
|
+
devices at once**, for example press a keyboard key and a gamepad button
|
|
43
|
+
together.
|
|
44
|
+
|
|
45
|
+
```inpmap
|
|
46
|
+
version 1
|
|
47
|
+
input kbd { path = "/dev/input/by-id/usb-4348_2.4G_Dongle-event-kbd" }
|
|
48
|
+
output keyboard { type = keyboard }
|
|
49
|
+
output gamepad { type = gamepad }
|
|
50
|
+
|
|
51
|
+
map KEY_X { # X = keyboard Y + gamepad A
|
|
52
|
+
hold KEY_Y
|
|
53
|
+
hold BTN_SOUTH
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
map KEY_F10 { # tap, double tap, long press
|
|
57
|
+
on tap { tap KEY_1 }
|
|
58
|
+
on double_tap { tap KEY_2 }
|
|
59
|
+
on long_press { tap KEY_3 }
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
map KEY_CAPSLOCK { # Caps Lock alone = Esc, with another key = Ctrl
|
|
63
|
+
if single { tap KEY_ESC } else { hold KEY_LEFTCTRL }
|
|
64
|
+
}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Why InpMap?
|
|
68
|
+
|
|
69
|
+
[Input Remapper](https://github.com/sezanzeb/input-remapper) is the
|
|
70
|
+
established remapper for Linux and served as the functional reference.
|
|
71
|
+
InpMap was started for needs it covers less well:
|
|
72
|
+
|
|
73
|
+
- **Several virtual output devices per mapping.** A key can drive a
|
|
74
|
+
virtual keyboard and a virtual gamepad (or two gamepads) at the same time
|
|
75
|
+
— e.g. for games that expect a gamepad.
|
|
76
|
+
- **Configuration as a readable text file** instead of a GUI: easy to write
|
|
77
|
+
in any editor, to compare, to keep in git and to copy to other PCs.
|
|
78
|
+
Errors are reported with file, line and column before any device is
|
|
79
|
+
touched.
|
|
80
|
+
- **Predictable behaviour**: exact rules for modifiers (Shift+A stays a
|
|
81
|
+
capital A unless you map it), reference-counted outputs, and a guarantee
|
|
82
|
+
that no key is ever left stuck — on release, on errors, on unplugging and
|
|
83
|
+
on shutdown.
|
|
84
|
+
- **A portable core.** The mapping engine is independent of Linux; a
|
|
85
|
+
Windows version is planned.
|
|
86
|
+
|
|
87
|
+
## Features
|
|
88
|
+
|
|
89
|
+
- Keyboard keys and gamepad buttons as triggers, optionally with modifiers
|
|
90
|
+
(`modifiers(ctrl, shift)`), from any number of physical devices. A
|
|
91
|
+
mapping applies to every configured device that has the key, or to one
|
|
92
|
+
device only (`pad.BTN_EAST`). Keys can be disabled.
|
|
93
|
+
- Sticks, analog triggers and the D-pad as buttons (`map pad.ABS_RZ above
|
|
94
|
+
0.5`), also two-stage triggers; `inpmap axes` shows their live values.
|
|
95
|
+
- Virtual keyboards and gamepads (buttons, D-pad, sticks, triggers).
|
|
96
|
+
- Hold, tap, chords (`ctrl + KEY_C`), sequences with waits and random
|
|
97
|
+
waits, loops, autofire, toggles, parallel branches, stick movements with
|
|
98
|
+
ramps.
|
|
99
|
+
- Conditions: tap vs. hold, double tap, long press, "pressed alone",
|
|
100
|
+
Caps/Num/Scroll Lock state, variables.
|
|
101
|
+
- Layers: groups of mappings switched on while a key is held or toggled,
|
|
102
|
+
e.g. Caps Lock + WASD as arrow keys, or a flight-sim layer on the gamepad.
|
|
103
|
+
- Reusable blocks: write a sequence once (`block close_dialog { … }`) and
|
|
104
|
+
`call` it from several mappings.
|
|
105
|
+
- Unmapped keys pass through unchanged; LEDs keep working; devices that
|
|
106
|
+
are unplugged and plugged in again are picked up automatically.
|
|
107
|
+
- `inpmap input-config` finds your devices for you: press a key on the
|
|
108
|
+
keyboard or gamepad you want, and it is added to the configuration.
|
|
109
|
+
- `inpmap fmt` lays out configuration files consistently, without ever
|
|
110
|
+
changing what they mean.
|
|
111
|
+
- `inpmap macro-trace` shows the exact timeline of a mapping without
|
|
112
|
+
touching any device.
|
|
113
|
+
- Runs in the foreground or as a systemd user service that starts at
|
|
114
|
+
login. Profiles (e.g. one per game) are switched with `systemctl --user`.
|
|
115
|
+
Holding Backspace + Escape + Enter always stops it (emergency stop).
|
|
116
|
+
|
|
117
|
+
Not yet: mouse output, a GUI, Windows, a system-wide service.
|
|
118
|
+
|
|
119
|
+
## Documentation
|
|
120
|
+
|
|
121
|
+
| Document | Contents |
|
|
122
|
+
|---|---|
|
|
123
|
+
| [docs/installation.md](https://github.com/unoctanium/InpMap/blob/main/docs/installation.md) | requirements, installation, device permissions, user service, uninstall |
|
|
124
|
+
| [docs/usage.md](https://github.com/unoctanium/InpMap/blob/main/docs/usage.md) | first configuration step by step, all commands and options, troubleshooting |
|
|
125
|
+
| [docs/configuration.md](https://github.com/unoctanium/InpMap/blob/main/docs/configuration.md) | **reference** of the configuration language: every feature with examples |
|
|
126
|
+
| [docs/development.md](https://github.com/unoctanium/InpMap/blob/main/docs/development.md) | for contributors: tests, architecture, releases |
|
|
127
|
+
| [docs/roadmap.md](https://github.com/unoctanium/InpMap/blob/main/docs/roadmap.md) | goals, requirements, milestones and what comes next |
|
|
128
|
+
| [CHANGELOG.md](https://github.com/unoctanium/InpMap/blob/main/CHANGELOG.md) | changes per version |
|
|
129
|
+
|
|
130
|
+
## Quick start
|
|
131
|
+
|
|
132
|
+
```sh
|
|
133
|
+
sudo pacman -S --needed python python-evdev python-pipx # Arch; other distributions: see installation.md
|
|
134
|
+
pipx install --system-site-packages inpmap
|
|
135
|
+
|
|
136
|
+
inpmap input-config example # the example with your keyboard (press i, then a key)
|
|
137
|
+
inpmap run example --timeout 60 # try F1-F8, Caps Lock, Insert
|
|
138
|
+
inpmap input-config # your own profile: ~/.config/inpmap/default.inpmap
|
|
139
|
+
inpmap detect # press keys: see how to write them in a mapping
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
Device permissions may be needed first: see
|
|
143
|
+
[installation.md §3](https://github.com/unoctanium/InpMap/blob/main/docs/installation.md#3-device-permissions).
|
|
144
|
+
To work on InpMap itself, install it from the source code
|
|
145
|
+
([installation.md §2b](https://github.com/unoctanium/InpMap/blob/main/docs/installation.md#2b-from-the-source-code-for-development)).
|
|
146
|
+
|
|
147
|
+
## Status
|
|
148
|
+
|
|
149
|
+
Version 0.2, Linux only. Verified on CachyOS / KDE Plasma (Wayland) with a
|
|
150
|
+
real keyboard and gamepad: remapping, suppression of the original keys,
|
|
151
|
+
passthrough, macros, modifiers, axes as triggers, the configuration
|
|
152
|
+
language and the user service. Later: Windows, then GUIs.
|
|
153
|
+
|
|
154
|
+
## License
|
|
155
|
+
|
|
156
|
+
MIT, see [LICENSE](https://github.com/unoctanium/InpMap/blob/main/LICENSE). Input Remapper (GPL-3.0) served as a
|
|
157
|
+
functional reference only; InpMap contains no code from it.
|
inpmap-0.2.0/README.md
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
# InpMap
|
|
2
|
+
|
|
3
|
+
[](https://github.com/unoctanium/InpMap/actions/workflows/ci.yml)
|
|
4
|
+
|
|
5
|
+
InpMap is an input remapper for Linux. It takes over your physical keyboard
|
|
6
|
+
or gamepad and turns its keys and buttons into whatever you describe in a
|
|
7
|
+
small configuration file: other keys, gamepad buttons, stick movements, or
|
|
8
|
+
whole timed sequences ("macros"). One key can act on **several virtual
|
|
9
|
+
devices at once**, for example press a keyboard key and a gamepad button
|
|
10
|
+
together.
|
|
11
|
+
|
|
12
|
+
```inpmap
|
|
13
|
+
version 1
|
|
14
|
+
input kbd { path = "/dev/input/by-id/usb-4348_2.4G_Dongle-event-kbd" }
|
|
15
|
+
output keyboard { type = keyboard }
|
|
16
|
+
output gamepad { type = gamepad }
|
|
17
|
+
|
|
18
|
+
map KEY_X { # X = keyboard Y + gamepad A
|
|
19
|
+
hold KEY_Y
|
|
20
|
+
hold BTN_SOUTH
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
map KEY_F10 { # tap, double tap, long press
|
|
24
|
+
on tap { tap KEY_1 }
|
|
25
|
+
on double_tap { tap KEY_2 }
|
|
26
|
+
on long_press { tap KEY_3 }
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
map KEY_CAPSLOCK { # Caps Lock alone = Esc, with another key = Ctrl
|
|
30
|
+
if single { tap KEY_ESC } else { hold KEY_LEFTCTRL }
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Why InpMap?
|
|
35
|
+
|
|
36
|
+
[Input Remapper](https://github.com/sezanzeb/input-remapper) is the
|
|
37
|
+
established remapper for Linux and served as the functional reference.
|
|
38
|
+
InpMap was started for needs it covers less well:
|
|
39
|
+
|
|
40
|
+
- **Several virtual output devices per mapping.** A key can drive a
|
|
41
|
+
virtual keyboard and a virtual gamepad (or two gamepads) at the same time
|
|
42
|
+
— e.g. for games that expect a gamepad.
|
|
43
|
+
- **Configuration as a readable text file** instead of a GUI: easy to write
|
|
44
|
+
in any editor, to compare, to keep in git and to copy to other PCs.
|
|
45
|
+
Errors are reported with file, line and column before any device is
|
|
46
|
+
touched.
|
|
47
|
+
- **Predictable behaviour**: exact rules for modifiers (Shift+A stays a
|
|
48
|
+
capital A unless you map it), reference-counted outputs, and a guarantee
|
|
49
|
+
that no key is ever left stuck — on release, on errors, on unplugging and
|
|
50
|
+
on shutdown.
|
|
51
|
+
- **A portable core.** The mapping engine is independent of Linux; a
|
|
52
|
+
Windows version is planned.
|
|
53
|
+
|
|
54
|
+
## Features
|
|
55
|
+
|
|
56
|
+
- Keyboard keys and gamepad buttons as triggers, optionally with modifiers
|
|
57
|
+
(`modifiers(ctrl, shift)`), from any number of physical devices. A
|
|
58
|
+
mapping applies to every configured device that has the key, or to one
|
|
59
|
+
device only (`pad.BTN_EAST`). Keys can be disabled.
|
|
60
|
+
- Sticks, analog triggers and the D-pad as buttons (`map pad.ABS_RZ above
|
|
61
|
+
0.5`), also two-stage triggers; `inpmap axes` shows their live values.
|
|
62
|
+
- Virtual keyboards and gamepads (buttons, D-pad, sticks, triggers).
|
|
63
|
+
- Hold, tap, chords (`ctrl + KEY_C`), sequences with waits and random
|
|
64
|
+
waits, loops, autofire, toggles, parallel branches, stick movements with
|
|
65
|
+
ramps.
|
|
66
|
+
- Conditions: tap vs. hold, double tap, long press, "pressed alone",
|
|
67
|
+
Caps/Num/Scroll Lock state, variables.
|
|
68
|
+
- Layers: groups of mappings switched on while a key is held or toggled,
|
|
69
|
+
e.g. Caps Lock + WASD as arrow keys, or a flight-sim layer on the gamepad.
|
|
70
|
+
- Reusable blocks: write a sequence once (`block close_dialog { … }`) and
|
|
71
|
+
`call` it from several mappings.
|
|
72
|
+
- Unmapped keys pass through unchanged; LEDs keep working; devices that
|
|
73
|
+
are unplugged and plugged in again are picked up automatically.
|
|
74
|
+
- `inpmap input-config` finds your devices for you: press a key on the
|
|
75
|
+
keyboard or gamepad you want, and it is added to the configuration.
|
|
76
|
+
- `inpmap fmt` lays out configuration files consistently, without ever
|
|
77
|
+
changing what they mean.
|
|
78
|
+
- `inpmap macro-trace` shows the exact timeline of a mapping without
|
|
79
|
+
touching any device.
|
|
80
|
+
- Runs in the foreground or as a systemd user service that starts at
|
|
81
|
+
login. Profiles (e.g. one per game) are switched with `systemctl --user`.
|
|
82
|
+
Holding Backspace + Escape + Enter always stops it (emergency stop).
|
|
83
|
+
|
|
84
|
+
Not yet: mouse output, a GUI, Windows, a system-wide service.
|
|
85
|
+
|
|
86
|
+
## Documentation
|
|
87
|
+
|
|
88
|
+
| Document | Contents |
|
|
89
|
+
|---|---|
|
|
90
|
+
| [docs/installation.md](https://github.com/unoctanium/InpMap/blob/main/docs/installation.md) | requirements, installation, device permissions, user service, uninstall |
|
|
91
|
+
| [docs/usage.md](https://github.com/unoctanium/InpMap/blob/main/docs/usage.md) | first configuration step by step, all commands and options, troubleshooting |
|
|
92
|
+
| [docs/configuration.md](https://github.com/unoctanium/InpMap/blob/main/docs/configuration.md) | **reference** of the configuration language: every feature with examples |
|
|
93
|
+
| [docs/development.md](https://github.com/unoctanium/InpMap/blob/main/docs/development.md) | for contributors: tests, architecture, releases |
|
|
94
|
+
| [docs/roadmap.md](https://github.com/unoctanium/InpMap/blob/main/docs/roadmap.md) | goals, requirements, milestones and what comes next |
|
|
95
|
+
| [CHANGELOG.md](https://github.com/unoctanium/InpMap/blob/main/CHANGELOG.md) | changes per version |
|
|
96
|
+
|
|
97
|
+
## Quick start
|
|
98
|
+
|
|
99
|
+
```sh
|
|
100
|
+
sudo pacman -S --needed python python-evdev python-pipx # Arch; other distributions: see installation.md
|
|
101
|
+
pipx install --system-site-packages inpmap
|
|
102
|
+
|
|
103
|
+
inpmap input-config example # the example with your keyboard (press i, then a key)
|
|
104
|
+
inpmap run example --timeout 60 # try F1-F8, Caps Lock, Insert
|
|
105
|
+
inpmap input-config # your own profile: ~/.config/inpmap/default.inpmap
|
|
106
|
+
inpmap detect # press keys: see how to write them in a mapping
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Device permissions may be needed first: see
|
|
110
|
+
[installation.md §3](https://github.com/unoctanium/InpMap/blob/main/docs/installation.md#3-device-permissions).
|
|
111
|
+
To work on InpMap itself, install it from the source code
|
|
112
|
+
([installation.md §2b](https://github.com/unoctanium/InpMap/blob/main/docs/installation.md#2b-from-the-source-code-for-development)).
|
|
113
|
+
|
|
114
|
+
## Status
|
|
115
|
+
|
|
116
|
+
Version 0.2, Linux only. Verified on CachyOS / KDE Plasma (Wayland) with a
|
|
117
|
+
real keyboard and gamepad: remapping, suppression of the original keys,
|
|
118
|
+
passthrough, macros, modifiers, axes as triggers, the configuration
|
|
119
|
+
language and the user service. Later: Windows, then GUIs.
|
|
120
|
+
|
|
121
|
+
## License
|
|
122
|
+
|
|
123
|
+
MIT, see [LICENSE](https://github.com/unoctanium/InpMap/blob/main/LICENSE). Input Remapper (GPL-3.0) served as a
|
|
124
|
+
functional reference only; InpMap contains no code from it.
|