From 576e70a989bdb71963911eadd4f1611c6ba6e0f7 Mon Sep 17 00:00:00 2001 From: Kevin F Date: Sun, 22 Jan 2023 19:31:21 -0600 Subject: [PATCH] Better handle special characters --- Streaming.md | 61 +++++++++++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/Streaming.md b/Streaming.md index d90483e..b6a05f1 100644 --- a/Streaming.md +++ b/Streaming.md @@ -14,8 +14,6 @@ To specify xdotool usage, the client should send a message with the format `{kb_ func clientConnected(w http.ResponseWriter, r *http.Request) { keyboard, err := sendkeys.NewKBWrapWithOptions(sendkeys.Noisy) - // regex if string has characters we need to convert to key presses - characterRegex, _ := regexp.Compile(`[^\x08]\x08|\t|\n`) if err != nil { panic(err) @@ -63,14 +61,23 @@ func clientConnected(w http.ResponseWriter, r *http.Request) { # Sending the keys -Sending the keys is a bit tricky as we need to manually convert backspace, tab, and enter. +Sending the keys is a bit tricky as we need to manually convert backspace, tab, enter and modifier keys. ``` go --- send keys to system + +// regex if string has characters we need to convert to key presses +characterRegex, _ := regexp.Compile(`[^\x08]\x08|\t|\n`) + doXDoTool := func(command string, keys string)(err error) { - cmd := exec.Command("xdotool", command, keys) + var cmd *exec.Cmd + if command == "type" { + cmd = exec.Command("xdotool", command, "--delay", "25", keys) + } else { + cmd = exec.Command("xdotool", command, keys) + } return cmd.Run() } @@ -94,33 +101,43 @@ if strings.HasPrefix(message_string, "{kb_cmd:xdotool}:") { doXDoTool("type", charString) continue } + // key is required for special characters err = doXDoTool("key", charString) + continue } continue + } else { + doXDoTool("type", message_string) } - - doXDoTool("type", message_string) continue } -for _, character := range message_string { - charString := string(character) - if charString == "\n" { - keyboard.Enter() +if characterRegex.MatchString(message_string) { + for _, character := range message_string { + charString := string(character) + if charString == "\n" { + keyboard.Enter() + continue + } + if charString == "\t" { + keyboard.Tab() + continue + } + if charString == "\b" { + keyboard.BackSpace() + continue + } + err = keyboard.Type(charString) + if err != nil { + log.Println("type:", err) + } continue } - if charString == "\t" { - keyboard.Tab() - continue - } - if charString == "\b" { - keyboard.BackSpace() - continue - } - err = keyboard.Type(charString) - if err != nil { - log.Println("type:", err) - } + continue +} +err = keyboard.Type(message_string) +if err != nil { + log.Println("type:", err) } --- ``` \ No newline at end of file