Plan 9: Key Visualizer
Simple key visualizer for capturing keystrokes during a screencast using kbdfs, awk and statusmsg.
Note: You need a Truetype font for arbitrary large display (/n/ttf/mine/32/font in the example). Also, ensure truetypefs is running if you do use Truetype font.
#!/bin/rc
fn notify {
scr=`{awk '{print $4, $5}' /dev/screen}
w=200
h=60
ws=$scr(1)
hs=$scr(2)
minx=`{echo $ws - $w | bc}
warg=`{echo -w $minx,0,$ws,$h}
font=/n/ttf/mine/32/font aux/statusmsg $warg $1
}
{
tee /dev/kbdtap |
tr '\000' '\034' |
awk -v 'RS=\034' '
BEGIN {
esc = sprintf("%c", 033)
tab = sprintf("%c", 011)
bksp = sprintf("%c", 010)
del = sprintf("%c", 0177)
enter = sprintf("%c", 012)
shift = "\357\200\226"
ctl = "\357\200\227"
alt = "\357\200\225"
altgr = "\357\241\247"
mod4 = "\357\241\250"
home = "\357\200\215"
pgup = "\357\200\217"
pgdn = "\357\200\223"
end = "\357\200\230"
up = "\357\200\216"
left = "\357\200\221"
right = "\357\200\222"
down = "\357\200\200"
}
$0 ~ /^k/ {
s = substr($0, 2)
gsub(" ", "Spc ", s)
gsub(shift, "Shift ", s)
gsub(ctl, "Ctrl ", s)
gsub(alt, "Alt ", s)
gsub(altgr, "AltGr ", s)
gsub(mod4, "Win ", s)
gsub(home, "Home ", s)
gsub(end, "End ", s)
gsub(pgup, "PgUp ", s)
gsub(pgdn, "PgDn ", s)
gsub(up, "Up ", s)
gsub(down, "Down ", s)
gsub(left, "Left ", s)
gsub(right, "Right ", s)
gsub(esc, "Esc ", s)
gsub(tab, "Tab ", s)
gsub(bksp, "Bksp ", s)
gsub(del, "Del ", s)
gsub(enter, "Enter ", s)
print s
}' |
# font=/n/ttf/mine/32/font aux/statusmsg -k -w 0,0,300,60
notify
}
fn notify {
scr=`{awk '{print $4, $5}' /dev/screen}
w=200
h=60
ws=$scr(1)
hs=$scr(2)
minx=`{echo $ws - $w | bc}
warg=`{echo -w $minx,0,$ws,$h}
font=/n/ttf/mine/32/font aux/statusmsg $warg $1
}
{
tee /dev/kbdtap |
tr '\000' '\034' |
awk -v 'RS=\034' '
BEGIN {
esc = sprintf("%c", 033)
tab = sprintf("%c", 011)
bksp = sprintf("%c", 010)
del = sprintf("%c", 0177)
enter = sprintf("%c", 012)
shift = "\357\200\226"
ctl = "\357\200\227"
alt = "\357\200\225"
altgr = "\357\241\247"
mod4 = "\357\241\250"
home = "\357\200\215"
pgup = "\357\200\217"
pgdn = "\357\200\223"
end = "\357\200\230"
up = "\357\200\216"
left = "\357\200\221"
right = "\357\200\222"
down = "\357\200\200"
}
$0 ~ /^k/ {
s = substr($0, 2)
gsub(" ", "Spc ", s)
gsub(shift, "Shift ", s)
gsub(ctl, "Ctrl ", s)
gsub(alt, "Alt ", s)
gsub(altgr, "AltGr ", s)
gsub(mod4, "Win ", s)
gsub(home, "Home ", s)
gsub(end, "End ", s)
gsub(pgup, "PgUp ", s)
gsub(pgdn, "PgDn ", s)
gsub(up, "Up ", s)
gsub(down, "Down ", s)
gsub(left, "Left ", s)
gsub(right, "Right ", s)
gsub(esc, "Esc ", s)
gsub(tab, "Tab ", s)
gsub(bksp, "Bksp ", s)
gsub(del, "Del ", s)
gsub(enter, "Enter ", s)
print s
}' |
# font=/n/ttf/mine/32/font aux/statusmsg -k -w 0,0,300,60
notify
}
Lessons Learnt
- `split {command} is a second form of command execution where you supply your own split string instead of $ifs.
- Use octal values (\1) or hex values (\x1) for control characters while setting environment variable e.g. ifs=`""{echo -n xy | tr 'xy' '\12'}
- Once you set an environment variable, you must delete the file /env/var. Unsetting via setting blank doesn't work.
- >{command} lets a program that only knows how to write to a file name, like tee, feed another command without a temp file. e.g. tee >{key.sh}. <{command} is the mirror: the command's stdout goes to a pipe, and the word becomes a file you can read, e.g. diff <{a} <{b}.
References
- Man pages kbdfs
Comments
Post a Comment