mirror of
https://github.com/Luzifer/streamdeck.git
synced 2024-10-18 05:04:18 +00:00
Add "key_press" action
Signed-off-by: Knut Ahlers <knut@ahlers.me>
This commit is contained in:
parent
2059647373
commit
4030524c09
5 changed files with 183 additions and 0 deletions
81
cmd/streamdeck/action_keyPress.go
Normal file
81
cmd/streamdeck/action_keyPress.go
Normal 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
|
||||||
|
}
|
|
@ -9,6 +9,7 @@ require (
|
||||||
github.com/Luzifer/streamdeck v0.0.0-20191120013804-40fbd11001d0
|
github.com/Luzifer/streamdeck v0.0.0-20191120013804-40fbd11001d0
|
||||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect
|
||||||
github.com/pkg/errors v0.8.1
|
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/sirupsen/logrus v1.4.2
|
||||||
github.com/spf13/pflag v1.0.5 // indirect
|
github.com/spf13/pflag v1.0.5 // indirect
|
||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e // indirect
|
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e // indirect
|
||||||
|
|
|
@ -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 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
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/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 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||||
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg=
|
||||||
|
|
89
cmd/streamdeck/keymap.go
Normal file
89
cmd/streamdeck/keymap.go
Normal 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,
|
||||||
|
}
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"github.com/Luzifer/rconfig/v2"
|
"github.com/Luzifer/rconfig/v2"
|
||||||
"github.com/Luzifer/streamdeck"
|
"github.com/Luzifer/streamdeck"
|
||||||
"github.com/pkg/errors"
|
"github.com/pkg/errors"
|
||||||
|
"github.com/sashko/go-uinput"
|
||||||
log "github.com/sirupsen/logrus"
|
log "github.com/sirupsen/logrus"
|
||||||
"gopkg.in/yaml.v2"
|
"gopkg.in/yaml.v2"
|
||||||
)
|
)
|
||||||
|
@ -25,6 +26,8 @@ var (
|
||||||
|
|
||||||
sd *streamdeck.Client
|
sd *streamdeck.Client
|
||||||
|
|
||||||
|
kbd uinput.Keyboard
|
||||||
|
|
||||||
version = "dev"
|
version = "dev"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -58,6 +61,13 @@ func main() {
|
||||||
|
|
||||||
userConfFile.Close()
|
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
|
// Initialize device
|
||||||
sd, err = streamdeck.New(streamdeck.StreamDeckOriginalV2)
|
sd, err = streamdeck.New(streamdeck.StreamDeckOriginalV2)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
Loading…
Reference in a new issue