Skip to content

Commit cf60384

Browse files
committed
Add missing dead characters into x11key table generation
* use source code open source from chromium project to get dead keysyms
1 parent 73e0679 commit cf60384

File tree

2 files changed

+105
-0
lines changed

2 files changed

+105
-0
lines changed

shiny/driver/internal/x11key/gen.go

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,10 @@ import (
1212
"bytes"
1313
"fmt"
1414
"go/format"
15+
"io"
1516
"io/ioutil"
1617
"log"
18+
"net/http"
1719
"os"
1820
"regexp"
1921
"strings"
@@ -29,6 +31,8 @@ func main() {
2931

3032
seen := make(map[string]struct{})
3133

34+
xkCodes := make(map[string]string)
35+
3236
buf := &bytes.Buffer{}
3337

3438
fmt.Fprintf(buf, `// generated by go generate; DO NOT EDIT.
@@ -40,15 +44,21 @@ var keysymCodePoints = map[rune]rune{
4044
`)
4145

4246
re := regexp.MustCompile(`^#define (XK_[^ ]*) *0x([[:xdigit:]]+) .*U\+([[:xdigit:]]+) (.+)(?: |\))\*/$`)
47+
reAll := regexp.MustCompile(`^#define (XK_[^ ]*) *0x([[:xdigit:]]+)`)
4348

4449
s := bufio.NewScanner(fh)
4550
for s.Scan() {
51+
mAll := reAll.FindStringSubmatch(strings.TrimSpace(s.Text()))
52+
if mAll != nil {
53+
xkCodes[mAll[1]] = mAll[2]
54+
}
4655
m := re.FindStringSubmatch(strings.TrimSpace(s.Text()))
4756
if m == nil {
4857
continue
4958
}
5059

5160
if _, isSeen := seen[m[2]]; isSeen {
61+
log.Printf("Duplicated mapped XK %s", m[2])
5262
continue
5363
}
5464
seen[m[2]] = struct{}{}
@@ -60,6 +70,45 @@ var keysymCodePoints = map[rune]rune{
6070
log.Fatalf("reading keysymdef.h: %v", err)
6171
}
6272

73+
tmpKeysymFile := os.TempDir() + "/keysym_to_unicode.cc"
74+
keysymUrl := "https://raw.githubusercontent.com/microsoft/node-native-keymap/master/deps/chromium/x/keysym_to_unicode.cc"
75+
err = DownloadFile(tmpKeysymFile, keysymUrl)
76+
if err != nil {
77+
log.Fatalf("downloading keysym_to_unicode.cc: %v", err)
78+
}
79+
80+
fh2, err := os.Open(tmpKeysymFile)
81+
if err != nil {
82+
log.Fatalf("opening keysym_to_unicode.cc: %v", err)
83+
}
84+
85+
defer fh2.Close()
86+
87+
re2 := regexp.MustCompile(`^\{(XK_[^,]*), *0x([[:xdigit:]]+)\}, *\/\/ *(.+)$`)
88+
89+
s2 := bufio.NewScanner(fh2)
90+
for s2.Scan() {
91+
m := re2.FindStringSubmatch(strings.TrimSpace(s2.Text()))
92+
if m == nil {
93+
continue
94+
}
95+
96+
var xkCode string
97+
var isXKCode bool
98+
if xkCode, isXKCode = xkCodes[m[1]]; !isXKCode {
99+
log.Printf("Unknown XK name %s", m[1])
100+
continue
101+
}
102+
103+
if _, isSeen := seen[xkCode]; isSeen {
104+
log.Printf("Already mapped XK %s", xkCode)
105+
continue
106+
}
107+
108+
fmt.Fprintf(buf, "0x%s: 0x%s, // %s:\t%s\n", xkCode, m[2], m[1], m[3])
109+
110+
}
111+
63112
fmt.Fprintf(buf, "}\n")
64113

65114
fmted, err := format.Source(buf.Bytes())
@@ -72,3 +121,26 @@ var keysymCodePoints = map[rune]rune{
72121
log.Fatalf("writing table.go: %v", err)
73122
}
74123
}
124+
125+
// DownloadFile will download a url to a local file. It's efficient because it will
126+
// write as it downloads and not load the whole file into memory.
127+
func DownloadFile(filepath string, url string) error {
128+
129+
// Get the data
130+
resp, err := http.Get(url)
131+
if err != nil {
132+
return err
133+
}
134+
defer resp.Body.Close()
135+
136+
// Create the file
137+
out, err := os.Create(filepath)
138+
if err != nil {
139+
return err
140+
}
141+
defer out.Close()
142+
143+
// Write the body to file
144+
_, err = io.Copy(out, resp.Body)
145+
return err
146+
}

shiny/driver/internal/x11key/table.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,4 +1574,37 @@ var keysymCodePoints = map[rune]rune{
15741574
0x1000df2: 0x0DF2, // XK_Sinh_ruu2: SINHALA DIGA GAETTA-PILLA
15751575
0x1000df3: 0x0DF3, // XK_Sinh_luu2: SINHALA DIGA GAYANUKITTA
15761576
0x1000df4: 0x0DF4, // XK_Sinh_kunddaliya: SINHALA KUNDDALIYA
1577+
0xfe50: 0x0300, // XK_dead_grave: COMBINING GRAVE ACCENT
1578+
0xfe51: 0x0301, // XK_dead_acute: COMBINING ACUTE ACCENT
1579+
0xfe52: 0x0302, // XK_dead_circumflex: COMBINING CIRCUMFLEX ACCENT
1580+
0xfe53: 0x0303, // XK_dead_tilde: COMBINING TILDE
1581+
0xfe54: 0x0304, // XK_dead_macron: COMBINING MACRON
1582+
0xfe55: 0x0306, // XK_dead_breve: COMBINING BREVE
1583+
0xfe56: 0x0307, // XK_dead_abovedot: COMBINING DOT ABOVE
1584+
0xfe57: 0x0308, // XK_dead_diaeresis: COMBINING DIAERESIS
1585+
0xfe58: 0x030A, // XK_dead_abovering: COMBINING RING ABOVE
1586+
0xfe59: 0x030B, // XK_dead_doubleacute: COMBINING DOUBLE ACUTE ACCENT
1587+
0xfe5a: 0x030C, // XK_dead_caron: COMBINING CARON
1588+
0xfe5b: 0x0327, // XK_dead_cedilla: COMBINING CEDILLA
1589+
0xfe5c: 0x0328, // XK_dead_ogonek: COMBINING OGONEK
1590+
0xfe5d: 0x0345, // XK_dead_iota: COMBINING GREEK YPOGEGRAMMENI
1591+
0xfe5e: 0x3099, // XK_dead_voiced_sound: COMB. KATAKANA-HIRAGANA VOICED
1592+
0xfe5f: 0x309A, // XK_dead_semivoiced_sound: COMB. KATAKANA-HIRAGANA SEMI-VOICED
1593+
0xfe60: 0x0323, // XK_dead_belowdot: COMBINING DOT BELOW
1594+
0xfe61: 0x0309, // XK_dead_hook: COMBINING HOOK ABOVE
1595+
0xfe62: 0x031B, // XK_dead_horn: COMBINING HORN
1596+
0xfe63: 0x0338, // XK_dead_stroke: COMBINING LONG SOLIDUS OVERLAY
1597+
0xfe64: 0x0313, // XK_dead_abovecomma: COMBINING COMMA ABOVE
1598+
0xfe65: 0x0314, // XK_dead_abovereversedcomma: COMBINING REVERSED COMMA ABOVE
1599+
0xfe66: 0x030F, // XK_dead_doublegrave: COMBINING DOUBLE GRAVE ACCENT
1600+
0xfe67: 0x0325, // XK_dead_belowring: COMBINING RING BELOW
1601+
0xfe68: 0x0331, // XK_dead_belowmacron: COMBINING MACRON BELOW
1602+
0xfe69: 0x032D, // XK_dead_belowcircumflex: COMBINING CIRCUMFLEX ACCENT BELOW
1603+
0xfe6a: 0x0330, // XK_dead_belowtilde: COMBINING TILDE BELOW
1604+
0xfe6b: 0x032E, // XK_dead_belowbreve: COMBINING BREVE BELOW
1605+
0xfe6c: 0x0324, // XK_dead_belowdiaeresis: COMBINING DIAERESIS BELOW
1606+
0xfe6d: 0x0311, // XK_dead_invertedbreve: COMBINING INVERTED BREVE
1607+
0xfe6e: 0x0326, // XK_dead_belowcomma: COMBINING COMMA BELOW
1608+
0xfe6f: 0x00A4, // XK_dead_currency: CURRENCY SIGN
1609+
0xfe8c: 0x037E, // XK_dead_greek: GREEK QUESTION MARK
15771610
}

0 commit comments

Comments
 (0)