Improve keymap changing
This commit is contained in:
parent
5a4c207159
commit
f6967e5f83
@ -68,6 +68,17 @@ var (
|
|||||||
"RSUPER": RSUPER,
|
"RSUPER": RSUPER,
|
||||||
"NONE": NONE,
|
"NONE": NONE,
|
||||||
}
|
}
|
||||||
|
AllModifiers = []string{
|
||||||
|
"LSHIFT",
|
||||||
|
"LCTRL",
|
||||||
|
"LALT",
|
||||||
|
"LSUPER",
|
||||||
|
"RSHIFT",
|
||||||
|
"RCTRL",
|
||||||
|
"RALT",
|
||||||
|
"RSUPER",
|
||||||
|
"NONE",
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
func NewKeyboard(Modifiers map[string]byte, kemapOrder []string, KeymapPath string, hidg0 io.Writer) *Keyboard {
|
func NewKeyboard(Modifiers map[string]byte, kemapOrder []string, KeymapPath string, hidg0 io.Writer) *Keyboard {
|
||||||
@ -251,7 +262,7 @@ func (k *Keyboard) Hold(press [8]byte, file io.Writer) error {
|
|||||||
func (k *Keyboard) keymapto0() error {
|
func (k *Keyboard) keymapto0() error {
|
||||||
if len(k.KeymapOrder) > 1 {
|
if len(k.KeymapOrder) > 1 {
|
||||||
for i := 0; i < len(k.KeymapOrder)-(k.currentKeyMap); i++ {
|
for i := 0; i < len(k.KeymapOrder)-(k.currentKeyMap); i++ {
|
||||||
err := k.Press([8]byte{LALT, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00}, k.Hidg0)
|
err := k.Press(k.KeymapShortcut, k.Hidg0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
120
ghid/keys.go
Normal file
120
ghid/keys.go
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
package hid
|
||||||
|
|
||||||
|
var (
|
||||||
|
StandardKeys = map[string]byte{
|
||||||
|
"␀": 0x00,
|
||||||
|
"a": 0x04,
|
||||||
|
"A": 0x04,
|
||||||
|
"b": 0x05,
|
||||||
|
"B": 0x05,
|
||||||
|
"c": 0x06,
|
||||||
|
"C": 0x06,
|
||||||
|
"d": 0x07,
|
||||||
|
"D": 0x07,
|
||||||
|
"e": 0x08,
|
||||||
|
"E": 0x08,
|
||||||
|
"f": 0x09,
|
||||||
|
"F": 0x09,
|
||||||
|
"g": 0x0A,
|
||||||
|
"G": 0x0A,
|
||||||
|
"h": 0x0B,
|
||||||
|
"H": 0x0B,
|
||||||
|
"i": 0x0C,
|
||||||
|
"I": 0x0C,
|
||||||
|
"j": 0x0D,
|
||||||
|
"J": 0x0D,
|
||||||
|
"k": 0x0E,
|
||||||
|
"K": 0x0E,
|
||||||
|
"l": 0x0F,
|
||||||
|
"L": 0x0F,
|
||||||
|
"m": 0x10,
|
||||||
|
"M": 0x10,
|
||||||
|
"n": 0x11,
|
||||||
|
"N": 0x11,
|
||||||
|
"o": 0x12,
|
||||||
|
"O": 0x12,
|
||||||
|
"p": 0x13,
|
||||||
|
"P": 0x13,
|
||||||
|
"q": 0x14,
|
||||||
|
"Q": 0x14,
|
||||||
|
"r": 0x15,
|
||||||
|
"R": 0x15,
|
||||||
|
"s": 0x16,
|
||||||
|
"S": 0x16,
|
||||||
|
"t": 0x17,
|
||||||
|
"T": 0x17,
|
||||||
|
"u": 0x18,
|
||||||
|
"U": 0x18,
|
||||||
|
"v": 0x19,
|
||||||
|
"V": 0x19,
|
||||||
|
"w": 0x1A,
|
||||||
|
"W": 0x1A,
|
||||||
|
"x": 0x1B,
|
||||||
|
"X": 0x1B,
|
||||||
|
"y": 0x1C,
|
||||||
|
"Y": 0x1C,
|
||||||
|
"z": 0x1D,
|
||||||
|
"Z": 0x1D,
|
||||||
|
"!": 0x1E,
|
||||||
|
"1": 0x1E,
|
||||||
|
"2": 0x1F,
|
||||||
|
"@": 0x1F,
|
||||||
|
"#": 0x20,
|
||||||
|
"3": 0x20,
|
||||||
|
"$": 0x21,
|
||||||
|
"4": 0x21,
|
||||||
|
"%": 0x22,
|
||||||
|
"5": 0x22,
|
||||||
|
"6": 0x23,
|
||||||
|
"^": 0x23,
|
||||||
|
"&": 0x24,
|
||||||
|
"7": 0x24,
|
||||||
|
"*": 0x25,
|
||||||
|
"8": 0x25,
|
||||||
|
"(": 0x26,
|
||||||
|
"9": 0x26,
|
||||||
|
")": 0x27,
|
||||||
|
"0": 0x27,
|
||||||
|
"\n": 0x28,
|
||||||
|
"⎋": 0x29, // esc
|
||||||
|
"␛": 0x29, // esc
|
||||||
|
"⌫": 0x2A, // backspace
|
||||||
|
"\t": 0x2B,
|
||||||
|
" ": 0x2C,
|
||||||
|
"-": 0x2D,
|
||||||
|
"_": 0x2D,
|
||||||
|
"+": 0x2E,
|
||||||
|
"=": 0x2E,
|
||||||
|
"[": 0x2F,
|
||||||
|
"{": 0x2F,
|
||||||
|
"]": 0x30,
|
||||||
|
"}": 0x30,
|
||||||
|
"\\": 0x31,
|
||||||
|
"|": 0x31,
|
||||||
|
":": 0x33,
|
||||||
|
";": 0x33,
|
||||||
|
"'": 0x34,
|
||||||
|
"\"": 0x34,
|
||||||
|
"`": 0x35,
|
||||||
|
"~": 0x35,
|
||||||
|
",": 0x36,
|
||||||
|
"<": 0x36,
|
||||||
|
".": 0x37,
|
||||||
|
">": 0x37,
|
||||||
|
"/": 0x38,
|
||||||
|
"?": 0x38,
|
||||||
|
"⇪": 0x39,
|
||||||
|
"⎙": 0x46,
|
||||||
|
"⏸️": 0x48,
|
||||||
|
"⎀": 0x49,
|
||||||
|
"↖": 0x4A,
|
||||||
|
"⇞": 0x4B,
|
||||||
|
"⌦": 0x4C,
|
||||||
|
"↘": 0x4D,
|
||||||
|
"⇟": 0x4E,
|
||||||
|
"→": 0x4F,
|
||||||
|
"←": 0x50,
|
||||||
|
"↑": 0x51,
|
||||||
|
"↓": 0x52,
|
||||||
|
}
|
||||||
|
)
|
65
main.go
65
main.go
@ -1,16 +1,57 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
hid "github.com/lordwelch/hid/ghid"
|
hid "github.com/lordwelch/hid/ghid"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func contains(str string, find []string) bool {
|
||||||
|
str = strings.ToLower(str)
|
||||||
|
for _, s := range find {
|
||||||
|
if strings.Contains(str, strings.ToLower(s)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func parse_shortcut(shortcut string) ([8]byte, error) {
|
||||||
|
var (
|
||||||
|
modifiers = []string{}
|
||||||
|
key = ""
|
||||||
|
curModifier byte = 0
|
||||||
|
curKey byte = 0
|
||||||
|
)
|
||||||
|
strs := strings.SplitN(strings.ToLower(shortcut), " ", 2)
|
||||||
|
if len(strs) > 1 {
|
||||||
|
if contains(strs[0], hid.AllModifiers) {
|
||||||
|
modifiers = strings.Split(strs[0], "|")
|
||||||
|
} else {
|
||||||
|
key = strings.TrimSpace(strs[0])
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
modifiers = strings.Split(strs[0], "|")
|
||||||
|
key = strings.TrimSpace(strs[1])
|
||||||
|
}
|
||||||
|
for _, v := range modifiers {
|
||||||
|
curModifier |= hid.Modifiers[strings.TrimSpace(v)]
|
||||||
|
}
|
||||||
|
if id, ok := hid.StandardKeys[key]; ok {
|
||||||
|
curKey = id
|
||||||
|
} else {
|
||||||
|
return [8]byte{}, errors.New("Key not found")
|
||||||
|
}
|
||||||
|
return [8]byte{curModifier, 0x0, curKey}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var (
|
var (
|
||||||
Shortcut string
|
Shortcut string
|
||||||
@ -23,12 +64,13 @@ func main() {
|
|||||||
ghid *os.File
|
ghid *os.File
|
||||||
tmp *os.File
|
tmp *os.File
|
||||||
keyboard *hid.Keyboard
|
keyboard *hid.Keyboard
|
||||||
|
keymaps []string
|
||||||
)
|
)
|
||||||
if _, exists := os.LookupEnv("XDG_CONFIG_HOME"); !exists {
|
if _, exists := os.LookupEnv("XDG_CONFIG_HOME"); !exists {
|
||||||
_ = os.Setenv("XDG_CONFIG_HOME", path.Join(os.ExpandEnv("$HOME"), ".config"))
|
_ = os.Setenv("XDG_CONFIG_HOME", path.Join(os.ExpandEnv("$HOME"), ".config"))
|
||||||
}
|
}
|
||||||
flag.StringVar(&Shortcut, "shortcut", "", "Keymap cycle shortcut")
|
flag.StringVar(&Shortcut, "shortcut", "", "Keymap cycle shortcut")
|
||||||
flag.StringVar(&Shortcut, "s", "", "Keymap cycle shortcut")
|
flag.StringVar(&Shortcut, "s", "LALT ⇪", "Keymap cycle shortcut")
|
||||||
flag.StringVar(&keymapPath, "path", path.Join(os.ExpandEnv("$XDG_CONFIG_HOME"), "hid"), "Path to config dir default: $XDG_CONFIG_HOME")
|
flag.StringVar(&keymapPath, "path", path.Join(os.ExpandEnv("$XDG_CONFIG_HOME"), "hid"), "Path to config dir default: $XDG_CONFIG_HOME")
|
||||||
flag.StringVar(&keymapPath, "p", path.Join(os.ExpandEnv("$XDG_CONFIG_HOME"), "hid"), "Path to config dir default: $XDG_CONFIG_HOME")
|
flag.StringVar(&keymapPath, "p", path.Join(os.ExpandEnv("$XDG_CONFIG_HOME"), "hid"), "Path to config dir default: $XDG_CONFIG_HOME")
|
||||||
flag.StringVar(&filePath, "f", "-", "The file to read content from. Defaults to stdin")
|
flag.StringVar(&filePath, "f", "-", "The file to read content from. Defaults to stdin")
|
||||||
@ -43,6 +85,21 @@ func main() {
|
|||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
fmt.Println(keymapPath)
|
fmt.Println(keymapPath)
|
||||||
|
dirs, err := os.ReadDir(keymapPath)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
keymap:
|
||||||
|
for _, requestedKeymap := range flag.Args() {
|
||||||
|
for _, dir := range dirs {
|
||||||
|
if strings.HasPrefix(strings.ToLower(dir.Name()), strings.ToLower(requestedKeymap)) {
|
||||||
|
keymaps = append(keymaps, dir.Name())
|
||||||
|
break keymap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic(fmt.Sprintf("Keymap %q not found", requestedKeymap))
|
||||||
|
}
|
||||||
|
|
||||||
if filePath != "-" {
|
if filePath != "-" {
|
||||||
tmp, err = os.Open(path.Clean(filePath))
|
tmp, err = os.Open(path.Clean(filePath))
|
||||||
@ -58,9 +115,13 @@ func main() {
|
|||||||
}
|
}
|
||||||
defer ghid.Close()
|
defer ghid.Close()
|
||||||
|
|
||||||
keyboard = hid.NewKeyboard(hid.Modifiers, flag.Args(), keymapPath, ghid)
|
keyboard = hid.NewKeyboard(hid.Modifiers, keymaps, keymapPath, ghid)
|
||||||
keyboard.PressDelay = pressDelay
|
keyboard.PressDelay = pressDelay
|
||||||
keyboard.ReleaseDelay = releaseDelay
|
keyboard.ReleaseDelay = releaseDelay
|
||||||
|
keyboard.KeymapShortcut, err = parse_shortcut(Shortcut)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Errorf("error parsing shortcut: %w", err))
|
||||||
|
}
|
||||||
|
|
||||||
_, err = io.Copy(keyboard, os.Stdin)
|
_, err = io.Copy(keyboard, os.Stdin)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user