From 67e1f313627afd679806c7f85d06ff03aff48d4e Mon Sep 17 00:00:00 2001 From: Unrud Date: Wed, 1 Aug 2018 13:01:14 +0200 Subject: [PATCH 001/292] update url for golang-dbus --- flatpak/com.github.unrud.RemoteTouchpad.json | 4 ++-- plugin_portal.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/flatpak/com.github.unrud.RemoteTouchpad.json b/flatpak/com.github.unrud.RemoteTouchpad.json index db92ec4..4288fb1 100644 --- a/flatpak/com.github.unrud.RemoteTouchpad.json +++ b/flatpak/com.github.unrud.RemoteTouchpad.json @@ -38,9 +38,9 @@ }, { "type" : "git", - "url" : "https://anonscm.debian.org/git/pkg-go/packages/golang-dbus.git", + "url" : "https://salsa.debian.org/go-team/packages/golang-dbus.git", "commit" : "79d96b151df08809558c825f8a75188826e8e228", - "dest" : "src/anonscm.debian.org/git/pkg-go/packages/golang-dbus.git" + "dest" : "src/salsa.debian.org/go-team/packages/golang-dbus.git" }, { "type" : "git", diff --git a/plugin_portal.go b/plugin_portal.go index faa6a5d..a1ddf12 100644 --- a/plugin_portal.go +++ b/plugin_portal.go @@ -22,7 +22,7 @@ package main import ( - dbus "anonscm.debian.org/git/pkg-go/packages/golang-dbus.git" + dbus "salsa.debian.org/go-team/packages/golang-dbus.git" "errors" "fmt" "sync" From 1787e573cb90e9978bf0fd4d6ce0847d31c2bdb0 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:33 +0200 Subject: [PATCH 002/292] minor refactoring --- plugin_windows.go | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/plugin_windows.go b/plugin_windows.go index 91c6e97..3978a7d 100644 --- a/plugin_windows.go +++ b/plugin_windows.go @@ -47,6 +47,11 @@ const ( scrollMult int = 6 ) +var ( + user32DLL = syscall.NewLazyDLL("user32.dll") + sendInputProc = user32DLL.NewProc("SendInput") +) + type mouseInput struct { typ uintptr // HACK: padded uint32 @@ -65,16 +70,11 @@ type keybdInput struct { padding [8]byte } -type windowsPlugin struct { - userDLL *syscall.LazyDLL - sendInputProc *syscall.LazyProc -} +type windowsPlugin struct{} func InitWindowsPlugin() (Plugin, error) { p := &windowsPlugin{} - p.userDLL = syscall.NewLazyDLL("user32.dll") - p.sendInputProc = p.userDLL.NewProc("SendInput") - if err := p.sendInputProc.Find(); err != nil { + if err := sendInputProc.Find(); err != nil { return nil, UnsupportedPlatformError{err} } return p, nil @@ -98,7 +98,7 @@ func (p *windowsPlugin) KeyboardText(text string) error { inputs[i].dwFlags |= keyeventfKeyup } } - if r, _, err := p.sendInputProc.Call(uintptr(len(inputs)), + if r, _, err := sendInputProc.Call(uintptr(len(inputs)), uintptr(unsafe.Pointer(&inputs[0])), unsafe.Sizeof(inputs[0])); int(r) != len(inputs) { return err @@ -125,7 +125,7 @@ func (p *windowsPlugin) PointerButton(button uint, press bool) error { } else { return errors.New("unsupported pointer button") } - if r, _, err := p.sendInputProc.Call(1, uintptr(unsafe.Pointer(&input)), + if r, _, err := sendInputProc.Call(1, uintptr(unsafe.Pointer(&input)), unsafe.Sizeof(input)); int(r) != 1 { return err } @@ -139,7 +139,7 @@ func (p *windowsPlugin) PointerMove(deltaX, deltaY int) error { dy: int32(deltaY), dwFlags: mouseeventfMove, } - if r, _, err := p.sendInputProc.Call(1, uintptr(unsafe.Pointer(&input)), + if r, _, err := sendInputProc.Call(1, uintptr(unsafe.Pointer(&input)), unsafe.Sizeof(input)); int(r) != 1 { return err } @@ -165,7 +165,7 @@ func (p *windowsPlugin) PointerScroll(deltaHorizontal, deltaVertical int) error if len(inputs) == 0 { return nil } - if r, _, err := p.sendInputProc.Call(uintptr(len(inputs)), + if r, _, err := sendInputProc.Call(uintptr(len(inputs)), uintptr(unsafe.Pointer(&inputs[0])), unsafe.Sizeof(inputs[0])); int(r) != len(inputs) { return err From 549de83fe38015cf76d52c3e4ae88d0971d1dc35 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:33 +0200 Subject: [PATCH 003/292] sort imports --- plugin_portal.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin_portal.go b/plugin_portal.go index a1ddf12..49267b8 100644 --- a/plugin_portal.go +++ b/plugin_portal.go @@ -22,9 +22,9 @@ package main import ( - dbus "salsa.debian.org/go-team/packages/golang-dbus.git" "errors" "fmt" + dbus "salsa.debian.org/go-team/packages/golang-dbus.git" "sync" ) From f2a7c1dc1d77cae67751937b06af2d453e9e2983 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:34 +0200 Subject: [PATCH 004/292] remove invert argument and use colors in terminal instead --- main.go | 7 ++++--- qr.go | 22 ++++++++++++++-------- terminal_color.go | 27 +++++++++++++++++++++++++++ terminal_color_posix.go | 29 +++++++++++++++++++++++++++++ terminal_color_windows.go | 39 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 113 insertions(+), 11 deletions(-) create mode 100644 terminal_color.go create mode 100644 terminal_color_posix.go create mode 100644 terminal_color_windows.go diff --git a/main.go b/main.go index aa9e68f..40ba744 100644 --- a/main.go +++ b/main.go @@ -32,6 +32,7 @@ import ( mathrand "math/rand" "net" "net/http" + "os" "strconv" "strings" "time" @@ -129,13 +130,13 @@ func secureRandBase64(length int) string { func main() { var bind, certFile, keyFile, secret string - var showVersion, invert bool + var showVersion bool flag.BoolVar(&showVersion, "version", false, "show program's version number and exit") flag.StringVar(&bind, "bind", defaultBind, "bind server to [HOSTNAME]:PORT") flag.StringVar(&secret, "secret", "", "shared secret for client authentication") flag.StringVar(&certFile, "cert", "", "file containing TLS certificate") flag.StringVar(&keyFile, "key", "", "file containing TLS private key") - flag.BoolVar(&invert, "invert", false, "use inverse colors for QR code") + flag.Bool("invert", false, "obsolete, not used anymore") flag.Int("interval", 0, "obsolete, not used anymore") flag.Parse() if showVersion { @@ -225,7 +226,7 @@ func main() { } url := fmt.Sprintf("%s://%s/#%s\n", scheme, domain, secret) readyMsg := "ready: " + url - qrCode, _ := GenerateQRCode(url, invert) + qrCode, _ := GenerateQRCode(url, terminalSupportsColor(os.Stderr.Fd())) readyMsg += qrCode if !tls { readyMsg += ("" + diff --git a/qr.go b/qr.go index 6e9e0f3..80f380c 100644 --- a/qr.go +++ b/qr.go @@ -21,36 +21,42 @@ package main import qrcode "github.com/skip2/go-qrcode" -func GenerateQRCode(message string, invert bool) (string, error) { +func GenerateQRCode(message string, colorize bool) (string, error) { q, err := qrcode.New(message, qrcode.Medium) if err != nil { return "", err } - return qrCodeToString(q.Bitmap(), invert), nil + return qrCodeToString(q.Bitmap(), colorize), nil } -func qrCodeToString(bits [][]bool, invert bool) string { +func qrCodeToString(bits [][]bool, colorize bool) string { s := "" for y := -1; y < len(bits); y += 2 { + if colorize { + s += terminalForegroundWhite + terminalBackgroundBlack + } for x := range bits[0] { - upper := !invert + upper := false if 0 <= y && y < len(bits) { upper = bits[y][x] } - lower := !invert + lower := false if 0 <= y+1 && y+1 < len(bits) { lower = bits[y+1][x] } - if upper != invert && lower != invert { + if upper && lower { s += " " - } else if upper == invert && lower != invert { + } else if !upper && lower { s += "▀" - } else if upper != invert && lower == invert { + } else if upper && !lower { s += "▄" } else { s += "█" } } + if colorize { + s += terminalForegroundReset + terminalBackgroundReset + } s += "\n" } return s diff --git a/terminal_color.go b/terminal_color.go new file mode 100644 index 0000000..af92fbb --- /dev/null +++ b/terminal_color.go @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2018 Unrud + * + * This file is part of Remote-Touchpad. + * + * Foobar is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Remote-Touchpad is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + +package main + +const ( + terminalForegroundWhite string = "\033[37m" + terminalForegroundReset string = "\033[39m" + terminalBackgroundBlack string = "\033[40m" + terminalBackgroundReset string = "\033[49m" +) diff --git a/terminal_color_posix.go b/terminal_color_posix.go new file mode 100644 index 0000000..ea0e5d4 --- /dev/null +++ b/terminal_color_posix.go @@ -0,0 +1,29 @@ +// +build !windows + +/* + * Copyright (c) 2018 Unrud + * + * This file is part of Remote-Touchpad. + * + * Foobar is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Remote-Touchpad is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + +package main + +// #include +import "C" + +func terminalSupportsColor(fd uintptr) bool { + return C.isatty(C.int(fd)) != 0 +} diff --git a/terminal_color_windows.go b/terminal_color_windows.go new file mode 100644 index 0000000..4fdf76a --- /dev/null +++ b/terminal_color_windows.go @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018 Unrud + * + * This file is part of Remote-Touchpad. + * + * Foobar is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Remote-Touchpad is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + +package main + +import "syscall" + +const ( + enableProcessedOuput uint32 = 0x1 + enableWrapAtEolOutput uint32 = 0x2 + enableVirtualTerminalProcessing uint32 = 0x4 +) + +var ( + kernel32DLL = syscall.NewLazyDLL("kernel32.dll") + setConsoleModeProc = kernel32DLL.NewProc("SetConsoleMode") +) + +func terminalSupportsColor(fd uintptr) bool { + r, _, _ := setConsoleModeProc.Call(fd, uintptr(enableProcessedOuput| + enableWrapAtEolOutput|enableVirtualTerminalProcessing)) + return r != 0 +} From f7fff5468c9ad36855a75f767fbe16628bf6713c Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:34 +0200 Subject: [PATCH 005/292] mitigate race when sending text on X11 --- plugin_x11.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin_x11.go b/plugin_x11.go index 747df9f..c058090 100644 --- a/plugin_x11.go +++ b/plugin_x11.go @@ -36,7 +36,7 @@ import ( ) const ( - typingDelay time.Duration = 100 * time.Millisecond + typingDelay time.Duration = 250 * time.Millisecond scrollDiv int = 20 ) From b1f8f7ea1ce4732f03bf0204285da50f87982ddd Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:35 +0200 Subject: [PATCH 006/292] rename _dummy to _disabled --- plugin_portal_dummy.go => plugin_portal_disabled.go | 0 plugin_windows_dummy.go => plugin_windows_disabled.go | 0 plugin_x11_dummy.go => plugin_x11_disabled.go | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename plugin_portal_dummy.go => plugin_portal_disabled.go (100%) rename plugin_windows_dummy.go => plugin_windows_disabled.go (100%) rename plugin_x11_dummy.go => plugin_x11_disabled.go (100%) diff --git a/plugin_portal_dummy.go b/plugin_portal_disabled.go similarity index 100% rename from plugin_portal_dummy.go rename to plugin_portal_disabled.go diff --git a/plugin_windows_dummy.go b/plugin_windows_disabled.go similarity index 100% rename from plugin_windows_dummy.go rename to plugin_windows_disabled.go diff --git a/plugin_x11_dummy.go b/plugin_x11_disabled.go similarity index 100% rename from plugin_x11_dummy.go rename to plugin_x11_disabled.go From 5a5ad3e6c653c3f6602901093acb86898f99a854 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:35 +0200 Subject: [PATCH 007/292] hide obsolete command line arguments --- main.go | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index 40ba744..51eb452 100644 --- a/main.go +++ b/main.go @@ -131,14 +131,22 @@ func secureRandBase64(length int) string { func main() { var bind, certFile, keyFile, secret string var showVersion bool - flag.BoolVar(&showVersion, "version", false, "show program's version number and exit") - flag.StringVar(&bind, "bind", defaultBind, "bind server to [HOSTNAME]:PORT") - flag.StringVar(&secret, "secret", "", "shared secret for client authentication") - flag.StringVar(&certFile, "cert", "", "file containing TLS certificate") - flag.StringVar(&keyFile, "key", "", "file containing TLS private key") - flag.Bool("invert", false, "obsolete, not used anymore") - flag.Int("interval", 0, "obsolete, not used anymore") - flag.Parse() + parseFlags := flag.NewFlagSet(os.Args[0], flag.ContinueOnError) + for _, fs := range [](*flag.FlagSet){parseFlags, flag.CommandLine} { + fs.BoolVar(&showVersion, "version", false, "show program's version number and exit") + fs.StringVar(&bind, "bind", defaultBind, "bind server to [HOSTNAME]:PORT") + fs.StringVar(&secret, "secret", "", "shared secret for client authentication") + fs.StringVar(&certFile, "cert", "", "file containing TLS certificate") + fs.StringVar(&keyFile, "key", "", "file containing TLS private key") + } + // ignore obsolete flags for backward compatibility, but don't show them in usage message + parseFlags.Usage = func() {} + parseFlags.Bool("invert", false, "") + parseFlags.Int("interval", 0, "") + if err := parseFlags.Parse(os.Args[1:]); err != nil { + flag.Usage() + os.Exit(2) + } if showVersion { fmt.Println(version) return From ed74ab60e4ca373c87d4eba109bc819e09608619 Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:35 +0200 Subject: [PATCH 008/292] normalize line endings --- main.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/main.go b/main.go index 51eb452..5987f54 100644 --- a/main.go +++ b/main.go @@ -57,6 +57,9 @@ func processCommand(plugin Plugin, command string) error { } if command[0] == 't' { text := command[1:] + // normalize line endings + text = strings.Replace(text, "\r\n", "\n", -1) + text = strings.Replace(text, "\r", "\n", -1) if !utf8.ValidString(text) { return errors.New("invalid utf-8") } From 33c9b815b076eee927ee832e1f35b00d0a455c6a Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:36 +0200 Subject: [PATCH 009/292] use correct KeySyms for runes < 0x100 --- keysyms.generated.go | 204 +++++++++++++++++++++++++++++++++++++++++++ keysyms.generator.go | 122 ++++++++++++++++++++++++++ keysyms.go | 39 +++++++++ plugin_portal.go | 5 +- plugin_x11.go | 7 +- 5 files changed, 374 insertions(+), 3 deletions(-) create mode 100644 keysyms.generated.go create mode 100644 keysyms.generator.go create mode 100644 keysyms.go diff --git a/keysyms.generated.go b/keysyms.generated.go new file mode 100644 index 0000000..6355f49 --- /dev/null +++ b/keysyms.generated.go @@ -0,0 +1,204 @@ +package main + +var keysymsMap = map[rune]int32{ + 0x0008: 0x0000ff08, + 0x0009: 0x0000ff09, + 0x000a: 0x0000ff0a, + 0x000b: 0x0000ff0b, + 0x000d: 0x0000ff0d, + 0x0013: 0x0000ff13, + 0x0014: 0x0000ff14, + 0x0015: 0x0000ff15, + 0x001b: 0x0000ff1b, + 0x0020: 0x00000020, + 0x0021: 0x00000021, + 0x0022: 0x00000022, + 0x0023: 0x00000023, + 0x0024: 0x00000024, + 0x0025: 0x00000025, + 0x0026: 0x00000026, + 0x0027: 0x00000027, + 0x0028: 0x00000028, + 0x0029: 0x00000029, + 0x002a: 0x0000002a, + 0x002b: 0x0000002b, + 0x002c: 0x0000002c, + 0x002d: 0x0000002d, + 0x002e: 0x0000002e, + 0x002f: 0x0000002f, + 0x0030: 0x00000030, + 0x0031: 0x00000031, + 0x0032: 0x00000032, + 0x0033: 0x00000033, + 0x0034: 0x00000034, + 0x0035: 0x00000035, + 0x0036: 0x00000036, + 0x0037: 0x00000037, + 0x0038: 0x00000038, + 0x0039: 0x00000039, + 0x003a: 0x0000003a, + 0x003b: 0x0000003b, + 0x003c: 0x0000003c, + 0x003d: 0x0000003d, + 0x003e: 0x0000003e, + 0x003f: 0x0000003f, + 0x0040: 0x00000040, + 0x0041: 0x00000041, + 0x0042: 0x00000042, + 0x0043: 0x00000043, + 0x0044: 0x00000044, + 0x0045: 0x00000045, + 0x0046: 0x00000046, + 0x0047: 0x00000047, + 0x0048: 0x00000048, + 0x0049: 0x00000049, + 0x004a: 0x0000004a, + 0x004b: 0x0000004b, + 0x004c: 0x0000004c, + 0x004d: 0x0000004d, + 0x004e: 0x0000004e, + 0x004f: 0x0000004f, + 0x0050: 0x00000050, + 0x0051: 0x00000051, + 0x0052: 0x00000052, + 0x0053: 0x00000053, + 0x0054: 0x00000054, + 0x0055: 0x00000055, + 0x0056: 0x00000056, + 0x0057: 0x00000057, + 0x0058: 0x00000058, + 0x0059: 0x00000059, + 0x005a: 0x0000005a, + 0x005b: 0x0000005b, + 0x005c: 0x0000005c, + 0x005d: 0x0000005d, + 0x005e: 0x0000005e, + 0x005f: 0x0000005f, + 0x0060: 0x00000060, + 0x0061: 0x00000061, + 0x0062: 0x00000062, + 0x0063: 0x00000063, + 0x0064: 0x00000064, + 0x0065: 0x00000065, + 0x0066: 0x00000066, + 0x0067: 0x00000067, + 0x0068: 0x00000068, + 0x0069: 0x00000069, + 0x006a: 0x0000006a, + 0x006b: 0x0000006b, + 0x006c: 0x0000006c, + 0x006d: 0x0000006d, + 0x006e: 0x0000006e, + 0x006f: 0x0000006f, + 0x0070: 0x00000070, + 0x0071: 0x00000071, + 0x0072: 0x00000072, + 0x0073: 0x00000073, + 0x0074: 0x00000074, + 0x0075: 0x00000075, + 0x0076: 0x00000076, + 0x0077: 0x00000077, + 0x0078: 0x00000078, + 0x0079: 0x00000079, + 0x007a: 0x0000007a, + 0x007b: 0x0000007b, + 0x007c: 0x0000007c, + 0x007d: 0x0000007d, + 0x007e: 0x0000007e, + 0x00a0: 0x000000a0, + 0x00a1: 0x000000a1, + 0x00a2: 0x000000a2, + 0x00a3: 0x000000a3, + 0x00a4: 0x000000a4, + 0x00a5: 0x000000a5, + 0x00a6: 0x000000a6, + 0x00a7: 0x000000a7, + 0x00a8: 0x000000a8, + 0x00a9: 0x000000a9, + 0x00aa: 0x000000aa, + 0x00ab: 0x000000ab, + 0x00ac: 0x000000ac, + 0x00ad: 0x000000ad, + 0x00ae: 0x000000ae, + 0x00af: 0x000000af, + 0x00b0: 0x000000b0, + 0x00b1: 0x000000b1, + 0x00b2: 0x000000b2, + 0x00b3: 0x000000b3, + 0x00b4: 0x000000b4, + 0x00b5: 0x000000b5, + 0x00b6: 0x000000b6, + 0x00b7: 0x000000b7, + 0x00b8: 0x000000b8, + 0x00b9: 0x000000b9, + 0x00ba: 0x000000ba, + 0x00bb: 0x000000bb, + 0x00bc: 0x000000bc, + 0x00bd: 0x000000bd, + 0x00be: 0x000000be, + 0x00bf: 0x000000bf, + 0x00c0: 0x000000c0, + 0x00c1: 0x000000c1, + 0x00c2: 0x000000c2, + 0x00c3: 0x000000c3, + 0x00c4: 0x000000c4, + 0x00c5: 0x000000c5, + 0x00c6: 0x000000c6, + 0x00c7: 0x000000c7, + 0x00c8: 0x000000c8, + 0x00c9: 0x000000c9, + 0x00ca: 0x000000ca, + 0x00cb: 0x000000cb, + 0x00cc: 0x000000cc, + 0x00cd: 0x000000cd, + 0x00ce: 0x000000ce, + 0x00cf: 0x000000cf, + 0x00d0: 0x000000d0, + 0x00d1: 0x000000d1, + 0x00d2: 0x000000d2, + 0x00d3: 0x000000d3, + 0x00d4: 0x000000d4, + 0x00d5: 0x000000d5, + 0x00d6: 0x000000d6, + 0x00d7: 0x000000d7, + 0x00d8: 0x000000d8, + 0x00d9: 0x000000d9, + 0x00da: 0x000000da, + 0x00db: 0x000000db, + 0x00dc: 0x000000dc, + 0x00dd: 0x000000dd, + 0x00de: 0x000000de, + 0x00df: 0x000000df, + 0x00e0: 0x000000e0, + 0x00e1: 0x000000e1, + 0x00e2: 0x000000e2, + 0x00e3: 0x000000e3, + 0x00e4: 0x000000e4, + 0x00e5: 0x000000e5, + 0x00e6: 0x000000e6, + 0x00e7: 0x000000e7, + 0x00e8: 0x000000e8, + 0x00e9: 0x000000e9, + 0x00ea: 0x000000ea, + 0x00eb: 0x000000eb, + 0x00ec: 0x000000ec, + 0x00ed: 0x000000ed, + 0x00ee: 0x000000ee, + 0x00ef: 0x000000ef, + 0x00f0: 0x000000f0, + 0x00f1: 0x000000f1, + 0x00f2: 0x000000f2, + 0x00f3: 0x000000f3, + 0x00f4: 0x000000f4, + 0x00f5: 0x000000f5, + 0x00f6: 0x000000f6, + 0x00f7: 0x000000f7, + 0x00f8: 0x000000f8, + 0x00f9: 0x000000f9, + 0x00fa: 0x000000fa, + 0x00fb: 0x000000fb, + 0x00fc: 0x000000fc, + 0x00fd: 0x000000fd, + 0x00fe: 0x000000fe, + 0x00ff: 0x000000ff, +} diff --git a/keysyms.generator.go b/keysyms.generator.go new file mode 100644 index 0000000..57e6645 --- /dev/null +++ b/keysyms.generator.go @@ -0,0 +1,122 @@ +// +build ignore + +/* + * Copyright (c) 2018 Unrud + * + * This file is part of Remote-Touchpad. + * + * Foobar is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Remote-Touchpad is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + +package main + +import ( + "bufio" + "fmt" + "io" + "os" + "regexp" + "sort" + "strconv" +) + +const ( + keysymdefHeader string = "/usr/include/X11/keysymdef.h" + output string = "keysyms.generated.go" + maxMappedUnicode rune = 0xff +) + +var overrideKeysyms = map[string]rune{ + "XK_BackSpace": 0x08, + "XK_Tab": 0x09, + "XK_Linefeed": 0x0a, + "XK_Clear": 0x0b, + "XK_Return": 0x0d, + "XK_Pause": 0x13, + "XK_Scroll_Lock": 0x14, + "XK_Sys_Req": 0x15, + "XK_Escape": 0x1b, +} + +func main() { + f, err := os.Open(keysymdefHeader) + if err != nil { + panic(err) + } + defer f.Close() + reader := bufio.NewReader(f) + re := regexp.MustCompile("^#define" + + "\\s+([A-Za-z0-9_]+)" + // keysymName + "\\s+0x([0-9a-fA-F]+)" + // keysym + "\\s*(?:/\\*\\s*(?:U\\+([0-9A-Fa-f]+))?.*\\*/)?" + // keysymUnicode (optional) + "\\s*$") + keysymsMap := make(map[rune]int32) + for { + l, err := reader.ReadString('\n') + if err == io.EOF { + break + } else if err != nil { + panic(err) + } + submatches := re.FindStringSubmatch(l) + if len(submatches) == 0 { + continue + } + keysymName := submatches[1] + keysymTemp, err := strconv.ParseInt(submatches[2], 16, 32) + keysym := int32(keysymTemp) + if err != nil { + panic(err) + } + unicode, found := overrideKeysyms[keysymName] + if !found { + if len(submatches[3]) == 0 { + continue + } + unicodeTemp, err := strconv.ParseInt(submatches[3], 16, 32) + unicode = rune(unicodeTemp) + if err != nil { + panic(err) + } + + } + if unicode > maxMappedUnicode { + continue + } + if _, found := keysymsMap[unicode]; found { + continue + } + keysymsMap[unicode] = keysym + } + content := "package main\n\n" + + "var keysymsMap = map[rune]int32{\n" + keys := make([]rune, 0) + for key := range keysymsMap { + keys = append(keys, key) + } + sort.Slice(keys, func(i, j int) bool { return keys[i] < keys[j] }) + for _, unicode := range keys { + keysym := keysymsMap[unicode] + content += fmt.Sprintf("\t0x%04x: 0x%08x,\n", unicode, keysym) + } + content += "}\n" + o, err := os.Create(output) + if err != nil { + panic(err) + } + defer o.Close() + if _, err := o.WriteString(content); err != nil { + panic(err) + } +} diff --git a/keysyms.go b/keysyms.go new file mode 100644 index 0000000..65c7c44 --- /dev/null +++ b/keysyms.go @@ -0,0 +1,39 @@ +/* + * Copyright (c) 2018 Unrud + * + * This file is part of Remote-Touchpad. + * + * Foobar is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Remote-Touchpad is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + +package main + +//go:generate go run keysyms.generator.go + +import "errors" + +func runeToKeysym(runeValue rune) (int32, error) { + if runeValue == '\n' { + runeValue = '\r' + } + keysym, found := keysymsMap[runeValue] + if !found { + if runeValue < 0x100 || runeValue > 0x10ffff { + return 0, errors.New("rune not mappend to keysym and " + + "out of range for direct unicode mapping") + } + keysym = 0x01000000 + runeValue + } + return keysym, nil +} diff --git a/plugin_portal.go b/plugin_portal.go index 49267b8..f83f44f 100644 --- a/plugin_portal.go +++ b/plugin_portal.go @@ -193,7 +193,10 @@ func (p *portalPlugin) KeyboardText(text string) error { } inVardict := make(map[string]dbus.Variant) for _, runeValue := range text { - keysym := int32(0x01000000 + runeValue) + keysym, err := runeToKeysym(runeValue) + if err != nil { + return err + } for _, state := range [...]uint32{btnPressed, btnReleased} { if err := p.remoteDesktop.Call( "org.freedesktop.portal.RemoteDesktop.NotifyKeyboardKeysym", diff --git a/plugin_x11.go b/plugin_x11.go index c058090..0ead480 100644 --- a/plugin_x11.go +++ b/plugin_x11.go @@ -117,9 +117,12 @@ keycodes: C.XFlush(p.display) }() for _, runeValue := range text { - keysym := C.KeySym(0x01000000 + runeValue) + keysym, err := runeToKeysym(runeValue) + if err != nil { + return err + } for i := range keycodeMapping { - keycodeMapping[i] = keysym + keycodeMapping[i] = C.KeySym(keysym) } C.XChangeKeyboardMapping(p.display, C.int(emptyKeycode), keysymsPerKeycode, (*C.KeySym)(unsafe.Pointer(&keycodeMapping[0])), 1) From 8a558c0437b5543f583d4cb1fe0c816e06580eac Mon Sep 17 00:00:00 2001 From: Unrud Date: Thu, 23 Aug 2018 17:12:36 +0200 Subject: [PATCH 010/292] bump version to 0.0.6 --- CHANGELOG.md | 10 +++++++++- desktop/remote-touchpad.appdata.xml | 15 ++++++++++++--- main.go | 2 +- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e02f4f3..58c354d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.0.6 (2018-08-23) + + * use colors in terminal for QR qode + * remove ``-invert`` command line argument + * mitigate race condition when typing text on X11 + * improve KeySyms used for text on X11 and Flatpak's RemoteDesktop portal + * normalize line endings + ## 0.0.5 (2018-07-31) * remove mouse polling interval @@ -22,4 +30,4 @@ ## 0.0.1 (2018-06-23) -initial release \ No newline at end of file +initial release diff --git a/desktop/remote-touchpad.appdata.xml b/desktop/remote-touchpad.appdata.xml index 139d300..53cf563 100644 --- a/desktop/remote-touchpad.appdata.xml +++ b/desktop/remote-touchpad.appdata.xml @@ -18,6 +18,15 @@ https://github.com/Unrud/remote-touchpad Unrud + +​
    +
  • use colors in terminal for QR qode
  • +
  • remove -invert command line argument
  • +
  • mitigate race condition when typing text on X11
  • +
  • improve KeySyms used for text on X11 and Flatpak's RemoteDesktop portal
  • +
  • normalize line endings
  • +
+