rvaiya / keyd

A key remapping daemon for linux.
MIT License
2.88k stars 170 forks source link

Increase max layer or make configurable #458

Open tkna91 opened 1 year ago

tkna91 commented 1 year ago

When I do sudo keyd with the following settings, I get ERROR: max layers (32) exceeded.

/etc/keyd/test.conf

[ids]
*

[layer01]
[layer02]
[layer03]
[layer04]
[layer05]
[layer06]
[layer07]
[layer08]
[layer09]
[layer10]
[layer11]
[layer12]
[layer13]
[layer14]
[layer15]
[layer16]
[layer17]
[layer18]
[layer19]
[layer20]
[layer21]
[layer22]
[layer23]
[layer24]
[layer25]
[layer26]
[layer27]
#[layer28]
#[layer29]
#[layer30]

If [layer27] is commented out, it will not be displayed.

Can we Increase max layers?

nsbgn commented 1 year ago

Age-old question: what's your use case? ;)

tkna91 commented 1 year ago

I have been doing the following, but have reached our limits.

Of course, I could organize and make less important layers unused, etc., but I thought it would be nice to have more upper limits.

tkna91 commented 1 year ago

If it is not a problem by design, I would suggest eliminating the upper limit and using the amount of memory as the upper limit. The flexibility of keyd's key remapping is the highest I have seen so far, and I think one of the charms of keyd is that it is structured in such a way that it is possible to increase the number of layers exponentially.

If eliminating the upper limit would cause design problems, I would be happy to see it increased.

rvaiya commented 1 year ago

Everything in keyd is statically allocated for reasons of efficiency (and portability). The limits set are intended to accommodate most real world use cases. If users find themselves bumping up against them, then they either need to modify their config (common), or the limits need to be re-evaluated. I am not opposed to increasing the layer limit, but I would need to see a compelling use case first.

Can you post your config?

tkna91 commented 1 year ago

My setup was too confusing to show to anyone but myself, so I reorganized it a bit and reduced the number of layers. However, I am almost at the upper limit.

ac1.conf

[ids]
# Translated shiftet 2 keyboard
0001:0001
k:06cb:cdb6

[aliases]
leftmeta         = lcontrol
leftcontrol      = l3
leftalt          = l2
muhenkan         = l1
henkan           = r1
rightalt         = r2
rightcontrol     = r3

include common

hhkb.conf

[ids]
#HHKB-Hybrid_1 Keyboard
k:04fe:0022
#PFU Limited  HHKB Professional JP
k:04fe:000d

[aliases]
leftcontrol      = lcontrol
`                = l4
leftmeta         = l3
leftalt          = l2
muhenkan         = l1
henkan           = r1
katakanahiragana = r2
rightalt         = r3

include common

hp1.conf

[ids]
k:04f3:0755

[aliases]
capslock         = lcontrol
leftmeta         = l3
leftalt          = l2
muhenkan         = l1
henkan           = r1
katakanahiragana = r2
rightalt         = r3

include common

kensington-expert-mouse.conf

[ids]
#Expert Wireless TB Mouse (Wireless)
047d:8018
047d:8019
#Kensington Expert Mouse (Wired)
047d:1020

[aliases]

include common

pcsensor_footswitch.conf

[ids]
k:1a86:e026

[main]

f21+f23 = clear()
f22+f23 = toggle(FL1)
f21 = overload(F21, back)
f22 = overload(F22, forward)
f23 = play

[F21]
[F22]

[FL1]
f21+f22 = clear()
f22+f23 = toggle(FL2)
f21 = overload(FL2, down)
f22 = overload(FL1, up)
f23 = enter

[FL2]
f21+f22 = toggle(FL1)
f22+f23 = toggle(FL3)
f21 = overload(FL3, left)
f22 = overload(FL2, right)
f23 = C-enter

[FL3]
f21+f22 = toggle(FL2)
f22+f23 = toggle(FL4)
f21 = overload(FL4, 1)
f22 = overload(FL3, 2)
f23 = 3

[FL4]
f21+f22 = toggle(FL3)

common

[global]
overload_tap_timeout = 500
oneshot_timeout = 10000
chord_hold_timeout = 50

[main]
esc        = overload(NORMAL, esc)
tab        = timeout(overload(TAB,      tab), 500, tab)
lcontrol  = overload(control, esc)
leftshift  = overload(shift, henkan)
l4         = overload(L4, toggle(L4))
l3         = leftmeta
l2         = timeout(overload(alt, pageup), 500, pageup)
l1         = timeout(overload(L1,  pagedown), 500, pagedown)
space      = overload(meta, space)
r1         = timeout(overload(alt,   pageup), 500, pageup)
r2         = timeout(overload(shift, pagedown), 500, pagedown)
r3         = timeout(overload(control, M-rightbrace), 500, esc)
rightshift = rightshift
middlemouse  = overload(MIDDLEMOUSE, middlemouse)
mouse1     = overload(MOUSE1, M-C-s) #sway: floating window
leftmouse+rightmouse = M-C-s
s+a = macro(C-l 10ms tab space right esc)
s+f = macro(rightmouse 20ms up up up up up up up up up up up enter esc)
s+g = S-esc
;+j = S-esc

[MIDDLEMOUSE:M]
rightmouse = M-rightmouse #sway: resize window
[MOUSE1:M]
leftmouse = M-leftmouse #sway: drag window

[L1]
z = overload(NUM,  toggle(NUM))
c = overload(C1, oneshot(C1))
x = overload(X1, oneshot(X1))
esc = clear()
backspace = toggle(NORMAL),
leftshift = overload(shift, leftshift)
leftalt = overload(alt, leftalt)
l1 = overload(L1, pagedown)
space = overload(meta, rightmeta)
r1 = overload(alt, leftalt)
f = right
d = delete
a = home
v = enter
e = end
r = rightmouse
q = up
w = down
g = backspace
b = left
t = middlemouse
h = left
j = down
k = up
l = right
p = C-pageup
n = C-pagedown
u = back
i = play
o = forward
m = enter
1 = f1
2 = f2
3 = f3
4 = f4
5 = f5
6 = f6
7 = f7
8 = f8
9 = f9
0 = f10
minus = f11
equal = f12
yen = f13
; = backspace
' = command(echo -n $(date +%Y%m%d-%H%M%S) | keyd input -t 14000)
[ = command(echo -n $(date +%Y%m%d) | keyd input -t 14000)
, = insert
. = pause
/ = scrolllock
ro = print
] = previoussong
\ = nextsong
r2 = overload(shift, leftshift)
r3 = overload(control, leftcontrol)
lcontrol = overload(control, macro(esc esc))
s = overload(CLICK, leftmouse)
[L1+control]
u = previoussong
o = nextsong
; = command(pkill warpd)
w = volumeup
q = volumedown
[CLICK]
a = macro(leftmouse 50ms leftmouse S-C-home delete esc)
e = macro(leftmouse 50ms leftmouse S-C-end delete esc)
d = macro(leftmouse 50ms leftmouse)
f = macro(leftmouse 50ms leftmouse 50ms leftmouse)
q = macro(M-rightbrace)
v = macro(C-c M-e 200ms S-C-v enter 100ms S-home)
[L1+meta]
esc = M-C-esc

[C1]
lcontrol = overload(control, clear())
1 = 6
2 = 7
3 = 8
4 = 9
5 = 0
z = C-,
leftshift = layer(shift)
l4 = henkan
l3 = overload(meta, leftmeta)
l2 = overload(alt, leftalt)
space = rightmeta
r1 = overload(alt, rightalt)
r2 = overload(shift, rightshift)
r3 = overload(control, rightcontrol)
j = volumedown
k = volumeup
h = command(light -A 0.5)
l = command(light -U 0.5)
[ = command(echo -n $(date +%Y%m%d) | keyd input -t 5000)
leftmouse = macro(leftmouse 50ms leftmouse)
f = macro(print 100ms f)
s = macro(print 100ms s)
a = macro(print 100ms a)
g = macro(print 100ms g)
r = macro(print 100ms r)
e = macro(print 100ms e)
t = macro(print 100ms t)
v = macro(M-c 500ms v)
m = macro(M-c 500ms m)
w = oneshot(SWAYWORK)
d = macro(print 100ms d)
i = command(echo -n "for i in \$" | keyd input ; keyd do "S-8 S-9 200ms" ; echo -n " ; do echo \$i ; done" | keyd input ; keyd do "200ms C-a 50ms A-f 50ms A-f 50ms A-f 50ms right 50ms right")
[C1+shift]
f = macro(print 200ms S-f)
s = macro(print 200ms S-s)
a = macro(print 200ms S-a)
r = macro(print 100ms S-r)
e = macro(print 100ms S-e)
t = macro(print 100ms S-t)

[X1]
lcontrol = overload(control, clear())
r = oneshot(RESTART)
k = oneshot(KILL)
s = oneshot(SYSTEM)
1 = C-A-f1
2 = C-A-f2
3 = C-A-f3
4 = C-A-f4
5 = C-A-f5
6 = C-A-f6
leftmouse = macro(leftmouse 50ms leftmouse 50ms leftmouse)
b = toggle(BACKUP)

[NUM]
esc = clear()
lcontrol = overload(control, clear())
m  = kp0
,  = macro(kp0 5ms kp0)
.  = kpdot
/  = kpenter
ro = scrolllock
j  = kp1
k  = kp2
l  = kp3
;  = kpplus
'  = kpasterisk
u  = kp4
i  = kp5
o  = kp6
p  = kpminus
[  = kpslash
7  = kp7
8  = kp8
9  = kp9
0  = kpequal
minus = insert
z = clearm(C-comma)
r1 = rightalt
space = rightmeta
r2 = rightshift
r3 = rightcontrol

[L4]
esc = clear()
lcontrol = overload(control, clear())
1 = kp1
2 = kp2
3 = kp3
4 = kp4
5 = kp5
6 = kp6
7 = kp7
8 = kp8
9 = kp9
0 = kp0
, = kpcomma
. = kpdot
- = kpminus
/ = kpslash
[L4+shift]
' = kpasterisk
- = kpequal
8 = kpleftparen
; = kpplus
9 = kprightparen

[SWAYWORK]
2 = macro(C-S-M-5 555ms M-s 222ms M-S-2 555ms M-g 222ms M-S-3 555ms M-d 555ms M-S-5 555ms)

[RESTART]
esc = clear()
lcontrol = overload(control, clear())
k = command(systemctl restart keyd.service)
i = command(systemctl restart kiwix-serve.service)
w = command(systemctl restart iwd.service)
b = command(systemctl restart bluetooth.service)
n = command(systemctl restart nftables.service)
t = command(systemctl restart tmux@a.service)
d = command(systemctl daemon-reload)

[KILL]
esc = clear()
lcontrol = overload(control, clear())
w = command(pkill warpd)

[SYSTEM]
esc = clear()
lcontrol = overload(control, clear())
u = command(systemctl suspend)
h = command(systemctl hybrid-sleep)
b = command(systemctl hibernate)
r = command(systemctl reboot)
p = command(systemctl poweroff)
x = command(FILE=/home/a/tmp/$(date +%Y%m%d-%H%M%S)_journalctl.log ; journalctl -p4 > $FILE ; pkill Xwayland)
w = command(FILE=/home/a/tmp/$(date +%Y%m%d-%H%M%S)_journalctl.log ; journalctl -p4 > $FILE ; pkill sway-run)

[NORMAL]
esc = clear()
lcontrol = overload(control, clear())
space      = space
leftmeta   = leftmeta
tab        = tab
leftshift  = leftshift
leftalt    = leftalt
rightshift = rightshift
enter      = enter
lcontrol   = leftcontrol
l1 = muhenkan
r1 = henkan
r2 = katakanahiragana
rightcontrol = rightcontrol
capslock = capslock

[BACKUP]
a = command(cp -pR /var/tmp/audacity-a /var/tmp/audacity-a_$(date +%Y%m%d-%H%M%S))

[TAB]
q = scrolllock
w = minus
rvaiya commented 1 year ago

@tkna91 That is indeed a lot of layers :P. But by my count, you still have another 11 to play with in your largest example. Have you run up against this limit in practice?

tkna91 commented 1 year ago

Yes, before I organized my settings, I was commenting out or deleting things that were used infrequently and making do.

tkna91 commented 4 months ago

In the music production software called REAPER, you can assign 128 values * 16 channels = 2048 operations per MIDI controller to any action (like a command) using the Control Change protocol of MIDI. https://anotherproducer.com/online-tools-for-musicians/midi-cc-list/

Screencast:

https://github.com/rvaiya/keyd/assets/102382754/2036e7ba-073c-4bec-8c39-d89c868b31e9

I would like to control this with the keyboard using keyd layers and the following commands, etc., but unfortunately the maximum number of layers is currently not enough.

sendmidi dev "Midi Through Port-0" ch 16 cc 127 0

Is it possible to increase the maximum number of layers used, for example, with something like the global option below?

[global]
max_layers = 128

I may have asked this question sometime ago? Sorry if fixed values are required by design.

450 #634

tkna91 commented 4 months ago

By rewriting the symbolic link to /etc/keyd/common, I was able to set up a pseudo-setup of what I wanted to do! Glad I did. @rvaiya Thanks to the command() you created, I was able to make it happen. Isn't this a pretty good idea?

[TAB]
esc = command(ln -sf /etc/keyd/{00-common-main,common}  ; keyd reload)
1 = command(ln -sf /etc/keyd/{50-common-midi-01,common} ; keyd reload)
# ...
y = command(ln -sf /etc/keyd/{50-common-midi-16,common} ; keyd reload)
enter = command(/root/.local/bin/keyd-deploy.sh)

Screencast:

https://github.com/rvaiya/keyd/assets/102382754/ca3cb2cc-0f39-47a7-b254-39f04e649d65

# /etc/keyd/50-common-midi-01

[global]
overload_tap_timeout = 500
oneshot_timeout = 10000
chord_hold_timeout = 50

[main]
esc = command(ln -sf /etc/keyd/{00-common-main,common}  ; keyd reload)
tab        = timeout(overload(TAB, tab), 500, tab)
lcontrol   = overload(control, esc)
leftshift  = overload(shift, henkan)
l4         = overload(SCA, toggle(SCA))
l3         = overload(HYPER, toggle(HYPER))
l2         = overload(alt, pageup)
l1         = timeout(overload(L1,  pagedown), 500, pagedown)
space      = overload(meta, space)
r1         = timeout(overload(alt,   pageup), 500, pageup)
r2         = timeout(overload(shift, pagedown), 500, pagedown)
r3         = overload(control, toggle(Z1))
r4         = overload(SCA, toggle(SCA))
rightshift  = overload(shift, toggle(Z1))
leftmouse+rightmouse = M-C-s
mouse1 = M-leftmouse

lcontrol = overload(control, command(ln -sf /etc/keyd/{00-common-main,common}  ; keyd reload))
1  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc   3 0)
2  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc   9 0)
3  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  14 0)
4  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  15 0)
5  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  20 0)
6  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  21 0)
7  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  22 0)
8  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  23 0)
9  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  24 0)
0  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  25 0)
q  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  26 0)
w  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  27 0)
e  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  28 0)
r  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  29 0)
t  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  30 0)
y  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  31 0)
u  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  85 0)
i  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  86 0)
o  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  87 0)
p  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  89 0)
a  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  90 0)
s  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc  90 0)
d  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 102 0)
f  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 103 0)
g  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 104 0)
h  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 105 0)
j  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 106 0)
k  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 107 0)
l  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 108 0)
;  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 109 0)
z  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 110 0)
x  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 111 0)
c  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 112 0)
v  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 113 0)
b  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 114 0)
n  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 115 0)
m  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 116 0)
,  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 117 0)
.  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 118 0)
/  = command(sudo -u a sendmidi dev "Midi Through Port-0" ch 01 cc 119 0)

[TAB]
esc = command(ln -sf /etc/keyd/{00-common-main,common}  ; keyd reload)
1 = command(ln -sf /etc/keyd/{50-common-midi-01,common} ; keyd reload)
2 = command(ln -sf /etc/keyd/{50-common-midi-02,common} ; keyd reload)
3 = command(ln -sf /etc/keyd/{50-common-midi-03,common} ; keyd reload)
4 = command(ln -sf /etc/keyd/{50-common-midi-04,common} ; keyd reload)
5 = command(ln -sf /etc/keyd/{50-common-midi-05,common} ; keyd reload)
6 = command(ln -sf /etc/keyd/{50-common-midi-06,common} ; keyd reload)
7 = command(ln -sf /etc/keyd/{50-common-midi-07,common} ; keyd reload)
8 = command(ln -sf /etc/keyd/{50-common-midi-08,common} ; keyd reload)
9 = command(ln -sf /etc/keyd/{50-common-midi-09,common} ; keyd reload)
0 = command(ln -sf /etc/keyd/{50-common-midi-10,common} ; keyd reload)
q = command(ln -sf /etc/keyd/{50-common-midi-11,common} ; keyd reload)
w = command(ln -sf /etc/keyd/{50-common-midi-12,common} ; keyd reload)
e = command(ln -sf /etc/keyd/{50-common-midi-13,common} ; keyd reload)
r = command(ln -sf /etc/keyd/{50-common-midi-14,common} ; keyd reload)
t = command(ln -sf /etc/keyd/{50-common-midi-15,common} ; keyd reload)
y = command(ln -sf /etc/keyd/{50-common-midi-16,common} ; keyd reload)
enter = command(/root/.local/bin/keyd-deploy.sh)
$ ls -l /etc/keyd
total 208
-rw-r--r-- 1 root root 9935 Jun 19 23:28 00-common-main
-rw-r--r-- 1 root root  235 Jun 18 18:40 10-global
-rw-r--r-- 1 root root 3859 Jun 19 22:36 11-main
-rw-r--r-- 1 root root 1263 Jun 19 22:31 12-tab
-rw-r--r-- 1 root root 2533 Jun 18 18:26 20-base-00
-rw-r--r-- 1 root root 3079 Jun 19 15:39 21-base-01
-rw-r--r-- 1 root root 2668 Jun 19 15:39 22-base-02
-rw-r--r-- 1 root root 7711 Jun 18 18:34 23-base-03
-rw-r--r-- 1 root root 3226 Jun 19 23:26 40-midi-base
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-01
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-02
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-03
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-04
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-05
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-06
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-07
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-08
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-09
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-10
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-11
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-12
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-13
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-14
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-15
-rw-r--r-- 1 root root 5119 Jun 19 23:28 50-common-midi-16
-rw-r--r-- 1 root root  304 Nov 18  2023 ac1.conf##hostname.ac1
lrwxrwxrwx 1 root keyd   24 Jun 19 23:28 common -> /etc/keyd/00-common-main
-rw-r--r-- 1 root root  313 Jan  5 00:10 fu1.conf##hostname.fu1
-rw-r--r-- 1 root root  435 Nov 18  2023 hhkb.conf
-rw-r--r-- 1 root root  269 Nov 18  2023 hp1.conf##hostname.hp1
-rw-r--r-- 1 root root  193 Feb  1 17:21 mouse.conf
-rw-r--r-- 1 root root  507 May  9  2023 pcsensor_footswitch.conf
-rw-r--r-- 1 root root  924 Mar  3 01:30 test.conf.bak
$

/root/.local/bin/keyd-deploy.sh

#!/bin/bash
set -x

# main
cat /etc/keyd/{1*,2*} | grep -v "^#" > /etc/keyd/00-common-main

# midi ch1-16
for i in $(seq -w 01 16) ; do
    file=/etc/keyd/50-common-midi-$i
    cat /etc/keyd/{10,11}* | grep -v "^#" > $file
    cat /etc/keyd/40-midi-base | grep -v "^#" |
        sed -e "s@ ch 0 @ ch $i @g" >> $file
    cat /etc/keyd/12* | grep -v "^#" >> $file
done

ln -sf /etc/keyd/{00-common-main,common}
keyd reload
# /etc/keyd/hhkb.conf
[ids]
#HHKB-Hybrid_1 Keyboard
k:04fe:0022
#PFU Limited  HHKB Professional JP
k:04fe:000d

[aliases]
leftcontrol      = lcontrol
`                = l4
leftmeta         = l3
leftalt          = l2
muhenkan         = l1
henkan           = r1
katakanahiragana = r2
rightalt         = r3

include common