Added support for "exec" driver. Executes anything through `bash -c`

pull/8/head
Alexandre Bourget 2020-04-03 00:24:07 -04:00
rodzic f4f36d787a
commit 6ee1b767cf
4 zmienionych plików z 15 dodań i 6 usunięć

Wyświetl plik

@ -74,6 +74,8 @@ func (ac *AppConfig) parseBindings() error {
switch {
case ac.Driver == "":
case ac.Driver == "exec":
driverProtocol = "exec"
case ac.Driver == "xdotool":
case strings.HasPrefix(ac.Driver, "osc://"):
addr, err := url.Parse(ac.Driver)
@ -89,10 +91,14 @@ func (ac *AppConfig) parseBindings() error {
driverProtocol = "osc"
oscClient = osc.NewClient(hostParts[0], int(port))
default:
return fmt.Errorf(`invalid driver %q, use one of: "xdotool" (default), "osc://address:port"`, ac.Driver)
return fmt.Errorf(`invalid driver %q, use one of: "xdotool" (default), "exec", "osc://address:port"`, ac.Driver)
}
for key, value := range ac.Bindings {
if strings.HasPrefix(key, "_") {
continue
}
binding, description := bindingAndDescription(driverProtocol, value)
newBinding := &deviceBinding{heldButtons: make(map[int]bool), rawKey: key, rawValue: value, original: binding, description: description, driver: driverProtocol, oscClient: oscClient}
@ -149,7 +155,7 @@ var oscDescriptionRE = regexp.MustCompile(`([^#]*)(\s*# *(.+))?`)
func bindingAndDescription(protocol, input string) (string, string) {
re := xdoDescriptionRE
if protocol == "osc" {
if protocol == "osc" || protocol == "exec" {
re = oscDescriptionRE
}

Wyświetl plik

@ -19,7 +19,7 @@ func TestBindingAndDescription(t *testing.T) {
}
for idx, test := range tests {
bind, desc := bindingAndDescription(test.in)
bind, desc := bindingAndDescription("xdo", test.in)
assert.Equal(t, test.bind, bind, "%d", idx)
assert.Equal(t, test.desc, desc, "%d", idx)
}

Wyświetl plik

@ -172,6 +172,9 @@ func (m *Mapper) EmitKeys(modifiers map[int]bool, keyDown int) error {
func (m *Mapper) executeBinding(binding *deviceBinding) error {
time.Sleep(25 * time.Millisecond)
switch binding.driver {
case "exec":
fmt.Printf("EXEC: /bin/bash -c %q\n", binding.original)
return exec.Command("/bin/bash", "-c", binding.original).Run()
case "xdotool", "":
fmt.Println("xdotool key --clearmodifiers", binding.original)
return exec.Command("xdotool", "key", "--clearmodifiers", binding.original).Run()

Wyświetl plik

@ -91,12 +91,12 @@
"__see_ardour_docs_for_actions": "http://manual.ardour.org/appendix/menu-actions-list/ and http://manual.ardour.org/using-control-surfaces/controlling-ardour-with-osc/osc-control/",
"bindings": {
"F1": "/access_action Transport/record-roll",
"F2": "/transport_stop + /sleep 0.25 + /access_action Editor/playhead-to-previous-region-boundary + /sleep 0.05 + /access_action Common/finish-range + /sleep 0.05 + /jump_seconds -0.1 + /sleep 0.05 + /access_action Common/start-range + /sleep 0.05 + /access_action Editor/editor-cut # Clears Marks on Lightworks",
"F2": "/transport_stop + /sleep 0.25 + /access_action Editor/playhead-to-previous-region-boundary + /sleep 0.05 + /access_action Common/finish-range + /sleep 0.05 + /jump_seconds -0.1 + /sleep 0.05 + /access_action Common/start-range + /sleep 0.05 + /access_action Editor/editor-cut # Stop recording and clear the last 0.05 second of recording (because it might catch the click of the Shuttle !)",
"M1+F2": "Cyrillic_YA # Swap In-Out Marks",
"F3": "/access_action Editor/editor-cut + /access_action Editor/playhead-to-previous-region-boundary # Delete",
"F3": "/access_action Common/finish-range + /access_action Editor/playhead-to-range-start + /access_action Editor/editor-cut",
"M1+F3": "z # Blackout",
"F4": "v # Insert",
"F4": "/access_action Common/start-range + /sleep 0.05 + /access_action Editor/editor-cut # Truncate end of clip",
"M1+F4": "b # Replace",
"B2+F4": "f # Clipboard Insert",
"B2+M1+F4": "g # Clipboard Replace",