1
0
Fork 0

initial commit

This commit is contained in:
ston1th 2019-02-11 23:58:53 +01:00
commit dc421f035e
8 changed files with 989 additions and 0 deletions

42
generate.sh Executable file
View file

@ -0,0 +1,42 @@
#!/bin/sh
dir="pkg/lang"
parse_keys() {
local file="${1%.*}"
local file="${file#*/}"
local file="${dir}/${file}.go"
cat <<EOF>${file}
package lang
var K = map[string]byte{
"": 0,
EOF
grep -v -E "^$|^/" $1 | sed 's/=//g' | awk '{print "\""$1"\": "$2","}' >>${file}
echo "}" >>${file}
gofmt -w ${file}
}
parse_lang() {
local lang="${1%.*}"
local lang="${lang#*/}"
local file="${dir}/${lang}.go"
cat <<EOF>${file}
package lang
func init() {
l := make(Lang)
EOF
grep -E "^A|^I|^U" $1 | sed 's/= \|,//g' | awk '{print "l[\""$1"\"] = Key{K[\""$2"\"],K[\""$3"\"]}"}' >>${file}
echo "Langs[\"${lang}\"] = l" >>${file}
echo "}" >>${file}
gofmt -w ${file}
}
for f in $(ls keyboard/*.properties); do
parse_keys "${f}"
done
for f in $(ls language/*.properties); do
parse_lang "${f}"
done

View file

@ -0,0 +1,150 @@
//default keys
MODIFIERKEY_CTRL = 0x01
MODIFIERKEY_SHIFT = 0x02
MODIFIERKEY_ALT = 0x04
MODIFIERKEY_GUI = 0x08
MODIFIERKEY_LEFT_CTRL = 0x01
MODIFIERKEY_LEFT_SHIFT = 0x02
MODIFIERKEY_LEFT_ALT = 0x04
MODIFIERKEY_LEFT_GUI = 0x08
MODIFIERKEY_RIGHT_CTRL = 0x10
MODIFIERKEY_RIGHT_SHIFT= 0x20
MODIFIERKEY_RIGHT_ALT = 0x40
MODIFIERKEY_RIGHT_GUI = 0x80
KEY_MEDIA_VOLUME_INC = 0x80
KEY_MEDIA_VOLUME_DEC = 0x81
KEY_MEDIA_MUTE = 0x7F
KEY_MEDIA_PLAY_PAUSE = 0x08
KEY_MEDIA_NEXT_TRACK = 0x10
KEY_MEDIA_PREV_TRACK = 0x20
//KEY_MEDIA_STOP = 0x40
//KEY_MEDIA_EJECT = 0x80
KEY_A = 4
KEY_B = 5
KEY_C = 6
KEY_D = 7
KEY_E = 8
KEY_F = 9
KEY_G = 10
KEY_H = 11
KEY_I = 12
KEY_J = 13
KEY_K = 14
KEY_L = 15
KEY_M = 16
KEY_N = 17
KEY_O = 18
KEY_P = 19
KEY_Q = 20
KEY_R = 21
KEY_S = 22
KEY_T = 23
KEY_U = 24
KEY_V = 25
KEY_W = 26
KEY_X = 27
KEY_Y = 28
KEY_Z = 29
KEY_1 = 30
KEY_2 = 31
KEY_3 = 32
KEY_4 = 33
KEY_5 = 34
KEY_6 = 35
KEY_7 = 36
KEY_8 = 37
KEY_9 = 38
KEY_0 = 39
KEY_ENTER = 40
KEY_ESC = 41
KEY_BACKSPACE = 42
KEY_TAB = 43
KEY_SPACE = 44
KEY_MINUS = 45
KEY_EQUAL = 46
KEY_LEFT_BRACE = 47
KEY_RIGHT_BRACE = 48
KEY_BACKSLASH = 49
KEY_NON_US_NUM = 50
KEY_SEMICOLON = 51
KEY_QUOTE = 52
KEY_TILDE = 53
KEY_COMMA = 54
KEY_PERIOD = 55
KEY_SLASH = 56
KEY_CAPS_LOCK = 57
KEY_F1 = 58
KEY_F2 = 59
KEY_F3 = 60
KEY_F4 = 61
KEY_F5 = 62
KEY_F6 = 63
KEY_F7 = 64
KEY_F8 = 65
KEY_F9 = 66
KEY_F10 = 67
KEY_F11 = 68
KEY_F12 = 69
KEY_PRINTSCREEN = 70
KEY_SCROLL_LOCK = 71
KEY_PAUSE = 72
KEY_INSERT = 73
KEY_HOME = 74
KEY_PAGEUP = 75
KEY_DELETE = 76
KEY_END = 77
KEY_PAGEDOWN = 78
KEY_RIGHT = 79
KEY_LEFT = 80
KEY_DOWN = 81
KEY_UP = 82
KEY_NUM_LOCK = 83
KEYPAD_SLASH = 84
KEYPAD_ASTERIX = 85
KEYPAD_MINUS = 86
KEYPAD_PLUS = 87
KEYPAD_ENTER = 88
KEYPAD_EQUALS = 103
KEYPAD_1 = 89
KEYPAD_2 = 90
KEYPAD_3 = 91
KEYPAD_4 = 92
KEYPAD_5 = 93
KEYPAD_6 = 94
KEYPAD_7 = 95
KEYPAD_8 = 96
KEYPAD_9 = 97
KEYPAD_0 = 98
KEYPAD_PERIOD = 99
KEY_APP = 0x65
KEY_POWER = 0x66
KEY_EXE = 0x74
KEY_HELP = 0x75
KEY_MENU = 0x76
KEY_SELECT = 0x77
KEY_STOP = 0x78
KEY_AGAIN = 0x79
KEY_UNDO = 0x7A
KEY_CUT = 0x7B
KEY_COPY = 0x7C
KEY_PASTE = 0x7D
KEY_FIND = 0x7E
KEY_SYSTEM_POWER = 0x81
KEY_SYSTEM_SLEEP = 0x82
KEY_SYSTEM_WAKE = 0x83
KEYPAD_PIPE = 0xC9
KEY_LEFT_CTRL = 0xE0
KEY_LEFT_SHIFT = 0xE1
KEY_LEFT_ALT = 0xE2
KEY_LEFT_GUI = 0xE3
KEY_COMMAND = 0xE3
KEY_RIGHT_CTRL = 0xE4
KEY_RIGHT_SHIFT= 0xE5
KEY_RIGHT_ALT = 0xE6
KEY_RIGHT_GUI = 0xE7

290
language/de.properties Normal file
View file

@ -0,0 +1,290 @@
//LAYOUT_GERMAN
//Credits go to webdirector for patch (02/17/2013)
KEY_NON_US_100 = 100
ASCII_20 = KEY_SPACE
// 32
ASCII_21 = KEY_1, MODIFIERKEY_SHIFT
// 33 !
ASCII_22 = KEY_2, MODIFIERKEY_SHIFT
// 34 "
ASCII_23 = KEY_BACKSLASH
// 35 # ??
ASCII_24 = KEY_4, MODIFIERKEY_SHIFT
// 36 $
ASCII_25 = KEY_5, MODIFIERKEY_SHIFT
// 37 %
ASCII_26 = KEY_6, MODIFIERKEY_SHIFT
// 38 &
ASCII_27 = KEY_BACKSLASH, MODIFIERKEY_SHIFT
// 39 '
ASCII_28 = KEY_8, MODIFIERKEY_SHIFT
// 40 (
ASCII_29 = KEY_9, MODIFIERKEY_SHIFT
// 41 )
ASCII_2A = KEY_RIGHT_BRACE, MODIFIERKEY_SHIFT
// 42 *
ASCII_2B = KEY_RIGHT_BRACE
// 43 +
ASCII_2C = KEY_COMMA
// 44 ,
ASCII_2D = KEY_SLASH
// 45 -
ASCII_2E = KEY_PERIOD
// 46 .
ASCII_2F = KEY_7, MODIFIERKEY_SHIFT
// 47 /
ASCII_30 = KEY_0
// 48 0
ASCII_31 = KEY_1
// 49 1
ASCII_32 = KEY_2
// 50 2
ASCII_33 = KEY_3
// 51 3
ASCII_34 = KEY_4
// 52 4
ASCII_35 = KEY_5
// 53 5
ASCII_36 = KEY_6
// 54 6
ASCII_37 = KEY_7
// 55 7
ASCII_38 = KEY_8
// 55 8
ASCII_39 = KEY_9
// 57 9
ASCII_3A = KEY_PERIOD, MODIFIERKEY_SHIFT
// 58 :
ASCII_3B = KEY_COMMA, MODIFIERKEY_SHIFT
// 59 ;
ASCII_3C = KEY_NON_US_100
// 60 <
ASCII_3D = KEY_0, MODIFIERKEY_SHIFT
// 61 =
ASCII_3E = KEY_NON_US_100, MODIFIERKEY_SHIFT
// 62 >
ASCII_3F = KEY_MINUS, MODIFIERKEY_SHIFT
// 63 ?
ASCII_40 = KEY_Q, MODIFIERKEY_RIGHT_ALT
// 64 @
ASCII_41 = KEY_A, MODIFIERKEY_SHIFT
// 65 A
ASCII_42 = KEY_B, MODIFIERKEY_SHIFT
// 66 B
ASCII_43 = KEY_C, MODIFIERKEY_SHIFT
// 67 C
ASCII_44 = KEY_D, MODIFIERKEY_SHIFT
// 68 D
ASCII_45 = KEY_E, MODIFIERKEY_SHIFT
// 69 E
ASCII_46 = KEY_F, MODIFIERKEY_SHIFT
// 70 F
ASCII_47 = KEY_G, MODIFIERKEY_SHIFT
// 71 G
ASCII_48 = KEY_H, MODIFIERKEY_SHIFT
// 72 H
ASCII_49 = KEY_I, MODIFIERKEY_SHIFT
// 73 I
ASCII_4A = KEY_J, MODIFIERKEY_SHIFT
// 74 J
ASCII_4B = KEY_K, MODIFIERKEY_SHIFT
// 75 K
ASCII_4C = KEY_L, MODIFIERKEY_SHIFT
// 76 L
ASCII_4D = KEY_M, MODIFIERKEY_SHIFT
// 77 M
ASCII_4E = KEY_N, MODIFIERKEY_SHIFT
// 78 N
ASCII_4F = KEY_O, MODIFIERKEY_SHIFT
// 79 O
ASCII_50 = KEY_P, MODIFIERKEY_SHIFT
// 80 P
ASCII_51 = KEY_Q, MODIFIERKEY_SHIFT
// 81 Q
ASCII_52 = KEY_R, MODIFIERKEY_SHIFT
// 82 R
ASCII_53 = KEY_S, MODIFIERKEY_SHIFT
// 83 S
ASCII_54 = KEY_T, MODIFIERKEY_SHIFT
// 84 T
ASCII_55 = KEY_U, MODIFIERKEY_SHIFT
// 85 U
ASCII_56 = KEY_V, MODIFIERKEY_SHIFT
// 86 V
ASCII_57 = KEY_W, MODIFIERKEY_SHIFT
// 87 W
ASCII_58 = KEY_X, MODIFIERKEY_SHIFT
// 88 X
ASCII_59 = KEY_Z, MODIFIERKEY_SHIFT
// 89 Y
ASCII_5A = KEY_Y, MODIFIERKEY_SHIFT
// 90 Z
ASCII_5B = KEY_8, MODIFIERKEY_RIGHT_ALT
// 91 [
ASCII_5C = KEY_MINUS, MODIFIERKEY_RIGHT_ALT
// 92
ASCII_5D = KEY_9, MODIFIERKEY_RIGHT_ALT
// 93 ]
ASCII_5E = KEY_TILDE
// 94 ^
ASCII_5F = KEY_SLASH, MODIFIERKEY_SHIFT
// 95 _
ASCII_60 = KEY_EQUAL, MODIFIERKEY_SHIFT
//GRAVE_ACCENT_BITS + KEY_SPACE
// 96 `
ASCII_61 = KEY_A
// 97 a
ASCII_62 = KEY_B
// 98 b
ASCII_63 = KEY_C
// 99 c
ASCII_64 = KEY_D
// 100 d
ASCII_65 = KEY_E
// 101 e
ASCII_66 = KEY_F
// 102 f
ASCII_67 = KEY_G
// 103 g
ASCII_68 = KEY_H
// 104 h
ASCII_69 = KEY_I
// 105 i
ASCII_6A = KEY_J
// 106 j
ASCII_6B = KEY_K
// 107 k
ASCII_6C = KEY_L
// 108 l
ASCII_6D = KEY_M
// 109 m
ASCII_6E = KEY_N
// 110 n
ASCII_6F = KEY_O
// 111 o
ASCII_70 = KEY_P
// 112 p
ASCII_71 = KEY_Q
// 113 q
ASCII_72 = KEY_R
// 114 r
ASCII_73 = KEY_S
// 115 s
ASCII_74 = KEY_T
// 116 t
ASCII_75 = KEY_U
// 117 u
ASCII_76 = KEY_V
// 118 v
ASCII_77 = KEY_W
// 119 w
ASCII_78 = KEY_X
// 120 x
ASCII_79 = KEY_Z
// 121 y
ASCII_7A = KEY_Y
// 122 z
ASCII_7B = KEY_7, MODIFIERKEY_RIGHT_ALT
// 123 {
ASCII_7C = KEY_NON_US_100, MODIFIERKEY_RIGHT_ALT
// 124 |
ASCII_7D = KEY_0, MODIFIERKEY_RIGHT_ALT
// 125 }
ASCII_7E = KEY_RIGHT_BRACE, MODIFIERKEY_RIGHT_ALT
// 126 ~
ASCII_7F = KEY_BACKSPACE
// 127
ISO_8859_1_A0 = KEY_SPACE
// 160 Nonbreakng Space
ISO_8859_1_A4 = KEY_E, MODIFIERKEY_RIGHT_ALT
// 164 ¤ Currency Sign
ISO_8859_1_A7 = KEY_3, MODIFIERKEY_SHIFT
// 167 § SECTION SIGN
ISO_8859_1_B0 = KEY_TILDE, MODIFIERKEY_SHIFT
// 176 ° DEGREE SIGN
ISO_8859_1_B2 = KEY_2, MODIFIERKEY_RIGHT_ALT
// 178 ² SUPERSCRIPT TWO
ISO_8859_1_B3 = KEY_3, MODIFIERKEY_RIGHT_ALT
// 179 ³ SUPERSCRIPT THREE
//ISO_8859_1_C0 = GRAVE_ACCENT_BITS + KEY_A, MODIFIERKEY_SHIFT
// 192 À A GRAVE
//ISO_8859_1_C1 = ACUTE_ACCENT_BITS + KEY_A, MODIFIERKEY_SHIFT
// 193 Á A ACUTE
//ISO_8859_1_C2 = CIRCUMFLEX_BITS = + KEY_A, MODIFIERKEY_SHIFT
// 194 Â A CIRCUMFLEX
ISO_8859_1_C4 = KEY_QUOTE, MODIFIERKEY_SHIFT
// 196 Ä A DIAERESIS
//ISO_8859_1_C8 = GRAVE_ACCENT_BITS + KEY_E, MODIFIERKEY_SHIFT
// 200 È E GRAVE
//ISO_8859_1_C9 = ACUTE_ACCENT_BITS + KEY_E, MODIFIERKEY_SHIFT
// 201 É E ACUTE
//ISO_8859_1_CA = CIRCUMFLEX_BITS + KEY_E, MODIFIERKEY_SHIFT
// 202 Ê E CIRCUMFLEX
//ISO_8859_1_CC = GRAVE_ACCENT_BITS + KEY_I, MODIFIERKEY_SHIFT
// 204 Ì I GRAVE
//ISO_8859_1_CD = ACUTE_ACCENT_BITS + KEY_I, MODIFIERKEY_SHIFT
// 205 Í I ACUTE
//ISO_8859_1_CE = CIRCUMFLEX_BITS + KEY_I, MODIFIERKEY_SHIFT
// 206 Î I CIRCUMFLEX
//ISO_8859_1_D2 = GRAVE_ACCENT_BITS + KEY_O, MODIFIERKEY_SHIFT
// 210 Ò O GRAVE
//ISO_8859_1_D3 = ACUTE_ACCENT_BITS + KEY_O, MODIFIERKEY_SHIFT
// 211 Ó O ACUTE
//ISO_8859_1_D4 = CIRCUMFLEX_BITS + KEY_O, MODIFIERKEY_SHIFT
// 212 Ô O CIRCUMFLEX
ISO_8859_1_D6 = KEY_SEMICOLON, MODIFIERKEY_SHIFT
// 214 Ö O DIAERESIS
//ISO_8859_1_D9 = GRAVE_ACCENT_BITS + KEY_U, MODIFIERKEY_SHIFT
// 217 Ù U GRAVE
//ISO_8859_1_DA = ACUTE_ACCENT_BITS + KEY_U, MODIFIERKEY_SHIFT
// 218 Ú U ACUTE
//ISO_8859_1_DB = CIRCUMFLEX_BITS + KEY_U, MODIFIERKEY_SHIFT
// 219 Û U CIRCUMFLEX
ISO_8859_1_DC = KEY_LEFT_BRACE, MODIFIERKEY_SHIFT
// 220 Ü U DIAERESIS
//ISO_8859_1_DD = ACUTE_ACCENT_BITS + KEY_Z, MODIFIERKEY_SHIFT
// 221 Ý Y ACUTE
ISO_8859_1_DF = KEY_MINUS
// 223 ß SHARP S
//ISO_8859_1_E0 = GRAVE_ACCENT_BITS + KEY_A
// 224 à a GRAVE
//ISO_8859_1_E1 = ACUTE_ACCENT_BITS + KEY_A
// 225 á a ACUTE
//ISO_8859_1_E2 = CIRCUMFLEX_BITS + KEY_A
// 226 â a CIRCUMFLEX
ISO_8859_1_E4 = KEY_QUOTE
// 228 ä a DIAERESIS
//ISO_8859_1_E8 = GRAVE_ACCENT_BITS + KEY_E
// 232 è e GRAVE
//ISO_8859_1_E9 = ACUTE_ACCENT_BITS + KEY_E
// 233 é e ACUTE
//ISO_8859_1_EA = CIRCUMFLEX_BITS + KEY_E
// 234 ê e CIRCUMFLEX
//ISO_8859_1_EC = GRAVE_ACCENT_BITS + KEY_I
// 236 ì i GRAVE
//ISO_8859_1_ED = ACUTE_ACCENT_BITS + KEY_I
// 237 í i ACUTE
//ISO_8859_1_EE = CIRCUMFLEX_BITS + KEY_I
// 238 î i CIRCUMFLEX
//ISO_8859_1_F2 = GRAVE_ACCENT_BITS + KEY_O
// 242 ò o GRAVE
//ISO_8859_1_F3 = ACUTE_ACCENT_BITS + KEY_O
// 243 ó o ACUTE
//ISO_8859_1_F4 = CIRCUMFLEX_BITS + KEY_O
// 244 ô o CIRCUMFLEX
ISO_8859_1_F6 = KEY_SEMICOLON
// 246 ö o DIAERESIS
//ISO_8859_1_F9 = GRAVE_ACCENT_BITS + KEY_U
// 249 ù u GRAVE
//ISO_8859_1_FA = ACUTE_ACCENT_BITS + KEY_U
// 250 ú u ACUTE
//ISO_8859_1_FB = CIRCUMFLEX_BITS + KEY_U
// 251 û u CIRCUMFLEX
ISO_8859_1_FC = KEY_LEFT_BRACE
// 252 ü u DIAERESIS
//ISO_8859_1_FD = ACUTE_ACCENT_BITS + KEY_Z
// 253 ý y ACUTE
UNICODE_20AC = KEY_E, MODIFIERKEY_RIGHT_ALT
// € Euro Sign

33
main.go Normal file
View file

@ -0,0 +1,33 @@
package main
import (
"bytes"
"fmt"
"git.giftfish.de/ston1th/duckycode/pkg/encode"
"os"
)
func main() {
// var buf = bytes.NewBufferString(`
//REM The next three lines execute a command prompt in Windows
//GUI r
//STRING cmd
//ENTER
//`)
var buf = bytes.NewBufferString(`
REM Type Hello World into Windows notepad. Target: Windows 95 and beyond. Author: Darren
DELAY 1000
GUI r
DELAY 100
STRING c:\windows\notepad.exe
ENTER
DELAY 1000
STRING Hello World
`)
e := encode.NewEncoder(buf, "de")
b, err := e.Encode()
if err != nil {
fmt.Println(err)
}
os.Stdout.Write(b)
}

202
pkg/encode/encode.go Normal file
View file

@ -0,0 +1,202 @@
package encode
import (
"bufio"
"fmt"
"io"
"os"
"strconv"
"strings"
"git.giftfish.de/ston1th/duckycode/pkg/lang"
)
type Encoder struct {
reader io.Reader
language string
defaultDelay int
delayOverride bool
loop int
repeat bool
}
func NewEncoder(r io.Reader, language string) *Encoder {
if language == "" {
language = "de"
}
return &Encoder{r, language, 0, false, 0, false}
}
func (e *Encoder) Encode() (buf []byte, err error) {
scanner := bufio.NewScanner(e.reader)
for scanner.Scan() {
if err = scanner.Err(); err != nil {
return
}
s := strings.SplitN(scanner.Text(), " ", 2)
switch len(s) {
case 1:
if b := e.instruction(s[0]); b != 0 {
fmt.Fprintf(os.Stderr, "%s\n", s[0])
buf = append(buf, []byte{b, 0}...)
fmt.Fprintf(os.Stderr, "%#v\n", buf)
}
case 2:
fmt.Fprintf(os.Stderr, "%s:%s\n", s[0], s[1])
buf = append(buf, e.instructionData(s[0], s[1])...)
fmt.Fprintf(os.Stderr, "%#v\n", buf)
}
if !e.delayOverride && e.defaultDelay > 0 {
delayCounter := e.defaultDelay
for delayCounter > 0 {
buf = append(buf, byte(0))
if delayCounter > 255 {
buf = append(buf, byte(255))
delayCounter -= 255
} else {
buf = append(buf, byte(delayCounter))
delayCounter = 0
}
}
}
}
return
}
func (e *Encoder) instruction(in string) byte {
if b, ok := lang.K["KEY_"+in]; ok {
return b
}
switch in {
case "", "REM":
return 0
case "ESCAPE":
return e.instruction("ESC")
case "DEL":
return e.instruction("DELETE")
case "BREAK":
return e.instruction("PAUSE")
case "CONTROL":
return e.instruction("CTRL")
case "DOWNARROW":
return e.instruction("DOWM")
case "UPARROW":
return e.instruction("UP")
case "LEFTARROW":
return e.instruction("LEFT")
case "RIGHTARROW":
return e.instruction("RIGHT")
case "MENU":
return e.instruction("APP")
case "WINDOWS":
return e.instruction("GUI")
case "PLAY":
return e.instruction("MEDIA_PLAY_PAUSE")
case "MUTE":
return e.instruction("MEDIA_MUTE")
case "VOLUMEUP":
return e.instruction("MEDIA_VOLUME_INC")
case "VOLUMEDOWN":
return e.instruction("MEDIAVOLUME_DEC")
case "SCROLLLOCK":
return e.instruction("SCROLL_LOCK")
case "NUMLOCK":
return e.instruction("NUM_LOCK")
case "CAPSLOCK":
return e.instruction("CAPS_LOCK")
case "CTRL":
return e.instruction("LEFT_CTRL")
case "ALT":
return e.instruction("LEFT_ALT")
case "SHIFT":
return e.instruction("LEFT_SHIFT")
case "ALT-SHIFT":
//TODO
return 0
case "ALT-TAB":
//TODO
return 0
}
return e.encodeRune(rune(in[0]))[0]
}
func (e *Encoder) instructionData(in string, data string) (b []byte) {
switch in {
case "DEFAULT_DELAY", "DEFAULTDELAY":
delay, err := strconv.Atoi(data)
if err == nil {
e.defaultDelay = delay
e.delayOverride = true
}
return nil
case "DELAY":
delay, err := strconv.Atoi(data)
if err != nil {
return nil
}
for delay > 0 {
b = append(b, byte(0))
if delay > 255 {
b = append(b, byte(255))
delay -= 255
} else {
b = append(b, byte(delay))
delay = 0
}
}
e.delayOverride = true
return
case "", "REM":
return nil
case "STRING":
for _, r := range data {
enc := e.encodeRune(r)
if len(enc)%2 != 0 {
enc = append(enc, byte(0))
}
b = append(b, enc...)
}
return
case "CONTROL", "CTRL":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"]}
case "ALT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_ALT"]}
case "SHIFT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_SHIFT"]}
case "CTRL-ALT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"] | lang.K["MODIFIERKEY_ALT"]}
case "CTRL-SHIFT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_CTRL"] | lang.K["MODIFIERKEY_SHIFT"]}
case "COMMAND-OPTION":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_GUI"] | lang.K["MODIFIERKEY_ALT"]}
case "ALT-SHIFT":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_ALT"] | lang.K["MODIFIERKEY_SHIFT"]}
case "WINDOWS", "GUI", "COMMAND":
return []byte{e.instruction(data), lang.K["MODIFIERKEY_LEFT_GUI"]}
}
return []byte{e.instruction(data), 0}
}
func (e *Encoder) encodeRune(r rune) []byte {
var code string
hex := strings.ToUpper(strconv.FormatUint(uint64(r), 16))
switch {
case r < 128:
code = "ASCII_" + hex
case r < 256:
code = "ISO_8859_1_" + hex
default:
code = "UNICODE_" + hex
}
if b, ok := lang.K[code]; ok {
return []byte{b}
} else if k, ok := lang.Langs[e.language][code]; ok {
if k.Mod != 0 {
return []byte{k.Key, k.Mod}
}
return []byte{k.Key}
}
return nil
}

116
pkg/lang/de.go Normal file
View file

@ -0,0 +1,116 @@
package lang
func init() {
l := make(Lang)
l["ASCII_20"] = Key{K["KEY_SPACE"], K[""]}
l["ASCII_21"] = Key{K["KEY_1"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_22"] = Key{K["KEY_2"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_23"] = Key{K["KEY_BACKSLASH"], K[""]}
l["ASCII_24"] = Key{K["KEY_4"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_25"] = Key{K["KEY_5"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_26"] = Key{K["KEY_6"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_27"] = Key{K["KEY_BACKSLASH"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_28"] = Key{K["KEY_8"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_29"] = Key{K["KEY_9"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_2A"] = Key{K["KEY_RIGHT_BRACE"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_2B"] = Key{K["KEY_RIGHT_BRACE"], K[""]}
l["ASCII_2C"] = Key{K["KEY_COMMA"], K[""]}
l["ASCII_2D"] = Key{K["KEY_SLASH"], K[""]}
l["ASCII_2E"] = Key{K["KEY_PERIOD"], K[""]}
l["ASCII_2F"] = Key{K["KEY_7"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_30"] = Key{K["KEY_0"], K[""]}
l["ASCII_31"] = Key{K["KEY_1"], K[""]}
l["ASCII_32"] = Key{K["KEY_2"], K[""]}
l["ASCII_33"] = Key{K["KEY_3"], K[""]}
l["ASCII_34"] = Key{K["KEY_4"], K[""]}
l["ASCII_35"] = Key{K["KEY_5"], K[""]}
l["ASCII_36"] = Key{K["KEY_6"], K[""]}
l["ASCII_37"] = Key{K["KEY_7"], K[""]}
l["ASCII_38"] = Key{K["KEY_8"], K[""]}
l["ASCII_39"] = Key{K["KEY_9"], K[""]}
l["ASCII_3A"] = Key{K["KEY_PERIOD"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3B"] = Key{K["KEY_COMMA"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3C"] = Key{K["KEY_NON_US_100"], K[""]}
l["ASCII_3D"] = Key{K["KEY_0"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3E"] = Key{K["KEY_NON_US_100"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_3F"] = Key{K["KEY_MINUS"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_40"] = Key{K["KEY_Q"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_41"] = Key{K["KEY_A"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_42"] = Key{K["KEY_B"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_43"] = Key{K["KEY_C"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_44"] = Key{K["KEY_D"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_45"] = Key{K["KEY_E"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_46"] = Key{K["KEY_F"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_47"] = Key{K["KEY_G"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_48"] = Key{K["KEY_H"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_49"] = Key{K["KEY_I"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4A"] = Key{K["KEY_J"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4B"] = Key{K["KEY_K"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4C"] = Key{K["KEY_L"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4D"] = Key{K["KEY_M"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4E"] = Key{K["KEY_N"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_4F"] = Key{K["KEY_O"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_50"] = Key{K["KEY_P"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_51"] = Key{K["KEY_Q"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_52"] = Key{K["KEY_R"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_53"] = Key{K["KEY_S"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_54"] = Key{K["KEY_T"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_55"] = Key{K["KEY_U"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_56"] = Key{K["KEY_V"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_57"] = Key{K["KEY_W"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_58"] = Key{K["KEY_X"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_59"] = Key{K["KEY_Z"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_5A"] = Key{K["KEY_Y"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_5B"] = Key{K["KEY_8"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_5C"] = Key{K["KEY_MINUS"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_5D"] = Key{K["KEY_9"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_5E"] = Key{K["KEY_TILDE"], K[""]}
l["ASCII_5F"] = Key{K["KEY_SLASH"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_60"] = Key{K["KEY_EQUAL"], K["MODIFIERKEY_SHIFT"]}
l["ASCII_61"] = Key{K["KEY_A"], K[""]}
l["ASCII_62"] = Key{K["KEY_B"], K[""]}
l["ASCII_63"] = Key{K["KEY_C"], K[""]}
l["ASCII_64"] = Key{K["KEY_D"], K[""]}
l["ASCII_65"] = Key{K["KEY_E"], K[""]}
l["ASCII_66"] = Key{K["KEY_F"], K[""]}
l["ASCII_67"] = Key{K["KEY_G"], K[""]}
l["ASCII_68"] = Key{K["KEY_H"], K[""]}
l["ASCII_69"] = Key{K["KEY_I"], K[""]}
l["ASCII_6A"] = Key{K["KEY_J"], K[""]}
l["ASCII_6B"] = Key{K["KEY_K"], K[""]}
l["ASCII_6C"] = Key{K["KEY_L"], K[""]}
l["ASCII_6D"] = Key{K["KEY_M"], K[""]}
l["ASCII_6E"] = Key{K["KEY_N"], K[""]}
l["ASCII_6F"] = Key{K["KEY_O"], K[""]}
l["ASCII_70"] = Key{K["KEY_P"], K[""]}
l["ASCII_71"] = Key{K["KEY_Q"], K[""]}
l["ASCII_72"] = Key{K["KEY_R"], K[""]}
l["ASCII_73"] = Key{K["KEY_S"], K[""]}
l["ASCII_74"] = Key{K["KEY_T"], K[""]}
l["ASCII_75"] = Key{K["KEY_U"], K[""]}
l["ASCII_76"] = Key{K["KEY_V"], K[""]}
l["ASCII_77"] = Key{K["KEY_W"], K[""]}
l["ASCII_78"] = Key{K["KEY_X"], K[""]}
l["ASCII_79"] = Key{K["KEY_Z"], K[""]}
l["ASCII_7A"] = Key{K["KEY_Y"], K[""]}
l["ASCII_7B"] = Key{K["KEY_7"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7C"] = Key{K["KEY_NON_US_100"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7D"] = Key{K["KEY_0"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7E"] = Key{K["KEY_RIGHT_BRACE"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ASCII_7F"] = Key{K["KEY_BACKSPACE"], K[""]}
l["ISO_8859_1_A0"] = Key{K["KEY_SPACE"], K[""]}
l["ISO_8859_1_A4"] = Key{K["KEY_E"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ISO_8859_1_A7"] = Key{K["KEY_3"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_B0"] = Key{K["KEY_TILDE"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_B2"] = Key{K["KEY_2"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ISO_8859_1_B3"] = Key{K["KEY_3"], K["MODIFIERKEY_RIGHT_ALT"]}
l["ISO_8859_1_C4"] = Key{K["KEY_QUOTE"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_D6"] = Key{K["KEY_SEMICOLON"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_DC"] = Key{K["KEY_LEFT_BRACE"], K["MODIFIERKEY_SHIFT"]}
l["ISO_8859_1_DF"] = Key{K["KEY_MINUS"], K[""]}
l["ISO_8859_1_E4"] = Key{K["KEY_QUOTE"], K[""]}
l["ISO_8859_1_F6"] = Key{K["KEY_SEMICOLON"], K[""]}
l["ISO_8859_1_FC"] = Key{K["KEY_LEFT_BRACE"], K[""]}
l["UNICODE_20AC"] = Key{K["KEY_E"], K["MODIFIERKEY_RIGHT_ALT"]}
Langs["de"] = l
}

146
pkg/lang/keyboard.go Normal file
View file

@ -0,0 +1,146 @@
package lang
var K = map[string]byte{
"": 0,
"MODIFIERKEY_CTRL": 0x01,
"MODIFIERKEY_SHIFT": 0x02,
"MODIFIERKEY_ALT": 0x04,
"MODIFIERKEY_GUI": 0x08,
"MODIFIERKEY_LEFT_CTRL": 0x01,
"MODIFIERKEY_LEFT_SHIFT": 0x02,
"MODIFIERKEY_LEFT_ALT": 0x04,
"MODIFIERKEY_LEFT_GUI": 0x08,
"MODIFIERKEY_RIGHT_CTRL": 0x10,
"MODIFIERKEY_RIGHT_SHIFT": 0x20,
"MODIFIERKEY_RIGHT_ALT": 0x40,
"MODIFIERKEY_RIGHT_GUI": 0x80,
"KEY_MEDIA_VOLUME_INC": 0x80,
"KEY_MEDIA_VOLUME_DEC": 0x81,
"KEY_MEDIA_MUTE": 0x7F,
"KEY_MEDIA_PLAY_PAUSE": 0x08,
"KEY_MEDIA_NEXT_TRACK": 0x10,
"KEY_MEDIA_PREV_TRACK": 0x20,
"KEY_A": 4,
"KEY_B": 5,
"KEY_C": 6,
"KEY_D": 7,
"KEY_E": 8,
"KEY_F": 9,
"KEY_G": 10,
"KEY_H": 11,
"KEY_I": 12,
"KEY_J": 13,
"KEY_K": 14,
"KEY_L": 15,
"KEY_M": 16,
"KEY_N": 17,
"KEY_O": 18,
"KEY_P": 19,
"KEY_Q": 20,
"KEY_R": 21,
"KEY_S": 22,
"KEY_T": 23,
"KEY_U": 24,
"KEY_V": 25,
"KEY_W": 26,
"KEY_X": 27,
"KEY_Y": 28,
"KEY_Z": 29,
"KEY_1": 30,
"KEY_2": 31,
"KEY_3": 32,
"KEY_4": 33,
"KEY_5": 34,
"KEY_6": 35,
"KEY_7": 36,
"KEY_8": 37,
"KEY_9": 38,
"KEY_0": 39,
"KEY_ENTER": 40,
"KEY_ESC": 41,
"KEY_BACKSPACE": 42,
"KEY_TAB": 43,
"KEY_SPACE": 44,
"KEY_MINUS": 45,
"KEY_EQUAL": 46,
"KEY_LEFT_BRACE": 47,
"KEY_RIGHT_BRACE": 48,
"KEY_BACKSLASH": 49,
"KEY_NON_US_NUM": 50,
"KEY_SEMICOLON": 51,
"KEY_QUOTE": 52,
"KEY_TILDE": 53,
"KEY_COMMA": 54,
"KEY_PERIOD": 55,
"KEY_SLASH": 56,
"KEY_CAPS_LOCK": 57,
"KEY_F1": 58,
"KEY_F2": 59,
"KEY_F3": 60,
"KEY_F4": 61,
"KEY_F5": 62,
"KEY_F6": 63,
"KEY_F7": 64,
"KEY_F8": 65,
"KEY_F9": 66,
"KEY_F10": 67,
"KEY_F11": 68,
"KEY_F12": 69,
"KEY_PRINTSCREEN": 70,
"KEY_SCROLL_LOCK": 71,
"KEY_PAUSE": 72,
"KEY_INSERT": 73,
"KEY_HOME": 74,
"KEY_PAGEUP": 75,
"KEY_DELETE": 76,
"KEY_END": 77,
"KEY_PAGEDOWN": 78,
"KEY_RIGHT": 79,
"KEY_LEFT": 80,
"KEY_DOWN": 81,
"KEY_UP": 82,
"KEY_NUM_LOCK": 83,
"KEYPAD_SLASH": 84,
"KEYPAD_ASTERIX": 85,
"KEYPAD_MINUS": 86,
"KEYPAD_PLUS": 87,
"KEYPAD_ENTER": 88,
"KEYPAD_EQUALS": 103,
"KEYPAD_1": 89,
"KEYPAD_2": 90,
"KEYPAD_3": 91,
"KEYPAD_4": 92,
"KEYPAD_5": 93,
"KEYPAD_6": 94,
"KEYPAD_7": 95,
"KEYPAD_8": 96,
"KEYPAD_9": 97,
"KEYPAD_0": 98,
"KEYPAD_PERIOD": 99,
"KEY_APP": 0x65,
"KEY_POWER": 0x66,
"KEY_EXE": 0x74,
"KEY_HELP": 0x75,
"KEY_MENU": 0x76,
"KEY_SELECT": 0x77,
"KEY_STOP": 0x78,
"KEY_AGAIN": 0x79,
"KEY_UNDO": 0x7A,
"KEY_CUT": 0x7B,
"KEY_COPY": 0x7C,
"KEY_PASTE": 0x7D,
"KEY_FIND": 0x7E,
"KEY_SYSTEM_POWER": 0x81,
"KEY_SYSTEM_SLEEP": 0x82,
"KEY_SYSTEM_WAKE": 0x83,
"KEYPAD_PIPE": 0xC9,
"KEY_LEFT_CTRL": 0xE0,
"KEY_LEFT_SHIFT": 0xE1,
"KEY_LEFT_ALT": 0xE2,
"KEY_LEFT_GUI": 0xE3,
"KEY_COMMAND": 0xE3,
"KEY_RIGHT_CTRL": 0xE4,
"KEY_RIGHT_SHIFT": 0xE5,
"KEY_RIGHT_ALT": 0xE6,
"KEY_RIGHT_GUI": 0xE7,
}

10
pkg/lang/lang.go Normal file
View file

@ -0,0 +1,10 @@
package lang
var Langs = make(map[string]Lang)
type Lang map[string]Key
type Key struct {
Key byte
Mod byte
}