Add limited unicode support

If we encounter a utf8 sequence corresponding to a glyph for which a
known XKB compose sequence exists, we replace the glyph with the
corresponding sequence. This allows non-english users to easilly specify
alternate glyphs without having to memorize the appropriate macros.
master
Raheman Vaiya 4 years ago
parent a1edfab5d1
commit 2a38fa22d0
  1. 3
      Makefile
  2. 6
      docs/CHANGELOG.md
  3. BIN
      docs/keyd.1.gz
  4. 61
      docs/keyd.scdoc
  5. 55
      scripts/gen_aliases.py
  6. 443
      src/aliases.h
  7. 9
      src/descriptor.c
  8. 2
      src/descriptor.h
  9. 5
      src/keyd.c
  10. 2
      src/vkbd/usb-gadget.h
  11. 2
      src/vkbd/usb-gadget.md

@ -2,7 +2,7 @@
DESTDIR=
PREFIX=/usr
VERSION=2.3.0-rc
VERSION=2.3.1-rc
COMMIT=$(shell git describe --no-match --always --abbrev=7 --dirty)
VKBD=uinput
@ -26,6 +26,7 @@ all:
debug:
CFLAGS="-pedantic -Wall -Wextra -g" $(MAKE)
assets:
./scripts/gen_aliases.py > src/aliases.h
for f in docs/*.scdoc; do \
scdoc < "$$f" | gzip > "$${f%%.scdoc}.1.gz"; \
done

@ -1,3 +1,9 @@
# v2.3.1-rc
- Add unicode support
- Add noop
- Fix keyd-application-mapper hotswapping
# v2.3.0-rc
This is a **major release** which breaks **backward compatibility** with

Binary file not shown.

@ -214,7 +214,8 @@ the full config actually looks something like this:
A special kind of layer called a *composite layer* can be defined by creating a
layer with a name consisting of existing layers delimited by _+_. The resultant
layer will be activated and given precedence when all of its constituents are
activated.
activated. Composite layers always inherit the modifiers of their constituent
layers and cannot be explicitly assigned.
E.G
@ -250,6 +251,64 @@ and not
[layer2]
```
## International Characters
If keyd encounters a UTF8 sequence as a right hand value, it will try and
translate that sequence into a macro which emits the corresponding XKB
sequence.
For example:
```
a = ä
u = Ü
```
will produce the following mapping:
```
a = macro(compose a ")
U = macro(compose U ")
```
In order for this to produce the desired symbol, the xkb option compose:menu
must be set, so that the compose keycode is properly recognized.
This can be manually achieved with:
```
setxkbmap -option compose:menu
```
though the settings will be lost when the device is unplugged (i.e keyd is
restarted).
The changes can be made permanent by setting the relevant option in your
display server's configuration logic. XKB compose sequences are supported by X
as well as most wayland compositors.
E.G:
on X:
Populating _/etc/X11/xorg.conf.d/compose.conf_ with:
```
Section "InputClass"
Identifier "system-keyboard"
MatchIsKeyboard "on"
Option "XkbOptions" "compose:menu"
EndSection
```
on sway:
Setting the following environment variable:
```
XKB_DEFAULT_OPTIONS=compose:menu
```
# MACROS
Various keyd actions accept macro expressions.

@ -0,0 +1,55 @@
#!/usr/bin/env python3
import re
import sys
import subprocess
keys = subprocess.check_output(['keyd', '-l']).decode('utf8').split('\n')
keymap = {k: k for k in keys}
keymap.update({
"quotedbl": "\"",
"apostrophe": "'",
"Multi_key": "compose",
"exclam": "!",
"question": "?",
"asciicircum": "^",
})
def create_macro(keys):
return f"macro({' '.join(keymap[k] for k in keys)})"
macros = {}
for line in open('/usr/share/X11/locale/en_US.UTF-8/Compose').readlines():
try:
keys, glyph = re.match('(\s*<.*?>+)\s*:\s*"(.*?)".*', line).groups()
keys = re.findall('<(.*?)>', keys)
macros[glyph] = create_macro(keys)
except:
pass
print('''/* GENERATED BY "%s" DO NOT EDIT BY HAND */
#ifndef ALIASES_H
#define ALIASES_H
struct alias {
const char *name;
const char *def;
};
static struct alias aliases[] = {
''' % sys.argv[0])
for glyph, macro in macros.items():
macro = macro.replace('"', '\\"')
print('\t{"%s", "%s"},' % (glyph, macro))
print('''
};
const size_t nr_aliases = sizeof(aliases)/sizeof(aliases[0]);
#endif
''')

@ -0,0 +1,443 @@
/* GENERATED BY "./scripts/gen_aliases.py" DO NOT EDIT BY HAND */
#ifndef ALIASES_H
#define ALIASES_H
struct alias {
const char *name;
const char *def;
};
static struct alias aliases[] = {
{"´", "macro(compose ' ')"},
{"¯", "macro(compose ^ minus)"},
{"¨", "macro(compose \" \")"},
{"­", "macro(compose minus minus space)"},
{"'", "macro(compose space ')"},
{"@", "macro(compose A T)"},
{"\\", "macro(compose slash slash)"},
{"^", "macro(compose space ^)"},
{"`", "macro(compose space grave)"},
{"¸", "macro(compose comma comma)"},
{"|", "macro(compose l v)"},
{"~", "macro(compose space minus)"},
{"<", "macro(compose l t)"},
{">", "macro(compose g t)"},
{" ", "macro(compose space space)"},
{"©", "macro(compose C O)"},
{"®", "macro(compose R O)"},
{"¦", "macro(compose ! ^)"},
{"¡", "macro(compose ! !)"},
{"", "macro(compose P P)"},
{"¿", "macro(compose ? ?)"},
{"ß", "macro(compose s s)"},
{"", "macro(compose S S)"},
{"œ", "macro(compose o e)"},
{"Œ", "macro(compose O E)"},
{"æ", "macro(compose a e)"},
{"Æ", "macro(compose A E)"},
{"", "macro(compose f f)"},
{"", "macro(compose f i)"},
{"", "macro(compose f l)"},
{"", "macro(compose F i)"},
{"", "macro(compose F l)"},
{"IJ", "macro(compose I j)"},
{"ij", "macro(compose i j)"},
{"°", "macro(compose o o)"},
{"", "macro(compose ' comma)"},
{"", "macro(compose \" comma)"},
{"", "macro(compose C E)"},
{"", "macro(compose slash C)"},
{"", "macro(compose C r)"},
{"", "macro(compose F r)"},
{"", "macro(compose equal L)"},
{"", "macro(compose slash m)"},
{"", "macro(compose equal N)"},
{"", "macro(compose P t)"},
{"", "macro(compose R s)"},
{"", "macro(compose equal W)"},
{"", "macro(compose equal d)"},
{"", "macro(compose equal e)"},
{"", "macro(compose equal p)"},
{"", "macro(compose equal r)"},
{"¢", "macro(compose slash c)"},
{"£", "macro(compose minus l)"},
{"¥", "macro(compose minus y)"},
{"ſ", "macro(compose f S)"},
{"", "macro(compose minus minus minus)"},
{"§", "macro(compose S !)"},
{"¤", "macro(compose x O)"},
{"", "macro(compose N O)"},
{"", "macro(compose ? !)"},
{"", "macro(compose ! ?)"},
{"", "macro(compose C C C P)"},
{"", "macro(compose O A)"},
{"🙌", "macro(compose backslash o slash)"},
{"💩", "macro(compose p o o)"},
{"🖕", "macro(compose F U)"},
{"🖖", "macro(compose L L A P)"},
{"¬", "macro(compose minus comma)"},
{"²", "macro(compose 2 ^)"},
{"³", "macro(compose 3 ^)"},
{"µ", "macro(compose u slash)"},
{"¹", "macro(compose 1 ^)"},
{"¼", "macro(compose 1 4)"},
{"½", "macro(compose 1 2)"},
{"¾", "macro(compose 3 4)"},
{"À", "macro(compose A grave)"},
{"Á", "macro(compose A ')"},
{"Â", "macro(compose A ^)"},
{"Ä", "macro(compose A \")"},
{"Å", "macro(compose A A)"},
{"Ç", "macro(compose C comma)"},
{"È", "macro(compose E grave)"},
{"É", "macro(compose E ')"},
{"Ê", "macro(compose E ^)"},
{"Ë", "macro(compose E \")"},
{"Ì", "macro(compose I grave)"},
{"Í", "macro(compose I ')"},
{"Î", "macro(compose I ^)"},
{"Ï", "macro(compose I \")"},
{"J́", "macro(compose J ')"},
{"Ð", "macro(compose D H)"},
{"Ò", "macro(compose O grave)"},
{"Ó", "macro(compose O ')"},
{"Ô", "macro(compose O ^)"},
{"Ö", "macro(compose O \")"},
{"×", "macro(compose x x)"},
{"Ø", "macro(compose O slash)"},
{"Ù", "macro(compose U grave)"},
{"Ú", "macro(compose U ')"},
{"Û", "macro(compose U ^)"},
{"Ü", "macro(compose U \")"},
{"Ý", "macro(compose Y ')"},
{"Þ", "macro(compose T H)"},
{"à", "macro(compose a grave)"},
{"á", "macro(compose a ')"},
{"â", "macro(compose a ^)"},
{"ä", "macro(compose a \")"},
{"å", "macro(compose a a)"},
{"ç", "macro(compose c comma)"},
{"è", "macro(compose e grave)"},
{"é", "macro(compose e ')"},
{"ê", "macro(compose e ^)"},
{"ë", "macro(compose e \")"},
{"ì", "macro(compose i grave)"},
{"í", "macro(compose i ')"},
{"î", "macro(compose i ^)"},
{"ï", "macro(compose i \")"},
{"j́", "macro(compose j ')"},
{"ð", "macro(compose d h)"},
{"ò", "macro(compose o grave)"},
{"ó", "macro(compose o ')"},
{"ô", "macro(compose o ^)"},
{"ö", "macro(compose o \")"},
{"ø", "macro(compose o slash)"},
{"ù", "macro(compose u grave)"},
{"ú", "macro(compose u ')"},
{"û", "macro(compose u ^)"},
{"ü", "macro(compose u \")"},
{"ý", "macro(compose y ')"},
{"þ", "macro(compose t h)"},
{"ÿ", "macro(compose y \")"},
{"Ā", "macro(compose A minus)"},
{"ā", "macro(compose a minus)"},
{"Ă", "macro(compose b A)"},
{"ă", "macro(compose b a)"},
{"Ą", "macro(compose A comma)"},
{"ą", "macro(compose a comma)"},
{"Ć", "macro(compose C ')"},
{"ć", "macro(compose c ')"},
{"Ĉ", "macro(compose ^ C)"},
{"ĉ", "macro(compose ^ c)"},
{"Č", "macro(compose v C)"},
{"č", "macro(compose v c)"},
{"Ď", "macro(compose v D)"},
{"ď", "macro(compose v d)"},
{"Đ", "macro(compose slash D)"},
{"đ", "macro(compose slash d)"},
{"Ē", "macro(compose E minus)"},
{"ē", "macro(compose e minus)"},
{"Ĕ", "macro(compose b E)"},
{"ĕ", "macro(compose b e)"},
{"Ę", "macro(compose E comma)"},
{"ę", "macro(compose e comma)"},
{"Ě", "macro(compose v E)"},
{"ě", "macro(compose v e)"},
{"Ĝ", "macro(compose ^ G)"},
{"ĝ", "macro(compose ^ g)"},
{"Ğ", "macro(compose b G)"},
{"ğ", "macro(compose b g)"},
{"Ģ", "macro(compose G comma)"},
{"ģ", "macro(compose g comma)"},
{"Ĥ", "macro(compose ^ H)"},
{"ĥ", "macro(compose ^ h)"},
{"Ħ", "macro(compose slash H)"},
{"ħ", "macro(compose slash h)"},
{"Ī", "macro(compose I minus)"},
{"ī", "macro(compose i minus)"},
{"Ĭ", "macro(compose b I)"},
{"ĭ", "macro(compose b i)"},
{"Į", "macro(compose I comma)"},
{"į", "macro(compose i comma)"},
{"Ĵ", "macro(compose ^ J)"},
{"ĵ", "macro(compose ^ j)"},
{"Ķ", "macro(compose K comma)"},
{"ķ", "macro(compose k comma)"},
{"ĸ", "macro(compose k k)"},
{"Ĺ", "macro(compose L ')"},
{"ĺ", "macro(compose l ')"},
{"Ļ", "macro(compose L comma)"},
{"ļ", "macro(compose l comma)"},
{"Ľ", "macro(compose c L)"},
{"ľ", "macro(compose c l)"},
{"Ł", "macro(compose L slash)"},
{"ł", "macro(compose l slash)"},
{"Ń", "macro(compose N ')"},
{"ń", "macro(compose n ')"},
{"Ņ", "macro(compose N comma)"},
{"ņ", "macro(compose n comma)"},
{"Ň", "macro(compose v N)"},
{"ň", "macro(compose v n)"},
{"Ŋ", "macro(compose N G)"},
{"ŋ", "macro(compose n g)"},
{"Ō", "macro(compose O minus)"},
{"ō", "macro(compose o minus)"},
{"Ŏ", "macro(compose b O)"},
{"ŏ", "macro(compose b o)"},
{"Ő", "macro(compose equal O)"},
{"ő", "macro(compose equal o)"},
{"Ŕ", "macro(compose R ')"},
{"ŕ", "macro(compose r ')"},
{"Ŗ", "macro(compose R comma)"},
{"ŗ", "macro(compose r comma)"},
{"Ř", "macro(compose v R)"},
{"ř", "macro(compose v r)"},
{"Ś", "macro(compose S ')"},
{"ś", "macro(compose s ')"},
{"Ŝ", "macro(compose ^ S)"},
{"ŝ", "macro(compose ^ s)"},
{"Ş", "macro(compose S comma)"},
{"ş", "macro(compose s comma)"},
{"Š", "macro(compose v S)"},
{"š", "macro(compose v s)"},
{"Ţ", "macro(compose T comma)"},
{"ţ", "macro(compose t comma)"},
{"Ť", "macro(compose v T)"},
{"ť", "macro(compose v t)"},
{"Ŧ", "macro(compose T minus)"},
{"ŧ", "macro(compose t minus)"},
{"Ū", "macro(compose U minus)"},
{"ū", "macro(compose u minus)"},
{"Ŭ", "macro(compose b U)"},
{"ŭ", "macro(compose b u)"},
{"Ů", "macro(compose o U)"},
{"ů", "macro(compose o u)"},
{"Ű", "macro(compose equal U)"},
{"ű", "macro(compose equal u)"},
{"Ų", "macro(compose U comma)"},
{"ų", "macro(compose u comma)"},
{"Ŵ", "macro(compose W ^)"},
{"ŵ", "macro(compose w ^)"},
{"Ŷ", "macro(compose Y ^)"},
{"ŷ", "macro(compose y ^)"},
{"Ÿ", "macro(compose Y \")"},
{"Ź", "macro(compose Z ')"},
{"ź", "macro(compose z ')"},
{"Ž", "macro(compose v Z)"},
{"ž", "macro(compose v z)"},
{"ƀ", "macro(compose slash b)"},
{"Ɨ", "macro(compose slash I)"},
{"Ƶ", "macro(compose slash Z)"},
{"ƶ", "macro(compose slash z)"},
{"Ǎ", "macro(compose v A)"},
{"ǎ", "macro(compose v a)"},
{"Ǐ", "macro(compose v I)"},
{"ǐ", "macro(compose v i)"},
{"Ǒ", "macro(compose v O)"},
{"ǒ", "macro(compose v o)"},
{"Ǔ", "macro(compose v U)"},
{"ǔ", "macro(compose v u)"},
{"Ǘ", "macro(compose ' \" U)"},
{"ǘ", "macro(compose ' \" u)"},
{"Ǚ", "macro(compose c \" U)"},
{"ǚ", "macro(compose c \" u)"},
{"Ǜ", "macro(compose grave \" U)"},
{"ǜ", "macro(compose grave \" u)"},
{"Ǥ", "macro(compose slash G)"},
{"ǥ", "macro(compose slash g)"},
{"Ǧ", "macro(compose v G)"},
{"ǧ", "macro(compose v g)"},
{"Ǩ", "macro(compose v K)"},
{"ǩ", "macro(compose v k)"},
{"Ǫ", "macro(compose O comma)"},
{"ǫ", "macro(compose o comma)"},
{"ǰ", "macro(compose v j)"},
{"Ǵ", "macro(compose ' G)"},
{"ǵ", "macro(compose ' g)"},
{"Ǹ", "macro(compose grave N)"},
{"ǹ", "macro(compose grave n)"},
{"Ǿ", "macro(compose ' slash O)"},
{"ǿ", "macro(compose ' slash o)"},
{"Ȟ", "macro(compose v H)"},
{"ȟ", "macro(compose v h)"},
{"ə", "macro(compose e e)"},
{"ɨ", "macro(compose slash i)"},
{"̈́", "macro(compose \" ')"},
{"΅", "macro(compose ' \" space)"},
{"", "macro(compose ! B)"},
{"", "macro(compose ! b)"},
{"", "macro(compose ! D)"},
{"", "macro(compose ! d)"},
{"", "macro(compose D comma)"},
{"", "macro(compose d comma)"},
{"", "macro(compose b comma E)"},
{"", "macro(compose b comma e)"},
{"", "macro(compose ! H)"},
{"", "macro(compose ! h)"},
{"", "macro(compose \" H)"},
{"", "macro(compose \" h)"},
{"", "macro(compose H comma)"},
{"", "macro(compose h comma)"},
{"", "macro(compose ' \" I)"},
{"", "macro(compose ' \" i)"},
{"", "macro(compose ' K)"},
{"", "macro(compose ' k)"},
{"", "macro(compose ! K)"},
{"", "macro(compose ! k)"},
{"", "macro(compose ! L)"},
{"", "macro(compose ! l)"},
{"", "macro(compose ' M)"},
{"ḿ", "macro(compose ' m)"},
{"", "macro(compose ! M)"},
{"", "macro(compose ! m)"},
{"", "macro(compose ! N)"},
{"", "macro(compose ! n)"},
{"", "macro(compose ' P)"},
{"", "macro(compose ' p)"},
{"", "macro(compose ! R)"},
{"", "macro(compose ! r)"},
{"", "macro(compose ! S)"},
{"", "macro(compose ! s)"},
{"", "macro(compose ! T)"},
{"", "macro(compose ! t)"},
{"", "macro(compose ! V)"},
{"ṿ", "macro(compose ! v)"},
{"", "macro(compose grave W)"},
{"", "macro(compose grave w)"},
{"", "macro(compose ' W)"},
{"", "macro(compose ' w)"},
{"", "macro(compose \" W)"},
{"", "macro(compose \" w)"},
{"", "macro(compose ! W)"},
{"", "macro(compose ! w)"},
{"", "macro(compose \" X)"},
{"", "macro(compose \" x)"},
{"", "macro(compose ^ Z)"},
{"", "macro(compose ^ z)"},
{"", "macro(compose ! Z)"},
{"", "macro(compose ! z)"},
{"", "macro(compose \" t)"},
{"", "macro(compose o w)"},
{"", "macro(compose o y)"},
{"", "macro(compose ! A)"},
{"", "macro(compose ! a)"},
{"", "macro(compose ? A)"},
{"", "macro(compose ? a)"},
{"", "macro(compose ' ^ A)"},
{"", "macro(compose ' ^ a)"},
{"", "macro(compose grave ^ A)"},
{"", "macro(compose grave ^ a)"},
{"", "macro(compose ? ^ A)"},
{"", "macro(compose ? ^ a)"},
{"", "macro(compose ^ ! A)"},
{"", "macro(compose ^ ! a)"},
{"", "macro(compose ' b A)"},
{"", "macro(compose ' b a)"},
{"", "macro(compose grave b A)"},
{"", "macro(compose grave b a)"},
{"", "macro(compose ? b A)"},
{"", "macro(compose ? b a)"},
{"", "macro(compose b ! A)"},
{"", "macro(compose b ! a)"},
{"", "macro(compose ! E)"},
{"", "macro(compose ! e)"},
{"", "macro(compose ? E)"},
{"", "macro(compose ? e)"},
{"", "macro(compose ' ^ E)"},
{"ế", "macro(compose ' ^ e)"},
{"", "macro(compose grave ^ E)"},
{"", "macro(compose grave ^ e)"},
{"", "macro(compose ? ^ E)"},
{"", "macro(compose ? ^ e)"},
{"", "macro(compose ^ ! E)"},
{"", "macro(compose ^ ! e)"},
{"", "macro(compose ? I)"},
{"", "macro(compose ? i)"},
{"", "macro(compose ! I)"},
{"", "macro(compose ! i)"},
{"", "macro(compose ! O)"},
{"", "macro(compose ! o)"},
{"", "macro(compose ? O)"},
{"", "macro(compose ? o)"},
{"", "macro(compose ' ^ O)"},
{"", "macro(compose ' ^ o)"},
{"", "macro(compose grave ^ O)"},
{"", "macro(compose grave ^ o)"},
{"", "macro(compose ? ^ O)"},
{"", "macro(compose ? ^ o)"},
{"", "macro(compose ^ ! O)"},
{"", "macro(compose ^ ! o)"},
{"", "macro(compose ! U)"},
{"", "macro(compose ! u)"},
{"", "macro(compose ? U)"},
{"", "macro(compose ? u)"},
{"", "macro(compose grave Y)"},
{"", "macro(compose grave y)"},
{"", "macro(compose ! Y)"},
{"", "macro(compose ! y)"},
{"", "macro(compose ? Y)"},
{"", "macro(compose ? y)"},
{"", "macro(compose ^ 0)"},
{"", "macro(compose ^ 4)"},
{"", "macro(compose ^ 5)"},
{"", "macro(compose ^ 6)"},
{"", "macro(compose ^ 7)"},
{"", "macro(compose ^ 8)"},
{"", "macro(compose ^ 9)"},
{"", "macro(compose ^ equal)"},
{"", "macro(compose s m)"},
{"", "macro(compose t m)"},
{"", "macro(compose 1 7)"},
{"", "macro(compose 1 9)"},
{"", "macro(compose 1 1 0)"},
{"", "macro(compose 1 3)"},
{"", "macro(compose 2 3)"},
{"", "macro(compose 1 5)"},
{"", "macro(compose 2 5)"},
{"", "macro(compose 3 5)"},
{"", "macro(compose 4 5)"},
{"", "macro(compose 1 6)"},
{"", "macro(compose 5 6)"},
{"", "macro(compose 1 8)"},
{"", "macro(compose 3 8)"},
{"", "macro(compose 5 8)"},
{"", "macro(compose 7 8)"},
{"", "macro(compose 0 3)"},
{"", "macro(compose equal slash)"},
{"", "macro(compose d i)"},
{"Ș", "macro(compose S semicolon)"},
{"ș", "macro(compose s semicolon)"},
{"Ț", "macro(compose T semicolon)"},
{"ț", "macro(compose t semicolon)"},
{"", "macro(compose slash v)"},
{"", "macro(compose 8 8)"},
{"", "macro(compose minus slash)"},
{"", "macro(compose minus backslash)"},
};
const size_t nr_aliases = sizeof(aliases)/sizeof(aliases[0]);
#endif

@ -14,6 +14,7 @@
#include "keys.h"
#include "error.h"
#include "config.h"
#include "aliases.h"
#define MAX_ARGS 5
@ -556,7 +557,7 @@ int create_layer(struct layer *layer, const char *desc, const struct layer_table
* Modifies the input string. Layers names within the descriptor
* are resolved using the provided layer table.
*/
int parse_descriptor(char *descstr,
int parse_descriptor(const char *descstr,
struct descriptor *d,
struct layer_table *lt)
{
@ -673,6 +674,12 @@ int parse_descriptor(char *descstr,
lt->nr_macros++;
}
} else {
size_t i;
for (i = 0; i < nr_aliases; i++)
if (!strcmp(aliases[i].name, descstr)) {
return parse_descriptor(aliases[i].def, d, lt);
}
err("invalid key or action");
return -1;
}

@ -50,7 +50,7 @@ struct descriptor {
* Potentially modifying the input string in the process.
*/
int parse_descriptor(char *s,
int parse_descriptor(const char *descstr,
struct descriptor *d,
struct layer_table *lt);

@ -245,6 +245,11 @@ static int loop(int monitor_mode)
} else {
init_devices(devices, 1);
ipcfd = ipc_create_server(socket_file);
if (ipcfd < 0) {
fprintf(stderr, "ERROR: failed to create %s (another instance running?)\n", socket_file);
exit(-1);
}
printf("socket: %s\n", socket_file);
}

@ -19,7 +19,7 @@
#define HID_RIGHTSUPER 0x80
#define HID_SUPER 0x8
static const uint8_t hid_table[MAX_KEYS] = {
static const uint8_t hid_table[256] = {
[KEYD_ESC] = 0x29,
[KEYD_1] = 0x1e,
[KEYD_2] = 0x1f,

@ -13,7 +13,7 @@ HID reports.
git clone https://github.com/rvaiya/keyd
cd keyd
make vkbd-usb-gadget && sudo make install-usb-gadget
make VKBD=usb-gadget && sudo make install VKBD=usb-gadget
sudo systemctl enable usb-gadget && sudo systemctl start usb-gadget
sudo systemctl enable keyd && sudo systemctl start keyd

Loading…
Cancel
Save