2020-12-19 15:09:24 +00:00
|
|
|
# Usage
|
|
|
|
|
|
|
|
To open the UI to modify the mappings, look into your applications menu
|
2020-12-24 00:26:34 +00:00
|
|
|
and search for 'Key Mapper'. You should be prompted for your sudo password
|
|
|
|
as special permissions are needed to read events from `/dev/input/` files.
|
|
|
|
You can also start it via `sudo key-mapper-gtk`.
|
2020-12-19 15:09:24 +00:00
|
|
|
|
2020-12-26 16:09:52 +00:00
|
|
|
<p align="center">
|
|
|
|
<img src="usage_1.png"/>
|
|
|
|
<img src="usage_2.png"/>
|
|
|
|
</p>
|
|
|
|
|
|
|
|
Hitting a key on the device that is selected in the large dropdown on the top
|
|
|
|
should display the key on the bottom of the window, and write it into the selected
|
|
|
|
row (as shown in the screenshots).
|
|
|
|
|
|
|
|
For changes to take effect, save the preset first. Otherwise, the daemon
|
|
|
|
won't be able to know about your changes. Afterwards press the "Apply" button.
|
|
|
|
|
2020-12-26 16:16:17 +00:00
|
|
|
To change the mapping, you need to use the "Restore Defaults" button, so that
|
2020-12-19 15:49:07 +00:00
|
|
|
the application can read the original keycode. It would otherwise be
|
|
|
|
invisible since the daemon maps it independently of the GUI.
|
|
|
|
|
2020-12-26 16:09:52 +00:00
|
|
|
## Troubleshooting
|
2020-12-19 15:49:07 +00:00
|
|
|
|
2020-12-25 19:42:28 +00:00
|
|
|
If stuff doesn't work, check the output of `sudo key-mapper-gtk -d` and feel free
|
2020-12-25 14:27:05 +00:00
|
|
|
to [open up an issue here](https://github.com/sezanzeb/key-mapper/issues/new).
|
|
|
|
Make sure to not post any debug logs that were generated while you entered
|
|
|
|
private information with your device. Debug logs are quite verbose.
|
2020-12-19 15:09:24 +00:00
|
|
|
|
2020-12-25 19:42:06 +00:00
|
|
|
If injecting stops after closing the window, the service is not running.
|
|
|
|
Try `sudo systemctl start key-mapper` in a terminal.
|
|
|
|
|
2021-01-01 02:46:38 +00:00
|
|
|
## Combinations
|
|
|
|
|
|
|
|
Select the key in your row (`click here`) and hold a few buttons down.
|
|
|
|
Releasing them will make your text cursor jump into the mapping column
|
|
|
|
to type in what you want to map it to.
|
|
|
|
|
|
|
|
Combinations involving Ctrl might not work, I think the desktop environment
|
|
|
|
grabs them or something. Combinations with Shift might not work the way
|
|
|
|
you would expect. If it outputs the keycode for a, you are going to get an
|
|
|
|
'A', because X11 still sees the enabled shift button.
|
|
|
|
|
|
|
|
This happens, because all key-mapper does is either forwarding or mapping
|
|
|
|
your keycodes (which is easier said than done), and X11/Wayland has to decide
|
|
|
|
what to do with it. And it decides, that if shift is pressed down, it will
|
|
|
|
capitalize your stuff.
|
|
|
|
|
|
|
|
A better option for a key combination would be `KP1 + a` instead of
|
|
|
|
`LEFTSHIFT + a`, because there won't be any side effect. You can disable
|
|
|
|
`KP1` by mapping it to `disable`, so you won't trigger writing a "1" into
|
|
|
|
your focused application.
|
|
|
|
|
|
|
|
<p align="center">
|
|
|
|
<img src="combination.png"/>
|
|
|
|
</p>
|
|
|
|
|
2020-12-19 15:09:24 +00:00
|
|
|
## Macros
|
|
|
|
|
|
|
|
It is possible to write timed macros into the center column:
|
|
|
|
- `k(1).k(2)` 1, 2
|
|
|
|
- `r(3, k(a).w(500))` a, a, a with 500ms pause
|
|
|
|
- `m(Control_L, k(a).k(x))` CTRL + a, CTRL + x
|
|
|
|
- `k(1).h(k(2)).k(3)` writes 1 2 2 ... 2 2 3 while the key is pressed
|
|
|
|
|
|
|
|
Documentation:
|
|
|
|
- `r` repeats the execution of the second parameter
|
|
|
|
- `w` waits in milliseconds
|
|
|
|
- `k` writes a single keystroke
|
|
|
|
- `m` holds a modifier while executing the second parameter
|
|
|
|
- `h` executes the parameter as long as the key is pressed down
|
|
|
|
- `.` executes two actions behind each other
|
|
|
|
|
2020-12-19 20:53:32 +00:00
|
|
|
Syntax errors are shown in the UI on save. Each `k` function adds a short
|
|
|
|
delay of 10ms between key-down, key-up and at the end. See
|
|
|
|
[Configuration Files](#configuration-files) for more info.
|
2020-12-19 15:09:24 +00:00
|
|
|
|
|
|
|
Bear in mind that anti-cheat software might detect macros in games.
|
|
|
|
|
|
|
|
## Key Names
|
|
|
|
|
|
|
|
Check the autocompletion of the GUI for possible values. You can also
|
2020-12-24 00:26:34 +00:00
|
|
|
obtain a complete list of possiblities using `key-mapper-control --key-names`.
|
2020-12-19 15:09:24 +00:00
|
|
|
Examples:
|
|
|
|
|
|
|
|
- Alphanumeric `a` to `z` and `0` to `9`
|
|
|
|
- Modifiers `Alt_L` `Control_L` `Control_R` `Shift_L` `Shift_R`
|
|
|
|
- Mouse buttons `BTN_LEFT` `BTN_RIGHT` `BTN_MIDDLE` `BTN_SIDE` ...
|
|
|
|
- Multimedia keys `KEY_NEXTSONG` `KEY_PLAYPAUSE` ...
|
|
|
|
|
|
|
|
## Gamepads
|
|
|
|
|
|
|
|
Joystick movements will be translated to mouse movements, while the second
|
2020-12-25 14:19:01 +00:00
|
|
|
joystick acts as a mouse wheel. You can swap this in the user interface.
|
|
|
|
All buttons, triggers and D-Pads can be mapped to keycodes and macros.
|
2020-12-19 15:09:24 +00:00
|
|
|
|
|
|
|
The D-Pad can be mapped to W, A, S, D for example, to run around in games,
|
2020-12-25 14:19:01 +00:00
|
|
|
while the joystick turns the view (depending on the game).
|
2020-12-19 15:09:24 +00:00
|
|
|
|
|
|
|
Tested with the XBOX 360 Gamepad. On Ubuntu, gamepads worked better in
|
|
|
|
Wayland than with X11 for me.
|
2020-12-19 20:50:27 +00:00
|
|
|
|
|
|
|
## Configuration Files
|
|
|
|
|
|
|
|
The default configuration is stored at `~/.config/key-mapper/config.json`.
|
2021-01-01 02:46:38 +00:00
|
|
|
The current default configuration as of 0.5.0 looks like, with
|
2020-12-19 22:03:30 +00:00
|
|
|
an example autoload entry:
|
2020-12-19 20:50:27 +00:00
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
2020-12-19 22:01:36 +00:00
|
|
|
"autoload": {
|
2020-12-19 22:04:43 +00:00
|
|
|
"Logitech USB Keyboard": "preset name"
|
2020-12-19 22:01:36 +00:00
|
|
|
},
|
2020-12-19 20:50:27 +00:00
|
|
|
"macros": {
|
|
|
|
"keystroke_sleep_ms": 10
|
|
|
|
},
|
|
|
|
"gamepad": {
|
|
|
|
"joystick": {
|
|
|
|
"non_linearity": 4,
|
|
|
|
"pointer_speed": 80,
|
|
|
|
"left_purpose": "mouse",
|
2021-01-01 02:46:38 +00:00
|
|
|
"right_purpose": "wheel",
|
|
|
|
"x_scroll_speed": 2,
|
|
|
|
"y_scroll_speed": 0.5
|
2020-12-19 20:50:27 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
2020-12-24 00:26:34 +00:00
|
|
|
`preset name` refers to `~/.config/key-mapper/presets/device name/preset name.json`.
|
2020-12-25 14:00:57 +00:00
|
|
|
The device name can be found with `sudo key-mapper-control --list-devices`.
|
2020-12-19 22:03:30 +00:00
|
|
|
|
2020-12-19 20:50:27 +00:00
|
|
|
Anything that is relevant to presets can be overwritten in them as well.
|
|
|
|
Here is an example configuration for preset "a" for the "gamepad" device:
|
2020-12-24 00:26:34 +00:00
|
|
|
`~/.config/key-mapper/presets/gamepad/a.json`
|
2020-12-19 20:50:27 +00:00
|
|
|
|
|
|
|
```json
|
|
|
|
{
|
|
|
|
"macros": {
|
|
|
|
"keystroke_sleep_ms": 100
|
|
|
|
},
|
|
|
|
"mapping": {
|
2020-12-31 20:46:57 +00:00
|
|
|
"1,315,1+1,16,-1": "1",
|
2020-12-19 20:50:27 +00:00
|
|
|
"1,307,1": "k(2).k(3)"
|
|
|
|
}
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
Both need to be valid json files, otherwise the parser refuses to work. This
|
2020-12-31 20:46:57 +00:00
|
|
|
preset maps the EV_KEY down event with code 307 to a macro and sets the time
|
|
|
|
between injected events of macros to 100 ms. The other mapping is a key
|
|
|
|
combination, chained using `+`.
|
|
|
|
|
|
|
|
Note that a complete keystroke consists of two events: down and up. Other
|
|
|
|
than that, it inherits all configurations from
|
|
|
|
`~/.config/key-mapper/config.json`. If config.json is missing some stuff,
|
|
|
|
it will query the hardcoded default values.
|
2020-12-19 20:54:15 +00:00
|
|
|
|
2020-12-19 22:05:46 +00:00
|
|
|
The event codes can be read using `evtest`. Available names in the mapping
|
2020-12-24 00:26:34 +00:00
|
|
|
can be listed with `key-mapper-control --key-names`.
|
|
|
|
|
|
|
|
## CLI
|
|
|
|
|
2020-12-24 10:00:28 +00:00
|
|
|
**key-mapper-control**
|
|
|
|
|
2020-12-24 00:26:34 +00:00
|
|
|
`--command` requires the service to be running. You can start it via
|
|
|
|
`systemctl start key-mapper` or `sudo key-mapper-service` if it isn't already
|
|
|
|
running (or without sudo if your user has the appropriate permissions).
|
|
|
|
|
|
|
|
```bash
|
|
|
|
key-mapper-control --command autoload
|
2020-12-25 14:00:57 +00:00
|
|
|
sudo key-mapper-control --list-devices
|
2020-12-24 00:26:34 +00:00
|
|
|
key-mapper-control --command stop --device "Razer Razer Naga Trinity"
|
|
|
|
key-mapper-control --command start --device "Razer Razer Naga Trinity" --preset "~/.config/key-mapper/presets/gamepad/a.json"
|
|
|
|
```
|
2020-12-24 10:00:28 +00:00
|
|
|
|
|
|
|
**systemctl**
|
|
|
|
|
|
|
|
Stopping the service will stop all injections until the computer is rebooted.
|
|
|
|
|
|
|
|
```bash
|
|
|
|
sudo systemctl stop key-mapper
|
|
|
|
sudo systemctl start key-mapper
|
|
|
|
systemctl status key-mapper
|
|
|
|
```
|
|
|
|
|
2020-12-25 14:27:05 +00:00
|
|
|
## Testing your Installation
|
|
|
|
|
|
|
|
The following commands can be used to make sure it works:
|
|
|
|
|
2020-12-25 14:27:48 +00:00
|
|
|
```bash
|
2020-12-25 14:27:05 +00:00
|
|
|
sudo key-mapper-service &
|
|
|
|
key-mapper-control --command hello
|
|
|
|
```
|
|
|
|
|
2020-12-25 14:27:48 +00:00
|
|
|
should print `Daemon answered with "hello"`. And
|
2020-12-25 14:27:05 +00:00
|
|
|
|
2020-12-25 14:27:48 +00:00
|
|
|
```bash
|
2020-12-25 14:27:05 +00:00
|
|
|
sudo key-mapper-control --list-devices
|
|
|
|
```
|
|
|
|
|
2020-12-25 14:28:08 +00:00
|
|
|
should print `Found "...", ...`. If anything looks wrong, feel free to [create
|
2020-12-25 14:27:05 +00:00
|
|
|
an issue](https://github.com/sezanzeb/key-mapper/issues/new).
|