From 40be382c2d3b89073770602ec9a8eb64307ebc72 Mon Sep 17 00:00:00 2001 From: Kevin F Date: Sun, 22 Jan 2023 01:08:48 -0600 Subject: [PATCH] began work on better character streaming with xdotool --- Server.md | 1 - Streaming.md | 71 +++++++++++++++++++++++++++++++++++++++++----------- 2 files changed, 57 insertions(+), 15 deletions(-) diff --git a/Server.md b/Server.md index 7eeca8d..90ca758 100644 --- a/Server.md +++ b/Server.md @@ -62,7 +62,6 @@ import( "os" "net/http" "fmt" - "strings" "log" "keyboard.voidnet.tech/auth" @{gorilla/websocket import string} diff --git a/Streaming.md b/Streaming.md index bc9e340..53476ba 100644 --- a/Streaming.md +++ b/Streaming.md @@ -1,6 +1,12 @@ # Streaming keyboard input -We use the Gorilla websocket library to handle the websocket connection. We then use the sendkeys library to stream the keyboard input to the client. +We use the Gorilla websocket library to handle the websocket connection. + +Most of the time, we can use sendkeys (which uses libinput) to effeciently press keys. However, if we need to send a character that sendkeys doesn't know about, we can use the xdotool command. + +xdotool spawns a new process for each keypress, so it's not as effecient as sendkeys. + +To specify xdotool usage, the client should send a message with the format `{kb_cmd:xdotool}:message` where message is a utf-8 string. ``` go --- streaming keyboard input @@ -31,7 +37,6 @@ func clientConnected(w http.ResponseWriter, r *http.Request) { } c.WriteMessage(websocket.TextMessage, []byte("authenticated")) - var parts []string for { time.Sleep(25 * time.Millisecond) _, message, err := c.ReadMessage() @@ -45,18 +50,56 @@ func clientConnected(w http.ResponseWriter, r *http.Request) { message_string = "\n" } - parts = strings.Split(message_string, "\n") - - for _, part := range parts { - err = keyboard.Type(part) - if err != nil { - log.Println("type:", err) - } - if len(parts) > 1 { - keyboard.Enter() - } - } + @{send keys to system} } } ---- \ No newline at end of file +--- +``` + +# Sending the keys + +Sending the keys is a bit tricky as we need to manually convert backspace, tab, and enter. + +``` go + +--- send keys to system + +if strings.HasPrefix(message_string, "{kb_cmd:xdotool}:") { + message_string = strings.TrimPrefix(message_string, "{kb_cmd:xdotool}:") + if message_string == "" { + message_string = "\n" + } + + // regex if string has characters we need to convert to key presses + // if it does, convert them and send them + // if it doesn't, send the whole string + + cmd := exec.Command("xdotool", "type", message_string) + err = cmd.Run() + if err != nil { + log.Println("xdotool:", err) + } + continue +} + +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) + } +} +``` \ No newline at end of file