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)