1
0
Fork 0
mirror of https://github.com/Luzifer/streamdeck.git synced 2024-12-20 09:41:19 +00:00

Add "key_press" action

Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
Knut Ahlers 2019-11-21 17:14:05 +01:00
parent 2059647373
commit 4030524c09
Signed by: luzifer
GPG key ID: DC2729FDD34BE99E
5 changed files with 183 additions and 0 deletions

View file

@ -0,0 +1,81 @@
package main
import (
"strconv"
"time"
"github.com/pkg/errors"
"github.com/sashko/go-uinput"
)
func init() {
registerAction("key_press", actionKeyPress{})
}
type actionKeyPress struct{}
func (actionKeyPress) Execute(attributes map[string]interface{}) error {
keys, ok := attributes["keys"].([]interface{})
if !ok {
return errors.New("No keys array present")
}
var (
delay time.Duration
keyCodes []uint16
)
if v, ok := attributes["delay"].(string); ok {
if d, err := time.ParseDuration(v); err == nil {
delay = d
}
}
for _, k := range keys {
// Convert misdetections into strings
switch k.(type) {
case int:
k = strconv.Itoa(k.(int))
}
if kv, ok := k.(string); ok {
if kc, ok := uinputKeyMapping[kv]; ok {
keyCodes = append(keyCodes, kc)
} else {
return errors.Errorf("Unknown key %q", kv)
}
} else {
return errors.New("Unknown key type detected")
}
}
if v, ok := attributes["mod_shift"].(bool); ok && v {
if err := kbd.KeyDown(uinput.KeyLeftShift); err != nil {
return errors.Wrap(err, "Unable to set shift")
}
defer kbd.KeyUp(uinput.KeyLeftShift)
}
if v, ok := attributes["mod_alt"].(bool); ok && v {
if err := kbd.KeyDown(uinput.KeyLeftAlt); err != nil {
return errors.Wrap(err, "Unable to set shift")
}
defer kbd.KeyUp(uinput.KeyLeftAlt)
}
if v, ok := attributes["mod_ctrl"].(bool); ok && v {
if err := kbd.KeyDown(uinput.KeyLeftCtrl); err != nil {
return errors.Wrap(err, "Unable to set shift")
}
defer kbd.KeyUp(uinput.KeyLeftCtrl)
}
for _, kc := range keyCodes {
if err := kbd.KeyPress(kc); err != nil {
return errors.Wrap(err, "Unable to press key")
}
time.Sleep(delay)
}
return nil
}

View file

@ -9,6 +9,7 @@ require (
github.com/Luzifer/streamdeck v0.0.0-20191120013804-40fbd11001d0
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
github.com/pkg/errors v0.8.1
github.com/sashko/go-uinput v0.0.0-20180923134002-15fcac7aa54a
github.com/sirupsen/logrus v1.4.2
github.com/spf13/pflag v1.0.5 // indirect
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e // indirect

View file

@ -13,6 +13,8 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxv
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/sashko/go-uinput v0.0.0-20180923134002-15fcac7aa54a h1:AWRVuJ7oUaZdSQviWTIV14AuNzoNHrodAQjY5VTpSdk=
github.com/sashko/go-uinput v0.0.0-20180923134002-15fcac7aa54a/go.mod h1:5XNvpYRRmWADwhphlimZLWP70oEL1f54E4Guo20fvV4=
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=

89
cmd/streamdeck/keymap.go Normal file
View file

@ -0,0 +1,89 @@
package main
import "github.com/sashko/go-uinput"
var uinputKeyMapping = map[string]uint16{
`<esc>`: uinput.KeyEsc,
`1`: uinput.Key1,
`2`: uinput.Key2,
`3`: uinput.Key3,
`4`: uinput.Key4,
`5`: uinput.Key5,
`6`: uinput.Key6,
`7`: uinput.Key7,
`8`: uinput.Key8,
`9`: uinput.Key9,
`0`: uinput.Key0,
`-`: uinput.KeyMinus,
`=`: uinput.KeyEqual,
`<bsp>`: uinput.KeyBackspace,
`<tab>`: uinput.KeyTab,
`q`: uinput.KeyQ,
`w`: uinput.KeyW,
`e`: uinput.KeyE,
`r`: uinput.KeyR,
`t`: uinput.KeyT,
`y`: uinput.KeyY,
`u`: uinput.KeyU,
`i`: uinput.KeyI,
`o`: uinput.KeyO,
`p`: uinput.KeyP,
`[`: uinput.KeyLeftBrace,
`]`: uinput.KeyRightBrace,
`<enter>`: uinput.KeyEnter,
`<lctrl>`: uinput.KeyLeftCtrl,
`a`: uinput.KeyA,
`s`: uinput.KeyS,
`d`: uinput.KeyD,
`f`: uinput.KeyF,
`g`: uinput.KeyG,
`h`: uinput.KeyH,
`j`: uinput.KeyJ,
`k`: uinput.KeyK,
`l`: uinput.KeyL,
`;`: uinput.KeySemicolon,
`'`: uinput.KeyApostrophe,
``: uinput.KeyGrave,
`<lshift>`: uinput.KeyLeftShift,
`\`: uinput.KeyBackslash,
`z`: uinput.KeyZ,
`x`: uinput.KeyX,
`c`: uinput.KeyC,
`v`: uinput.KeyV,
`b`: uinput.KeyB,
`n`: uinput.KeyN,
`m`: uinput.KeyM,
`,`: uinput.KeyComma,
`.`: uinput.KeyDot,
`/`: uinput.KeySlash,
`<rshift>`: uinput.KeyRightShift,
`<lalt>`: uinput.KeyLeftAlt,
`<space>`: uinput.KeySpace,
`<caps>`: uinput.KeyCapsLock,
`f1`: uinput.KeyF1,
`f2`: uinput.KeyF2,
`f3`: uinput.KeyF3,
`f4`: uinput.KeyF4,
`f5`: uinput.KeyF5,
`f6`: uinput.KeyF6,
`f7`: uinput.KeyF7,
`f8`: uinput.KeyF8,
`f9`: uinput.KeyF9,
`f10`: uinput.KeyF10,
`<num>`: uinput.KeyNumLock,
`<scroll>`: uinput.KeyScrollLock,
`f11`: uinput.KeyF11,
`f12`: uinput.KeyF12,
`f13`: uinput.KeyF13,
`f14`: uinput.KeyF14,
`f15`: uinput.KeyF15,
`f16`: uinput.KeyF16,
`f17`: uinput.KeyF17,
`f18`: uinput.KeyF18,
`f19`: uinput.KeyF19,
`f20`: uinput.KeyF20,
`f21`: uinput.KeyF21,
`f22`: uinput.KeyF22,
`f23`: uinput.KeyF23,
`f24`: uinput.KeyF24,
}

View file

@ -7,6 +7,7 @@ import (
"github.com/Luzifer/rconfig/v2"
"github.com/Luzifer/streamdeck"
"github.com/pkg/errors"
"github.com/sashko/go-uinput"
log "github.com/sirupsen/logrus"
"gopkg.in/yaml.v2"
)
@ -25,6 +26,8 @@ var (
sd *streamdeck.Client
kbd uinput.Keyboard
version = "dev"
)
@ -58,6 +61,13 @@ func main() {
userConfFile.Close()
// Initalize control devices
kbd, err = uinput.CreateKeyboard()
if err != nil {
log.WithError(err).Fatal("Unable to create uinput keyboard")
}
defer kbd.Close()
// Initialize device
sd, err = streamdeck.New(streamdeck.StreamDeckOriginalV2)
if err != nil {