use correct KeySyms for runes < 0x100
This commit is contained in:
parent
ed74ab60e4
commit
33c9b815b0
5 changed files with 374 additions and 3 deletions
204
keysyms.generated.go
Normal file
204
keysyms.generated.go
Normal file
|
|
@ -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,
|
||||||
|
}
|
||||||
122
keysyms.generator.go
Normal file
122
keysyms.generator.go
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
// +build ignore
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Unrud<unrud@outlook.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
}
|
||||||
39
keysyms.go
Normal file
39
keysyms.go
Normal file
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2018 Unrud<unrud@outlook.com>
|
||||||
|
*
|
||||||
|
* 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 <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
@ -193,7 +193,10 @@ func (p *portalPlugin) KeyboardText(text string) error {
|
||||||
}
|
}
|
||||||
inVardict := make(map[string]dbus.Variant)
|
inVardict := make(map[string]dbus.Variant)
|
||||||
for _, runeValue := range text {
|
for _, runeValue := range text {
|
||||||
keysym := int32(0x01000000 + runeValue)
|
keysym, err := runeToKeysym(runeValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
for _, state := range [...]uint32{btnPressed, btnReleased} {
|
for _, state := range [...]uint32{btnPressed, btnReleased} {
|
||||||
if err := p.remoteDesktop.Call(
|
if err := p.remoteDesktop.Call(
|
||||||
"org.freedesktop.portal.RemoteDesktop.NotifyKeyboardKeysym",
|
"org.freedesktop.portal.RemoteDesktop.NotifyKeyboardKeysym",
|
||||||
|
|
|
||||||
|
|
@ -117,9 +117,12 @@ keycodes:
|
||||||
C.XFlush(p.display)
|
C.XFlush(p.display)
|
||||||
}()
|
}()
|
||||||
for _, runeValue := range text {
|
for _, runeValue := range text {
|
||||||
keysym := C.KeySym(0x01000000 + runeValue)
|
keysym, err := runeToKeysym(runeValue)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
for i := range keycodeMapping {
|
for i := range keycodeMapping {
|
||||||
keycodeMapping[i] = keysym
|
keycodeMapping[i] = C.KeySym(keysym)
|
||||||
}
|
}
|
||||||
C.XChangeKeyboardMapping(p.display, C.int(emptyKeycode), keysymsPerKeycode,
|
C.XChangeKeyboardMapping(p.display, C.int(emptyKeycode), keysymsPerKeycode,
|
||||||
(*C.KeySym)(unsafe.Pointer(&keycodeMapping[0])), 1)
|
(*C.KeySym)(unsafe.Pointer(&keycodeMapping[0])), 1)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue