kopia lustrzana https://github.com/abourget/shuttle-go
Added support for "exec" driver. Executes anything through `bash -c`
rodzic
f4f36d787a
commit
6ee1b767cf
10
config.go
10
config.go
|
@ -74,6 +74,8 @@ func (ac *AppConfig) parseBindings() error {
|
||||||
|
|
||||||
switch {
|
switch {
|
||||||
case ac.Driver == "":
|
case ac.Driver == "":
|
||||||
|
case ac.Driver == "exec":
|
||||||
|
driverProtocol = "exec"
|
||||||
case ac.Driver == "xdotool":
|
case ac.Driver == "xdotool":
|
||||||
case strings.HasPrefix(ac.Driver, "osc://"):
|
case strings.HasPrefix(ac.Driver, "osc://"):
|
||||||
addr, err := url.Parse(ac.Driver)
|
addr, err := url.Parse(ac.Driver)
|
||||||
|
@ -89,10 +91,14 @@ func (ac *AppConfig) parseBindings() error {
|
||||||
driverProtocol = "osc"
|
driverProtocol = "osc"
|
||||||
oscClient = osc.NewClient(hostParts[0], int(port))
|
oscClient = osc.NewClient(hostParts[0], int(port))
|
||||||
default:
|
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 {
|
for key, value := range ac.Bindings {
|
||||||
|
if strings.HasPrefix(key, "_") {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
binding, description := bindingAndDescription(driverProtocol, value)
|
binding, description := bindingAndDescription(driverProtocol, value)
|
||||||
newBinding := &deviceBinding{heldButtons: make(map[int]bool), rawKey: key, rawValue: value, original: binding, description: description, driver: driverProtocol, oscClient: oscClient}
|
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) {
|
func bindingAndDescription(protocol, input string) (string, string) {
|
||||||
re := xdoDescriptionRE
|
re := xdoDescriptionRE
|
||||||
if protocol == "osc" {
|
if protocol == "osc" || protocol == "exec" {
|
||||||
re = oscDescriptionRE
|
re = oscDescriptionRE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ func TestBindingAndDescription(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
for idx, test := range tests {
|
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.bind, bind, "%d", idx)
|
||||||
assert.Equal(t, test.desc, desc, "%d", idx)
|
assert.Equal(t, test.desc, desc, "%d", idx)
|
||||||
}
|
}
|
||||||
|
|
|
@ -172,6 +172,9 @@ func (m *Mapper) EmitKeys(modifiers map[int]bool, keyDown int) error {
|
||||||
func (m *Mapper) executeBinding(binding *deviceBinding) error {
|
func (m *Mapper) executeBinding(binding *deviceBinding) error {
|
||||||
time.Sleep(25 * time.Millisecond)
|
time.Sleep(25 * time.Millisecond)
|
||||||
switch binding.driver {
|
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", "":
|
case "xdotool", "":
|
||||||
fmt.Println("xdotool key --clearmodifiers", binding.original)
|
fmt.Println("xdotool key --clearmodifiers", binding.original)
|
||||||
return exec.Command("xdotool", "key", "--clearmodifiers", binding.original).Run()
|
return exec.Command("xdotool", "key", "--clearmodifiers", binding.original).Run()
|
||||||
|
|
|
@ -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/",
|
"__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": {
|
"bindings": {
|
||||||
"F1": "/access_action Transport/record-roll",
|
"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",
|
"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",
|
"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",
|
"M1+F4": "b # Replace",
|
||||||
"B2+F4": "f # Clipboard Insert",
|
"B2+F4": "f # Clipboard Insert",
|
||||||
"B2+M1+F4": "g # Clipboard Replace",
|
"B2+M1+F4": "g # Clipboard Replace",
|
||||||
|
|
Ładowanie…
Reference in New Issue