detached e79265d

merge: purego-xkbcommon bindings (Veya P1)

commit
e79265dfcdc2120f43bd7b7b6b0a3f906cc2c724
author
brice · · 2026-09-28 07:11 UTC
merge of
a7f62f3 + 30529e3 · diff against the first parent
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
23 files · +19672 -1
A LICENSE +21 -0
@@ -0,0 +1,21 @@
1+MIT License
2+
3+Copyright (c) 2026 purego-xkbcommon contributors
4+
5+Permission is hereby granted, free of charge, to any person obtaining a copy
6+of this software and associated documentation files (the "Software"), to deal
7+in the Software without restriction, including without limitation the rights
8+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9+copies of the Software, and to permit persons to whom the Software is
10+furnished to do so, subject to the following conditions:
11+
12+The above copyright notice and this permission notice shall be included in all
13+copies or substantial portions of the Software.
14+
15+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21+SOFTWARE.
M README.md +18 -1
@@ -1,3 +1,20 @@
11 # purego-xkbcommon
22
3-Pure Go (no cgo) bindings for libxkbcommon, loaded at runtime with purego.
3+Go 1.27 bindings for Linux `libxkbcommon.so.0`, without cgo or X11. The safe package owns native references; the `raw` package exposes generated ABI constants, types, and function registrations. Install libxkbcommon at runtime and xkeyboard-config for rules-based keymaps. The loader reports missing libraries and required symbols via `Available`.
4+
5+```go
6+ctx, err := xkbcommon.NewContext()
7+if err != nil { return err }
8+defer ctx.Close()
9+keymap, err := ctx.NewKeymapRules("evdev", "pc105", "fr", "", "")
10+if err != nil { return err }
11+defer keymap.Close()
12+state, err := keymap.NewState()
13+if err != nil { return err }
14+defer state.Close()
15+text, err := state.UTF8(xkbcommon.WaylandKeycode(evdevKeycode))
16+```
17+
18+Use `NewKeymapFD(fd, size)` for Wayland `xkb_v1` keymaps; it copies exactly `size` bytes with `pread` (at most 16 MiB), fails on a short read, and accepts an optional trailing NUL. **The caller retains and must close the FD**, on success and failure. `UpdateMask` accepts Wayland modifier masks and group indices. `ComposeState.Feed` and `Status` distinguish composing, composed, cancelled, and ignored keysyms; use `UTF8` only for a composed result. Objects retain their native parents; close each object, in any order. Do not copy value structs containing a mutex.
19+
20+Pinned upstream headers and licenses are in `upstream/`; `upstream/METADATA` and `SHA256SUMS` identify their exact source. Run `GOWORK=off go generate ./...` to regenerate `raw/generated.go`; consumers do not run generation. The generator checks the selected ABI declarations against the headers. `github.com/bnema/purego v0.13.0-bnema.1` matches purego-vulkan and supports `Dlopen`, `Dlsym`, and `RegisterFunc` with cgo disabled.
A cmd/xkbgen/main.go +12 -0
@@ -0,0 +1,12 @@
1+package main
2+
3+import (
4+ "github.com/bnema/purego-xkbcommon/internal/gen"
5+ "log"
6+)
7+
8+func main() {
9+ if err := gen.Generate("."); err != nil {
10+ log.Fatal(err)
11+ }
12+}
A generate.go +3 -0
@@ -0,0 +1,3 @@
1+package xkbcommon
2+
3+//go:generate go run ./cmd/xkbgen
A go.mod +5 -0
@@ -0,0 +1,5 @@
1+module github.com/bnema/purego-xkbcommon
2+
3+go 1.27
4+
5+require github.com/bnema/purego v0.13.0-bnema.1
A go.sum +2 -0 generated file: collapsed
A internal/gen/gen.go +120 -0
@@ -0,0 +1,120 @@
1+// Package gen generates the deliberately bounded libxkbcommon ABI subset.
2+package gen
3+
4+import (
5+ "fmt"
6+ "go/format"
7+ "os"
8+ "regexp"
9+ "strconv"
10+ "strings"
11+)
12+
13+var comments = regexp.MustCompile(`(?s)/\*.*?\*/|//[^\n]*`)
14+
15+func clean(s string) string { return comments.ReplaceAllString(s, "") }
16+func declared(h, name string) bool {
17+ re := regexp.MustCompile(`(?m)\b` + regexp.QuoteMeta(name) + `\s*\([^;{}]*\)\s*;`)
18+ return re.MatchString(clean(h))
19+}
20+
21+var def = regexp.MustCompile(`(?m)^\s*#define\s+(XKB_(?:KEY_|MOD_NAME_|VMOD_NAME_|LED_NAME_)[A-Za-z0-9_]+)\s+("[^"]*"|0x[0-9a-fA-F]+|[0-9]+)\b?`)
22+var en = regexp.MustCompile(`(?s)enum\s+xkb_[a-z_]+\s*\{([^}]*)\}`)
23+var item = regexp.MustCompile(`^\s*(XKB_[A-Z][A-Z0-9_]*)(?:\s*=\s*(.+))?$`)
24+
25+func constants(h string) string {
26+ h = clean(h)
27+ var b strings.Builder
28+ for _, e := range en.FindAllStringSubmatch(h, -1) {
29+ last := int64(-1)
30+ for _, part := range strings.Split(e[1], ",") {
31+ m := item.FindStringSubmatch(strings.TrimSpace(part))
32+ if m == nil {
33+ continue
34+ }
35+ expr := strings.TrimSpace(m[2])
36+ if expr == "" {
37+ last++
38+ expr = strconv.FormatInt(last, 10)
39+ } else if n, err := strconv.ParseInt(expr, 0, 64); err == nil {
40+ last = n
41+ } else if v := regexp.MustCompile(`^\(1 << (\d+)\)$`).FindStringSubmatch(expr); v != nil {
42+ shift, _ := strconv.Atoi(v[1])
43+ last = 1 << shift
44+ } else {
45+ continue
46+ }
47+ fmt.Fprintf(&b, "%s = %s\n", m[1], expr)
48+ }
49+ }
50+ for _, m := range def.FindAllStringSubmatch(h, -1) {
51+ fmt.Fprintf(&b, "%s = %s\n", m[1], m[2])
52+ }
53+ return b.String()
54+}
55+
56+// Functions describes the bound ABI; each name is checked against the pinned headers.
57+// Pointers are uintptr to avoid GC passing Go pointers to native code unexpectedly.
58+var Functions = []struct{ Name, Signature string }{
59+ {"xkb_context_new", "func(uint32) uintptr"}, {"xkb_context_ref", "func(uintptr) uintptr"}, {"xkb_context_unref", "func(uintptr)"},
60+ {"xkb_keymap_new_from_names", "func(uintptr, uintptr, uint32) uintptr"}, {"xkb_keymap_new_from_string", "func(uintptr, uintptr, uint32, uint32) uintptr"}, {"xkb_keymap_new_from_buffer", "func(uintptr, uintptr, uintptr, uint32, uint32) uintptr"},
61+ {"xkb_keymap_ref", "func(uintptr) uintptr"}, {"xkb_keymap_unref", "func(uintptr)"}, {"xkb_keymap_get_as_string", "func(uintptr,uint32) uintptr"},
62+ {"xkb_keymap_mod_get_index", "func(uintptr,uintptr) uint32"}, {"xkb_keymap_num_layouts", "func(uintptr) uint32"},
63+ {"xkb_state_new", "func(uintptr) uintptr"}, {"xkb_state_ref", "func(uintptr) uintptr"}, {"xkb_state_unref", "func(uintptr)"},
64+ {"xkb_state_update_mask", "func(uintptr,uint32,uint32,uint32,uint32,uint32,uint32) uint32"},
65+ {"xkb_state_serialize_layout", "func(uintptr,uint32) uint32"}, {"xkb_state_serialize_mods", "func(uintptr,uint32) uint32"},
66+ {"xkb_state_key_get_one_sym", "func(uintptr,uint32) uint32"}, {"xkb_state_key_get_utf8", "func(uintptr,uint32,uintptr,uintptr) int32"},
67+ {"xkb_keysym_get_name", "func(uint32,uintptr,uintptr) int32"}, {"xkb_keysym_from_name", "func(uintptr,uint32) uint32"},
68+ {"xkb_compose_table_new_from_locale", "func(uintptr,uintptr,uint32) uintptr"}, {"xkb_compose_table_ref", "func(uintptr) uintptr"}, {"xkb_compose_table_unref", "func(uintptr)"},
69+ {"xkb_compose_state_new", "func(uintptr,uint32) uintptr"}, {"xkb_compose_state_ref", "func(uintptr) uintptr"}, {"xkb_compose_state_unref", "func(uintptr)"},
70+ {"xkb_compose_state_feed", "func(uintptr,uint32) uint32"}, {"xkb_compose_state_get_status", "func(uintptr) uint32"},
71+ {"xkb_compose_state_reset", "func(uintptr)"}, {"xkb_compose_state_get_utf8", "func(uintptr,uintptr,uintptr) int32"}, {"xkb_compose_state_get_one_sym", "func(uintptr) uint32"},
72+}
73+
74+func field(name string) string { return strings.ToUpper(name[:1]) + name[1:] }
75+func Generate(root string) error {
76+ h1, err := os.ReadFile(root + "/upstream/xkbcommon.h")
77+ if err != nil {
78+ return err
79+ }
80+ h2, err := os.ReadFile(root + "/upstream/xkbcommon-compose.h")
81+ if err != nil {
82+ return err
83+ }
84+ hdr := string(h1) + "\n" + string(h2)
85+ var b strings.Builder
86+ b.WriteString("// Code generated by go generate; DO NOT EDIT.\npackage raw\n\n")
87+ b.WriteString("// Opaque C handles and scalar typedefs.\ntype Context uintptr\ntype Keymap uintptr\ntype State uintptr\ntype ComposeTable uintptr\ntype ComposeState uintptr\ntype Keycode uint32\ntype Keysym uint32\ntype LayoutIndex uint32\ntype ModIndex uint32\ntype ModMask uint32\ntype LayoutMask uint32\n")
88+ b.WriteString("// RuleNames matches struct xkb_rule_names (five const char pointers).\ntype RuleNames struct { Rules, Model, Layout, Variant, Options uintptr }\n")
89+ b.WriteString("const (\n" + constants(hdr))
90+ for _, f := range []string{"xkbcommon-keysyms.h", "xkbcommon-names.h"} {
91+ data, e := os.ReadFile(root + "/upstream/" + f)
92+ if e != nil {
93+ return e
94+ }
95+ b.WriteString(constants(string(data)))
96+ }
97+ b.WriteString(")\n\n// Funcs holds resolved library functions.\ntype Funcs struct {\n")
98+ for _, f := range Functions {
99+ if !declared(hdr, f.Name) {
100+ return fmt.Errorf("missing pinned declaration: %s", f.Name)
101+ }
102+ fmt.Fprintf(&b, "%s %s\n", field(f.Name), f.Signature)
103+ }
104+ b.WriteString("}\n\n// Symbols is the complete required symbol set.\nvar Symbols = []string{\n")
105+ for _, f := range Functions {
106+ fmt.Fprintf(&b, "%q,\n", f.Name)
107+ }
108+ b.WriteString("}\n\n// Register registers prevalidated addresses in a Funcs value.\nfunc Register(f *Funcs, register func(any,uintptr)) {\n")
109+ for _, f := range Functions {
110+ fmt.Fprintf(&b, "register(&f.%s, addresses[%q])\n", field(f.Name), f.Name)
111+ }
112+ b.WriteString("}\n")
113+ // address map is passed in, not a global mutable singleton.
114+ s := strings.Replace(b.String(), "func Register(f *Funcs, register func(any,uintptr))", "func Register(f *Funcs, addresses map[string]uintptr, register func(any,uintptr))", 1)
115+ formatted, err := format.Source([]byte(s))
116+ if err != nil {
117+ return fmt.Errorf("format generated file: %w", err)
118+ }
119+ return os.WriteFile(root+"/raw/generated.go", formatted, 0644)
120+}
A internal/gen/gen_test.go +25 -0
@@ -0,0 +1,25 @@
1+package gen
2+
3+import (
4+ "strings"
5+ "testing"
6+)
7+
8+func TestDeclarations(t *testing.T) {
9+ h := "/* xkb_fake(void); */\nXKB_EXPORT struct xkb_context *\nxkb_context_new(enum xkb_context_flags flags);"
10+ if !declared(h, "xkb_context_new") || declared(h, "xkb_fake") {
11+ t.Fatal("incorrect declaration selection")
12+ }
13+ if declared(h, "xkb_context_unref") {
14+ t.Fatal("missing declaration accepted")
15+ }
16+}
17+func TestConstants(t *testing.T) {
18+ h := "enum xkb_test { XKB_A = (1 << 2), XKB_B, XKB_C = 0x10 };\n#define XKB_MOD_NAME_SHIFT \"Shift\"\n#define XKB_KEY_dead_acute 0xfe51\n"
19+ got := constants(h)
20+ for _, want := range []string{"XKB_A = (1 << 2)", "XKB_B = 5", "XKB_C = 0x10", "XKB_MOD_NAME_SHIFT = \"Shift\"", "XKB_KEY_dead_acute = 0xfe51"} {
21+ if !strings.Contains(got, want) {
22+ t.Fatalf("missing %s in %s", want, got)
23+ }
24+ }
25+}
A loader.go +50 -0
@@ -0,0 +1,50 @@
1+package xkbcommon
2+
3+import (
4+ "fmt"
5+ "sync"
6+
7+ "github.com/bnema/purego"
8+ "github.com/bnema/purego-xkbcommon/raw"
9+)
10+
11+var loader struct {
12+ sync.Once
13+ f raw.Funcs
14+ err error
15+}
16+
17+// resolveLibrary keeps path and required symbols injectable for diagnostic tests.
18+// On success it leaves the library open for the lifetime of registered functions.
19+func resolveLibrary(path string, symbols []string) (map[string]uintptr, error) {
20+ lib, err := purego.Dlopen(path, purego.RTLD_NOW|purego.RTLD_LOCAL)
21+ if err != nil {
22+ return nil, fmt.Errorf("xkbcommon: load %s: %w", path, err)
23+ }
24+ addresses := make(map[string]uintptr, len(symbols))
25+ for _, name := range symbols {
26+ address, e := purego.Dlsym(lib, name)
27+ if e != nil || address == 0 {
28+ _ = purego.Dlclose(lib)
29+ return nil, fmt.Errorf("xkbcommon: incompatible %s: missing %s: %v", path, name, e)
30+ }
31+ addresses[name] = address
32+ }
33+ return addresses, nil
34+}
35+
36+// Available resolves the SONAME and every required symbol, reporting the first
37+// incompatible symbol rather than failing later in a keyboard event callback.
38+func Available() error {
39+ loader.Do(func() {
40+ addresses, err := resolveLibrary("libxkbcommon.so.0", raw.Symbols)
41+ if err != nil {
42+ loader.err = err
43+ return
44+ }
45+ raw.Register(&loader.f, addresses, purego.RegisterFunc)
46+ // Intentionally keep the library open: registered function pointers and live
47+ // native objects remain valid for the process lifetime.
48+ })
49+ return loader.err
50+}
A raw/generated.go +2834 -0 large diff (2834 lines changed): collapsed
A testdata/keymaps/de.xkb +2090 -0 large diff (2090 lines changed): collapsed
A testdata/keymaps/fr.xkb +2084 -0 large diff (2084 lines changed): collapsed
A testdata/keymaps/us.xkb +2081 -0 large diff (2081 lines changed): collapsed
A testdata/keymaps/us_fr.xkb +2227 -0 large diff (2227 lines changed): collapsed
A upstream/LICENSE +279 -0
@@ -0,0 +1,279 @@
1+The following is a list of all copyright notices and license statements which
2+appear in the xkbcommon source tree, along with the SPDX short license
3+identifiers which source files use to refer to them. To see which parts are
4+covered by which license and copyright, refer to the source files.
5+
6+If making new contributions, the MIT License is vastly preferred.
7+
8+All licenses are derivative of the MIT/X11 license, mostly identical other
9+than no-endorsement clauses (e.g. paragraph 4 of The Open Group's license).
10+
11+These statements are split into two sections: one for the code compiled and
12+distributed as part of the libxkbcommon shared library and the code component
13+of all tests, and another only for the test data under test/data, which is
14+distributed with the xkbcommon source code, but not installed to the system.
15+
16+BEGINNING OF SOFTWARE COPYRIGHT/LICENSE STATEMENTS:
17+
18+
19+-------------------------------------------------------------------------------
20+SPDX full name: MIT License
21+SPDX short identifier: MIT
22+License text:
23+
24+Copyright © 2008-2009 Dan Nicholson <dbn.lists@gmail.com>
25+Copyright © 2009-2012, 2016 Daniel Stone <daniel@fooishbar.org>
26+Copyright © 2012-2014, 2020-2022, 2025 Ran Benita <ran@unusedvar.com>
27+Copyright © 2010-2012, 2016 Intel Corporation
28+Copyright © 2013-2015, 2018-2020 Red Hat, Inc.
29+Copyright © 2023-2024 Pierre Le Marre <dev@wismill.eu>
30+Copyright (c) 1991, Oracle and/or its affiliates.
31+Copyright © 2008-2011 Kristian Høgsberg
32+Copyright © 2010 Francisco Jerez <currojerez@riseup.net>
33+Copyright © 2012 Collabora, Ltd.
34+Copyright © 2015 Kazunobu Kuriyama <kazunobu.kuriyama@nifty.com>
35+Copyright (C) 2011 Joseph Adams <joeyadams3.14159@gmail.com>
36+
37+Permission is hereby granted, free of charge, to any person obtaining a
38+copy of this software and associated documentation files (the "Software"),
39+to deal in the Software without restriction, including without limitation
40+the rights to use, copy, modify, merge, publish, distribute, sublicense,
41+and/or sell copies of the Software, and to permit persons to whom the
42+Software is furnished to do so, subject to the following conditions:
43+
44+The above copyright notice and this permission notice (including the next
45+paragraph) shall be included in all copies or substantial portions of the
46+Software.
47+
48+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
49+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
50+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
51+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
52+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
53+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
54+DEALINGS IN THE SOFTWARE.
55+
56+
57+-------------------------------------------------------------------------------
58+SPDX full name: MIT Open Group variant
59+SPDX short identifier: MIT-open-group
60+License text:
61+
62+Copyright 1985, 1987, 1988, 1990, 1998 The Open Group
63+
64+Permission is hereby granted, free of charge, to any person obtaining a
65+copy of this software and associated documentation files (the "Software"),
66+to deal in the Software without restriction, including without limitation
67+the rights to use, copy, modify, merge, publish, distribute, sublicense,
68+and/or sell copies of the Software, and to permit persons to whom the
69+Software is furnished to do so, subject to the following conditions:
70+
71+The above copyright notice and this permission notice shall be included in
72+all copies or substantial portions of the Software.
73+
74+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
75+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
76+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
77+AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
78+ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
79+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
80+
81+Except as contained in this notice, the names of the authors or their
82+institutions shall not be used in advertising or otherwise to promote the
83+sale, use or other dealings in this Software without prior written
84+authorization from the authors.
85+
86+
87+-------------------------------------------------------------------------------
88+SPDX full name: Historical Permission Notice and Disclaimer
89+SPDX short identifier: HPND
90+License text:
91+
92+Copyright (c) 1993, 1994, 1995, 1996 by Silicon Graphics Computer Systems, Inc.
93+
94+Permission to use, copy, modify, and distribute this
95+software and its documentation for any purpose and without
96+fee is hereby granted, provided that the above copyright
97+notice appear in all copies and that both that copyright
98+notice and this permission notice appear in supporting
99+documentation, and that the name of Silicon Graphics not be
100+used in advertising or publicity pertaining to distribution
101+of the software without specific prior written permission.
102+Silicon Graphics makes no representation about the suitability
103+of this software for any purpose. It is provided "as is"
104+without any express or implied warranty.
105+
106+SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
107+SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
108+AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON
109+GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
110+DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
111+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
112+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH
113+THE USE OR PERFORMANCE OF THIS SOFTWARE.
114+
115+-------------------------------------------------------------------------------
116+SPDX full name: Historical Permission Notice and Disclaimer - sell variant
117+SPDX short identifier: HPND-sell-variant
118+License text:
119+
120+Copyright 1992 by Oki Technosystems Laboratory, Inc.
121+Copyright 1992 by Fuji Xerox Co., Ltd.
122+
123+Permission to use, copy, modify, distribute, and sell this software
124+and its documentation for any purpose is hereby granted without fee,
125+provided that the above copyright notice appear in all copies and
126+that both that copyright notice and this permission notice appear
127+in supporting documentation, and that the name of Oki Technosystems
128+Laboratory and Fuji Xerox not be used in advertising or publicity
129+pertaining to distribution of the software without specific, written
130+prior permission.
131+Oki Technosystems Laboratory and Fuji Xerox make no representations
132+about the suitability of this software for any purpose. It is provided
133+"as is" without express or implied warranty.
134+
135+OKI TECHNOSYSTEMS LABORATORY AND FUJI XEROX DISCLAIM ALL WARRANTIES
136+WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
137+MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL OKI TECHNOSYSTEMS
138+LABORATORY AND FUJI XEROX BE LIABLE FOR ANY SPECIAL, INDIRECT OR
139+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
140+OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
141+OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
142+OR PERFORMANCE OF THIS SOFTWARE.
143+
144+
145+-------------------------------------------------------------------------------
146+SPDX full name: <none>
147+SPDX short identifier: LicenseRef-digital-equipment-corporation
148+License text:
149+
150+Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
151+
152+ All Rights Reserved
153+
154+Permission to use, copy, modify, and distribute this software and its
155+documentation for any purpose and without fee is hereby granted,
156+provided that the above copyright notice appear in all copies and that
157+both that copyright notice and this permission notice appear in
158+supporting documentation, and that the name of Digital not be
159+used in advertising or publicity pertaining to distribution of the
160+software without specific, written prior permission.
161+
162+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
163+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
164+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
165+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
166+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
167+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
168+SOFTWARE.
169+
170+
171+-------------------------------------------------------------------------------
172+
173+
174+
175+END OF SOFTWARE COPYRIGHT/LICENSE STATEMENTS
176+
177+
178+BEGINNING OF LICENSE STATEMENTS ONLY FOR UNDISTRIBUTED DATA FILES IN test/data,
179+derived from xkeyboard-config and libX11 nls/ directory:
180+
181+
182+
183+-------------------------------------------------------------------------------
184+SPDX full name: Historical Permission Notice and Disclaimer - sell variant
185+SPDX short identifier: HPND-sell-variant
186+
187+Copyright 1996 by Joseph Moss
188+Copyright (C) 2002-2007 Free Software Foundation, Inc.
189+Copyright (C) Dmitry Golubev <lastguru@mail.ru>, 2003-2004
190+Copyright (C) 2004, Gregory Mokhin <mokhin@bog.msu.ru>
191+Copyright (C) 2006 Erdal Ronahî
192+
193+Permission to use, copy, modify, distribute, and sell this software and its
194+documentation for any purpose is hereby granted without fee, provided that
195+the above copyright notice appear in all copies and that both that
196+copyright notice and this permission notice appear in supporting
197+documentation, and that the name of the copyright holder(s) not be used in
198+advertising or publicity pertaining to distribution of the software without
199+specific, written prior permission. The copyright holder(s) makes no
200+representations about the suitability of this software for any purpose. It
201+is provided "as is" without express or implied warranty.
202+
203+THE COPYRIGHT HOLDER(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
204+INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
205+EVENT SHALL THE COPYRIGHT HOLDER(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
206+CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
207+DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
208+TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
209+PERFORMANCE OF THIS SOFTWARE.
210+
211+
212+-------------------------------------------------------------------------------
213+SPDX full name: MIT License
214+SPDX short identifier: MIT
215+
216+Copyright 2004-2005 Sun Microsystems, Inc. All rights reserved.
217+
218+
219+-------------------------------------------------------------------------------
220+SPDX full name: X11 License
221+SPDX short identifier: X11
222+License text:
223+
224+Copyright (c) 1996 X Consortium
225+
226+Permission is hereby granted, free of charge, to any person obtaining
227+a copy of this software and associated documentation files (the
228+"Software"), to deal in the Software without restriction, including
229+without limitation the rights to use, copy, modify, merge, publish,
230+distribute, sublicense, and/or sell copies of the Software, and to
231+permit persons to whom the Software is furnished to do so, subject to
232+the following conditions:
233+
234+The above copyright notice and this permission notice shall be
235+included in all copies or substantial portions of the Software.
236+
237+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
238+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
239+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
240+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
241+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
242+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
243+OTHER DEALINGS IN THE SOFTWARE.
244+
245+Except as contained in this notice, the name of the X Consortium shall
246+not be used in advertising or otherwise to promote the sale, use or
247+other dealings in this Software without prior written authorization
248+from the X Consortium.
249+
250+
251+
252+-------------------------------------------------------------------------------
253+SPDX full name: MIT Open Group variant
254+SPDX short identifier: MIT-open-group
255+
256+Copyright (C) 2004, 2006 Ævar Arnfjörð Bjarmason <avarab@gmail.com>
257+
258+
259+-------------------------------------------------------------------------------
260+SPDX full name: <none>
261+SPDX short identifier: MIT-open-group
262+SPDX short identifier: LicenseRef-anton-zinoviev
263+License text:
264+
265+Copyright (C) 1999, 2000 by Anton Zinoviev <anton@lml.bas.bg>
266+
267+This software may be used, modified, copied, distributed, and sold,
268+in both source and binary form provided that the above copyright
269+and these terms are retained. Under no circumstances is the author
270+responsible for the proper functioning of this software, nor does
271+the author assume any responsibility for damages incurred with its
272+use.
273+
274+Permission is granted to anyone to use, distribute and modify
275+this file in any way, provided that the above copyright notice
276+is left intact and the author of the modification summarizes
277+the changes in this header.
278+
279+This file is distributed without any expressed or implied warranty.
A upstream/METADATA +6 -0
@@ -0,0 +1,6 @@
1+Source: https://github.com/xkbcommon/libxkbcommon
2+Tag: xkbcommon-1.13.2
3+Commit: d1442aaa6b635551182e83c3b55037f4c118c962
4+Files: include/xkbcommon/{xkbcommon.h,xkbcommon-compose.h,xkbcommon-keysyms.h,xkbcommon-names.h}, LICENSE
5+SHA-256: see SHA256SUMS (paths relative to repository root)
6+Note: the keysyms header includes third-party copyright and license notices; preserve it verbatim.
A upstream/SHA256SUMS +5 -0
@@ -0,0 +1,5 @@
1+967e97b28658f0037bbe164a237bdfb0c3ec790e67f6c29372ea5b09306f61f3 upstream/LICENSE
2+6e2d985b3653c3674df87731931b98a68e4dcb72d5ff90e457708e8e16ce818d upstream/xkbcommon-compose.h
3+17e58db5edc299d13b4365adce6c6d805e16642977ffaacf98d9be0c4c7071ff upstream/xkbcommon.h
4+13023369f65a17411606084e3e09557b4886aeb15f89affba4aaa86490a463f3 upstream/xkbcommon-keysyms.h
5+a5b0ed01c8b1816da8b5ed29cf776eb2ad1f707cf03ff74e62e36a5ca9009f61 upstream/xkbcommon-names.h
A upstream/xkbcommon-compose.h +621 -0
@@ -0,0 +1,621 @@
1+/*
2+ * Copyright © 2013 Ran Benita
3+ * SPDX-License-Identifier: MIT
4+ */
5+
6+#ifndef _XKBCOMMON_COMPOSE_H
7+#define _XKBCOMMON_COMPOSE_H
8+
9+#include <xkbcommon/xkbcommon.h>
10+
11+#ifdef __cplusplus
12+extern "C" {
13+#endif
14+
15+/**
16+ * @file
17+ * libxkbcommon Compose API - support for Compose and dead-keys.
18+ */
19+
20+/**
21+ * @defgroup compose Compose and dead-keys support
22+ * Support for Compose and dead-keys.
23+ * @since 0.5.0
24+ *
25+ * @{
26+ */
27+
28+/**
29+ * @page compose-overview Overview
30+ * @parblock
31+ *
32+ * Compose and dead-keys are a common feature of many keyboard input
33+ * systems. They extend the range of the keysyms that can be produced
34+ * directly from a keyboard by using a sequence of key strokes, instead
35+ * of just one.
36+ *
37+ * Here are some example sequences, in the libX11 Compose file format:
38+ *
39+ * <dead_acute> <a> : "á" aacute # LATIN SMALL LETTER A WITH ACUTE
40+ * <Multi_key> <A> <T> : "@" at # COMMERCIAL AT
41+ *
42+ * When the user presses a key which produces the `<dead_acute>` keysym,
43+ * nothing initially happens (thus the key is dubbed a *dead-key*). But
44+ * when the user enters `<a>`, “á” is *composed*, in place of “a”. If
45+ * instead the user had entered a keysym which does not follow
46+ * `<dead_acute>` in any compose sequence, the sequence is said to be
47+ * *cancelled*.
48+ *
49+ * Compose files define many such sequences. For a description of the
50+ * common file format for Compose files, see the `Compose(5)` man page.
51+ *
52+ * A successfully-composed sequence has two results: a keysym and a UTF-8
53+ * string. At least one of the two is defined for each sequence. If only
54+ * a keysym is given, the keysym’s string representation is used for the
55+ * result string (using xkb_keysym_to_utf8()).
56+ *
57+ * This library provides low-level support for Compose file parsing and
58+ * processing. Higher-level APIs (such as libX11’s `Xutf8LookupString(3)`)
59+ * may be built upon it, or it can be used directly.
60+ *
61+ * @endparblock
62+ */
63+
64+/**
65+ * @page compose-conflicting Conflicting Sequences
66+ * @parblock
67+ *
68+ * To avoid ambiguity, a sequence is not allowed to be a prefix of another.
69+ * When such a conflict occurs, the sequence defined last is the one retained.
70+ *
71+ * Sequences of length 1 are allowed.
72+ *
73+ * @endparblock
74+ */
75+
76+/**
77+ * @page compose-cancellation Cancellation Behavior
78+ * @parblock
79+ *
80+ * What should happen when a sequence is cancelled? For example, consider
81+ * there are only the above sequences, and the input keysyms are
82+ * `<dead_acute> <b>`. There are a few approaches:
83+ *
84+ * 1. Swallow the cancelling keysym; that is, no keysym is produced.
85+ * This is the approach taken by libX11.
86+ * 2. Let the cancelling keysym through; that is, `<b>` is produced.
87+ * 3. Replay the entire sequence; that is, `<dead_acute> <b>` is produced.
88+ * This is the approach taken by Microsoft Windows (approximately;
89+ * instead of `<dead_acute>`, the underlying key is used. This is
90+ * difficult to simulate with XKB keymaps).
91+ *
92+ * You can program whichever approach best fits users' expectations.
93+ *
94+ * @endparblock
95+ */
96+
97+/**
98+ * @struct xkb_compose_table
99+ * Opaque Compose table object.
100+ *
101+ * The compose table holds the definitions of the Compose sequences, as
102+ * gathered from Compose files. It is immutable.
103+ */
104+struct xkb_compose_table;
105+
106+/**
107+ * @struct xkb_compose_state
108+ * Opaque Compose state object.
109+ *
110+ * The compose state maintains state for compose sequence matching, such
111+ * as which possible sequences are being matched, and the position within
112+ * these sequences. It acts as a simple state machine wherein keysyms are
113+ * the input, and composed keysyms and strings are the output.
114+ *
115+ * The compose state is usually associated with a keyboard device.
116+ */
117+struct xkb_compose_state;
118+
119+/** Flags affecting Compose file compilation. */
120+enum xkb_compose_compile_flags {
121+ /** Do not apply any flags. */
122+ XKB_COMPOSE_COMPILE_NO_FLAGS = 0
123+};
124+
125+/** The recognized Compose file formats. */
126+enum xkb_compose_format {
127+ /** The classic libX11 Compose text format, described in Compose(5). */
128+ XKB_COMPOSE_FORMAT_TEXT_V1 = 1
129+};
130+
131+/**
132+ * @page compose-locale Compose Locale
133+ * @parblock
134+ *
135+ * Compose files are locale dependent:
136+ * - Compose files are written for a locale, and the locale is used when
137+ * searching for the appropriate file to use.
138+ * - Compose files may reference the locale internally, with directives
139+ * such as `%%L`.
140+ *
141+ * As such, functions like `xkb_compose_table::xkb_compose_table_new_from_locale()`
142+ * require a `locale` parameter. This will usually be the current locale (see
143+ * `locale(7)` for more details). You may also want to allow the user to
144+ * explicitly configure it, so he can use the Compose file of a given
145+ * locale, but not use that locale for other things.
146+ *
147+ * You may query the current locale as follows:
148+ *
149+ * ```c
150+ * const char *locale;
151+ * locale = setlocale(LC_CTYPE, NULL);
152+ * ```
153+ *
154+ * This will only give useful results if the program had previously set
155+ * the current locale using setlocale(3), with `LC_CTYPE` or `LC_ALL`
156+ * and a non-`NULL` argument.
157+ *
158+ * If you prefer not to use the locale system of the C runtime library,
159+ * you may nevertheless obtain the user’s locale directly using
160+ * environment variables, as described in `locale(7)`. For example,
161+ *
162+ * ```c
163+ * const char *locale;
164+ * locale = getenv("LC_ALL");
165+ * if (!locale || !*locale)
166+ * locale = getenv("LC_CTYPE");
167+ * if (!locale || !*locale)
168+ * locale = getenv("LANG");
169+ * if (!locale || !*locale)
170+ * locale = "C";
171+ * ```
172+ *
173+ * Note that some locales supported by the C standard library may not
174+ * have a Compose file assigned.
175+ *
176+ * @endparblock
177+ */
178+
179+/**
180+ * Create a compose table for a given locale.
181+ *
182+ * The locale is used for searching the file-system for an appropriate
183+ * Compose file. The search order is described in Compose(5). It is
184+ * affected by the following environment variables:
185+ *
186+ * 1. `XCOMPOSEFILE` - see Compose(5).
187+ * 2. `XDG_CONFIG_HOME` - before `$HOME/.XCompose` is checked,
188+ * `$XDG_CONFIG_HOME/XCompose` is checked (with a fall back to
189+ * `$HOME/.config/XCompose` if `XDG_CONFIG_HOME` is not defined).
190+ * This is a libxkbcommon extension to the search procedure in
191+ * Compose(5) (since libxkbcommon 1.0.0). Note that other
192+ * implementations, such as libX11, might not find a Compose file in
193+ * this path.
194+ * 3. `HOME` - see Compose(5).
195+ * 4. `XLOCALEDIR` - if set, used as the base directory for the system’s
196+ * X locale files, e.g. `/usr/share/X11/locale`, instead of the
197+ * preconfigured directory.
198+ *
199+ * Since 1.12, system locales not registered in `$XLOCALEDIR` will fallback
200+ * to `en_US.UTF-8`, if missing locale detection is supported by the C standard
201+ * library in use.
202+ *
203+ * @param context
204+ * The library context in which to create the compose table.
205+ * @param locale
206+ * The current locale. See @ref compose-locale.
207+ * \n
208+ * The value is copied, so it is safe to pass the result of `getenv(3)`
209+ * (or similar) without fear of it being invalidated by a subsequent
210+ * `setenv(3)` (or similar).
211+ * @param flags
212+ * Optional flags for the compose table, or 0.
213+ *
214+ * @returns A compose table for the given locale, or `NULL` if the
215+ * compilation failed or a Compose file was not found.
216+ *
217+ * @memberof xkb_compose_table
218+ */
219+XKB_EXPORT struct xkb_compose_table *
220+xkb_compose_table_new_from_locale(struct xkb_context *context,
221+ const char *locale,
222+ enum xkb_compose_compile_flags flags);
223+
224+/**
225+ * Create a new compose table from a Compose file.
226+ *
227+ * @param context
228+ * The library context in which to create the compose table.
229+ * @param file
230+ * The Compose file to compile.
231+ * @param locale
232+ * The current locale. See @ref compose-locale.
233+ * @param format
234+ * The text format of the Compose file to compile.
235+ * @param flags
236+ * Optional flags for the compose table, or 0.
237+ *
238+ * @returns A compose table compiled from the given file, or `NULL` if
239+ * the compilation failed.
240+ *
241+ * @memberof xkb_compose_table
242+ */
243+XKB_EXPORT struct xkb_compose_table *
244+xkb_compose_table_new_from_file(struct xkb_context *context,
245+ FILE *file,
246+ const char *locale,
247+ enum xkb_compose_format format,
248+ enum xkb_compose_compile_flags flags);
249+
250+/**
251+ * Create a new compose table from a memory buffer.
252+ *
253+ * This is just like xkb_compose_table_new_from_file(), but instead of
254+ * a file, gets the table as one enormous string.
255+ *
256+ * @see xkb_compose_table_new_from_file()
257+ * @memberof xkb_compose_table
258+ */
259+XKB_EXPORT struct xkb_compose_table *
260+xkb_compose_table_new_from_buffer(struct xkb_context *context,
261+ const char *buffer, size_t length,
262+ const char *locale,
263+ enum xkb_compose_format format,
264+ enum xkb_compose_compile_flags flags);
265+
266+/**
267+ * Take a new reference on a compose table.
268+ *
269+ * @returns The passed in object.
270+ *
271+ * @memberof xkb_compose_table
272+ */
273+XKB_EXPORT struct xkb_compose_table *
274+xkb_compose_table_ref(struct xkb_compose_table *table);
275+
276+/**
277+ * Release a reference on a compose table, and possibly free it.
278+ *
279+ * @param table The object. If it is `NULL`, this function does nothing.
280+ *
281+ * @memberof xkb_compose_table
282+ */
283+XKB_EXPORT void
284+xkb_compose_table_unref(struct xkb_compose_table *table);
285+
286+/**
287+ * @struct xkb_compose_table_entry
288+ * Opaque Compose table entry object.
289+ *
290+ * Represents a single entry in a Compose file in the iteration API.
291+ * It is immutable.
292+ *
293+ * @sa xkb_compose_table_iterator_new
294+ * @since 1.6.0
295+ */
296+struct xkb_compose_table_entry;
297+
298+/**
299+ * Get the left-hand keysym sequence of a Compose table entry.
300+ *
301+ * For example, given the following entry:
302+ *
303+ * ```
304+ * <dead_tilde> <space> : "~" asciitilde # TILDE
305+ * ```
306+ *
307+ * it will return `{XKB_KEY_dead_tilde, XKB_KEY_space}`.
308+ *
309+ * @param[in] entry The compose table entry object to process.
310+ *
311+ * @param[out] sequence_length Number of keysyms in the sequence.
312+ *
313+ * @returns The array of left-hand side keysyms. The number of keysyms
314+ * is returned in the @p sequence_length out-parameter.
315+ *
316+ * @memberof xkb_compose_table_entry
317+ * @since 1.6.0
318+ */
319+XKB_EXPORT const xkb_keysym_t *
320+xkb_compose_table_entry_sequence(struct xkb_compose_table_entry *entry,
321+ size_t *sequence_length);
322+
323+/**
324+ * Get the right-hand result keysym of a Compose table entry.
325+ *
326+ * For example, given the following entry:
327+ *
328+ * ```
329+ * <dead_tilde> <space> : "~" asciitilde # TILDE
330+ * ```
331+ *
332+ * it will return `XKB_KEY_asciitilde`.
333+ *
334+ * The keysym is optional; if the entry does not specify a keysym,
335+ * returns `XKB_KEY_NoSymbol`.
336+ *
337+ * @memberof xkb_compose_table_entry
338+ * @since 1.6.0
339+ */
340+XKB_EXPORT xkb_keysym_t
341+xkb_compose_table_entry_keysym(struct xkb_compose_table_entry *entry);
342+
343+/**
344+ * Get the right-hand result string of a Compose table entry.
345+ *
346+ * The string is UTF-8 encoded and `NULL`-terminated.
347+ *
348+ * For example, given the following entry:
349+ *
350+ * ```
351+ * <dead_tilde> <space> : "~" asciitilde # TILDE
352+ * ```
353+ *
354+ * it will return `"~"`.
355+ *
356+ * The string is optional; if the entry does not specify a string,
357+ * returns the empty string.
358+ *
359+ * @memberof xkb_compose_table_entry
360+ * @since 1.6.0
361+ */
362+XKB_EXPORT const char *
363+xkb_compose_table_entry_utf8(struct xkb_compose_table_entry *entry);
364+
365+/**
366+ * @struct xkb_compose_table_iterator
367+ * Iterator over a compose table’s entries.
368+ *
369+ * @sa xkb_compose_table_iterator_new()
370+ * @since 1.6.0
371+ */
372+struct xkb_compose_table_iterator;
373+
374+/**
375+ * Create a new iterator for a compose table.
376+ *
377+ * Intended use:
378+ *
379+ * ```c
380+ * struct xkb_compose_table_iterator *iter = xkb_compose_table_iterator_new(compose_table);
381+ * struct xkb_compose_table_entry *entry;
382+ * while ((entry = xkb_compose_table_iterator_next(iter))) {
383+ * // ...
384+ * }
385+ * xkb_compose_table_iterator_free(iter);
386+ * ```
387+ *
388+ * @returns A new compose table iterator, or `NULL` on failure.
389+ *
390+ * @memberof xkb_compose_table_iterator
391+ * @sa xkb_compose_table_iterator_free()
392+ * @since 1.6.0
393+ */
394+XKB_EXPORT struct xkb_compose_table_iterator *
395+xkb_compose_table_iterator_new(struct xkb_compose_table *table);
396+
397+/**
398+ * Free a compose iterator.
399+ *
400+ * @memberof xkb_compose_table_iterator
401+ * @since 1.6.0
402+ */
403+XKB_EXPORT void
404+xkb_compose_table_iterator_free(struct xkb_compose_table_iterator *iter);
405+
406+/**
407+ * Get the next compose entry from a compose table iterator.
408+ *
409+ * The entries are returned in lexicographic order of the left-hand
410+ * side of entries. This does not correspond to the order in which
411+ * the entries appear in the Compose file.
412+ *
413+ * @attention The return value is valid until the next call to this function.
414+ *
415+ * Returns `NULL` in case there is no more entries.
416+ *
417+ * @memberof xkb_compose_table_iterator
418+ * @since 1.6.0
419+ */
420+XKB_EXPORT struct xkb_compose_table_entry *
421+xkb_compose_table_iterator_next(struct xkb_compose_table_iterator *iter);
422+
423+/** Flags for compose state creation. */
424+enum xkb_compose_state_flags {
425+ /** Do not apply any flags. */
426+ XKB_COMPOSE_STATE_NO_FLAGS = 0
427+};
428+
429+/**
430+ * Create a new compose state object.
431+ *
432+ * @param table
433+ * The compose table the state will use.
434+ * @param flags
435+ * Optional flags for the compose state, or 0.
436+ *
437+ * @returns A new compose state, or `NULL` on failure.
438+ *
439+ * @memberof xkb_compose_state
440+ */
441+XKB_EXPORT struct xkb_compose_state *
442+xkb_compose_state_new(struct xkb_compose_table *table,
443+ enum xkb_compose_state_flags flags);
444+
445+/**
446+ * Take a new reference on a compose state object.
447+ *
448+ * @returns The passed in object.
449+ *
450+ * @memberof xkb_compose_state
451+ */
452+XKB_EXPORT struct xkb_compose_state *
453+xkb_compose_state_ref(struct xkb_compose_state *state);
454+
455+/**
456+ * Release a reference on a compose state object, and possibly free it.
457+ *
458+ * @param state The object. If `NULL`, do nothing.
459+ *
460+ * @memberof xkb_compose_state
461+ */
462+XKB_EXPORT void
463+xkb_compose_state_unref(struct xkb_compose_state *state);
464+
465+/**
466+ * Get the compose table which a compose state object is using.
467+ *
468+ * @returns The compose table which was passed to xkb_compose_state_new()
469+ * when creating this state object.
470+ *
471+ * This function does not take a new reference on the compose table; you
472+ * must explicitly reference it yourself if you plan to use it beyond the
473+ * lifetime of the state.
474+ *
475+ * @memberof xkb_compose_state
476+ */
477+XKB_EXPORT struct xkb_compose_table *
478+xkb_compose_state_get_compose_table(struct xkb_compose_state *state);
479+
480+/** Status of the Compose sequence state machine. */
481+enum xkb_compose_status {
482+ /** The initial state; no sequence has started yet. */
483+ XKB_COMPOSE_NOTHING,
484+ /** In the middle of a sequence. */
485+ XKB_COMPOSE_COMPOSING,
486+ /** A complete sequence has been matched. */
487+ XKB_COMPOSE_COMPOSED,
488+ /** The last sequence was cancelled due to an unmatched keysym. */
489+ XKB_COMPOSE_CANCELLED
490+};
491+
492+/** The effect of a keysym fed to xkb_compose_state_feed(). */
493+enum xkb_compose_feed_result {
494+ /** The keysym had no effect - it did not affect the status. */
495+ XKB_COMPOSE_FEED_IGNORED,
496+ /** The keysym started, advanced or cancelled a sequence. */
497+ XKB_COMPOSE_FEED_ACCEPTED
498+};
499+
500+/**
501+ * Feed one keysym to the Compose sequence state machine.
502+ *
503+ * This function can advance into a compose sequence, cancel a sequence,
504+ * start a new sequence, or do nothing in particular. The resulting
505+ * status may be observed with `xkb_compose_state_get_status()`.
506+ *
507+ * Some keysyms, such as keysyms for modifier keys, are ignored - they
508+ * have no effect on the status or otherwise.
509+ *
510+ * The following is a description of the possible status transitions, in
511+ * the format CURRENT STATUS => NEXT STATUS, given a non-ignored input
512+ * keysym `keysym`:
513+ *
514+ @verbatim
515+ NOTHING or CANCELLED or COMPOSED =>
516+ NOTHING if keysym does not start a sequence.
517+ COMPOSING if keysym starts a sequence.
518+ COMPOSED if keysym starts and terminates a single-keysym sequence.
519+
520+ COMPOSING =>
521+ COMPOSING if keysym advances any of the currently possible
522+ sequences but does not terminate any of them.
523+ COMPOSED if keysym terminates one of the currently possible
524+ sequences.
525+ CANCELLED if keysym does not advance any of the currently
526+ possible sequences.
527+ @endverbatim
528+ *
529+ * The current Compose formats do not support multiple-keysyms. Therefore, if
530+ * you are using a function such as `xkb_state::xkb_state_key_get_syms()`
531+ * and it returns more than one keysym, consider feeding `XKB_KEY_NoSymbol`
532+ * instead.
533+ *
534+ * @param state
535+ * The compose state object.
536+ * @param keysym
537+ * A keysym, usually obtained after a key-press event, with a
538+ * function such as `xkb_state::xkb_state_key_get_one_sym()`.
539+ *
540+ * @returns Whether the keysym was ignored. This is useful, for example,
541+ * if you want to keep a record of the sequence matched thus far.
542+ *
543+ * @memberof xkb_compose_state
544+ */
545+XKB_EXPORT enum xkb_compose_feed_result
546+xkb_compose_state_feed(struct xkb_compose_state *state,
547+ xkb_keysym_t keysym);
548+
549+/**
550+ * Reset the Compose sequence state machine.
551+ *
552+ * The status is set to `::XKB_COMPOSE_NOTHING`, and the current sequence
553+ * is discarded.
554+ *
555+ * @memberof xkb_compose_state
556+ */
557+XKB_EXPORT void
558+xkb_compose_state_reset(struct xkb_compose_state *state);
559+
560+/**
561+ * Get the current status of the compose state machine.
562+ *
563+ * @see xkb_compose_status
564+ * @memberof xkb_compose_state
565+ **/
566+XKB_EXPORT enum xkb_compose_status
567+xkb_compose_state_get_status(struct xkb_compose_state *state);
568+
569+/**
570+ * Get the result Unicode/UTF-8 string for a composed sequence.
571+ *
572+ * See @ref compose-overview for more details. This function is only
573+ * useful when the status is `::XKB_COMPOSE_COMPOSED`.
574+ *
575+ * @param[in] state
576+ * The compose state.
577+ * @param[out] buffer
578+ * A buffer to write the string into.
579+ * @param[in] size
580+ * Size of the buffer.
581+ *
582+ * @warning If the buffer passed is too small, the string is truncated
583+ * (though still `NULL`-terminated).
584+ *
585+ * @returns
586+ * The number of bytes required for the string, excluding the `NULL` byte.
587+ * If the sequence is not complete, or does not have a viable result
588+ * string, returns 0, and sets `buffer` to the empty string (if possible).
589+ * @returns
590+ * You may check if truncation has occurred by comparing the return value
591+ * with the size of `buffer`, similarly to the `snprintf(3)` function.
592+ * You may safely pass `NULL` and 0 to `buffer` and `size` to find the
593+ * required size (without the `NULL`-byte).
594+ *
595+ * @memberof xkb_compose_state
596+ **/
597+XKB_EXPORT int
598+xkb_compose_state_get_utf8(struct xkb_compose_state *state,
599+ char *buffer, size_t size);
600+
601+/**
602+ * Get the result keysym for a composed sequence.
603+ *
604+ * See @ref compose-overview for more details. This function is only
605+ * useful when the status is `::XKB_COMPOSE_COMPOSED`.
606+ *
607+ * @returns The result keysym. If the sequence is not complete, or does
608+ * not specify a result keysym, returns `XKB_KEY_NoSymbol`.
609+ *
610+ * @memberof xkb_compose_state
611+ **/
612+XKB_EXPORT xkb_keysym_t
613+xkb_compose_state_get_one_sym(struct xkb_compose_state *state);
614+
615+/** @} */
616+
617+#ifdef __cplusplus
618+} /* extern "C" */
619+#endif
620+
621+#endif /* _XKBCOMMON_COMPOSE_H */
A upstream/xkbcommon-keysyms.h +3545 -0
@@ -0,0 +1,3545 @@
1+#ifndef _XKBCOMMON_KEYSYMS_H
2+#define _XKBCOMMON_KEYSYMS_H
3+
4+/* This file is autogenerated; please do not commit directly. */
5+
6+/**
7+ * @file
8+ * Key symbols (keysyms) definitions.
9+ */
10+
11+#define XKB_KEY_NoSymbol 0x000000 /* Special KeySym */
12+
13+/***********************************************************
14+Copyright 1987, 1994, 1998 The Open Group
15+
16+Permission to use, copy, modify, distribute, and sell this software and its
17+documentation for any purpose is hereby granted without fee, provided that
18+the above copyright notice appear in all copies and that both that
19+copyright notice and this permission notice appear in supporting
20+documentation.
21+
22+The above copyright notice and this permission notice shall be included
23+in all copies or substantial portions of the Software.
24+
25+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
26+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
27+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
28+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
29+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
30+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
31+OTHER DEALINGS IN THE SOFTWARE.
32+
33+Except as contained in this notice, the name of The Open Group shall
34+not be used in advertising or otherwise to promote the sale, use or
35+other dealings in this Software without prior written authorization
36+from The Open Group.
37+
38+
39+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts
40+
41+ All Rights Reserved
42+
43+Permission to use, copy, modify, and distribute this software and its
44+documentation for any purpose and without fee is hereby granted,
45+provided that the above copyright notice appear in all copies and that
46+both that copyright notice and this permission notice appear in
47+supporting documentation, and that the name of Digital not be
48+used in advertising or publicity pertaining to distribution of the
49+software without specific, written prior permission.
50+
51+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
52+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
53+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
54+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
55+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
56+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
57+SOFTWARE.
58+
59+******************************************************************/
60+
61+/*
62+ * The "X11 Window System Protocol" standard defines in Appendix A the
63+ * keysym codes. These 29-bit integer values identify characters or
64+ * functions associated with each key (e.g., via the visible
65+ * engraving) of a keyboard layout. This file assigns mnemonic macro
66+ * names for these keysyms.
67+ *
68+ * This file is also compiled (by src/util/makekeys.c in libX11) into
69+ * hash tables that can be accessed with X11 library functions such as
70+ * XStringToKeysym() and XKeysymToString().
71+ *
72+ * Where a keysym corresponds one-to-one to an ISO 10646 / Unicode
73+ * character, this is noted in a comment that provides both the U+xxxx
74+ * Unicode position, as well as the official Unicode name of the
75+ * character.
76+ *
77+ * Some keysyms map to a character already mapped by another keysym,
78+ * with compatible but more precise semantics, such as the keypad-
79+ * related keysyms. In this case, none of the keysym are deprecated.
80+ * The most generic keysym is annotated as previously and more specific
81+ * keysyms have the same annotation between angle brackets:
82+ *
83+ * #define XKB_KEY_space 0x0020 // U+0020 SPACE
84+ * #define XKB_KEY_KP_Space 0xff80 //<U+0020 SPACE>
85+ *
86+ * Where the correspondence is either not one-to-one or semantically
87+ * unclear, the Unicode position and name are enclosed in
88+ * parentheses. Such legacy keysyms should be considered deprecated
89+ * and are not recommended for use in future keyboard mappings.
90+ *
91+ * For any future extension of the keysyms with characters already
92+ * found in ISO 10646 / Unicode, the following algorithm shall be
93+ * used. The new keysym code position will simply be the character's
94+ * Unicode number plus 0x01000000. The keysym values in the range
95+ * 0x01000100 to 0x0110ffff are reserved to represent Unicode
96+ * characters in the range U+0100 to U+10FFFF.
97+ *
98+ * While most newer Unicode-based X11 clients do already accept
99+ * Unicode-mapped keysyms in the range 0x01000100 to 0x0110ffff, it
100+ * will remain necessary for clients -- in the interest of
101+ * compatibility with existing servers -- to also understand the
102+ * existing legacy keysym values in the range 0x0100 to 0x20ff.
103+ *
104+ * Where several mnemonic names are defined for the same keysym in this
105+ * file, the first one listed is considered the "canonical" name. This
106+ * is the name that should be used when retrieving a keysym name from
107+ * its code. The next names are considered "aliases" to the canonical
108+ * name.
109+ *
110+ * Aliases are made explicit by writing in their comment "alias for",
111+ * followed by the corresponding canonical name. Example:
112+ *
113+ * #define XKB_KEY_dead_tilde 0xfe53
114+ * #define XKB_KEY_dead_perispomeni 0xfe53 // alias for dead_tilde
115+ *
116+ * The rules to consider a keysym mnemonic name deprecated are:
117+ *
118+ * 1. A legacy keysym with its Unicode mapping in parentheses is
119+ * deprecated (see above).
120+ *
121+ * 2. A keysym name is *explicitly* deprecated by starting its comment
122+ * with "deprecated". Examples:
123+ *
124+ * #define XKB_KEY_L1 0xffc8 // deprecated alias for F11
125+ * #define XKB_KEY_quoteleft 0x0060 // deprecated
126+ *
127+ * 3. A keysym name is *explicitly* *not* deprecated by starting its
128+ * comment with "non-deprecated alias". Examples:
129+ *
130+ * #define XKB_KEY_dead_tilde 0xfe53
131+ * #define XKB_KEY_dead_perispomeni 0xfe53 // non-deprecated alias for dead_tilde
132+ *
133+ * 4. If none of the previous rules apply, an alias is *implicitly*
134+ * deprecated if there is at least one previous name for the
135+ * corresponding keysym that is *not* explicitly deprecated.
136+ *
137+ * Examples:
138+ *
139+ * // SingleCandidate is the canonical name
140+ * #define XKB_KEY_SingleCandidate 0xff3c
141+ * // Hangul_SingleCandidate is deprecated because it is an alias
142+ * // and it does not start with "non-deprecated alias"
143+ * #define XKB_KEY_Hangul_SingleCandidate 0xff3c // Single candidate
144+ *
145+ * // guillemotleft is the canonical name, but it is deprecated
146+ * #define XKB_KEY_guillemotleft 0x00ab // deprecated alias for guillemetleft (misspelling)
147+ * // guillemetleft is not deprecated, because the keysym has no endorsed name before it.
148+ * #define XKB_KEY_guillemetleft 0x00ab // U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
149+ * // The following hypothetical name is deprecated because guillemetleft come before.
150+ * #define XKB_KEY_guillemetleft2 0x00ab
151+ *
152+ * Mnemonic names for keysyms are defined in this file with lines
153+ * that match one of these Perl regular expressions:
154+ *
155+ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\* U\+([0-9A-F]{4,6}) (.*) \*\/\s*$/
156+ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*<U\+([0-9A-F]{4,6}) (.*)>\*\/\s*$/
157+ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*\/\*\(U\+([0-9A-F]{4,6}) (.*)\)\*\/\s*$/
158+ * /^\#define XKB_KEY_([a-zA-Z_0-9]+)\s+0x([0-9a-f]+)\s*(\/\*\s*(.*)\s*\*\/)?\s*$/
159+ *
160+ * Before adding new keysyms, please do consider the following: In
161+ * addition to the keysym names defined in this file, the
162+ * XStringToKeysym() and XKeysymToString() functions will also handle
163+ * any keysym string of the form "U0020" to "U007E" and "U00A0" to
164+ * "U10FFFF" for all possible Unicode characters. In other words,
165+ * every possible Unicode character has already a keysym string
166+ * defined algorithmically, even if it is not listed here. Therefore,
167+ * defining an additional keysym macro is only necessary where a
168+ * non-hexadecimal mnemonic name is needed, or where the new keysym
169+ * does not represent any existing Unicode character.
170+ *
171+ * When adding new keysyms to this file, do not forget to also update the
172+ * following as needed:
173+ *
174+ * - the mappings in src/KeyBind.c in the libX11 repo
175+ * https://gitlab.freedesktop.org/xorg/lib/libx11
176+ *
177+ * - the protocol specification in specs/keysyms.xml in this repo
178+ * https://gitlab.freedesktop.org/xorg/proto/xorgproto
179+ *
180+ * Before removing or changing the order of the keysyms, please consider
181+ * the following: it is very difficult to know what keysyms are used and
182+ * how.
183+ *
184+ * - A sandboxed application may have incompatibilities with the host
185+ * system. For example, if new keysym name is introduced and is made
186+ * the canonical name, then an application with an older keysym parser
187+ * will not be able to parse the new name.
188+ * - Customization of keyboard layout and Compose files are two popular
189+ * use cases. Checking the standard keyboard layout database xkeyboard-config
190+ * https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config
191+ * and the standard Compose files in libx11
192+ * https://gitlab.freedesktop.org/xorg/lib/libx11 is a mandatory
193+ * step, but may *not* be enough for a proper impact assessment for
194+ * e.g. keysyms removals.
195+ *
196+ * Therefore, it is advised to proceed to no removal and to make a new
197+ * name canonical only 10 years after its introduction. This means that
198+ * some keysyms may have their first listed name deprecated during the
199+ * period of transition. Once this period is over, the deprecated name
200+ * should be moved after the new canonical name.
201+ */
202+
203+#define XKB_KEY_VoidSymbol 0xffffff /* Void symbol */
204+
205+/*
206+ * TTY function keys, cleverly chosen to map to ASCII, for convenience of
207+ * programming, but could have been arbitrary (at the cost of lookup
208+ * tables in client code).
209+ */
210+
211+#define XKB_KEY_BackSpace 0xff08 /* U+0008 BACKSPACE */
212+#define XKB_KEY_Tab 0xff09 /* U+0009 CHARACTER TABULATION */
213+#define XKB_KEY_Linefeed 0xff0a /* U+000A LINE FEED */
214+#define XKB_KEY_Clear 0xff0b /* U+000B LINE TABULATION */
215+#define XKB_KEY_Return 0xff0d /* U+000D CARRIAGE RETURN */
216+#define XKB_KEY_Pause 0xff13 /* Pause, hold */
217+#define XKB_KEY_Scroll_Lock 0xff14
218+#define XKB_KEY_Sys_Req 0xff15
219+#define XKB_KEY_Escape 0xff1b /* U+001B ESCAPE */
220+#define XKB_KEY_Delete 0xffff /* U+007F DELETE */
221+
222+
223+
224+/* International & multi-key character composition */
225+
226+#define XKB_KEY_Multi_key 0xff20 /* Multi-key character compose */
227+#define XKB_KEY_Codeinput 0xff37
228+#define XKB_KEY_SingleCandidate 0xff3c
229+#define XKB_KEY_MultipleCandidate 0xff3d
230+#define XKB_KEY_PreviousCandidate 0xff3e
231+
232+/* Japanese keyboard support */
233+
234+#define XKB_KEY_Kanji 0xff21 /* Kanji, Kanji convert */
235+#define XKB_KEY_Muhenkan 0xff22 /* Cancel Conversion */
236+#define XKB_KEY_Henkan_Mode 0xff23 /* Start/Stop Conversion */
237+#define XKB_KEY_Henkan 0xff23 /* non-deprecated alias for Henkan_Mode */
238+#define XKB_KEY_Romaji 0xff24 /* to Romaji */
239+#define XKB_KEY_Hiragana 0xff25 /* to Hiragana */
240+#define XKB_KEY_Katakana 0xff26 /* to Katakana */
241+#define XKB_KEY_Hiragana_Katakana 0xff27 /* Hiragana/Katakana toggle */
242+#define XKB_KEY_Zenkaku 0xff28 /* to Zenkaku */
243+#define XKB_KEY_Hankaku 0xff29 /* to Hankaku */
244+#define XKB_KEY_Zenkaku_Hankaku 0xff2a /* Zenkaku/Hankaku toggle */
245+#define XKB_KEY_Touroku 0xff2b /* Add to Dictionary */
246+#define XKB_KEY_Massyo 0xff2c /* Delete from Dictionary */
247+#define XKB_KEY_Kana_Lock 0xff2d /* Kana Lock */
248+#define XKB_KEY_Kana_Shift 0xff2e /* Kana Shift */
249+#define XKB_KEY_Eisu_Shift 0xff2f /* Alphanumeric Shift */
250+#define XKB_KEY_Eisu_toggle 0xff30 /* Alphanumeric toggle */
251+#define XKB_KEY_Kanji_Bangou 0xff37 /* Codeinput */
252+#define XKB_KEY_Zen_Koho 0xff3d /* Multiple/All Candidate(s) */
253+#define XKB_KEY_Mae_Koho 0xff3e /* Previous Candidate */
254+
255+/* 0xff31 thru 0xff3f are under XK_KOREAN */
256+
257+/* Cursor control & motion */
258+
259+#define XKB_KEY_Home 0xff50
260+#define XKB_KEY_Left 0xff51 /* Move left, left arrow */
261+#define XKB_KEY_Up 0xff52 /* Move up, up arrow */
262+#define XKB_KEY_Right 0xff53 /* Move right, right arrow */
263+#define XKB_KEY_Down 0xff54 /* Move down, down arrow */
264+#define XKB_KEY_Prior 0xff55 /* Prior, previous */
265+#define XKB_KEY_Page_Up 0xff55 /* deprecated alias for Prior */
266+#define XKB_KEY_Next 0xff56 /* Next */
267+#define XKB_KEY_Page_Down 0xff56 /* deprecated alias for Next */
268+#define XKB_KEY_End 0xff57 /* EOL */
269+#define XKB_KEY_Begin 0xff58 /* BOL */
270+
271+
272+/* Misc functions */
273+
274+#define XKB_KEY_Select 0xff60 /* Select, mark */
275+#define XKB_KEY_Print 0xff61
276+#define XKB_KEY_Execute 0xff62 /* Execute, run, do */
277+#define XKB_KEY_Insert 0xff63 /* Insert, insert here */
278+#define XKB_KEY_Undo 0xff65
279+#define XKB_KEY_Redo 0xff66 /* Redo, again */
280+#define XKB_KEY_Menu 0xff67
281+#define XKB_KEY_Find 0xff68 /* Find, search */
282+#define XKB_KEY_Cancel 0xff69 /* Cancel, stop, abort, exit */
283+#define XKB_KEY_Help 0xff6a /* Help */
284+#define XKB_KEY_Break 0xff6b
285+#define XKB_KEY_ISO_Group_Shift 0xff7e
286+#define XKB_KEY_Mode_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
287+#define XKB_KEY_script_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
288+#define XKB_KEY_Num_Lock 0xff7f
289+
290+/* Keypad functions, keypad numbers cleverly chosen to map to ASCII */
291+
292+#define XKB_KEY_KP_Space 0xff80 /*<U+0020 SPACE>*/
293+#define XKB_KEY_KP_Tab 0xff89 /*<U+0009 CHARACTER TABULATION>*/
294+#define XKB_KEY_KP_Enter 0xff8d /*<U+000D CARRIAGE RETURN>*/
295+#define XKB_KEY_KP_F1 0xff91 /* PF1, KP_A, ... */
296+#define XKB_KEY_KP_F2 0xff92
297+#define XKB_KEY_KP_F3 0xff93
298+#define XKB_KEY_KP_F4 0xff94
299+#define XKB_KEY_KP_Home 0xff95
300+#define XKB_KEY_KP_Left 0xff96
301+#define XKB_KEY_KP_Up 0xff97
302+#define XKB_KEY_KP_Right 0xff98
303+#define XKB_KEY_KP_Down 0xff99
304+#define XKB_KEY_KP_Prior 0xff9a
305+#define XKB_KEY_KP_Page_Up 0xff9a /* deprecated alias for KP_Prior */
306+#define XKB_KEY_KP_Next 0xff9b
307+#define XKB_KEY_KP_Page_Down 0xff9b /* deprecated alias for KP_Next */
308+#define XKB_KEY_KP_End 0xff9c
309+#define XKB_KEY_KP_Begin 0xff9d
310+#define XKB_KEY_KP_Insert 0xff9e
311+#define XKB_KEY_KP_Delete 0xff9f
312+#define XKB_KEY_KP_Equal 0xffbd /*<U+003D EQUALS SIGN>*/
313+#define XKB_KEY_KP_Multiply 0xffaa /*<U+002A ASTERISK>*/
314+#define XKB_KEY_KP_Add 0xffab /*<U+002B PLUS SIGN>*/
315+#define XKB_KEY_KP_Separator 0xffac /*<U+002C COMMA>*/
316+#define XKB_KEY_KP_Subtract 0xffad /*<U+002D HYPHEN-MINUS>*/
317+#define XKB_KEY_KP_Decimal 0xffae /*<U+002E FULL STOP>*/
318+#define XKB_KEY_KP_Divide 0xffaf /*<U+002F SOLIDUS>*/
319+
320+#define XKB_KEY_KP_0 0xffb0 /*<U+0030 DIGIT ZERO>*/
321+#define XKB_KEY_KP_1 0xffb1 /*<U+0031 DIGIT ONE>*/
322+#define XKB_KEY_KP_2 0xffb2 /*<U+0032 DIGIT TWO>*/
323+#define XKB_KEY_KP_3 0xffb3 /*<U+0033 DIGIT THREE>*/
324+#define XKB_KEY_KP_4 0xffb4 /*<U+0034 DIGIT FOUR>*/
325+#define XKB_KEY_KP_5 0xffb5 /*<U+0035 DIGIT FIVE>*/
326+#define XKB_KEY_KP_6 0xffb6 /*<U+0036 DIGIT SIX>*/
327+#define XKB_KEY_KP_7 0xffb7 /*<U+0037 DIGIT SEVEN>*/
328+#define XKB_KEY_KP_8 0xffb8 /*<U+0038 DIGIT EIGHT>*/
329+#define XKB_KEY_KP_9 0xffb9 /*<U+0039 DIGIT NINE>*/
330+
331+
332+
333+/*
334+ * Auxiliary functions; note the duplicate definitions for left and right
335+ * function keys; Sun keyboards and a few other manufacturers have such
336+ * function key groups on the left and/or right sides of the keyboard.
337+ * We've not found a keyboard with more than 35 function keys total.
338+ */
339+
340+#define XKB_KEY_F1 0xffbe
341+#define XKB_KEY_F2 0xffbf
342+#define XKB_KEY_F3 0xffc0
343+#define XKB_KEY_F4 0xffc1
344+#define XKB_KEY_F5 0xffc2
345+#define XKB_KEY_F6 0xffc3
346+#define XKB_KEY_F7 0xffc4
347+#define XKB_KEY_F8 0xffc5
348+#define XKB_KEY_F9 0xffc6
349+#define XKB_KEY_F10 0xffc7
350+#define XKB_KEY_F11 0xffc8
351+#define XKB_KEY_L1 0xffc8 /* deprecated alias for F11 */
352+#define XKB_KEY_F12 0xffc9
353+#define XKB_KEY_L2 0xffc9 /* deprecated alias for F12 */
354+#define XKB_KEY_F13 0xffca
355+#define XKB_KEY_L3 0xffca /* deprecated alias for F13 */
356+#define XKB_KEY_F14 0xffcb
357+#define XKB_KEY_L4 0xffcb /* deprecated alias for F14 */
358+#define XKB_KEY_F15 0xffcc
359+#define XKB_KEY_L5 0xffcc /* deprecated alias for F15 */
360+#define XKB_KEY_F16 0xffcd
361+#define XKB_KEY_L6 0xffcd /* deprecated alias for F16 */
362+#define XKB_KEY_F17 0xffce
363+#define XKB_KEY_L7 0xffce /* deprecated alias for F17 */
364+#define XKB_KEY_F18 0xffcf
365+#define XKB_KEY_L8 0xffcf /* deprecated alias for F18 */
366+#define XKB_KEY_F19 0xffd0
367+#define XKB_KEY_L9 0xffd0 /* deprecated alias for F19 */
368+#define XKB_KEY_F20 0xffd1
369+#define XKB_KEY_L10 0xffd1 /* deprecated alias for F20 */
370+#define XKB_KEY_F21 0xffd2
371+#define XKB_KEY_R1 0xffd2 /* deprecated alias for F21 */
372+#define XKB_KEY_F22 0xffd3
373+#define XKB_KEY_R2 0xffd3 /* deprecated alias for F22 */
374+#define XKB_KEY_F23 0xffd4
375+#define XKB_KEY_R3 0xffd4 /* deprecated alias for F23 */
376+#define XKB_KEY_F24 0xffd5
377+#define XKB_KEY_R4 0xffd5 /* deprecated alias for F24 */
378+#define XKB_KEY_F25 0xffd6
379+#define XKB_KEY_R5 0xffd6 /* deprecated alias for F25 */
380+#define XKB_KEY_F26 0xffd7
381+#define XKB_KEY_R6 0xffd7 /* deprecated alias for F26 */
382+#define XKB_KEY_F27 0xffd8
383+#define XKB_KEY_R7 0xffd8 /* deprecated alias for F27 */
384+#define XKB_KEY_F28 0xffd9
385+#define XKB_KEY_R8 0xffd9 /* deprecated alias for F28 */
386+#define XKB_KEY_F29 0xffda
387+#define XKB_KEY_R9 0xffda /* deprecated alias for F29 */
388+#define XKB_KEY_F30 0xffdb
389+#define XKB_KEY_R10 0xffdb /* deprecated alias for F30 */
390+#define XKB_KEY_F31 0xffdc
391+#define XKB_KEY_R11 0xffdc /* deprecated alias for F31 */
392+#define XKB_KEY_F32 0xffdd
393+#define XKB_KEY_R12 0xffdd /* deprecated alias for F32 */
394+#define XKB_KEY_F33 0xffde
395+#define XKB_KEY_R13 0xffde /* deprecated alias for F33 */
396+#define XKB_KEY_F34 0xffdf
397+#define XKB_KEY_R14 0xffdf /* deprecated alias for F34 */
398+#define XKB_KEY_F35 0xffe0
399+#define XKB_KEY_R15 0xffe0 /* deprecated alias for F35 */
400+
401+/* Modifiers */
402+
403+#define XKB_KEY_Shift_L 0xffe1 /* Left shift */
404+#define XKB_KEY_Shift_R 0xffe2 /* Right shift */
405+#define XKB_KEY_Control_L 0xffe3 /* Left control */
406+#define XKB_KEY_Control_R 0xffe4 /* Right control */
407+#define XKB_KEY_Caps_Lock 0xffe5 /* Caps lock */
408+#define XKB_KEY_Shift_Lock 0xffe6 /* Shift lock */
409+
410+#define XKB_KEY_Meta_L 0xffe7 /* Left meta */
411+#define XKB_KEY_Meta_R 0xffe8 /* Right meta */
412+#define XKB_KEY_Alt_L 0xffe9 /* Left alt */
413+#define XKB_KEY_Alt_R 0xffea /* Right alt */
414+#define XKB_KEY_Super_L 0xffeb /* Left super */
415+#define XKB_KEY_Super_R 0xffec /* Right super */
416+#define XKB_KEY_Hyper_L 0xffed /* Left hyper */
417+#define XKB_KEY_Hyper_R 0xffee /* Right hyper */
418+
419+/*
420+ * Keyboard (XKB) Extension function and modifier keys
421+ * (from Appendix C of "The X Keyboard Extension: Protocol Specification")
422+ * Byte 3 = 0xfe
423+ */
424+
425+#define XKB_KEY_ISO_Lock 0xfe01
426+#define XKB_KEY_ISO_Level2_Latch 0xfe02
427+#define XKB_KEY_ISO_Level3_Shift 0xfe03
428+#define XKB_KEY_ISO_Level3_Latch 0xfe04
429+#define XKB_KEY_ISO_Level3_Lock 0xfe05
430+#define XKB_KEY_ISO_Level5_Shift 0xfe11
431+#define XKB_KEY_ISO_Level5_Latch 0xfe12
432+#define XKB_KEY_ISO_Level5_Lock 0xfe13
433+/* XKB_KEY_ISO_Group_Shift 0xff7e (see above) */
434+#define XKB_KEY_ISO_Group_Latch 0xfe06
435+#define XKB_KEY_ISO_Group_Lock 0xfe07
436+#define XKB_KEY_ISO_Next_Group 0xfe08
437+#define XKB_KEY_ISO_Next_Group_Lock 0xfe09
438+#define XKB_KEY_ISO_Prev_Group 0xfe0a
439+#define XKB_KEY_ISO_Prev_Group_Lock 0xfe0b
440+#define XKB_KEY_ISO_First_Group 0xfe0c
441+#define XKB_KEY_ISO_First_Group_Lock 0xfe0d
442+#define XKB_KEY_ISO_Last_Group 0xfe0e
443+#define XKB_KEY_ISO_Last_Group_Lock 0xfe0f
444+
445+#define XKB_KEY_ISO_Left_Tab 0xfe20
446+#define XKB_KEY_ISO_Move_Line_Up 0xfe21
447+#define XKB_KEY_ISO_Move_Line_Down 0xfe22
448+#define XKB_KEY_ISO_Partial_Line_Up 0xfe23
449+#define XKB_KEY_ISO_Partial_Line_Down 0xfe24
450+#define XKB_KEY_ISO_Partial_Space_Left 0xfe25
451+#define XKB_KEY_ISO_Partial_Space_Right 0xfe26
452+#define XKB_KEY_ISO_Set_Margin_Left 0xfe27
453+#define XKB_KEY_ISO_Set_Margin_Right 0xfe28
454+#define XKB_KEY_ISO_Release_Margin_Left 0xfe29
455+#define XKB_KEY_ISO_Release_Margin_Right 0xfe2a
456+#define XKB_KEY_ISO_Release_Both_Margins 0xfe2b
457+#define XKB_KEY_ISO_Fast_Cursor_Left 0xfe2c
458+#define XKB_KEY_ISO_Fast_Cursor_Right 0xfe2d
459+#define XKB_KEY_ISO_Fast_Cursor_Up 0xfe2e
460+#define XKB_KEY_ISO_Fast_Cursor_Down 0xfe2f
461+#define XKB_KEY_ISO_Continuous_Underline 0xfe30
462+#define XKB_KEY_ISO_Discontinuous_Underline 0xfe31
463+#define XKB_KEY_ISO_Emphasize 0xfe32
464+#define XKB_KEY_ISO_Center_Object 0xfe33
465+#define XKB_KEY_ISO_Enter 0xfe34
466+
467+#define XKB_KEY_dead_grave 0xfe50
468+#define XKB_KEY_dead_acute 0xfe51
469+#define XKB_KEY_dead_circumflex 0xfe52
470+#define XKB_KEY_dead_tilde 0xfe53
471+#define XKB_KEY_dead_perispomeni 0xfe53 /* non-deprecated alias for dead_tilde */
472+#define XKB_KEY_dead_macron 0xfe54
473+#define XKB_KEY_dead_breve 0xfe55
474+#define XKB_KEY_dead_abovedot 0xfe56
475+#define XKB_KEY_dead_diaeresis 0xfe57
476+#define XKB_KEY_dead_abovering 0xfe58
477+#define XKB_KEY_dead_doubleacute 0xfe59
478+#define XKB_KEY_dead_caron 0xfe5a
479+#define XKB_KEY_dead_cedilla 0xfe5b
480+#define XKB_KEY_dead_ogonek 0xfe5c
481+#define XKB_KEY_dead_iota 0xfe5d
482+#define XKB_KEY_dead_voiced_sound 0xfe5e
483+#define XKB_KEY_dead_semivoiced_sound 0xfe5f
484+#define XKB_KEY_dead_belowdot 0xfe60
485+#define XKB_KEY_dead_hook 0xfe61
486+#define XKB_KEY_dead_horn 0xfe62
487+#define XKB_KEY_dead_stroke 0xfe63
488+#define XKB_KEY_dead_abovecomma 0xfe64
489+#define XKB_KEY_dead_psili 0xfe64 /* non-deprecated alias for dead_abovecomma */
490+#define XKB_KEY_dead_abovereversedcomma 0xfe65
491+#define XKB_KEY_dead_dasia 0xfe65 /* non-deprecated alias for dead_abovereversedcomma */
492+#define XKB_KEY_dead_doublegrave 0xfe66
493+#define XKB_KEY_dead_belowring 0xfe67
494+#define XKB_KEY_dead_belowmacron 0xfe68
495+#define XKB_KEY_dead_belowcircumflex 0xfe69
496+#define XKB_KEY_dead_belowtilde 0xfe6a
497+#define XKB_KEY_dead_belowbreve 0xfe6b
498+#define XKB_KEY_dead_belowdiaeresis 0xfe6c
499+#define XKB_KEY_dead_invertedbreve 0xfe6d
500+#define XKB_KEY_dead_belowcomma 0xfe6e
501+#define XKB_KEY_dead_currency 0xfe6f
502+
503+/* extra dead elements for German T3 layout */
504+#define XKB_KEY_dead_lowline 0xfe90
505+#define XKB_KEY_dead_aboveverticalline 0xfe91
506+#define XKB_KEY_dead_belowverticalline 0xfe92
507+#define XKB_KEY_dead_longsolidusoverlay 0xfe93
508+
509+/* dead vowels for universal syllable entry */
510+#define XKB_KEY_dead_a 0xfe80
511+#define XKB_KEY_dead_A 0xfe81
512+#define XKB_KEY_dead_e 0xfe82
513+#define XKB_KEY_dead_E 0xfe83
514+#define XKB_KEY_dead_i 0xfe84
515+#define XKB_KEY_dead_I 0xfe85
516+#define XKB_KEY_dead_o 0xfe86
517+#define XKB_KEY_dead_O 0xfe87
518+#define XKB_KEY_dead_u 0xfe88
519+#define XKB_KEY_dead_U 0xfe89
520+#define XKB_KEY_dead_small_schwa 0xfe8a /* deprecated alias for dead_schwa */
521+#define XKB_KEY_dead_schwa 0xfe8a
522+#define XKB_KEY_dead_capital_schwa 0xfe8b /* deprecated alias for dead_SCHWA */
523+#define XKB_KEY_dead_SCHWA 0xfe8b
524+
525+#define XKB_KEY_dead_greek 0xfe8c
526+#define XKB_KEY_dead_hamza 0xfe8d
527+#define XKB_KEY_dead_apostrophe 0xfe8e
528+
529+#define XKB_KEY_First_Virtual_Screen 0xfed0
530+#define XKB_KEY_Prev_Virtual_Screen 0xfed1
531+#define XKB_KEY_Next_Virtual_Screen 0xfed2
532+#define XKB_KEY_Last_Virtual_Screen 0xfed4
533+#define XKB_KEY_Terminate_Server 0xfed5
534+
535+#define XKB_KEY_AccessX_Enable 0xfe70
536+#define XKB_KEY_AccessX_Feedback_Enable 0xfe71
537+#define XKB_KEY_RepeatKeys_Enable 0xfe72
538+#define XKB_KEY_SlowKeys_Enable 0xfe73
539+#define XKB_KEY_BounceKeys_Enable 0xfe74
540+#define XKB_KEY_StickyKeys_Enable 0xfe75
541+#define XKB_KEY_MouseKeys_Enable 0xfe76
542+#define XKB_KEY_MouseKeys_Accel_Enable 0xfe77
543+#define XKB_KEY_Overlay1_Enable 0xfe78
544+#define XKB_KEY_Overlay2_Enable 0xfe79
545+#define XKB_KEY_AudibleBell_Enable 0xfe7a
546+
547+#define XKB_KEY_Pointer_Left 0xfee0
548+#define XKB_KEY_Pointer_Right 0xfee1
549+#define XKB_KEY_Pointer_Up 0xfee2
550+#define XKB_KEY_Pointer_Down 0xfee3
551+#define XKB_KEY_Pointer_UpLeft 0xfee4
552+#define XKB_KEY_Pointer_UpRight 0xfee5
553+#define XKB_KEY_Pointer_DownLeft 0xfee6
554+#define XKB_KEY_Pointer_DownRight 0xfee7
555+#define XKB_KEY_Pointer_Button_Dflt 0xfee8
556+#define XKB_KEY_Pointer_Button1 0xfee9
557+#define XKB_KEY_Pointer_Button2 0xfeea
558+#define XKB_KEY_Pointer_Button3 0xfeeb
559+#define XKB_KEY_Pointer_Button4 0xfeec
560+#define XKB_KEY_Pointer_Button5 0xfeed
561+#define XKB_KEY_Pointer_DblClick_Dflt 0xfeee
562+#define XKB_KEY_Pointer_DblClick1 0xfeef
563+#define XKB_KEY_Pointer_DblClick2 0xfef0
564+#define XKB_KEY_Pointer_DblClick3 0xfef1
565+#define XKB_KEY_Pointer_DblClick4 0xfef2
566+#define XKB_KEY_Pointer_DblClick5 0xfef3
567+#define XKB_KEY_Pointer_Drag_Dflt 0xfef4
568+#define XKB_KEY_Pointer_Drag1 0xfef5
569+#define XKB_KEY_Pointer_Drag2 0xfef6
570+#define XKB_KEY_Pointer_Drag3 0xfef7
571+#define XKB_KEY_Pointer_Drag4 0xfef8
572+#define XKB_KEY_Pointer_Drag5 0xfefd
573+
574+#define XKB_KEY_Pointer_EnableKeys 0xfef9
575+#define XKB_KEY_Pointer_Accelerate 0xfefa
576+#define XKB_KEY_Pointer_DfltBtnNext 0xfefb
577+#define XKB_KEY_Pointer_DfltBtnPrev 0xfefc
578+
579+/* Single-Stroke Multiple-Character N-Graph Keysyms For The X Input Method */
580+
581+#define XKB_KEY_ch 0xfea0
582+#define XKB_KEY_Ch 0xfea1
583+#define XKB_KEY_CH 0xfea2
584+#define XKB_KEY_c_h 0xfea3
585+#define XKB_KEY_C_h 0xfea4
586+#define XKB_KEY_C_H 0xfea5
587+
588+
589+/*
590+ * 3270 Terminal Keys
591+ * Byte 3 = 0xfd
592+ */
593+
594+#define XKB_KEY_3270_Duplicate 0xfd01
595+#define XKB_KEY_3270_FieldMark 0xfd02
596+#define XKB_KEY_3270_Right2 0xfd03
597+#define XKB_KEY_3270_Left2 0xfd04
598+#define XKB_KEY_3270_BackTab 0xfd05
599+#define XKB_KEY_3270_EraseEOF 0xfd06
600+#define XKB_KEY_3270_EraseInput 0xfd07
601+#define XKB_KEY_3270_Reset 0xfd08
602+#define XKB_KEY_3270_Quit 0xfd09
603+#define XKB_KEY_3270_PA1 0xfd0a
604+#define XKB_KEY_3270_PA2 0xfd0b
605+#define XKB_KEY_3270_PA3 0xfd0c
606+#define XKB_KEY_3270_Test 0xfd0d
607+#define XKB_KEY_3270_Attn 0xfd0e
608+#define XKB_KEY_3270_CursorBlink 0xfd0f
609+#define XKB_KEY_3270_AltCursor 0xfd10
610+#define XKB_KEY_3270_KeyClick 0xfd11
611+#define XKB_KEY_3270_Jump 0xfd12
612+#define XKB_KEY_3270_Ident 0xfd13
613+#define XKB_KEY_3270_Rule 0xfd14
614+#define XKB_KEY_3270_Copy 0xfd15
615+#define XKB_KEY_3270_Play 0xfd16
616+#define XKB_KEY_3270_Setup 0xfd17
617+#define XKB_KEY_3270_Record 0xfd18
618+#define XKB_KEY_3270_ChangeScreen 0xfd19
619+#define XKB_KEY_3270_DeleteWord 0xfd1a
620+#define XKB_KEY_3270_ExSelect 0xfd1b
621+#define XKB_KEY_3270_CursorSelect 0xfd1c
622+#define XKB_KEY_3270_PrintScreen 0xfd1d
623+#define XKB_KEY_3270_Enter 0xfd1e
624+
625+/*
626+ * Latin 1
627+ * (ISO/IEC 8859-1 = Unicode U+0020..U+00FF)
628+ * Byte 3 = 0
629+ */
630+#define XKB_KEY_space 0x0020 /* U+0020 SPACE */
631+#define XKB_KEY_exclam 0x0021 /* U+0021 EXCLAMATION MARK */
632+#define XKB_KEY_quotedbl 0x0022 /* U+0022 QUOTATION MARK */
633+#define XKB_KEY_numbersign 0x0023 /* U+0023 NUMBER SIGN */
634+#define XKB_KEY_dollar 0x0024 /* U+0024 DOLLAR SIGN */
635+#define XKB_KEY_percent 0x0025 /* U+0025 PERCENT SIGN */
636+#define XKB_KEY_ampersand 0x0026 /* U+0026 AMPERSAND */
637+#define XKB_KEY_apostrophe 0x0027 /* U+0027 APOSTROPHE */
638+#define XKB_KEY_quoteright 0x0027 /* deprecated */
639+#define XKB_KEY_parenleft 0x0028 /* U+0028 LEFT PARENTHESIS */
640+#define XKB_KEY_parenright 0x0029 /* U+0029 RIGHT PARENTHESIS */
641+#define XKB_KEY_asterisk 0x002a /* U+002A ASTERISK */
642+#define XKB_KEY_plus 0x002b /* U+002B PLUS SIGN */
643+#define XKB_KEY_comma 0x002c /* U+002C COMMA */
644+#define XKB_KEY_minus 0x002d /* U+002D HYPHEN-MINUS */
645+#define XKB_KEY_period 0x002e /* U+002E FULL STOP */
646+#define XKB_KEY_slash 0x002f /* U+002F SOLIDUS */
647+#define XKB_KEY_0 0x0030 /* U+0030 DIGIT ZERO */
648+#define XKB_KEY_1 0x0031 /* U+0031 DIGIT ONE */
649+#define XKB_KEY_2 0x0032 /* U+0032 DIGIT TWO */
650+#define XKB_KEY_3 0x0033 /* U+0033 DIGIT THREE */
651+#define XKB_KEY_4 0x0034 /* U+0034 DIGIT FOUR */
652+#define XKB_KEY_5 0x0035 /* U+0035 DIGIT FIVE */
653+#define XKB_KEY_6 0x0036 /* U+0036 DIGIT SIX */
654+#define XKB_KEY_7 0x0037 /* U+0037 DIGIT SEVEN */
655+#define XKB_KEY_8 0x0038 /* U+0038 DIGIT EIGHT */
656+#define XKB_KEY_9 0x0039 /* U+0039 DIGIT NINE */
657+#define XKB_KEY_colon 0x003a /* U+003A COLON */
658+#define XKB_KEY_semicolon 0x003b /* U+003B SEMICOLON */
659+#define XKB_KEY_less 0x003c /* U+003C LESS-THAN SIGN */
660+#define XKB_KEY_equal 0x003d /* U+003D EQUALS SIGN */
661+#define XKB_KEY_greater 0x003e /* U+003E GREATER-THAN SIGN */
662+#define XKB_KEY_question 0x003f /* U+003F QUESTION MARK */
663+#define XKB_KEY_at 0x0040 /* U+0040 COMMERCIAL AT */
664+#define XKB_KEY_A 0x0041 /* U+0041 LATIN CAPITAL LETTER A */
665+#define XKB_KEY_B 0x0042 /* U+0042 LATIN CAPITAL LETTER B */
666+#define XKB_KEY_C 0x0043 /* U+0043 LATIN CAPITAL LETTER C */
667+#define XKB_KEY_D 0x0044 /* U+0044 LATIN CAPITAL LETTER D */
668+#define XKB_KEY_E 0x0045 /* U+0045 LATIN CAPITAL LETTER E */
669+#define XKB_KEY_F 0x0046 /* U+0046 LATIN CAPITAL LETTER F */
670+#define XKB_KEY_G 0x0047 /* U+0047 LATIN CAPITAL LETTER G */
671+#define XKB_KEY_H 0x0048 /* U+0048 LATIN CAPITAL LETTER H */
672+#define XKB_KEY_I 0x0049 /* U+0049 LATIN CAPITAL LETTER I */
673+#define XKB_KEY_J 0x004a /* U+004A LATIN CAPITAL LETTER J */
674+#define XKB_KEY_K 0x004b /* U+004B LATIN CAPITAL LETTER K */
675+#define XKB_KEY_L 0x004c /* U+004C LATIN CAPITAL LETTER L */
676+#define XKB_KEY_M 0x004d /* U+004D LATIN CAPITAL LETTER M */
677+#define XKB_KEY_N 0x004e /* U+004E LATIN CAPITAL LETTER N */
678+#define XKB_KEY_O 0x004f /* U+004F LATIN CAPITAL LETTER O */
679+#define XKB_KEY_P 0x0050 /* U+0050 LATIN CAPITAL LETTER P */
680+#define XKB_KEY_Q 0x0051 /* U+0051 LATIN CAPITAL LETTER Q */
681+#define XKB_KEY_R 0x0052 /* U+0052 LATIN CAPITAL LETTER R */
682+#define XKB_KEY_S 0x0053 /* U+0053 LATIN CAPITAL LETTER S */
683+#define XKB_KEY_T 0x0054 /* U+0054 LATIN CAPITAL LETTER T */
684+#define XKB_KEY_U 0x0055 /* U+0055 LATIN CAPITAL LETTER U */
685+#define XKB_KEY_V 0x0056 /* U+0056 LATIN CAPITAL LETTER V */
686+#define XKB_KEY_W 0x0057 /* U+0057 LATIN CAPITAL LETTER W */
687+#define XKB_KEY_X 0x0058 /* U+0058 LATIN CAPITAL LETTER X */
688+#define XKB_KEY_Y 0x0059 /* U+0059 LATIN CAPITAL LETTER Y */
689+#define XKB_KEY_Z 0x005a /* U+005A LATIN CAPITAL LETTER Z */
690+#define XKB_KEY_bracketleft 0x005b /* U+005B LEFT SQUARE BRACKET */
691+#define XKB_KEY_backslash 0x005c /* U+005C REVERSE SOLIDUS */
692+#define XKB_KEY_bracketright 0x005d /* U+005D RIGHT SQUARE BRACKET */
693+#define XKB_KEY_asciicircum 0x005e /* U+005E CIRCUMFLEX ACCENT */
694+#define XKB_KEY_underscore 0x005f /* U+005F LOW LINE */
695+#define XKB_KEY_grave 0x0060 /* U+0060 GRAVE ACCENT */
696+#define XKB_KEY_quoteleft 0x0060 /* deprecated */
697+#define XKB_KEY_a 0x0061 /* U+0061 LATIN SMALL LETTER A */
698+#define XKB_KEY_b 0x0062 /* U+0062 LATIN SMALL LETTER B */
699+#define XKB_KEY_c 0x0063 /* U+0063 LATIN SMALL LETTER C */
700+#define XKB_KEY_d 0x0064 /* U+0064 LATIN SMALL LETTER D */
701+#define XKB_KEY_e 0x0065 /* U+0065 LATIN SMALL LETTER E */
702+#define XKB_KEY_f 0x0066 /* U+0066 LATIN SMALL LETTER F */
703+#define XKB_KEY_g 0x0067 /* U+0067 LATIN SMALL LETTER G */
704+#define XKB_KEY_h 0x0068 /* U+0068 LATIN SMALL LETTER H */
705+#define XKB_KEY_i 0x0069 /* U+0069 LATIN SMALL LETTER I */
706+#define XKB_KEY_j 0x006a /* U+006A LATIN SMALL LETTER J */
707+#define XKB_KEY_k 0x006b /* U+006B LATIN SMALL LETTER K */
708+#define XKB_KEY_l 0x006c /* U+006C LATIN SMALL LETTER L */
709+#define XKB_KEY_m 0x006d /* U+006D LATIN SMALL LETTER M */
710+#define XKB_KEY_n 0x006e /* U+006E LATIN SMALL LETTER N */
711+#define XKB_KEY_o 0x006f /* U+006F LATIN SMALL LETTER O */
712+#define XKB_KEY_p 0x0070 /* U+0070 LATIN SMALL LETTER P */
713+#define XKB_KEY_q 0x0071 /* U+0071 LATIN SMALL LETTER Q */
714+#define XKB_KEY_r 0x0072 /* U+0072 LATIN SMALL LETTER R */
715+#define XKB_KEY_s 0x0073 /* U+0073 LATIN SMALL LETTER S */
716+#define XKB_KEY_t 0x0074 /* U+0074 LATIN SMALL LETTER T */
717+#define XKB_KEY_u 0x0075 /* U+0075 LATIN SMALL LETTER U */
718+#define XKB_KEY_v 0x0076 /* U+0076 LATIN SMALL LETTER V */
719+#define XKB_KEY_w 0x0077 /* U+0077 LATIN SMALL LETTER W */
720+#define XKB_KEY_x 0x0078 /* U+0078 LATIN SMALL LETTER X */
721+#define XKB_KEY_y 0x0079 /* U+0079 LATIN SMALL LETTER Y */
722+#define XKB_KEY_z 0x007a /* U+007A LATIN SMALL LETTER Z */
723+#define XKB_KEY_braceleft 0x007b /* U+007B LEFT CURLY BRACKET */
724+#define XKB_KEY_bar 0x007c /* U+007C VERTICAL LINE */
725+#define XKB_KEY_braceright 0x007d /* U+007D RIGHT CURLY BRACKET */
726+#define XKB_KEY_asciitilde 0x007e /* U+007E TILDE */
727+
728+#define XKB_KEY_nobreakspace 0x00a0 /* U+00A0 NO-BREAK SPACE */
729+#define XKB_KEY_exclamdown 0x00a1 /* U+00A1 INVERTED EXCLAMATION MARK */
730+#define XKB_KEY_cent 0x00a2 /* U+00A2 CENT SIGN */
731+#define XKB_KEY_sterling 0x00a3 /* U+00A3 POUND SIGN */
732+#define XKB_KEY_currency 0x00a4 /* U+00A4 CURRENCY SIGN */
733+#define XKB_KEY_yen 0x00a5 /* U+00A5 YEN SIGN */
734+#define XKB_KEY_brokenbar 0x00a6 /* U+00A6 BROKEN BAR */
735+#define XKB_KEY_section 0x00a7 /* U+00A7 SECTION SIGN */
736+#define XKB_KEY_diaeresis 0x00a8 /* U+00A8 DIAERESIS */
737+#define XKB_KEY_copyright 0x00a9 /* U+00A9 COPYRIGHT SIGN */
738+#define XKB_KEY_ordfeminine 0x00aa /* U+00AA FEMININE ORDINAL INDICATOR */
739+#define XKB_KEY_guillemotleft 0x00ab /* deprecated alias for guillemetleft (misspelling) */
740+#define XKB_KEY_guillemetleft 0x00ab /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
741+#define XKB_KEY_notsign 0x00ac /* U+00AC NOT SIGN */
742+#define XKB_KEY_hyphen 0x00ad /* U+00AD SOFT HYPHEN */
743+#define XKB_KEY_registered 0x00ae /* U+00AE REGISTERED SIGN */
744+#define XKB_KEY_macron 0x00af /* U+00AF MACRON */
745+#define XKB_KEY_degree 0x00b0 /* U+00B0 DEGREE SIGN */
746+#define XKB_KEY_plusminus 0x00b1 /* U+00B1 PLUS-MINUS SIGN */
747+#define XKB_KEY_twosuperior 0x00b2 /* U+00B2 SUPERSCRIPT TWO */
748+#define XKB_KEY_threesuperior 0x00b3 /* U+00B3 SUPERSCRIPT THREE */
749+#define XKB_KEY_acute 0x00b4 /* U+00B4 ACUTE ACCENT */
750+#define XKB_KEY_mu 0x00b5 /* U+00B5 MICRO SIGN */
751+#define XKB_KEY_paragraph 0x00b6 /* U+00B6 PILCROW SIGN */
752+#define XKB_KEY_periodcentered 0x00b7 /* U+00B7 MIDDLE DOT */
753+#define XKB_KEY_cedilla 0x00b8 /* U+00B8 CEDILLA */
754+#define XKB_KEY_onesuperior 0x00b9 /* U+00B9 SUPERSCRIPT ONE */
755+#define XKB_KEY_masculine 0x00ba /* deprecated alias for ordmasculine (inconsistent name) */
756+#define XKB_KEY_ordmasculine 0x00ba /* U+00BA MASCULINE ORDINAL INDICATOR */
757+#define XKB_KEY_guillemotright 0x00bb /* deprecated alias for guillemetright (misspelling) */
758+#define XKB_KEY_guillemetright 0x00bb /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
759+#define XKB_KEY_onequarter 0x00bc /* U+00BC VULGAR FRACTION ONE QUARTER */
760+#define XKB_KEY_onehalf 0x00bd /* U+00BD VULGAR FRACTION ONE HALF */
761+#define XKB_KEY_threequarters 0x00be /* U+00BE VULGAR FRACTION THREE QUARTERS */
762+#define XKB_KEY_questiondown 0x00bf /* U+00BF INVERTED QUESTION MARK */
763+#define XKB_KEY_Agrave 0x00c0 /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */
764+#define XKB_KEY_Aacute 0x00c1 /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */
765+#define XKB_KEY_Acircumflex 0x00c2 /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
766+#define XKB_KEY_Atilde 0x00c3 /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */
767+#define XKB_KEY_Adiaeresis 0x00c4 /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */
768+#define XKB_KEY_Aring 0x00c5 /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */
769+#define XKB_KEY_AE 0x00c6 /* U+00C6 LATIN CAPITAL LETTER AE */
770+#define XKB_KEY_Ccedilla 0x00c7 /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */
771+#define XKB_KEY_Egrave 0x00c8 /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */
772+#define XKB_KEY_Eacute 0x00c9 /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
773+#define XKB_KEY_Ecircumflex 0x00ca /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
774+#define XKB_KEY_Ediaeresis 0x00cb /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */
775+#define XKB_KEY_Igrave 0x00cc /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */
776+#define XKB_KEY_Iacute 0x00cd /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */
777+#define XKB_KEY_Icircumflex 0x00ce /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
778+#define XKB_KEY_Idiaeresis 0x00cf /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */
779+#define XKB_KEY_ETH 0x00d0 /* U+00D0 LATIN CAPITAL LETTER ETH */
780+#define XKB_KEY_Eth 0x00d0 /* deprecated */
781+#define XKB_KEY_Ntilde 0x00d1 /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */
782+#define XKB_KEY_Ograve 0x00d2 /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */
783+#define XKB_KEY_Oacute 0x00d3 /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */
784+#define XKB_KEY_Ocircumflex 0x00d4 /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
785+#define XKB_KEY_Otilde 0x00d5 /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */
786+#define XKB_KEY_Odiaeresis 0x00d6 /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */
787+#define XKB_KEY_multiply 0x00d7 /* U+00D7 MULTIPLICATION SIGN */
788+#define XKB_KEY_Oslash 0x00d8 /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
789+#define XKB_KEY_Ooblique 0x00d8 /* deprecated alias for Oslash */
790+#define XKB_KEY_Ugrave 0x00d9 /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */
791+#define XKB_KEY_Uacute 0x00da /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */
792+#define XKB_KEY_Ucircumflex 0x00db /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
793+#define XKB_KEY_Udiaeresis 0x00dc /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */
794+#define XKB_KEY_Yacute 0x00dd /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */
795+#define XKB_KEY_THORN 0x00de /* U+00DE LATIN CAPITAL LETTER THORN */
796+#define XKB_KEY_Thorn 0x00de /* deprecated */
797+#define XKB_KEY_ssharp 0x00df /* U+00DF LATIN SMALL LETTER SHARP S */
798+#define XKB_KEY_agrave 0x00e0 /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */
799+#define XKB_KEY_aacute 0x00e1 /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */
800+#define XKB_KEY_acircumflex 0x00e2 /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */
801+#define XKB_KEY_atilde 0x00e3 /* U+00E3 LATIN SMALL LETTER A WITH TILDE */
802+#define XKB_KEY_adiaeresis 0x00e4 /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */
803+#define XKB_KEY_aring 0x00e5 /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */
804+#define XKB_KEY_ae 0x00e6 /* U+00E6 LATIN SMALL LETTER AE */
805+#define XKB_KEY_ccedilla 0x00e7 /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */
806+#define XKB_KEY_egrave 0x00e8 /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */
807+#define XKB_KEY_eacute 0x00e9 /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
808+#define XKB_KEY_ecircumflex 0x00ea /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */
809+#define XKB_KEY_ediaeresis 0x00eb /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */
810+#define XKB_KEY_igrave 0x00ec /* U+00EC LATIN SMALL LETTER I WITH GRAVE */
811+#define XKB_KEY_iacute 0x00ed /* U+00ED LATIN SMALL LETTER I WITH ACUTE */
812+#define XKB_KEY_icircumflex 0x00ee /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */
813+#define XKB_KEY_idiaeresis 0x00ef /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */
814+#define XKB_KEY_eth 0x00f0 /* U+00F0 LATIN SMALL LETTER ETH */
815+#define XKB_KEY_ntilde 0x00f1 /* U+00F1 LATIN SMALL LETTER N WITH TILDE */
816+#define XKB_KEY_ograve 0x00f2 /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */
817+#define XKB_KEY_oacute 0x00f3 /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */
818+#define XKB_KEY_ocircumflex 0x00f4 /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */
819+#define XKB_KEY_otilde 0x00f5 /* U+00F5 LATIN SMALL LETTER O WITH TILDE */
820+#define XKB_KEY_odiaeresis 0x00f6 /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */
821+#define XKB_KEY_division 0x00f7 /* U+00F7 DIVISION SIGN */
822+#define XKB_KEY_oslash 0x00f8 /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
823+#define XKB_KEY_ooblique 0x00f8 /* deprecated alias for oslash */
824+#define XKB_KEY_ugrave 0x00f9 /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */
825+#define XKB_KEY_uacute 0x00fa /* U+00FA LATIN SMALL LETTER U WITH ACUTE */
826+#define XKB_KEY_ucircumflex 0x00fb /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */
827+#define XKB_KEY_udiaeresis 0x00fc /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */
828+#define XKB_KEY_yacute 0x00fd /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */
829+#define XKB_KEY_thorn 0x00fe /* U+00FE LATIN SMALL LETTER THORN */
830+#define XKB_KEY_ydiaeresis 0x00ff /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
831+
832+/*
833+ * Latin 2
834+ * Byte 3 = 1
835+ */
836+
837+#define XKB_KEY_Aogonek 0x01a1 /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */
838+#define XKB_KEY_breve 0x01a2 /* U+02D8 BREVE */
839+#define XKB_KEY_Lstroke 0x01a3 /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
840+#define XKB_KEY_Lcaron 0x01a5 /* U+013D LATIN CAPITAL LETTER L WITH CARON */
841+#define XKB_KEY_Sacute 0x01a6 /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */
842+#define XKB_KEY_Scaron 0x01a9 /* U+0160 LATIN CAPITAL LETTER S WITH CARON */
843+#define XKB_KEY_Scedilla 0x01aa /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */
844+#define XKB_KEY_Tcaron 0x01ab /* U+0164 LATIN CAPITAL LETTER T WITH CARON */
845+#define XKB_KEY_Zacute 0x01ac /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */
846+#define XKB_KEY_Zcaron 0x01ae /* U+017D LATIN CAPITAL LETTER Z WITH CARON */
847+#define XKB_KEY_Zabovedot 0x01af /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */
848+#define XKB_KEY_aogonek 0x01b1 /* U+0105 LATIN SMALL LETTER A WITH OGONEK */
849+#define XKB_KEY_ogonek 0x01b2 /* U+02DB OGONEK */
850+#define XKB_KEY_lstroke 0x01b3 /* U+0142 LATIN SMALL LETTER L WITH STROKE */
851+#define XKB_KEY_lcaron 0x01b5 /* U+013E LATIN SMALL LETTER L WITH CARON */
852+#define XKB_KEY_sacute 0x01b6 /* U+015B LATIN SMALL LETTER S WITH ACUTE */
853+#define XKB_KEY_caron 0x01b7 /* U+02C7 CARON */
854+#define XKB_KEY_scaron 0x01b9 /* U+0161 LATIN SMALL LETTER S WITH CARON */
855+#define XKB_KEY_scedilla 0x01ba /* U+015F LATIN SMALL LETTER S WITH CEDILLA */
856+#define XKB_KEY_tcaron 0x01bb /* U+0165 LATIN SMALL LETTER T WITH CARON */
857+#define XKB_KEY_zacute 0x01bc /* U+017A LATIN SMALL LETTER Z WITH ACUTE */
858+#define XKB_KEY_doubleacute 0x01bd /* U+02DD DOUBLE ACUTE ACCENT */
859+#define XKB_KEY_zcaron 0x01be /* U+017E LATIN SMALL LETTER Z WITH CARON */
860+#define XKB_KEY_zabovedot 0x01bf /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */
861+#define XKB_KEY_Racute 0x01c0 /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */
862+#define XKB_KEY_Abreve 0x01c3 /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */
863+#define XKB_KEY_Lacute 0x01c5 /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */
864+#define XKB_KEY_Cacute 0x01c6 /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */
865+#define XKB_KEY_Ccaron 0x01c8 /* U+010C LATIN CAPITAL LETTER C WITH CARON */
866+#define XKB_KEY_Eogonek 0x01ca /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */
867+#define XKB_KEY_Ecaron 0x01cc /* U+011A LATIN CAPITAL LETTER E WITH CARON */
868+#define XKB_KEY_Dcaron 0x01cf /* U+010E LATIN CAPITAL LETTER D WITH CARON */
869+#define XKB_KEY_Dstroke 0x01d0 /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */
870+#define XKB_KEY_Nacute 0x01d1 /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */
871+#define XKB_KEY_Ncaron 0x01d2 /* U+0147 LATIN CAPITAL LETTER N WITH CARON */
872+#define XKB_KEY_Odoubleacute 0x01d5 /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
873+#define XKB_KEY_Rcaron 0x01d8 /* U+0158 LATIN CAPITAL LETTER R WITH CARON */
874+#define XKB_KEY_Uring 0x01d9 /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */
875+#define XKB_KEY_Udoubleacute 0x01db /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
876+#define XKB_KEY_Tcedilla 0x01de /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */
877+#define XKB_KEY_racute 0x01e0 /* U+0155 LATIN SMALL LETTER R WITH ACUTE */
878+#define XKB_KEY_abreve 0x01e3 /* U+0103 LATIN SMALL LETTER A WITH BREVE */
879+#define XKB_KEY_lacute 0x01e5 /* U+013A LATIN SMALL LETTER L WITH ACUTE */
880+#define XKB_KEY_cacute 0x01e6 /* U+0107 LATIN SMALL LETTER C WITH ACUTE */
881+#define XKB_KEY_ccaron 0x01e8 /* U+010D LATIN SMALL LETTER C WITH CARON */
882+#define XKB_KEY_eogonek 0x01ea /* U+0119 LATIN SMALL LETTER E WITH OGONEK */
883+#define XKB_KEY_ecaron 0x01ec /* U+011B LATIN SMALL LETTER E WITH CARON */
884+#define XKB_KEY_dcaron 0x01ef /* U+010F LATIN SMALL LETTER D WITH CARON */
885+#define XKB_KEY_dstroke 0x01f0 /* U+0111 LATIN SMALL LETTER D WITH STROKE */
886+#define XKB_KEY_nacute 0x01f1 /* U+0144 LATIN SMALL LETTER N WITH ACUTE */
887+#define XKB_KEY_ncaron 0x01f2 /* U+0148 LATIN SMALL LETTER N WITH CARON */
888+#define XKB_KEY_odoubleacute 0x01f5 /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */
889+#define XKB_KEY_rcaron 0x01f8 /* U+0159 LATIN SMALL LETTER R WITH CARON */
890+#define XKB_KEY_uring 0x01f9 /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */
891+#define XKB_KEY_udoubleacute 0x01fb /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */
892+#define XKB_KEY_tcedilla 0x01fe /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */
893+#define XKB_KEY_abovedot 0x01ff /* U+02D9 DOT ABOVE */
894+
895+/*
896+ * Latin 3
897+ * Byte 3 = 2
898+ */
899+
900+#define XKB_KEY_Hstroke 0x02a1 /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */
901+#define XKB_KEY_Hcircumflex 0x02a6 /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
902+#define XKB_KEY_Iabovedot 0x02a9 /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */
903+#define XKB_KEY_Gbreve 0x02ab /* U+011E LATIN CAPITAL LETTER G WITH BREVE */
904+#define XKB_KEY_Jcircumflex 0x02ac /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
905+#define XKB_KEY_hstroke 0x02b1 /* U+0127 LATIN SMALL LETTER H WITH STROKE */
906+#define XKB_KEY_hcircumflex 0x02b6 /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */
907+#define XKB_KEY_idotless 0x02b9 /* U+0131 LATIN SMALL LETTER DOTLESS I */
908+#define XKB_KEY_gbreve 0x02bb /* U+011F LATIN SMALL LETTER G WITH BREVE */
909+#define XKB_KEY_jcircumflex 0x02bc /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */
910+#define XKB_KEY_Cabovedot 0x02c5 /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */
911+#define XKB_KEY_Ccircumflex 0x02c6 /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
912+#define XKB_KEY_Gabovedot 0x02d5 /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */
913+#define XKB_KEY_Gcircumflex 0x02d8 /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
914+#define XKB_KEY_Ubreve 0x02dd /* U+016C LATIN CAPITAL LETTER U WITH BREVE */
915+#define XKB_KEY_Scircumflex 0x02de /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
916+#define XKB_KEY_cabovedot 0x02e5 /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */
917+#define XKB_KEY_ccircumflex 0x02e6 /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */
918+#define XKB_KEY_gabovedot 0x02f5 /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */
919+#define XKB_KEY_gcircumflex 0x02f8 /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */
920+#define XKB_KEY_ubreve 0x02fd /* U+016D LATIN SMALL LETTER U WITH BREVE */
921+#define XKB_KEY_scircumflex 0x02fe /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */
922+
923+
924+/*
925+ * Latin 4
926+ * Byte 3 = 3
927+ */
928+
929+#define XKB_KEY_kra 0x03a2 /* U+0138 LATIN SMALL LETTER KRA */
930+#define XKB_KEY_kappa 0x03a2 /* deprecated */
931+#define XKB_KEY_Rcedilla 0x03a3 /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */
932+#define XKB_KEY_Itilde 0x03a5 /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */
933+#define XKB_KEY_Lcedilla 0x03a6 /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */
934+#define XKB_KEY_Emacron 0x03aa /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */
935+#define XKB_KEY_Gcedilla 0x03ab /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */
936+#define XKB_KEY_Tslash 0x03ac /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */
937+#define XKB_KEY_rcedilla 0x03b3 /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */
938+#define XKB_KEY_itilde 0x03b5 /* U+0129 LATIN SMALL LETTER I WITH TILDE */
939+#define XKB_KEY_lcedilla 0x03b6 /* U+013C LATIN SMALL LETTER L WITH CEDILLA */
940+#define XKB_KEY_emacron 0x03ba /* U+0113 LATIN SMALL LETTER E WITH MACRON */
941+#define XKB_KEY_gcedilla 0x03bb /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */
942+#define XKB_KEY_tslash 0x03bc /* U+0167 LATIN SMALL LETTER T WITH STROKE */
943+#define XKB_KEY_ENG 0x03bd /* U+014A LATIN CAPITAL LETTER ENG */
944+#define XKB_KEY_eng 0x03bf /* U+014B LATIN SMALL LETTER ENG */
945+#define XKB_KEY_Amacron 0x03c0 /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */
946+#define XKB_KEY_Iogonek 0x03c7 /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */
947+#define XKB_KEY_Eabovedot 0x03cc /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */
948+#define XKB_KEY_Imacron 0x03cf /* U+012A LATIN CAPITAL LETTER I WITH MACRON */
949+#define XKB_KEY_Ncedilla 0x03d1 /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */
950+#define XKB_KEY_Omacron 0x03d2 /* U+014C LATIN CAPITAL LETTER O WITH MACRON */
951+#define XKB_KEY_Kcedilla 0x03d3 /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */
952+#define XKB_KEY_Uogonek 0x03d9 /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */
953+#define XKB_KEY_Utilde 0x03dd /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */
954+#define XKB_KEY_Umacron 0x03de /* U+016A LATIN CAPITAL LETTER U WITH MACRON */
955+#define XKB_KEY_amacron 0x03e0 /* U+0101 LATIN SMALL LETTER A WITH MACRON */
956+#define XKB_KEY_iogonek 0x03e7 /* U+012F LATIN SMALL LETTER I WITH OGONEK */
957+#define XKB_KEY_eabovedot 0x03ec /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */
958+#define XKB_KEY_imacron 0x03ef /* U+012B LATIN SMALL LETTER I WITH MACRON */
959+#define XKB_KEY_ncedilla 0x03f1 /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */
960+#define XKB_KEY_omacron 0x03f2 /* U+014D LATIN SMALL LETTER O WITH MACRON */
961+#define XKB_KEY_kcedilla 0x03f3 /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */
962+#define XKB_KEY_uogonek 0x03f9 /* U+0173 LATIN SMALL LETTER U WITH OGONEK */
963+#define XKB_KEY_utilde 0x03fd /* U+0169 LATIN SMALL LETTER U WITH TILDE */
964+#define XKB_KEY_umacron 0x03fe /* U+016B LATIN SMALL LETTER U WITH MACRON */
965+
966+/*
967+ * Latin 8
968+ */
969+#define XKB_KEY_Wcircumflex 0x1000174 /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
970+#define XKB_KEY_wcircumflex 0x1000175 /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */
971+#define XKB_KEY_Ycircumflex 0x1000176 /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
972+#define XKB_KEY_ycircumflex 0x1000177 /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */
973+#define XKB_KEY_Babovedot 0x1001e02 /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */
974+#define XKB_KEY_babovedot 0x1001e03 /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */
975+#define XKB_KEY_Dabovedot 0x1001e0a /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */
976+#define XKB_KEY_dabovedot 0x1001e0b /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */
977+#define XKB_KEY_Fabovedot 0x1001e1e /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */
978+#define XKB_KEY_fabovedot 0x1001e1f /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */
979+#define XKB_KEY_Mabovedot 0x1001e40 /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */
980+#define XKB_KEY_mabovedot 0x1001e41 /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */
981+#define XKB_KEY_Pabovedot 0x1001e56 /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */
982+#define XKB_KEY_pabovedot 0x1001e57 /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */
983+#define XKB_KEY_Sabovedot 0x1001e60 /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */
984+#define XKB_KEY_sabovedot 0x1001e61 /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */
985+#define XKB_KEY_Tabovedot 0x1001e6a /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */
986+#define XKB_KEY_tabovedot 0x1001e6b /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */
987+#define XKB_KEY_Wgrave 0x1001e80 /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */
988+#define XKB_KEY_wgrave 0x1001e81 /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */
989+#define XKB_KEY_Wacute 0x1001e82 /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */
990+#define XKB_KEY_wacute 0x1001e83 /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */
991+#define XKB_KEY_Wdiaeresis 0x1001e84 /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */
992+#define XKB_KEY_wdiaeresis 0x1001e85 /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */
993+#define XKB_KEY_Ygrave 0x1001ef2 /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */
994+#define XKB_KEY_ygrave 0x1001ef3 /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */
995+
996+/*
997+ * Latin 9
998+ * Byte 3 = 0x13
999+ */
1000+
1001+#define XKB_KEY_OE 0x13bc /* U+0152 LATIN CAPITAL LIGATURE OE */
1002+#define XKB_KEY_oe 0x13bd /* U+0153 LATIN SMALL LIGATURE OE */
1003+#define XKB_KEY_Ydiaeresis 0x13be /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */
1004+
1005+/*
1006+ * Katakana
1007+ * Byte 3 = 4
1008+ */
1009+
1010+#define XKB_KEY_overline 0x047e /* U+203E OVERLINE */
1011+#define XKB_KEY_kana_fullstop 0x04a1 /* U+3002 IDEOGRAPHIC FULL STOP */
1012+#define XKB_KEY_kana_openingbracket 0x04a2 /* U+300C LEFT CORNER BRACKET */
1013+#define XKB_KEY_kana_closingbracket 0x04a3 /* U+300D RIGHT CORNER BRACKET */
1014+#define XKB_KEY_kana_comma 0x04a4 /* U+3001 IDEOGRAPHIC COMMA */
1015+#define XKB_KEY_kana_conjunctive 0x04a5 /* U+30FB KATAKANA MIDDLE DOT */
1016+#define XKB_KEY_kana_middledot 0x04a5 /* deprecated */
1017+#define XKB_KEY_kana_WO 0x04a6 /* U+30F2 KATAKANA LETTER WO */
1018+#define XKB_KEY_kana_a 0x04a7 /* U+30A1 KATAKANA LETTER SMALL A */
1019+#define XKB_KEY_kana_i 0x04a8 /* U+30A3 KATAKANA LETTER SMALL I */
1020+#define XKB_KEY_kana_u 0x04a9 /* U+30A5 KATAKANA LETTER SMALL U */
1021+#define XKB_KEY_kana_e 0x04aa /* U+30A7 KATAKANA LETTER SMALL E */
1022+#define XKB_KEY_kana_o 0x04ab /* U+30A9 KATAKANA LETTER SMALL O */
1023+#define XKB_KEY_kana_ya 0x04ac /* U+30E3 KATAKANA LETTER SMALL YA */
1024+#define XKB_KEY_kana_yu 0x04ad /* U+30E5 KATAKANA LETTER SMALL YU */
1025+#define XKB_KEY_kana_yo 0x04ae /* U+30E7 KATAKANA LETTER SMALL YO */
1026+#define XKB_KEY_kana_tsu 0x04af /* U+30C3 KATAKANA LETTER SMALL TU */
1027+#define XKB_KEY_kana_tu 0x04af /* deprecated */
1028+#define XKB_KEY_prolongedsound 0x04b0 /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */
1029+#define XKB_KEY_kana_A 0x04b1 /* U+30A2 KATAKANA LETTER A */
1030+#define XKB_KEY_kana_I 0x04b2 /* U+30A4 KATAKANA LETTER I */
1031+#define XKB_KEY_kana_U 0x04b3 /* U+30A6 KATAKANA LETTER U */
1032+#define XKB_KEY_kana_E 0x04b4 /* U+30A8 KATAKANA LETTER E */
1033+#define XKB_KEY_kana_O 0x04b5 /* U+30AA KATAKANA LETTER O */
1034+#define XKB_KEY_kana_KA 0x04b6 /* U+30AB KATAKANA LETTER KA */
1035+#define XKB_KEY_kana_KI 0x04b7 /* U+30AD KATAKANA LETTER KI */
1036+#define XKB_KEY_kana_KU 0x04b8 /* U+30AF KATAKANA LETTER KU */
1037+#define XKB_KEY_kana_KE 0x04b9 /* U+30B1 KATAKANA LETTER KE */
1038+#define XKB_KEY_kana_KO 0x04ba /* U+30B3 KATAKANA LETTER KO */
1039+#define XKB_KEY_kana_SA 0x04bb /* U+30B5 KATAKANA LETTER SA */
1040+#define XKB_KEY_kana_SHI 0x04bc /* U+30B7 KATAKANA LETTER SI */
1041+#define XKB_KEY_kana_SU 0x04bd /* U+30B9 KATAKANA LETTER SU */
1042+#define XKB_KEY_kana_SE 0x04be /* U+30BB KATAKANA LETTER SE */
1043+#define XKB_KEY_kana_SO 0x04bf /* U+30BD KATAKANA LETTER SO */
1044+#define XKB_KEY_kana_TA 0x04c0 /* U+30BF KATAKANA LETTER TA */
1045+#define XKB_KEY_kana_CHI 0x04c1 /* U+30C1 KATAKANA LETTER TI */
1046+#define XKB_KEY_kana_TI 0x04c1 /* deprecated */
1047+#define XKB_KEY_kana_TSU 0x04c2 /* U+30C4 KATAKANA LETTER TU */
1048+#define XKB_KEY_kana_TU 0x04c2 /* deprecated */
1049+#define XKB_KEY_kana_TE 0x04c3 /* U+30C6 KATAKANA LETTER TE */
1050+#define XKB_KEY_kana_TO 0x04c4 /* U+30C8 KATAKANA LETTER TO */
1051+#define XKB_KEY_kana_NA 0x04c5 /* U+30CA KATAKANA LETTER NA */
1052+#define XKB_KEY_kana_NI 0x04c6 /* U+30CB KATAKANA LETTER NI */
1053+#define XKB_KEY_kana_NU 0x04c7 /* U+30CC KATAKANA LETTER NU */
1054+#define XKB_KEY_kana_NE 0x04c8 /* U+30CD KATAKANA LETTER NE */
1055+#define XKB_KEY_kana_NO 0x04c9 /* U+30CE KATAKANA LETTER NO */
1056+#define XKB_KEY_kana_HA 0x04ca /* U+30CF KATAKANA LETTER HA */
1057+#define XKB_KEY_kana_HI 0x04cb /* U+30D2 KATAKANA LETTER HI */
1058+#define XKB_KEY_kana_FU 0x04cc /* U+30D5 KATAKANA LETTER HU */
1059+#define XKB_KEY_kana_HU 0x04cc /* deprecated */
1060+#define XKB_KEY_kana_HE 0x04cd /* U+30D8 KATAKANA LETTER HE */
1061+#define XKB_KEY_kana_HO 0x04ce /* U+30DB KATAKANA LETTER HO */
1062+#define XKB_KEY_kana_MA 0x04cf /* U+30DE KATAKANA LETTER MA */
1063+#define XKB_KEY_kana_MI 0x04d0 /* U+30DF KATAKANA LETTER MI */
1064+#define XKB_KEY_kana_MU 0x04d1 /* U+30E0 KATAKANA LETTER MU */
1065+#define XKB_KEY_kana_ME 0x04d2 /* U+30E1 KATAKANA LETTER ME */
1066+#define XKB_KEY_kana_MO 0x04d3 /* U+30E2 KATAKANA LETTER MO */
1067+#define XKB_KEY_kana_YA 0x04d4 /* U+30E4 KATAKANA LETTER YA */
1068+#define XKB_KEY_kana_YU 0x04d5 /* U+30E6 KATAKANA LETTER YU */
1069+#define XKB_KEY_kana_YO 0x04d6 /* U+30E8 KATAKANA LETTER YO */
1070+#define XKB_KEY_kana_RA 0x04d7 /* U+30E9 KATAKANA LETTER RA */
1071+#define XKB_KEY_kana_RI 0x04d8 /* U+30EA KATAKANA LETTER RI */
1072+#define XKB_KEY_kana_RU 0x04d9 /* U+30EB KATAKANA LETTER RU */
1073+#define XKB_KEY_kana_RE 0x04da /* U+30EC KATAKANA LETTER RE */
1074+#define XKB_KEY_kana_RO 0x04db /* U+30ED KATAKANA LETTER RO */
1075+#define XKB_KEY_kana_WA 0x04dc /* U+30EF KATAKANA LETTER WA */
1076+#define XKB_KEY_kana_N 0x04dd /* U+30F3 KATAKANA LETTER N */
1077+#define XKB_KEY_voicedsound 0x04de /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */
1078+#define XKB_KEY_semivoicedsound 0x04df /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
1079+#define XKB_KEY_kana_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
1080+
1081+/*
1082+ * Arabic
1083+ * Byte 3 = 5
1084+ */
1085+
1086+#define XKB_KEY_Farsi_0 0x10006f0 /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */
1087+#define XKB_KEY_Farsi_1 0x10006f1 /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */
1088+#define XKB_KEY_Farsi_2 0x10006f2 /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */
1089+#define XKB_KEY_Farsi_3 0x10006f3 /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */
1090+#define XKB_KEY_Farsi_4 0x10006f4 /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */
1091+#define XKB_KEY_Farsi_5 0x10006f5 /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */
1092+#define XKB_KEY_Farsi_6 0x10006f6 /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */
1093+#define XKB_KEY_Farsi_7 0x10006f7 /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */
1094+#define XKB_KEY_Farsi_8 0x10006f8 /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */
1095+#define XKB_KEY_Farsi_9 0x10006f9 /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */
1096+#define XKB_KEY_Arabic_percent 0x100066a /* U+066A ARABIC PERCENT SIGN */
1097+#define XKB_KEY_Arabic_superscript_alef 0x1000670 /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */
1098+#define XKB_KEY_Arabic_tteh 0x1000679 /* U+0679 ARABIC LETTER TTEH */
1099+#define XKB_KEY_Arabic_peh 0x100067e /* U+067E ARABIC LETTER PEH */
1100+#define XKB_KEY_Arabic_tcheh 0x1000686 /* U+0686 ARABIC LETTER TCHEH */
1101+#define XKB_KEY_Arabic_ddal 0x1000688 /* U+0688 ARABIC LETTER DDAL */
1102+#define XKB_KEY_Arabic_rreh 0x1000691 /* U+0691 ARABIC LETTER RREH */
1103+#define XKB_KEY_Arabic_comma 0x05ac /* U+060C ARABIC COMMA */
1104+#define XKB_KEY_Arabic_fullstop 0x10006d4 /* U+06D4 ARABIC FULL STOP */
1105+#define XKB_KEY_Arabic_0 0x1000660 /* U+0660 ARABIC-INDIC DIGIT ZERO */
1106+#define XKB_KEY_Arabic_1 0x1000661 /* U+0661 ARABIC-INDIC DIGIT ONE */
1107+#define XKB_KEY_Arabic_2 0x1000662 /* U+0662 ARABIC-INDIC DIGIT TWO */
1108+#define XKB_KEY_Arabic_3 0x1000663 /* U+0663 ARABIC-INDIC DIGIT THREE */
1109+#define XKB_KEY_Arabic_4 0x1000664 /* U+0664 ARABIC-INDIC DIGIT FOUR */
1110+#define XKB_KEY_Arabic_5 0x1000665 /* U+0665 ARABIC-INDIC DIGIT FIVE */
1111+#define XKB_KEY_Arabic_6 0x1000666 /* U+0666 ARABIC-INDIC DIGIT SIX */
1112+#define XKB_KEY_Arabic_7 0x1000667 /* U+0667 ARABIC-INDIC DIGIT SEVEN */
1113+#define XKB_KEY_Arabic_8 0x1000668 /* U+0668 ARABIC-INDIC DIGIT EIGHT */
1114+#define XKB_KEY_Arabic_9 0x1000669 /* U+0669 ARABIC-INDIC DIGIT NINE */
1115+#define XKB_KEY_Arabic_semicolon 0x05bb /* U+061B ARABIC SEMICOLON */
1116+#define XKB_KEY_Arabic_question_mark 0x05bf /* U+061F ARABIC QUESTION MARK */
1117+#define XKB_KEY_Arabic_hamza 0x05c1 /* U+0621 ARABIC LETTER HAMZA */
1118+#define XKB_KEY_Arabic_maddaonalef 0x05c2 /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */
1119+#define XKB_KEY_Arabic_hamzaonalef 0x05c3 /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */
1120+#define XKB_KEY_Arabic_hamzaonwaw 0x05c4 /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */
1121+#define XKB_KEY_Arabic_hamzaunderalef 0x05c5 /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */
1122+#define XKB_KEY_Arabic_hamzaonyeh 0x05c6 /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */
1123+#define XKB_KEY_Arabic_alef 0x05c7 /* U+0627 ARABIC LETTER ALEF */
1124+#define XKB_KEY_Arabic_beh 0x05c8 /* U+0628 ARABIC LETTER BEH */
1125+#define XKB_KEY_Arabic_tehmarbuta 0x05c9 /* U+0629 ARABIC LETTER TEH MARBUTA */
1126+#define XKB_KEY_Arabic_teh 0x05ca /* U+062A ARABIC LETTER TEH */
1127+#define XKB_KEY_Arabic_theh 0x05cb /* U+062B ARABIC LETTER THEH */
1128+#define XKB_KEY_Arabic_jeem 0x05cc /* U+062C ARABIC LETTER JEEM */
1129+#define XKB_KEY_Arabic_hah 0x05cd /* U+062D ARABIC LETTER HAH */
1130+#define XKB_KEY_Arabic_khah 0x05ce /* U+062E ARABIC LETTER KHAH */
1131+#define XKB_KEY_Arabic_dal 0x05cf /* U+062F ARABIC LETTER DAL */
1132+#define XKB_KEY_Arabic_thal 0x05d0 /* U+0630 ARABIC LETTER THAL */
1133+#define XKB_KEY_Arabic_ra 0x05d1 /* U+0631 ARABIC LETTER REH */
1134+#define XKB_KEY_Arabic_zain 0x05d2 /* U+0632 ARABIC LETTER ZAIN */
1135+#define XKB_KEY_Arabic_seen 0x05d3 /* U+0633 ARABIC LETTER SEEN */
1136+#define XKB_KEY_Arabic_sheen 0x05d4 /* U+0634 ARABIC LETTER SHEEN */
1137+#define XKB_KEY_Arabic_sad 0x05d5 /* U+0635 ARABIC LETTER SAD */
1138+#define XKB_KEY_Arabic_dad 0x05d6 /* U+0636 ARABIC LETTER DAD */
1139+#define XKB_KEY_Arabic_tah 0x05d7 /* U+0637 ARABIC LETTER TAH */
1140+#define XKB_KEY_Arabic_zah 0x05d8 /* U+0638 ARABIC LETTER ZAH */
1141+#define XKB_KEY_Arabic_ain 0x05d9 /* U+0639 ARABIC LETTER AIN */
1142+#define XKB_KEY_Arabic_ghain 0x05da /* U+063A ARABIC LETTER GHAIN */
1143+#define XKB_KEY_Arabic_tatweel 0x05e0 /* U+0640 ARABIC TATWEEL */
1144+#define XKB_KEY_Arabic_feh 0x05e1 /* U+0641 ARABIC LETTER FEH */
1145+#define XKB_KEY_Arabic_qaf 0x05e2 /* U+0642 ARABIC LETTER QAF */
1146+#define XKB_KEY_Arabic_kaf 0x05e3 /* U+0643 ARABIC LETTER KAF */
1147+#define XKB_KEY_Arabic_lam 0x05e4 /* U+0644 ARABIC LETTER LAM */
1148+#define XKB_KEY_Arabic_meem 0x05e5 /* U+0645 ARABIC LETTER MEEM */
1149+#define XKB_KEY_Arabic_noon 0x05e6 /* U+0646 ARABIC LETTER NOON */
1150+#define XKB_KEY_Arabic_ha 0x05e7 /* U+0647 ARABIC LETTER HEH */
1151+#define XKB_KEY_Arabic_heh 0x05e7 /* deprecated */
1152+#define XKB_KEY_Arabic_waw 0x05e8 /* U+0648 ARABIC LETTER WAW */
1153+#define XKB_KEY_Arabic_alefmaksura 0x05e9 /* U+0649 ARABIC LETTER ALEF MAKSURA */
1154+#define XKB_KEY_Arabic_yeh 0x05ea /* U+064A ARABIC LETTER YEH */
1155+#define XKB_KEY_Arabic_fathatan 0x05eb /* U+064B ARABIC FATHATAN */
1156+#define XKB_KEY_Arabic_dammatan 0x05ec /* U+064C ARABIC DAMMATAN */
1157+#define XKB_KEY_Arabic_kasratan 0x05ed /* U+064D ARABIC KASRATAN */
1158+#define XKB_KEY_Arabic_fatha 0x05ee /* U+064E ARABIC FATHA */
1159+#define XKB_KEY_Arabic_damma 0x05ef /* U+064F ARABIC DAMMA */
1160+#define XKB_KEY_Arabic_kasra 0x05f0 /* U+0650 ARABIC KASRA */
1161+#define XKB_KEY_Arabic_shadda 0x05f1 /* U+0651 ARABIC SHADDA */
1162+#define XKB_KEY_Arabic_sukun 0x05f2 /* U+0652 ARABIC SUKUN */
1163+#define XKB_KEY_Arabic_madda_above 0x1000653 /* U+0653 ARABIC MADDAH ABOVE */
1164+#define XKB_KEY_Arabic_hamza_above 0x1000654 /* U+0654 ARABIC HAMZA ABOVE */
1165+#define XKB_KEY_Arabic_hamza_below 0x1000655 /* U+0655 ARABIC HAMZA BELOW */
1166+#define XKB_KEY_Arabic_jeh 0x1000698 /* U+0698 ARABIC LETTER JEH */
1167+#define XKB_KEY_Arabic_veh 0x10006a4 /* U+06A4 ARABIC LETTER VEH */
1168+#define XKB_KEY_Arabic_keheh 0x10006a9 /* U+06A9 ARABIC LETTER KEHEH */
1169+#define XKB_KEY_Arabic_gaf 0x10006af /* U+06AF ARABIC LETTER GAF */
1170+#define XKB_KEY_Arabic_noon_ghunna 0x10006ba /* U+06BA ARABIC LETTER NOON GHUNNA */
1171+#define XKB_KEY_Arabic_heh_doachashmee 0x10006be /* U+06BE ARABIC LETTER HEH DOACHASHMEE */
1172+#define XKB_KEY_Farsi_yeh 0x10006cc /* U+06CC ARABIC LETTER FARSI YEH */
1173+#define XKB_KEY_Arabic_farsi_yeh 0x10006cc /* deprecated alias for Farsi_yeh */
1174+#define XKB_KEY_Arabic_yeh_baree 0x10006d2 /* U+06D2 ARABIC LETTER YEH BARREE */
1175+#define XKB_KEY_Arabic_heh_goal 0x10006c1 /* U+06C1 ARABIC LETTER HEH GOAL */
1176+#define XKB_KEY_Arabic_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
1177+
1178+/*
1179+ * Cyrillic
1180+ * Byte 3 = 6
1181+ */
1182+#define XKB_KEY_Cyrillic_GHE_bar 0x1000492 /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */
1183+#define XKB_KEY_Cyrillic_ghe_bar 0x1000493 /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */
1184+#define XKB_KEY_Cyrillic_ZHE_descender 0x1000496 /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */
1185+#define XKB_KEY_Cyrillic_zhe_descender 0x1000497 /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */
1186+#define XKB_KEY_Cyrillic_KA_descender 0x100049a /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */
1187+#define XKB_KEY_Cyrillic_ka_descender 0x100049b /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */
1188+#define XKB_KEY_Cyrillic_KA_vertstroke 0x100049c /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */
1189+#define XKB_KEY_Cyrillic_ka_vertstroke 0x100049d /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */
1190+#define XKB_KEY_Cyrillic_EN_descender 0x10004a2 /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */
1191+#define XKB_KEY_Cyrillic_en_descender 0x10004a3 /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */
1192+#define XKB_KEY_Cyrillic_U_straight 0x10004ae /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */
1193+#define XKB_KEY_Cyrillic_u_straight 0x10004af /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */
1194+#define XKB_KEY_Cyrillic_U_straight_bar 0x10004b0 /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */
1195+#define XKB_KEY_Cyrillic_u_straight_bar 0x10004b1 /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */
1196+#define XKB_KEY_Cyrillic_HA_descender 0x10004b2 /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */
1197+#define XKB_KEY_Cyrillic_ha_descender 0x10004b3 /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */
1198+#define XKB_KEY_Cyrillic_CHE_descender 0x10004b6 /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */
1199+#define XKB_KEY_Cyrillic_che_descender 0x10004b7 /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */
1200+#define XKB_KEY_Cyrillic_CHE_vertstroke 0x10004b8 /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */
1201+#define XKB_KEY_Cyrillic_che_vertstroke 0x10004b9 /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */
1202+#define XKB_KEY_Cyrillic_SHHA 0x10004ba /* U+04BA CYRILLIC CAPITAL LETTER SHHA */
1203+#define XKB_KEY_Cyrillic_shha 0x10004bb /* U+04BB CYRILLIC SMALL LETTER SHHA */
1204+
1205+#define XKB_KEY_Cyrillic_SCHWA 0x10004d8 /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */
1206+#define XKB_KEY_Cyrillic_schwa 0x10004d9 /* U+04D9 CYRILLIC SMALL LETTER SCHWA */
1207+#define XKB_KEY_Cyrillic_I_macron 0x10004e2 /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */
1208+#define XKB_KEY_Cyrillic_i_macron 0x10004e3 /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */
1209+#define XKB_KEY_Cyrillic_O_bar 0x10004e8 /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */
1210+#define XKB_KEY_Cyrillic_o_bar 0x10004e9 /* U+04E9 CYRILLIC SMALL LETTER BARRED O */
1211+#define XKB_KEY_Cyrillic_U_macron 0x10004ee /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */
1212+#define XKB_KEY_Cyrillic_u_macron 0x10004ef /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */
1213+
1214+#define XKB_KEY_Serbian_dje 0x06a1 /* U+0452 CYRILLIC SMALL LETTER DJE */
1215+#define XKB_KEY_Macedonia_gje 0x06a2 /* U+0453 CYRILLIC SMALL LETTER GJE */
1216+#define XKB_KEY_Cyrillic_io 0x06a3 /* U+0451 CYRILLIC SMALL LETTER IO */
1217+#define XKB_KEY_Ukrainian_ie 0x06a4 /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */
1218+#define XKB_KEY_Ukranian_je 0x06a4 /* deprecated */
1219+#define XKB_KEY_Macedonia_dse 0x06a5 /* U+0455 CYRILLIC SMALL LETTER DZE */
1220+#define XKB_KEY_Ukrainian_i 0x06a6 /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
1221+#define XKB_KEY_Ukranian_i 0x06a6 /* deprecated */
1222+#define XKB_KEY_Ukrainian_yi 0x06a7 /* U+0457 CYRILLIC SMALL LETTER YI */
1223+#define XKB_KEY_Ukranian_yi 0x06a7 /* deprecated */
1224+#define XKB_KEY_Cyrillic_je 0x06a8 /* U+0458 CYRILLIC SMALL LETTER JE */
1225+#define XKB_KEY_Serbian_je 0x06a8 /* deprecated */
1226+#define XKB_KEY_Cyrillic_lje 0x06a9 /* U+0459 CYRILLIC SMALL LETTER LJE */
1227+#define XKB_KEY_Serbian_lje 0x06a9 /* deprecated */
1228+#define XKB_KEY_Cyrillic_nje 0x06aa /* U+045A CYRILLIC SMALL LETTER NJE */
1229+#define XKB_KEY_Serbian_nje 0x06aa /* deprecated */
1230+#define XKB_KEY_Serbian_tshe 0x06ab /* U+045B CYRILLIC SMALL LETTER TSHE */
1231+#define XKB_KEY_Macedonia_kje 0x06ac /* U+045C CYRILLIC SMALL LETTER KJE */
1232+#define XKB_KEY_Ukrainian_ghe_with_upturn 0x06ad /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */
1233+#define XKB_KEY_Byelorussian_shortu 0x06ae /* U+045E CYRILLIC SMALL LETTER SHORT U */
1234+#define XKB_KEY_Cyrillic_dzhe 0x06af /* U+045F CYRILLIC SMALL LETTER DZHE */
1235+#define XKB_KEY_Serbian_dze 0x06af /* deprecated */
1236+#define XKB_KEY_numerosign 0x06b0 /* U+2116 NUMERO SIGN */
1237+#define XKB_KEY_Serbian_DJE 0x06b1 /* U+0402 CYRILLIC CAPITAL LETTER DJE */
1238+#define XKB_KEY_Macedonia_GJE 0x06b2 /* U+0403 CYRILLIC CAPITAL LETTER GJE */
1239+#define XKB_KEY_Cyrillic_IO 0x06b3 /* U+0401 CYRILLIC CAPITAL LETTER IO */
1240+#define XKB_KEY_Ukrainian_IE 0x06b4 /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */
1241+#define XKB_KEY_Ukranian_JE 0x06b4 /* deprecated */
1242+#define XKB_KEY_Macedonia_DSE 0x06b5 /* U+0405 CYRILLIC CAPITAL LETTER DZE */
1243+#define XKB_KEY_Ukrainian_I 0x06b6 /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
1244+#define XKB_KEY_Ukranian_I 0x06b6 /* deprecated */
1245+#define XKB_KEY_Ukrainian_YI 0x06b7 /* U+0407 CYRILLIC CAPITAL LETTER YI */
1246+#define XKB_KEY_Ukranian_YI 0x06b7 /* deprecated */
1247+#define XKB_KEY_Cyrillic_JE 0x06b8 /* U+0408 CYRILLIC CAPITAL LETTER JE */
1248+#define XKB_KEY_Serbian_JE 0x06b8 /* deprecated */
1249+#define XKB_KEY_Cyrillic_LJE 0x06b9 /* U+0409 CYRILLIC CAPITAL LETTER LJE */
1250+#define XKB_KEY_Serbian_LJE 0x06b9 /* deprecated */
1251+#define XKB_KEY_Cyrillic_NJE 0x06ba /* U+040A CYRILLIC CAPITAL LETTER NJE */
1252+#define XKB_KEY_Serbian_NJE 0x06ba /* deprecated */
1253+#define XKB_KEY_Serbian_TSHE 0x06bb /* U+040B CYRILLIC CAPITAL LETTER TSHE */
1254+#define XKB_KEY_Macedonia_KJE 0x06bc /* U+040C CYRILLIC CAPITAL LETTER KJE */
1255+#define XKB_KEY_Ukrainian_GHE_WITH_UPTURN 0x06bd /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
1256+#define XKB_KEY_Byelorussian_SHORTU 0x06be /* U+040E CYRILLIC CAPITAL LETTER SHORT U */
1257+#define XKB_KEY_Cyrillic_DZHE 0x06bf /* U+040F CYRILLIC CAPITAL LETTER DZHE */
1258+#define XKB_KEY_Serbian_DZE 0x06bf /* deprecated */
1259+#define XKB_KEY_Cyrillic_yu 0x06c0 /* U+044E CYRILLIC SMALL LETTER YU */
1260+#define XKB_KEY_Cyrillic_a 0x06c1 /* U+0430 CYRILLIC SMALL LETTER A */
1261+#define XKB_KEY_Cyrillic_be 0x06c2 /* U+0431 CYRILLIC SMALL LETTER BE */
1262+#define XKB_KEY_Cyrillic_tse 0x06c3 /* U+0446 CYRILLIC SMALL LETTER TSE */
1263+#define XKB_KEY_Cyrillic_de 0x06c4 /* U+0434 CYRILLIC SMALL LETTER DE */
1264+#define XKB_KEY_Cyrillic_ie 0x06c5 /* U+0435 CYRILLIC SMALL LETTER IE */
1265+#define XKB_KEY_Cyrillic_ef 0x06c6 /* U+0444 CYRILLIC SMALL LETTER EF */
1266+#define XKB_KEY_Cyrillic_ghe 0x06c7 /* U+0433 CYRILLIC SMALL LETTER GHE */
1267+#define XKB_KEY_Cyrillic_ha 0x06c8 /* U+0445 CYRILLIC SMALL LETTER HA */
1268+#define XKB_KEY_Cyrillic_i 0x06c9 /* U+0438 CYRILLIC SMALL LETTER I */
1269+#define XKB_KEY_Cyrillic_shorti 0x06ca /* U+0439 CYRILLIC SMALL LETTER SHORT I */
1270+#define XKB_KEY_Cyrillic_ka 0x06cb /* U+043A CYRILLIC SMALL LETTER KA */
1271+#define XKB_KEY_Cyrillic_el 0x06cc /* U+043B CYRILLIC SMALL LETTER EL */
1272+#define XKB_KEY_Cyrillic_em 0x06cd /* U+043C CYRILLIC SMALL LETTER EM */
1273+#define XKB_KEY_Cyrillic_en 0x06ce /* U+043D CYRILLIC SMALL LETTER EN */
1274+#define XKB_KEY_Cyrillic_o 0x06cf /* U+043E CYRILLIC SMALL LETTER O */
1275+#define XKB_KEY_Cyrillic_pe 0x06d0 /* U+043F CYRILLIC SMALL LETTER PE */
1276+#define XKB_KEY_Cyrillic_ya 0x06d1 /* U+044F CYRILLIC SMALL LETTER YA */
1277+#define XKB_KEY_Cyrillic_er 0x06d2 /* U+0440 CYRILLIC SMALL LETTER ER */
1278+#define XKB_KEY_Cyrillic_es 0x06d3 /* U+0441 CYRILLIC SMALL LETTER ES */
1279+#define XKB_KEY_Cyrillic_te 0x06d4 /* U+0442 CYRILLIC SMALL LETTER TE */
1280+#define XKB_KEY_Cyrillic_u 0x06d5 /* U+0443 CYRILLIC SMALL LETTER U */
1281+#define XKB_KEY_Cyrillic_zhe 0x06d6 /* U+0436 CYRILLIC SMALL LETTER ZHE */
1282+#define XKB_KEY_Cyrillic_ve 0x06d7 /* U+0432 CYRILLIC SMALL LETTER VE */
1283+#define XKB_KEY_Cyrillic_softsign 0x06d8 /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */
1284+#define XKB_KEY_Cyrillic_yeru 0x06d9 /* U+044B CYRILLIC SMALL LETTER YERU */
1285+#define XKB_KEY_Cyrillic_ze 0x06da /* U+0437 CYRILLIC SMALL LETTER ZE */
1286+#define XKB_KEY_Cyrillic_sha 0x06db /* U+0448 CYRILLIC SMALL LETTER SHA */
1287+#define XKB_KEY_Cyrillic_e 0x06dc /* U+044D CYRILLIC SMALL LETTER E */
1288+#define XKB_KEY_Cyrillic_shcha 0x06dd /* U+0449 CYRILLIC SMALL LETTER SHCHA */
1289+#define XKB_KEY_Cyrillic_che 0x06de /* U+0447 CYRILLIC SMALL LETTER CHE */
1290+#define XKB_KEY_Cyrillic_hardsign 0x06df /* U+044A CYRILLIC SMALL LETTER HARD SIGN */
1291+#define XKB_KEY_Cyrillic_YU 0x06e0 /* U+042E CYRILLIC CAPITAL LETTER YU */
1292+#define XKB_KEY_Cyrillic_A 0x06e1 /* U+0410 CYRILLIC CAPITAL LETTER A */
1293+#define XKB_KEY_Cyrillic_BE 0x06e2 /* U+0411 CYRILLIC CAPITAL LETTER BE */
1294+#define XKB_KEY_Cyrillic_TSE 0x06e3 /* U+0426 CYRILLIC CAPITAL LETTER TSE */
1295+#define XKB_KEY_Cyrillic_DE 0x06e4 /* U+0414 CYRILLIC CAPITAL LETTER DE */
1296+#define XKB_KEY_Cyrillic_IE 0x06e5 /* U+0415 CYRILLIC CAPITAL LETTER IE */
1297+#define XKB_KEY_Cyrillic_EF 0x06e6 /* U+0424 CYRILLIC CAPITAL LETTER EF */
1298+#define XKB_KEY_Cyrillic_GHE 0x06e7 /* U+0413 CYRILLIC CAPITAL LETTER GHE */
1299+#define XKB_KEY_Cyrillic_HA 0x06e8 /* U+0425 CYRILLIC CAPITAL LETTER HA */
1300+#define XKB_KEY_Cyrillic_I 0x06e9 /* U+0418 CYRILLIC CAPITAL LETTER I */
1301+#define XKB_KEY_Cyrillic_SHORTI 0x06ea /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */
1302+#define XKB_KEY_Cyrillic_KA 0x06eb /* U+041A CYRILLIC CAPITAL LETTER KA */
1303+#define XKB_KEY_Cyrillic_EL 0x06ec /* U+041B CYRILLIC CAPITAL LETTER EL */
1304+#define XKB_KEY_Cyrillic_EM 0x06ed /* U+041C CYRILLIC CAPITAL LETTER EM */
1305+#define XKB_KEY_Cyrillic_EN 0x06ee /* U+041D CYRILLIC CAPITAL LETTER EN */
1306+#define XKB_KEY_Cyrillic_O 0x06ef /* U+041E CYRILLIC CAPITAL LETTER O */
1307+#define XKB_KEY_Cyrillic_PE 0x06f0 /* U+041F CYRILLIC CAPITAL LETTER PE */
1308+#define XKB_KEY_Cyrillic_YA 0x06f1 /* U+042F CYRILLIC CAPITAL LETTER YA */
1309+#define XKB_KEY_Cyrillic_ER 0x06f2 /* U+0420 CYRILLIC CAPITAL LETTER ER */
1310+#define XKB_KEY_Cyrillic_ES 0x06f3 /* U+0421 CYRILLIC CAPITAL LETTER ES */
1311+#define XKB_KEY_Cyrillic_TE 0x06f4 /* U+0422 CYRILLIC CAPITAL LETTER TE */
1312+#define XKB_KEY_Cyrillic_U 0x06f5 /* U+0423 CYRILLIC CAPITAL LETTER U */
1313+#define XKB_KEY_Cyrillic_ZHE 0x06f6 /* U+0416 CYRILLIC CAPITAL LETTER ZHE */
1314+#define XKB_KEY_Cyrillic_VE 0x06f7 /* U+0412 CYRILLIC CAPITAL LETTER VE */
1315+#define XKB_KEY_Cyrillic_SOFTSIGN 0x06f8 /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */
1316+#define XKB_KEY_Cyrillic_YERU 0x06f9 /* U+042B CYRILLIC CAPITAL LETTER YERU */
1317+#define XKB_KEY_Cyrillic_ZE 0x06fa /* U+0417 CYRILLIC CAPITAL LETTER ZE */
1318+#define XKB_KEY_Cyrillic_SHA 0x06fb /* U+0428 CYRILLIC CAPITAL LETTER SHA */
1319+#define XKB_KEY_Cyrillic_E 0x06fc /* U+042D CYRILLIC CAPITAL LETTER E */
1320+#define XKB_KEY_Cyrillic_SHCHA 0x06fd /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
1321+#define XKB_KEY_Cyrillic_CHE 0x06fe /* U+0427 CYRILLIC CAPITAL LETTER CHE */
1322+#define XKB_KEY_Cyrillic_HARDSIGN 0x06ff /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */
1323+
1324+/*
1325+ * Greek
1326+ * (based on an early draft of, and not quite identical to, ISO/IEC 8859-7)
1327+ * Byte 3 = 7
1328+ */
1329+
1330+#define XKB_KEY_Greek_ALPHAaccent 0x07a1 /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */
1331+#define XKB_KEY_Greek_EPSILONaccent 0x07a2 /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */
1332+#define XKB_KEY_Greek_ETAaccent 0x07a3 /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */
1333+#define XKB_KEY_Greek_IOTAaccent 0x07a4 /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */
1334+#define XKB_KEY_Greek_IOTAdieresis 0x07a5 /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
1335+#define XKB_KEY_Greek_IOTAdiaeresis 0x07a5 /* deprecated (old typo) */
1336+#define XKB_KEY_Greek_OMICRONaccent 0x07a7 /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */
1337+#define XKB_KEY_Greek_UPSILONaccent 0x07a8 /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */
1338+#define XKB_KEY_Greek_UPSILONdieresis 0x07a9 /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
1339+#define XKB_KEY_Greek_OMEGAaccent 0x07ab /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */
1340+#define XKB_KEY_Greek_accentdieresis 0x07ae /* U+0385 GREEK DIALYTIKA TONOS */
1341+#define XKB_KEY_Greek_horizbar 0x07af /* U+2015 HORIZONTAL BAR */
1342+#define XKB_KEY_Greek_alphaaccent 0x07b1 /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */
1343+#define XKB_KEY_Greek_epsilonaccent 0x07b2 /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */
1344+#define XKB_KEY_Greek_etaaccent 0x07b3 /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */
1345+#define XKB_KEY_Greek_iotaaccent 0x07b4 /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */
1346+#define XKB_KEY_Greek_iotadieresis 0x07b5 /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */
1347+#define XKB_KEY_Greek_iotaaccentdieresis 0x07b6 /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
1348+#define XKB_KEY_Greek_omicronaccent 0x07b7 /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */
1349+#define XKB_KEY_Greek_upsilonaccent 0x07b8 /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */
1350+#define XKB_KEY_Greek_upsilondieresis 0x07b9 /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
1351+#define XKB_KEY_Greek_upsilonaccentdieresis 0x07ba /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
1352+#define XKB_KEY_Greek_omegaaccent 0x07bb /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */
1353+#define XKB_KEY_Greek_ALPHA 0x07c1 /* U+0391 GREEK CAPITAL LETTER ALPHA */
1354+#define XKB_KEY_Greek_BETA 0x07c2 /* U+0392 GREEK CAPITAL LETTER BETA */
1355+#define XKB_KEY_Greek_GAMMA 0x07c3 /* U+0393 GREEK CAPITAL LETTER GAMMA */
1356+#define XKB_KEY_Greek_DELTA 0x07c4 /* U+0394 GREEK CAPITAL LETTER DELTA */
1357+#define XKB_KEY_Greek_EPSILON 0x07c5 /* U+0395 GREEK CAPITAL LETTER EPSILON */
1358+#define XKB_KEY_Greek_ZETA 0x07c6 /* U+0396 GREEK CAPITAL LETTER ZETA */
1359+#define XKB_KEY_Greek_ETA 0x07c7 /* U+0397 GREEK CAPITAL LETTER ETA */
1360+#define XKB_KEY_Greek_THETA 0x07c8 /* U+0398 GREEK CAPITAL LETTER THETA */
1361+#define XKB_KEY_Greek_IOTA 0x07c9 /* U+0399 GREEK CAPITAL LETTER IOTA */
1362+#define XKB_KEY_Greek_KAPPA 0x07ca /* U+039A GREEK CAPITAL LETTER KAPPA */
1363+#define XKB_KEY_Greek_LAMDA 0x07cb /* U+039B GREEK CAPITAL LETTER LAMDA */
1364+#define XKB_KEY_Greek_LAMBDA 0x07cb /* non-deprecated alias for Greek_LAMDA */
1365+#define XKB_KEY_Greek_MU 0x07cc /* U+039C GREEK CAPITAL LETTER MU */
1366+#define XKB_KEY_Greek_NU 0x07cd /* U+039D GREEK CAPITAL LETTER NU */
1367+#define XKB_KEY_Greek_XI 0x07ce /* U+039E GREEK CAPITAL LETTER XI */
1368+#define XKB_KEY_Greek_OMICRON 0x07cf /* U+039F GREEK CAPITAL LETTER OMICRON */
1369+#define XKB_KEY_Greek_PI 0x07d0 /* U+03A0 GREEK CAPITAL LETTER PI */
1370+#define XKB_KEY_Greek_RHO 0x07d1 /* U+03A1 GREEK CAPITAL LETTER RHO */
1371+#define XKB_KEY_Greek_SIGMA 0x07d2 /* U+03A3 GREEK CAPITAL LETTER SIGMA */
1372+#define XKB_KEY_Greek_TAU 0x07d4 /* U+03A4 GREEK CAPITAL LETTER TAU */
1373+#define XKB_KEY_Greek_UPSILON 0x07d5 /* U+03A5 GREEK CAPITAL LETTER UPSILON */
1374+#define XKB_KEY_Greek_PHI 0x07d6 /* U+03A6 GREEK CAPITAL LETTER PHI */
1375+#define XKB_KEY_Greek_CHI 0x07d7 /* U+03A7 GREEK CAPITAL LETTER CHI */
1376+#define XKB_KEY_Greek_PSI 0x07d8 /* U+03A8 GREEK CAPITAL LETTER PSI */
1377+#define XKB_KEY_Greek_OMEGA 0x07d9 /* U+03A9 GREEK CAPITAL LETTER OMEGA */
1378+#define XKB_KEY_Greek_alpha 0x07e1 /* U+03B1 GREEK SMALL LETTER ALPHA */
1379+#define XKB_KEY_Greek_beta 0x07e2 /* U+03B2 GREEK SMALL LETTER BETA */
1380+#define XKB_KEY_Greek_gamma 0x07e3 /* U+03B3 GREEK SMALL LETTER GAMMA */
1381+#define XKB_KEY_Greek_delta 0x07e4 /* U+03B4 GREEK SMALL LETTER DELTA */
1382+#define XKB_KEY_Greek_epsilon 0x07e5 /* U+03B5 GREEK SMALL LETTER EPSILON */
1383+#define XKB_KEY_Greek_zeta 0x07e6 /* U+03B6 GREEK SMALL LETTER ZETA */
1384+#define XKB_KEY_Greek_eta 0x07e7 /* U+03B7 GREEK SMALL LETTER ETA */
1385+#define XKB_KEY_Greek_theta 0x07e8 /* U+03B8 GREEK SMALL LETTER THETA */
1386+#define XKB_KEY_Greek_iota 0x07e9 /* U+03B9 GREEK SMALL LETTER IOTA */
1387+#define XKB_KEY_Greek_kappa 0x07ea /* U+03BA GREEK SMALL LETTER KAPPA */
1388+#define XKB_KEY_Greek_lamda 0x07eb /* U+03BB GREEK SMALL LETTER LAMDA */
1389+#define XKB_KEY_Greek_lambda 0x07eb /* non-deprecated alias for Greek_lamda */
1390+#define XKB_KEY_Greek_mu 0x07ec /* U+03BC GREEK SMALL LETTER MU */
1391+#define XKB_KEY_Greek_nu 0x07ed /* U+03BD GREEK SMALL LETTER NU */
1392+#define XKB_KEY_Greek_xi 0x07ee /* U+03BE GREEK SMALL LETTER XI */
1393+#define XKB_KEY_Greek_omicron 0x07ef /* U+03BF GREEK SMALL LETTER OMICRON */
1394+#define XKB_KEY_Greek_pi 0x07f0 /* U+03C0 GREEK SMALL LETTER PI */
1395+#define XKB_KEY_Greek_rho 0x07f1 /* U+03C1 GREEK SMALL LETTER RHO */
1396+#define XKB_KEY_Greek_sigma 0x07f2 /* U+03C3 GREEK SMALL LETTER SIGMA */
1397+#define XKB_KEY_Greek_finalsmallsigma 0x07f3 /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */
1398+#define XKB_KEY_Greek_tau 0x07f4 /* U+03C4 GREEK SMALL LETTER TAU */
1399+#define XKB_KEY_Greek_upsilon 0x07f5 /* U+03C5 GREEK SMALL LETTER UPSILON */
1400+#define XKB_KEY_Greek_phi 0x07f6 /* U+03C6 GREEK SMALL LETTER PHI */
1401+#define XKB_KEY_Greek_chi 0x07f7 /* U+03C7 GREEK SMALL LETTER CHI */
1402+#define XKB_KEY_Greek_psi 0x07f8 /* U+03C8 GREEK SMALL LETTER PSI */
1403+#define XKB_KEY_Greek_omega 0x07f9 /* U+03C9 GREEK SMALL LETTER OMEGA */
1404+#define XKB_KEY_Greek_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
1405+
1406+/*
1407+ * Technical
1408+ * (from the DEC VT330/VT420 Technical Character Set, http://vt100.net/charsets/technical.html)
1409+ * Byte 3 = 8
1410+ */
1411+
1412+#define XKB_KEY_leftradical 0x08a1 /* U+23B7 RADICAL SYMBOL BOTTOM */
1413+#define XKB_KEY_topleftradical 0x08a2 /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/
1414+#define XKB_KEY_horizconnector 0x08a3 /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/
1415+#define XKB_KEY_topintegral 0x08a4 /* U+2320 TOP HALF INTEGRAL */
1416+#define XKB_KEY_botintegral 0x08a5 /* U+2321 BOTTOM HALF INTEGRAL */
1417+#define XKB_KEY_vertconnector 0x08a6 /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/
1418+#define XKB_KEY_topleftsqbracket 0x08a7 /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */
1419+#define XKB_KEY_botleftsqbracket 0x08a8 /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */
1420+#define XKB_KEY_toprightsqbracket 0x08a9 /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */
1421+#define XKB_KEY_botrightsqbracket 0x08aa /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */
1422+#define XKB_KEY_topleftparens 0x08ab /* U+239B LEFT PARENTHESIS UPPER HOOK */
1423+#define XKB_KEY_botleftparens 0x08ac /* U+239D LEFT PARENTHESIS LOWER HOOK */
1424+#define XKB_KEY_toprightparens 0x08ad /* U+239E RIGHT PARENTHESIS UPPER HOOK */
1425+#define XKB_KEY_botrightparens 0x08ae /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */
1426+#define XKB_KEY_leftmiddlecurlybrace 0x08af /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */
1427+#define XKB_KEY_rightmiddlecurlybrace 0x08b0 /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */
1428+#define XKB_KEY_topleftsummation 0x08b1
1429+#define XKB_KEY_botleftsummation 0x08b2
1430+#define XKB_KEY_topvertsummationconnector 0x08b3
1431+#define XKB_KEY_botvertsummationconnector 0x08b4
1432+#define XKB_KEY_toprightsummation 0x08b5
1433+#define XKB_KEY_botrightsummation 0x08b6
1434+#define XKB_KEY_rightmiddlesummation 0x08b7
1435+#define XKB_KEY_lessthanequal 0x08bc /* U+2264 LESS-THAN OR EQUAL TO */
1436+#define XKB_KEY_notequal 0x08bd /* U+2260 NOT EQUAL TO */
1437+#define XKB_KEY_greaterthanequal 0x08be /* U+2265 GREATER-THAN OR EQUAL TO */
1438+#define XKB_KEY_integral 0x08bf /* U+222B INTEGRAL */
1439+#define XKB_KEY_therefore 0x08c0 /* U+2234 THEREFORE */
1440+#define XKB_KEY_variation 0x08c1 /* U+221D PROPORTIONAL TO */
1441+#define XKB_KEY_infinity 0x08c2 /* U+221E INFINITY */
1442+#define XKB_KEY_nabla 0x08c5 /* U+2207 NABLA */
1443+#define XKB_KEY_approximate 0x08c8 /* U+223C TILDE OPERATOR */
1444+#define XKB_KEY_similarequal 0x08c9 /* U+2243 ASYMPTOTICALLY EQUAL TO */
1445+#define XKB_KEY_ifonlyif 0x08cd /* U+21D4 LEFT RIGHT DOUBLE ARROW */
1446+#define XKB_KEY_implies 0x08ce /* U+21D2 RIGHTWARDS DOUBLE ARROW */
1447+#define XKB_KEY_identical 0x08cf /* U+2261 IDENTICAL TO */
1448+#define XKB_KEY_radical 0x08d6 /* U+221A SQUARE ROOT */
1449+#define XKB_KEY_includedin 0x08da /* U+2282 SUBSET OF */
1450+#define XKB_KEY_includes 0x08db /* U+2283 SUPERSET OF */
1451+#define XKB_KEY_intersection 0x08dc /* U+2229 INTERSECTION */
1452+#define XKB_KEY_union 0x08dd /* U+222A UNION */
1453+#define XKB_KEY_logicaland 0x08de /* U+2227 LOGICAL AND */
1454+#define XKB_KEY_logicalor 0x08df /* U+2228 LOGICAL OR */
1455+#define XKB_KEY_partialderivative 0x08ef /* U+2202 PARTIAL DIFFERENTIAL */
1456+#define XKB_KEY_function 0x08f6 /* U+0192 LATIN SMALL LETTER F WITH HOOK */
1457+#define XKB_KEY_leftarrow 0x08fb /* U+2190 LEFTWARDS ARROW */
1458+#define XKB_KEY_uparrow 0x08fc /* U+2191 UPWARDS ARROW */
1459+#define XKB_KEY_rightarrow 0x08fd /* U+2192 RIGHTWARDS ARROW */
1460+#define XKB_KEY_downarrow 0x08fe /* U+2193 DOWNWARDS ARROW */
1461+
1462+/*
1463+ * Special
1464+ * (from the DEC VT100 Special Graphics Character Set)
1465+ * Byte 3 = 9
1466+ */
1467+
1468+#define XKB_KEY_blank 0x09df
1469+#define XKB_KEY_soliddiamond 0x09e0 /* U+25C6 BLACK DIAMOND */
1470+#define XKB_KEY_checkerboard 0x09e1 /* U+2592 MEDIUM SHADE */
1471+#define XKB_KEY_ht 0x09e2 /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */
1472+#define XKB_KEY_ff 0x09e3 /* U+240C SYMBOL FOR FORM FEED */
1473+#define XKB_KEY_cr 0x09e4 /* U+240D SYMBOL FOR CARRIAGE RETURN */
1474+#define XKB_KEY_lf 0x09e5 /* U+240A SYMBOL FOR LINE FEED */
1475+#define XKB_KEY_nl 0x09e8 /* U+2424 SYMBOL FOR NEWLINE */
1476+#define XKB_KEY_vt 0x09e9 /* U+240B SYMBOL FOR VERTICAL TABULATION */
1477+#define XKB_KEY_lowrightcorner 0x09ea /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */
1478+#define XKB_KEY_uprightcorner 0x09eb /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */
1479+#define XKB_KEY_upleftcorner 0x09ec /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */
1480+#define XKB_KEY_lowleftcorner 0x09ed /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */
1481+#define XKB_KEY_crossinglines 0x09ee /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
1482+#define XKB_KEY_horizlinescan1 0x09ef /* U+23BA HORIZONTAL SCAN LINE-1 */
1483+#define XKB_KEY_horizlinescan3 0x09f0 /* U+23BB HORIZONTAL SCAN LINE-3 */
1484+#define XKB_KEY_horizlinescan5 0x09f1 /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */
1485+#define XKB_KEY_horizlinescan7 0x09f2 /* U+23BC HORIZONTAL SCAN LINE-7 */
1486+#define XKB_KEY_horizlinescan9 0x09f3 /* U+23BD HORIZONTAL SCAN LINE-9 */
1487+#define XKB_KEY_leftt 0x09f4 /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
1488+#define XKB_KEY_rightt 0x09f5 /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */
1489+#define XKB_KEY_bott 0x09f6 /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */
1490+#define XKB_KEY_topt 0x09f7 /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
1491+#define XKB_KEY_vertbar 0x09f8 /* U+2502 BOX DRAWINGS LIGHT VERTICAL */
1492+
1493+/*
1494+ * Publishing
1495+ * (these are probably from a long forgotten DEC Publishing
1496+ * font that once shipped with DECwrite)
1497+ * Byte 3 = 0x0a
1498+ */
1499+
1500+#define XKB_KEY_emspace 0x0aa1 /* U+2003 EM SPACE */
1501+#define XKB_KEY_enspace 0x0aa2 /* U+2002 EN SPACE */
1502+#define XKB_KEY_em3space 0x0aa3 /* U+2004 THREE-PER-EM SPACE */
1503+#define XKB_KEY_em4space 0x0aa4 /* U+2005 FOUR-PER-EM SPACE */
1504+#define XKB_KEY_digitspace 0x0aa5 /* U+2007 FIGURE SPACE */
1505+#define XKB_KEY_punctspace 0x0aa6 /* U+2008 PUNCTUATION SPACE */
1506+#define XKB_KEY_thinspace 0x0aa7 /* U+2009 THIN SPACE */
1507+#define XKB_KEY_hairspace 0x0aa8 /* U+200A HAIR SPACE */
1508+#define XKB_KEY_emdash 0x0aa9 /* U+2014 EM DASH */
1509+#define XKB_KEY_endash 0x0aaa /* U+2013 EN DASH */
1510+#define XKB_KEY_signifblank 0x0aac /*(U+2423 OPEN BOX)*/
1511+#define XKB_KEY_ellipsis 0x0aae /* U+2026 HORIZONTAL ELLIPSIS */
1512+#define XKB_KEY_doubbaselinedot 0x0aaf /* U+2025 TWO DOT LEADER */
1513+#define XKB_KEY_onethird 0x0ab0 /* U+2153 VULGAR FRACTION ONE THIRD */
1514+#define XKB_KEY_twothirds 0x0ab1 /* U+2154 VULGAR FRACTION TWO THIRDS */
1515+#define XKB_KEY_onefifth 0x0ab2 /* U+2155 VULGAR FRACTION ONE FIFTH */
1516+#define XKB_KEY_twofifths 0x0ab3 /* U+2156 VULGAR FRACTION TWO FIFTHS */
1517+#define XKB_KEY_threefifths 0x0ab4 /* U+2157 VULGAR FRACTION THREE FIFTHS */
1518+#define XKB_KEY_fourfifths 0x0ab5 /* U+2158 VULGAR FRACTION FOUR FIFTHS */
1519+#define XKB_KEY_onesixth 0x0ab6 /* U+2159 VULGAR FRACTION ONE SIXTH */
1520+#define XKB_KEY_fivesixths 0x0ab7 /* U+215A VULGAR FRACTION FIVE SIXTHS */
1521+#define XKB_KEY_careof 0x0ab8 /* U+2105 CARE OF */
1522+#define XKB_KEY_figdash 0x0abb /* U+2012 FIGURE DASH */
1523+#define XKB_KEY_leftanglebracket 0x0abc /*(U+2329 LEFT-POINTING ANGLE BRACKET)*/
1524+#define XKB_KEY_decimalpoint 0x0abd /*(U+002E FULL STOP)*/
1525+#define XKB_KEY_rightanglebracket 0x0abe /*(U+232A RIGHT-POINTING ANGLE BRACKET)*/
1526+#define XKB_KEY_marker 0x0abf
1527+#define XKB_KEY_oneeighth 0x0ac3 /* U+215B VULGAR FRACTION ONE EIGHTH */
1528+#define XKB_KEY_threeeighths 0x0ac4 /* U+215C VULGAR FRACTION THREE EIGHTHS */
1529+#define XKB_KEY_fiveeighths 0x0ac5 /* U+215D VULGAR FRACTION FIVE EIGHTHS */
1530+#define XKB_KEY_seveneighths 0x0ac6 /* U+215E VULGAR FRACTION SEVEN EIGHTHS */
1531+#define XKB_KEY_trademark 0x0ac9 /* U+2122 TRADE MARK SIGN */
1532+#define XKB_KEY_signaturemark 0x0aca /*(U+2613 SALTIRE)*/
1533+#define XKB_KEY_trademarkincircle 0x0acb
1534+#define XKB_KEY_leftopentriangle 0x0acc /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/
1535+#define XKB_KEY_rightopentriangle 0x0acd /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/
1536+#define XKB_KEY_emopencircle 0x0ace /*(U+25CB WHITE CIRCLE)*/
1537+#define XKB_KEY_emopenrectangle 0x0acf /*(U+25AF WHITE VERTICAL RECTANGLE)*/
1538+#define XKB_KEY_leftsinglequotemark 0x0ad0 /* U+2018 LEFT SINGLE QUOTATION MARK */
1539+#define XKB_KEY_rightsinglequotemark 0x0ad1 /* U+2019 RIGHT SINGLE QUOTATION MARK */
1540+#define XKB_KEY_leftdoublequotemark 0x0ad2 /* U+201C LEFT DOUBLE QUOTATION MARK */
1541+#define XKB_KEY_rightdoublequotemark 0x0ad3 /* U+201D RIGHT DOUBLE QUOTATION MARK */
1542+#define XKB_KEY_prescription 0x0ad4 /* U+211E PRESCRIPTION TAKE */
1543+#define XKB_KEY_permille 0x0ad5 /* U+2030 PER MILLE SIGN */
1544+#define XKB_KEY_minutes 0x0ad6 /* U+2032 PRIME */
1545+#define XKB_KEY_seconds 0x0ad7 /* U+2033 DOUBLE PRIME */
1546+#define XKB_KEY_latincross 0x0ad9 /* U+271D LATIN CROSS */
1547+#define XKB_KEY_hexagram 0x0ada
1548+#define XKB_KEY_filledrectbullet 0x0adb /*(U+25AC BLACK RECTANGLE)*/
1549+#define XKB_KEY_filledlefttribullet 0x0adc /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/
1550+#define XKB_KEY_filledrighttribullet 0x0add /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/
1551+#define XKB_KEY_emfilledcircle 0x0ade /*(U+25CF BLACK CIRCLE)*/
1552+#define XKB_KEY_emfilledrect 0x0adf /*(U+25AE BLACK VERTICAL RECTANGLE)*/
1553+#define XKB_KEY_enopencircbullet 0x0ae0 /*(U+25E6 WHITE BULLET)*/
1554+#define XKB_KEY_enopensquarebullet 0x0ae1 /*(U+25AB WHITE SMALL SQUARE)*/
1555+#define XKB_KEY_openrectbullet 0x0ae2 /*(U+25AD WHITE RECTANGLE)*/
1556+#define XKB_KEY_opentribulletup 0x0ae3 /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/
1557+#define XKB_KEY_opentribulletdown 0x0ae4 /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/
1558+#define XKB_KEY_openstar 0x0ae5 /*(U+2606 WHITE STAR)*/
1559+#define XKB_KEY_enfilledcircbullet 0x0ae6 /*(U+2022 BULLET)*/
1560+#define XKB_KEY_enfilledsqbullet 0x0ae7 /*(U+25AA BLACK SMALL SQUARE)*/
1561+#define XKB_KEY_filledtribulletup 0x0ae8 /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/
1562+#define XKB_KEY_filledtribulletdown 0x0ae9 /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/
1563+#define XKB_KEY_leftpointer 0x0aea /*(U+261C WHITE LEFT POINTING INDEX)*/
1564+#define XKB_KEY_rightpointer 0x0aeb /*(U+261E WHITE RIGHT POINTING INDEX)*/
1565+#define XKB_KEY_club 0x0aec /* U+2663 BLACK CLUB SUIT */
1566+#define XKB_KEY_diamond 0x0aed /* U+2666 BLACK DIAMOND SUIT */
1567+#define XKB_KEY_heart 0x0aee /* U+2665 BLACK HEART SUIT */
1568+#define XKB_KEY_maltesecross 0x0af0 /* U+2720 MALTESE CROSS */
1569+#define XKB_KEY_dagger 0x0af1 /* U+2020 DAGGER */
1570+#define XKB_KEY_doubledagger 0x0af2 /* U+2021 DOUBLE DAGGER */
1571+#define XKB_KEY_checkmark 0x0af3 /* U+2713 CHECK MARK */
1572+#define XKB_KEY_ballotcross 0x0af4 /* U+2717 BALLOT X */
1573+#define XKB_KEY_musicalsharp 0x0af5 /* U+266F MUSIC SHARP SIGN */
1574+#define XKB_KEY_musicalflat 0x0af6 /* U+266D MUSIC FLAT SIGN */
1575+#define XKB_KEY_malesymbol 0x0af7 /* U+2642 MALE SIGN */
1576+#define XKB_KEY_femalesymbol 0x0af8 /* U+2640 FEMALE SIGN */
1577+#define XKB_KEY_telephone 0x0af9 /* U+260E BLACK TELEPHONE */
1578+#define XKB_KEY_telephonerecorder 0x0afa /* U+2315 TELEPHONE RECORDER */
1579+#define XKB_KEY_phonographcopyright 0x0afb /* U+2117 SOUND RECORDING COPYRIGHT */
1580+#define XKB_KEY_caret 0x0afc /* U+2038 CARET */
1581+#define XKB_KEY_singlelowquotemark 0x0afd /* U+201A SINGLE LOW-9 QUOTATION MARK */
1582+#define XKB_KEY_doublelowquotemark 0x0afe /* U+201E DOUBLE LOW-9 QUOTATION MARK */
1583+#define XKB_KEY_cursor 0x0aff
1584+
1585+/*
1586+ * APL
1587+ * Byte 3 = 0x0b
1588+ */
1589+
1590+#define XKB_KEY_leftcaret 0x0ba3 /*(U+003C LESS-THAN SIGN)*/
1591+#define XKB_KEY_rightcaret 0x0ba6 /*(U+003E GREATER-THAN SIGN)*/
1592+#define XKB_KEY_downcaret 0x0ba8 /*(U+2228 LOGICAL OR)*/
1593+#define XKB_KEY_upcaret 0x0ba9 /*(U+2227 LOGICAL AND)*/
1594+#define XKB_KEY_overbar 0x0bc0 /*(U+00AF MACRON)*/
1595+#define XKB_KEY_downtack 0x0bc2 /* U+22A4 DOWN TACK */
1596+#define XKB_KEY_upshoe 0x0bc3 /*(U+2229 INTERSECTION)*/
1597+#define XKB_KEY_downstile 0x0bc4 /* U+230A LEFT FLOOR */
1598+#define XKB_KEY_underbar 0x0bc6 /*(U+005F LOW LINE)*/
1599+#define XKB_KEY_jot 0x0bca /* U+2218 RING OPERATOR */
1600+#define XKB_KEY_quad 0x0bcc /* U+2395 APL FUNCTIONAL SYMBOL QUAD */
1601+#define XKB_KEY_uptack 0x0bce /* U+22A5 UP TACK */
1602+#define XKB_KEY_circle 0x0bcf /* U+25CB WHITE CIRCLE */
1603+#define XKB_KEY_upstile 0x0bd3 /* U+2308 LEFT CEILING */
1604+#define XKB_KEY_downshoe 0x0bd6 /*(U+222A UNION)*/
1605+#define XKB_KEY_rightshoe 0x0bd8 /*(U+2283 SUPERSET OF)*/
1606+#define XKB_KEY_leftshoe 0x0bda /*(U+2282 SUBSET OF)*/
1607+#define XKB_KEY_lefttack 0x0bdc /* U+22A3 LEFT TACK */
1608+#define XKB_KEY_righttack 0x0bfc /* U+22A2 RIGHT TACK */
1609+
1610+/*
1611+ * Hebrew
1612+ * Byte 3 = 0x0c
1613+ */
1614+
1615+#define XKB_KEY_hebrew_doublelowline 0x0cdf /* U+2017 DOUBLE LOW LINE */
1616+#define XKB_KEY_hebrew_aleph 0x0ce0 /* U+05D0 HEBREW LETTER ALEF */
1617+#define XKB_KEY_hebrew_bet 0x0ce1 /* U+05D1 HEBREW LETTER BET */
1618+#define XKB_KEY_hebrew_beth 0x0ce1 /* deprecated */
1619+#define XKB_KEY_hebrew_gimel 0x0ce2 /* U+05D2 HEBREW LETTER GIMEL */
1620+#define XKB_KEY_hebrew_gimmel 0x0ce2 /* deprecated */
1621+#define XKB_KEY_hebrew_dalet 0x0ce3 /* U+05D3 HEBREW LETTER DALET */
1622+#define XKB_KEY_hebrew_daleth 0x0ce3 /* deprecated */
1623+#define XKB_KEY_hebrew_he 0x0ce4 /* U+05D4 HEBREW LETTER HE */
1624+#define XKB_KEY_hebrew_waw 0x0ce5 /* U+05D5 HEBREW LETTER VAV */
1625+#define XKB_KEY_hebrew_zain 0x0ce6 /* U+05D6 HEBREW LETTER ZAYIN */
1626+#define XKB_KEY_hebrew_zayin 0x0ce6 /* deprecated */
1627+#define XKB_KEY_hebrew_chet 0x0ce7 /* U+05D7 HEBREW LETTER HET */
1628+#define XKB_KEY_hebrew_het 0x0ce7 /* deprecated */
1629+#define XKB_KEY_hebrew_tet 0x0ce8 /* U+05D8 HEBREW LETTER TET */
1630+#define XKB_KEY_hebrew_teth 0x0ce8 /* deprecated */
1631+#define XKB_KEY_hebrew_yod 0x0ce9 /* U+05D9 HEBREW LETTER YOD */
1632+#define XKB_KEY_hebrew_finalkaph 0x0cea /* U+05DA HEBREW LETTER FINAL KAF */
1633+#define XKB_KEY_hebrew_kaph 0x0ceb /* U+05DB HEBREW LETTER KAF */
1634+#define XKB_KEY_hebrew_lamed 0x0cec /* U+05DC HEBREW LETTER LAMED */
1635+#define XKB_KEY_hebrew_finalmem 0x0ced /* U+05DD HEBREW LETTER FINAL MEM */
1636+#define XKB_KEY_hebrew_mem 0x0cee /* U+05DE HEBREW LETTER MEM */
1637+#define XKB_KEY_hebrew_finalnun 0x0cef /* U+05DF HEBREW LETTER FINAL NUN */
1638+#define XKB_KEY_hebrew_nun 0x0cf0 /* U+05E0 HEBREW LETTER NUN */
1639+#define XKB_KEY_hebrew_samech 0x0cf1 /* U+05E1 HEBREW LETTER SAMEKH */
1640+#define XKB_KEY_hebrew_samekh 0x0cf1 /* deprecated */
1641+#define XKB_KEY_hebrew_ayin 0x0cf2 /* U+05E2 HEBREW LETTER AYIN */
1642+#define XKB_KEY_hebrew_finalpe 0x0cf3 /* U+05E3 HEBREW LETTER FINAL PE */
1643+#define XKB_KEY_hebrew_pe 0x0cf4 /* U+05E4 HEBREW LETTER PE */
1644+#define XKB_KEY_hebrew_finalzade 0x0cf5 /* U+05E5 HEBREW LETTER FINAL TSADI */
1645+#define XKB_KEY_hebrew_finalzadi 0x0cf5 /* deprecated */
1646+#define XKB_KEY_hebrew_zade 0x0cf6 /* U+05E6 HEBREW LETTER TSADI */
1647+#define XKB_KEY_hebrew_zadi 0x0cf6 /* deprecated */
1648+#define XKB_KEY_hebrew_qoph 0x0cf7 /* U+05E7 HEBREW LETTER QOF */
1649+#define XKB_KEY_hebrew_kuf 0x0cf7 /* deprecated */
1650+#define XKB_KEY_hebrew_resh 0x0cf8 /* U+05E8 HEBREW LETTER RESH */
1651+#define XKB_KEY_hebrew_shin 0x0cf9 /* U+05E9 HEBREW LETTER SHIN */
1652+#define XKB_KEY_hebrew_taw 0x0cfa /* U+05EA HEBREW LETTER TAV */
1653+#define XKB_KEY_hebrew_taf 0x0cfa /* deprecated */
1654+#define XKB_KEY_Hebrew_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
1655+
1656+/*
1657+ * Thai
1658+ * Byte 3 = 0x0d
1659+ */
1660+
1661+#define XKB_KEY_Thai_kokai 0x0da1 /* U+0E01 THAI CHARACTER KO KAI */
1662+#define XKB_KEY_Thai_khokhai 0x0da2 /* U+0E02 THAI CHARACTER KHO KHAI */
1663+#define XKB_KEY_Thai_khokhuat 0x0da3 /* U+0E03 THAI CHARACTER KHO KHUAT */
1664+#define XKB_KEY_Thai_khokhwai 0x0da4 /* U+0E04 THAI CHARACTER KHO KHWAI */
1665+#define XKB_KEY_Thai_khokhon 0x0da5 /* U+0E05 THAI CHARACTER KHO KHON */
1666+#define XKB_KEY_Thai_khorakhang 0x0da6 /* U+0E06 THAI CHARACTER KHO RAKHANG */
1667+#define XKB_KEY_Thai_ngongu 0x0da7 /* U+0E07 THAI CHARACTER NGO NGU */
1668+#define XKB_KEY_Thai_chochan 0x0da8 /* U+0E08 THAI CHARACTER CHO CHAN */
1669+#define XKB_KEY_Thai_choching 0x0da9 /* U+0E09 THAI CHARACTER CHO CHING */
1670+#define XKB_KEY_Thai_chochang 0x0daa /* U+0E0A THAI CHARACTER CHO CHANG */
1671+#define XKB_KEY_Thai_soso 0x0dab /* U+0E0B THAI CHARACTER SO SO */
1672+#define XKB_KEY_Thai_chochoe 0x0dac /* U+0E0C THAI CHARACTER CHO CHOE */
1673+#define XKB_KEY_Thai_yoying 0x0dad /* U+0E0D THAI CHARACTER YO YING */
1674+#define XKB_KEY_Thai_dochada 0x0dae /* U+0E0E THAI CHARACTER DO CHADA */
1675+#define XKB_KEY_Thai_topatak 0x0daf /* U+0E0F THAI CHARACTER TO PATAK */
1676+#define XKB_KEY_Thai_thothan 0x0db0 /* U+0E10 THAI CHARACTER THO THAN */
1677+#define XKB_KEY_Thai_thonangmontho 0x0db1 /* U+0E11 THAI CHARACTER THO NANGMONTHO */
1678+#define XKB_KEY_Thai_thophuthao 0x0db2 /* U+0E12 THAI CHARACTER THO PHUTHAO */
1679+#define XKB_KEY_Thai_nonen 0x0db3 /* U+0E13 THAI CHARACTER NO NEN */
1680+#define XKB_KEY_Thai_dodek 0x0db4 /* U+0E14 THAI CHARACTER DO DEK */
1681+#define XKB_KEY_Thai_totao 0x0db5 /* U+0E15 THAI CHARACTER TO TAO */
1682+#define XKB_KEY_Thai_thothung 0x0db6 /* U+0E16 THAI CHARACTER THO THUNG */
1683+#define XKB_KEY_Thai_thothahan 0x0db7 /* U+0E17 THAI CHARACTER THO THAHAN */
1684+#define XKB_KEY_Thai_thothong 0x0db8 /* U+0E18 THAI CHARACTER THO THONG */
1685+#define XKB_KEY_Thai_nonu 0x0db9 /* U+0E19 THAI CHARACTER NO NU */
1686+#define XKB_KEY_Thai_bobaimai 0x0dba /* U+0E1A THAI CHARACTER BO BAIMAI */
1687+#define XKB_KEY_Thai_popla 0x0dbb /* U+0E1B THAI CHARACTER PO PLA */
1688+#define XKB_KEY_Thai_phophung 0x0dbc /* U+0E1C THAI CHARACTER PHO PHUNG */
1689+#define XKB_KEY_Thai_fofa 0x0dbd /* U+0E1D THAI CHARACTER FO FA */
1690+#define XKB_KEY_Thai_phophan 0x0dbe /* U+0E1E THAI CHARACTER PHO PHAN */
1691+#define XKB_KEY_Thai_fofan 0x0dbf /* U+0E1F THAI CHARACTER FO FAN */
1692+#define XKB_KEY_Thai_phosamphao 0x0dc0 /* U+0E20 THAI CHARACTER PHO SAMPHAO */
1693+#define XKB_KEY_Thai_moma 0x0dc1 /* U+0E21 THAI CHARACTER MO MA */
1694+#define XKB_KEY_Thai_yoyak 0x0dc2 /* U+0E22 THAI CHARACTER YO YAK */
1695+#define XKB_KEY_Thai_rorua 0x0dc3 /* U+0E23 THAI CHARACTER RO RUA */
1696+#define XKB_KEY_Thai_ru 0x0dc4 /* U+0E24 THAI CHARACTER RU */
1697+#define XKB_KEY_Thai_loling 0x0dc5 /* U+0E25 THAI CHARACTER LO LING */
1698+#define XKB_KEY_Thai_lu 0x0dc6 /* U+0E26 THAI CHARACTER LU */
1699+#define XKB_KEY_Thai_wowaen 0x0dc7 /* U+0E27 THAI CHARACTER WO WAEN */
1700+#define XKB_KEY_Thai_sosala 0x0dc8 /* U+0E28 THAI CHARACTER SO SALA */
1701+#define XKB_KEY_Thai_sorusi 0x0dc9 /* U+0E29 THAI CHARACTER SO RUSI */
1702+#define XKB_KEY_Thai_sosua 0x0dca /* U+0E2A THAI CHARACTER SO SUA */
1703+#define XKB_KEY_Thai_hohip 0x0dcb /* U+0E2B THAI CHARACTER HO HIP */
1704+#define XKB_KEY_Thai_lochula 0x0dcc /* U+0E2C THAI CHARACTER LO CHULA */
1705+#define XKB_KEY_Thai_oang 0x0dcd /* U+0E2D THAI CHARACTER O ANG */
1706+#define XKB_KEY_Thai_honokhuk 0x0dce /* U+0E2E THAI CHARACTER HO NOKHUK */
1707+#define XKB_KEY_Thai_paiyannoi 0x0dcf /* U+0E2F THAI CHARACTER PAIYANNOI */
1708+#define XKB_KEY_Thai_saraa 0x0dd0 /* U+0E30 THAI CHARACTER SARA A */
1709+#define XKB_KEY_Thai_maihanakat 0x0dd1 /* U+0E31 THAI CHARACTER MAI HAN-AKAT */
1710+#define XKB_KEY_Thai_saraaa 0x0dd2 /* U+0E32 THAI CHARACTER SARA AA */
1711+#define XKB_KEY_Thai_saraam 0x0dd3 /* U+0E33 THAI CHARACTER SARA AM */
1712+#define XKB_KEY_Thai_sarai 0x0dd4 /* U+0E34 THAI CHARACTER SARA I */
1713+#define XKB_KEY_Thai_saraii 0x0dd5 /* U+0E35 THAI CHARACTER SARA II */
1714+#define XKB_KEY_Thai_saraue 0x0dd6 /* U+0E36 THAI CHARACTER SARA UE */
1715+#define XKB_KEY_Thai_sarauee 0x0dd7 /* U+0E37 THAI CHARACTER SARA UEE */
1716+#define XKB_KEY_Thai_sarau 0x0dd8 /* U+0E38 THAI CHARACTER SARA U */
1717+#define XKB_KEY_Thai_sarauu 0x0dd9 /* U+0E39 THAI CHARACTER SARA UU */
1718+#define XKB_KEY_Thai_phinthu 0x0dda /* U+0E3A THAI CHARACTER PHINTHU */
1719+#define XKB_KEY_Thai_maihanakat_maitho 0x0dde /*(U+0E3E Unassigned code point)*/
1720+#define XKB_KEY_Thai_baht 0x0ddf /* U+0E3F THAI CURRENCY SYMBOL BAHT */
1721+#define XKB_KEY_Thai_sarae 0x0de0 /* U+0E40 THAI CHARACTER SARA E */
1722+#define XKB_KEY_Thai_saraae 0x0de1 /* U+0E41 THAI CHARACTER SARA AE */
1723+#define XKB_KEY_Thai_sarao 0x0de2 /* U+0E42 THAI CHARACTER SARA O */
1724+#define XKB_KEY_Thai_saraaimaimuan 0x0de3 /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */
1725+#define XKB_KEY_Thai_saraaimaimalai 0x0de4 /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */
1726+#define XKB_KEY_Thai_lakkhangyao 0x0de5 /* U+0E45 THAI CHARACTER LAKKHANGYAO */
1727+#define XKB_KEY_Thai_maiyamok 0x0de6 /* U+0E46 THAI CHARACTER MAIYAMOK */
1728+#define XKB_KEY_Thai_maitaikhu 0x0de7 /* U+0E47 THAI CHARACTER MAITAIKHU */
1729+#define XKB_KEY_Thai_maiek 0x0de8 /* U+0E48 THAI CHARACTER MAI EK */
1730+#define XKB_KEY_Thai_maitho 0x0de9 /* U+0E49 THAI CHARACTER MAI THO */
1731+#define XKB_KEY_Thai_maitri 0x0dea /* U+0E4A THAI CHARACTER MAI TRI */
1732+#define XKB_KEY_Thai_maichattawa 0x0deb /* U+0E4B THAI CHARACTER MAI CHATTAWA */
1733+#define XKB_KEY_Thai_thanthakhat 0x0dec /* U+0E4C THAI CHARACTER THANTHAKHAT */
1734+#define XKB_KEY_Thai_nikhahit 0x0ded /* U+0E4D THAI CHARACTER NIKHAHIT */
1735+#define XKB_KEY_Thai_leksun 0x0df0 /* U+0E50 THAI DIGIT ZERO */
1736+#define XKB_KEY_Thai_leknung 0x0df1 /* U+0E51 THAI DIGIT ONE */
1737+#define XKB_KEY_Thai_leksong 0x0df2 /* U+0E52 THAI DIGIT TWO */
1738+#define XKB_KEY_Thai_leksam 0x0df3 /* U+0E53 THAI DIGIT THREE */
1739+#define XKB_KEY_Thai_leksi 0x0df4 /* U+0E54 THAI DIGIT FOUR */
1740+#define XKB_KEY_Thai_lekha 0x0df5 /* U+0E55 THAI DIGIT FIVE */
1741+#define XKB_KEY_Thai_lekhok 0x0df6 /* U+0E56 THAI DIGIT SIX */
1742+#define XKB_KEY_Thai_lekchet 0x0df7 /* U+0E57 THAI DIGIT SEVEN */
1743+#define XKB_KEY_Thai_lekpaet 0x0df8 /* U+0E58 THAI DIGIT EIGHT */
1744+#define XKB_KEY_Thai_lekkao 0x0df9 /* U+0E59 THAI DIGIT NINE */
1745+
1746+/*
1747+ * Korean
1748+ * Byte 3 = 0x0e
1749+ */
1750+
1751+
1752+#define XKB_KEY_Hangul 0xff31 /* Hangul start/stop(toggle) */
1753+#define XKB_KEY_Hangul_Start 0xff32 /* Hangul start */
1754+#define XKB_KEY_Hangul_End 0xff33 /* Hangul end, English start */
1755+#define XKB_KEY_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */
1756+#define XKB_KEY_Hangul_Jamo 0xff35 /* Hangul Jamo mode */
1757+#define XKB_KEY_Hangul_Romaja 0xff36 /* Hangul Romaja mode */
1758+#define XKB_KEY_Hangul_Codeinput 0xff37 /* Hangul code input mode */
1759+#define XKB_KEY_Hangul_Jeonja 0xff38 /* Jeonja mode */
1760+#define XKB_KEY_Hangul_Banja 0xff39 /* Banja mode */
1761+#define XKB_KEY_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */
1762+#define XKB_KEY_Hangul_PostHanja 0xff3b /* Post Hanja conversion */
1763+#define XKB_KEY_Hangul_SingleCandidate 0xff3c /* Single candidate */
1764+#define XKB_KEY_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */
1765+#define XKB_KEY_Hangul_PreviousCandidate 0xff3e /* Previous candidate */
1766+#define XKB_KEY_Hangul_Special 0xff3f /* Special symbols */
1767+#define XKB_KEY_Hangul_switch 0xff7e /* non-deprecated alias for ISO_Group_Shift */
1768+
1769+/* Hangul Consonant Characters */
1770+#define XKB_KEY_Hangul_Kiyeog 0x0ea1 /* U+3131 HANGUL LETTER KIYEOK */
1771+#define XKB_KEY_Hangul_SsangKiyeog 0x0ea2 /* U+3132 HANGUL LETTER SSANGKIYEOK */
1772+#define XKB_KEY_Hangul_KiyeogSios 0x0ea3 /* U+3133 HANGUL LETTER KIYEOK-SIOS */
1773+#define XKB_KEY_Hangul_Nieun 0x0ea4 /* U+3134 HANGUL LETTER NIEUN */
1774+#define XKB_KEY_Hangul_NieunJieuj 0x0ea5 /* U+3135 HANGUL LETTER NIEUN-CIEUC */
1775+#define XKB_KEY_Hangul_NieunHieuh 0x0ea6 /* U+3136 HANGUL LETTER NIEUN-HIEUH */
1776+#define XKB_KEY_Hangul_Dikeud 0x0ea7 /* U+3137 HANGUL LETTER TIKEUT */
1777+#define XKB_KEY_Hangul_SsangDikeud 0x0ea8 /* U+3138 HANGUL LETTER SSANGTIKEUT */
1778+#define XKB_KEY_Hangul_Rieul 0x0ea9 /* U+3139 HANGUL LETTER RIEUL */
1779+#define XKB_KEY_Hangul_RieulKiyeog 0x0eaa /* U+313A HANGUL LETTER RIEUL-KIYEOK */
1780+#define XKB_KEY_Hangul_RieulMieum 0x0eab /* U+313B HANGUL LETTER RIEUL-MIEUM */
1781+#define XKB_KEY_Hangul_RieulPieub 0x0eac /* U+313C HANGUL LETTER RIEUL-PIEUP */
1782+#define XKB_KEY_Hangul_RieulSios 0x0ead /* U+313D HANGUL LETTER RIEUL-SIOS */
1783+#define XKB_KEY_Hangul_RieulTieut 0x0eae /* U+313E HANGUL LETTER RIEUL-THIEUTH */
1784+#define XKB_KEY_Hangul_RieulPhieuf 0x0eaf /* U+313F HANGUL LETTER RIEUL-PHIEUPH */
1785+#define XKB_KEY_Hangul_RieulHieuh 0x0eb0 /* U+3140 HANGUL LETTER RIEUL-HIEUH */
1786+#define XKB_KEY_Hangul_Mieum 0x0eb1 /* U+3141 HANGUL LETTER MIEUM */
1787+#define XKB_KEY_Hangul_Pieub 0x0eb2 /* U+3142 HANGUL LETTER PIEUP */
1788+#define XKB_KEY_Hangul_SsangPieub 0x0eb3 /* U+3143 HANGUL LETTER SSANGPIEUP */
1789+#define XKB_KEY_Hangul_PieubSios 0x0eb4 /* U+3144 HANGUL LETTER PIEUP-SIOS */
1790+#define XKB_KEY_Hangul_Sios 0x0eb5 /* U+3145 HANGUL LETTER SIOS */
1791+#define XKB_KEY_Hangul_SsangSios 0x0eb6 /* U+3146 HANGUL LETTER SSANGSIOS */
1792+#define XKB_KEY_Hangul_Ieung 0x0eb7 /* U+3147 HANGUL LETTER IEUNG */
1793+#define XKB_KEY_Hangul_Jieuj 0x0eb8 /* U+3148 HANGUL LETTER CIEUC */
1794+#define XKB_KEY_Hangul_SsangJieuj 0x0eb9 /* U+3149 HANGUL LETTER SSANGCIEUC */
1795+#define XKB_KEY_Hangul_Cieuc 0x0eba /* U+314A HANGUL LETTER CHIEUCH */
1796+#define XKB_KEY_Hangul_Khieuq 0x0ebb /* U+314B HANGUL LETTER KHIEUKH */
1797+#define XKB_KEY_Hangul_Tieut 0x0ebc /* U+314C HANGUL LETTER THIEUTH */
1798+#define XKB_KEY_Hangul_Phieuf 0x0ebd /* U+314D HANGUL LETTER PHIEUPH */
1799+#define XKB_KEY_Hangul_Hieuh 0x0ebe /* U+314E HANGUL LETTER HIEUH */
1800+
1801+/* Hangul Vowel Characters */
1802+#define XKB_KEY_Hangul_A 0x0ebf /* U+314F HANGUL LETTER A */
1803+#define XKB_KEY_Hangul_AE 0x0ec0 /* U+3150 HANGUL LETTER AE */
1804+#define XKB_KEY_Hangul_YA 0x0ec1 /* U+3151 HANGUL LETTER YA */
1805+#define XKB_KEY_Hangul_YAE 0x0ec2 /* U+3152 HANGUL LETTER YAE */
1806+#define XKB_KEY_Hangul_EO 0x0ec3 /* U+3153 HANGUL LETTER EO */
1807+#define XKB_KEY_Hangul_E 0x0ec4 /* U+3154 HANGUL LETTER E */
1808+#define XKB_KEY_Hangul_YEO 0x0ec5 /* U+3155 HANGUL LETTER YEO */
1809+#define XKB_KEY_Hangul_YE 0x0ec6 /* U+3156 HANGUL LETTER YE */
1810+#define XKB_KEY_Hangul_O 0x0ec7 /* U+3157 HANGUL LETTER O */
1811+#define XKB_KEY_Hangul_WA 0x0ec8 /* U+3158 HANGUL LETTER WA */
1812+#define XKB_KEY_Hangul_WAE 0x0ec9 /* U+3159 HANGUL LETTER WAE */
1813+#define XKB_KEY_Hangul_OE 0x0eca /* U+315A HANGUL LETTER OE */
1814+#define XKB_KEY_Hangul_YO 0x0ecb /* U+315B HANGUL LETTER YO */
1815+#define XKB_KEY_Hangul_U 0x0ecc /* U+315C HANGUL LETTER U */
1816+#define XKB_KEY_Hangul_WEO 0x0ecd /* U+315D HANGUL LETTER WEO */
1817+#define XKB_KEY_Hangul_WE 0x0ece /* U+315E HANGUL LETTER WE */
1818+#define XKB_KEY_Hangul_WI 0x0ecf /* U+315F HANGUL LETTER WI */
1819+#define XKB_KEY_Hangul_YU 0x0ed0 /* U+3160 HANGUL LETTER YU */
1820+#define XKB_KEY_Hangul_EU 0x0ed1 /* U+3161 HANGUL LETTER EU */
1821+#define XKB_KEY_Hangul_YI 0x0ed2 /* U+3162 HANGUL LETTER YI */
1822+#define XKB_KEY_Hangul_I 0x0ed3 /* U+3163 HANGUL LETTER I */
1823+
1824+/* Hangul syllable-final (JongSeong) Characters */
1825+#define XKB_KEY_Hangul_J_Kiyeog 0x0ed4 /* U+11A8 HANGUL JONGSEONG KIYEOK */
1826+#define XKB_KEY_Hangul_J_SsangKiyeog 0x0ed5 /* U+11A9 HANGUL JONGSEONG SSANGKIYEOK */
1827+#define XKB_KEY_Hangul_J_KiyeogSios 0x0ed6 /* U+11AA HANGUL JONGSEONG KIYEOK-SIOS */
1828+#define XKB_KEY_Hangul_J_Nieun 0x0ed7 /* U+11AB HANGUL JONGSEONG NIEUN */
1829+#define XKB_KEY_Hangul_J_NieunJieuj 0x0ed8 /* U+11AC HANGUL JONGSEONG NIEUN-CIEUC */
1830+#define XKB_KEY_Hangul_J_NieunHieuh 0x0ed9 /* U+11AD HANGUL JONGSEONG NIEUN-HIEUH */
1831+#define XKB_KEY_Hangul_J_Dikeud 0x0eda /* U+11AE HANGUL JONGSEONG TIKEUT */
1832+#define XKB_KEY_Hangul_J_Rieul 0x0edb /* U+11AF HANGUL JONGSEONG RIEUL */
1833+#define XKB_KEY_Hangul_J_RieulKiyeog 0x0edc /* U+11B0 HANGUL JONGSEONG RIEUL-KIYEOK */
1834+#define XKB_KEY_Hangul_J_RieulMieum 0x0edd /* U+11B1 HANGUL JONGSEONG RIEUL-MIEUM */
1835+#define XKB_KEY_Hangul_J_RieulPieub 0x0ede /* U+11B2 HANGUL JONGSEONG RIEUL-PIEUP */
1836+#define XKB_KEY_Hangul_J_RieulSios 0x0edf /* U+11B3 HANGUL JONGSEONG RIEUL-SIOS */
1837+#define XKB_KEY_Hangul_J_RieulTieut 0x0ee0 /* U+11B4 HANGUL JONGSEONG RIEUL-THIEUTH */
1838+#define XKB_KEY_Hangul_J_RieulPhieuf 0x0ee1 /* U+11B5 HANGUL JONGSEONG RIEUL-PHIEUPH */
1839+#define XKB_KEY_Hangul_J_RieulHieuh 0x0ee2 /* U+11B6 HANGUL JONGSEONG RIEUL-HIEUH */
1840+#define XKB_KEY_Hangul_J_Mieum 0x0ee3 /* U+11B7 HANGUL JONGSEONG MIEUM */
1841+#define XKB_KEY_Hangul_J_Pieub 0x0ee4 /* U+11B8 HANGUL JONGSEONG PIEUP */
1842+#define XKB_KEY_Hangul_J_PieubSios 0x0ee5 /* U+11B9 HANGUL JONGSEONG PIEUP-SIOS */
1843+#define XKB_KEY_Hangul_J_Sios 0x0ee6 /* U+11BA HANGUL JONGSEONG SIOS */
1844+#define XKB_KEY_Hangul_J_SsangSios 0x0ee7 /* U+11BB HANGUL JONGSEONG SSANGSIOS */
1845+#define XKB_KEY_Hangul_J_Ieung 0x0ee8 /* U+11BC HANGUL JONGSEONG IEUNG */
1846+#define XKB_KEY_Hangul_J_Jieuj 0x0ee9 /* U+11BD HANGUL JONGSEONG CIEUC */
1847+#define XKB_KEY_Hangul_J_Cieuc 0x0eea /* U+11BE HANGUL JONGSEONG CHIEUCH */
1848+#define XKB_KEY_Hangul_J_Khieuq 0x0eeb /* U+11BF HANGUL JONGSEONG KHIEUKH */
1849+#define XKB_KEY_Hangul_J_Tieut 0x0eec /* U+11C0 HANGUL JONGSEONG THIEUTH */
1850+#define XKB_KEY_Hangul_J_Phieuf 0x0eed /* U+11C1 HANGUL JONGSEONG PHIEUPH */
1851+#define XKB_KEY_Hangul_J_Hieuh 0x0eee /* U+11C2 HANGUL JONGSEONG HIEUH */
1852+
1853+/* Ancient Hangul Consonant Characters */
1854+#define XKB_KEY_Hangul_RieulYeorinHieuh 0x0eef /* U+316D HANGUL LETTER RIEUL-YEORINHIEUH */
1855+#define XKB_KEY_Hangul_SunkyeongeumMieum 0x0ef0 /* U+3171 HANGUL LETTER KAPYEOUNMIEUM */
1856+#define XKB_KEY_Hangul_SunkyeongeumPieub 0x0ef1 /* U+3178 HANGUL LETTER KAPYEOUNPIEUP */
1857+#define XKB_KEY_Hangul_PanSios 0x0ef2 /* U+317F HANGUL LETTER PANSIOS */
1858+#define XKB_KEY_Hangul_KkogjiDalrinIeung 0x0ef3 /* U+3181 HANGUL LETTER YESIEUNG */
1859+#define XKB_KEY_Hangul_SunkyeongeumPhieuf 0x0ef4 /* U+3184 HANGUL LETTER KAPYEOUNPHIEUPH */
1860+#define XKB_KEY_Hangul_YeorinHieuh 0x0ef5 /* U+3186 HANGUL LETTER YEORINHIEUH */
1861+
1862+/* Ancient Hangul Vowel Characters */
1863+#define XKB_KEY_Hangul_AraeA 0x0ef6 /* U+318D HANGUL LETTER ARAEA */
1864+#define XKB_KEY_Hangul_AraeAE 0x0ef7 /* U+318E HANGUL LETTER ARAEAE */
1865+
1866+/* Ancient Hangul syllable-final (JongSeong) Characters */
1867+#define XKB_KEY_Hangul_J_PanSios 0x0ef8 /* U+11EB HANGUL JONGSEONG PANSIOS */
1868+#define XKB_KEY_Hangul_J_KkogjiDalrinIeung 0x0ef9 /* U+11F0 HANGUL JONGSEONG YESIEUNG */
1869+#define XKB_KEY_Hangul_J_YeorinHieuh 0x0efa /* U+11F9 HANGUL JONGSEONG YEORINHIEUH */
1870+
1871+/* Korean currency symbol */
1872+#define XKB_KEY_Korean_Won 0x0eff /*(U+20A9 WON SIGN)*/
1873+
1874+
1875+/*
1876+ * Armenian
1877+ */
1878+
1879+#define XKB_KEY_Armenian_ligature_ew 0x1000587 /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */
1880+#define XKB_KEY_Armenian_full_stop 0x1000589 /* U+0589 ARMENIAN FULL STOP */
1881+#define XKB_KEY_Armenian_verjaket 0x1000589 /* deprecated alias for Armenian_full_stop */
1882+#define XKB_KEY_Armenian_separation_mark 0x100055d /* U+055D ARMENIAN COMMA */
1883+#define XKB_KEY_Armenian_but 0x100055d /* deprecated alias for Armenian_separation_mark */
1884+#define XKB_KEY_Armenian_hyphen 0x100058a /* U+058A ARMENIAN HYPHEN */
1885+#define XKB_KEY_Armenian_yentamna 0x100058a /* deprecated alias for Armenian_hyphen */
1886+#define XKB_KEY_Armenian_exclam 0x100055c /* U+055C ARMENIAN EXCLAMATION MARK */
1887+#define XKB_KEY_Armenian_amanak 0x100055c /* deprecated alias for Armenian_exclam */
1888+#define XKB_KEY_Armenian_accent 0x100055b /* U+055B ARMENIAN EMPHASIS MARK */
1889+#define XKB_KEY_Armenian_shesht 0x100055b /* deprecated alias for Armenian_accent */
1890+#define XKB_KEY_Armenian_question 0x100055e /* U+055E ARMENIAN QUESTION MARK */
1891+#define XKB_KEY_Armenian_paruyk 0x100055e /* deprecated alias for Armenian_question */
1892+#define XKB_KEY_Armenian_AYB 0x1000531 /* U+0531 ARMENIAN CAPITAL LETTER AYB */
1893+#define XKB_KEY_Armenian_ayb 0x1000561 /* U+0561 ARMENIAN SMALL LETTER AYB */
1894+#define XKB_KEY_Armenian_BEN 0x1000532 /* U+0532 ARMENIAN CAPITAL LETTER BEN */
1895+#define XKB_KEY_Armenian_ben 0x1000562 /* U+0562 ARMENIAN SMALL LETTER BEN */
1896+#define XKB_KEY_Armenian_GIM 0x1000533 /* U+0533 ARMENIAN CAPITAL LETTER GIM */
1897+#define XKB_KEY_Armenian_gim 0x1000563 /* U+0563 ARMENIAN SMALL LETTER GIM */
1898+#define XKB_KEY_Armenian_DA 0x1000534 /* U+0534 ARMENIAN CAPITAL LETTER DA */
1899+#define XKB_KEY_Armenian_da 0x1000564 /* U+0564 ARMENIAN SMALL LETTER DA */
1900+#define XKB_KEY_Armenian_YECH 0x1000535 /* U+0535 ARMENIAN CAPITAL LETTER ECH */
1901+#define XKB_KEY_Armenian_yech 0x1000565 /* U+0565 ARMENIAN SMALL LETTER ECH */
1902+#define XKB_KEY_Armenian_ZA 0x1000536 /* U+0536 ARMENIAN CAPITAL LETTER ZA */
1903+#define XKB_KEY_Armenian_za 0x1000566 /* U+0566 ARMENIAN SMALL LETTER ZA */
1904+#define XKB_KEY_Armenian_E 0x1000537 /* U+0537 ARMENIAN CAPITAL LETTER EH */
1905+#define XKB_KEY_Armenian_e 0x1000567 /* U+0567 ARMENIAN SMALL LETTER EH */
1906+#define XKB_KEY_Armenian_AT 0x1000538 /* U+0538 ARMENIAN CAPITAL LETTER ET */
1907+#define XKB_KEY_Armenian_at 0x1000568 /* U+0568 ARMENIAN SMALL LETTER ET */
1908+#define XKB_KEY_Armenian_TO 0x1000539 /* U+0539 ARMENIAN CAPITAL LETTER TO */
1909+#define XKB_KEY_Armenian_to 0x1000569 /* U+0569 ARMENIAN SMALL LETTER TO */
1910+#define XKB_KEY_Armenian_ZHE 0x100053a /* U+053A ARMENIAN CAPITAL LETTER ZHE */
1911+#define XKB_KEY_Armenian_zhe 0x100056a /* U+056A ARMENIAN SMALL LETTER ZHE */
1912+#define XKB_KEY_Armenian_INI 0x100053b /* U+053B ARMENIAN CAPITAL LETTER INI */
1913+#define XKB_KEY_Armenian_ini 0x100056b /* U+056B ARMENIAN SMALL LETTER INI */
1914+#define XKB_KEY_Armenian_LYUN 0x100053c /* U+053C ARMENIAN CAPITAL LETTER LIWN */
1915+#define XKB_KEY_Armenian_lyun 0x100056c /* U+056C ARMENIAN SMALL LETTER LIWN */
1916+#define XKB_KEY_Armenian_KHE 0x100053d /* U+053D ARMENIAN CAPITAL LETTER XEH */
1917+#define XKB_KEY_Armenian_khe 0x100056d /* U+056D ARMENIAN SMALL LETTER XEH */
1918+#define XKB_KEY_Armenian_TSA 0x100053e /* U+053E ARMENIAN CAPITAL LETTER CA */
1919+#define XKB_KEY_Armenian_tsa 0x100056e /* U+056E ARMENIAN SMALL LETTER CA */
1920+#define XKB_KEY_Armenian_KEN 0x100053f /* U+053F ARMENIAN CAPITAL LETTER KEN */
1921+#define XKB_KEY_Armenian_ken 0x100056f /* U+056F ARMENIAN SMALL LETTER KEN */
1922+#define XKB_KEY_Armenian_HO 0x1000540 /* U+0540 ARMENIAN CAPITAL LETTER HO */
1923+#define XKB_KEY_Armenian_ho 0x1000570 /* U+0570 ARMENIAN SMALL LETTER HO */
1924+#define XKB_KEY_Armenian_DZA 0x1000541 /* U+0541 ARMENIAN CAPITAL LETTER JA */
1925+#define XKB_KEY_Armenian_dza 0x1000571 /* U+0571 ARMENIAN SMALL LETTER JA */
1926+#define XKB_KEY_Armenian_GHAT 0x1000542 /* U+0542 ARMENIAN CAPITAL LETTER GHAD */
1927+#define XKB_KEY_Armenian_ghat 0x1000572 /* U+0572 ARMENIAN SMALL LETTER GHAD */
1928+#define XKB_KEY_Armenian_TCHE 0x1000543 /* U+0543 ARMENIAN CAPITAL LETTER CHEH */
1929+#define XKB_KEY_Armenian_tche 0x1000573 /* U+0573 ARMENIAN SMALL LETTER CHEH */
1930+#define XKB_KEY_Armenian_MEN 0x1000544 /* U+0544 ARMENIAN CAPITAL LETTER MEN */
1931+#define XKB_KEY_Armenian_men 0x1000574 /* U+0574 ARMENIAN SMALL LETTER MEN */
1932+#define XKB_KEY_Armenian_HI 0x1000545 /* U+0545 ARMENIAN CAPITAL LETTER YI */
1933+#define XKB_KEY_Armenian_hi 0x1000575 /* U+0575 ARMENIAN SMALL LETTER YI */
1934+#define XKB_KEY_Armenian_NU 0x1000546 /* U+0546 ARMENIAN CAPITAL LETTER NOW */
1935+#define XKB_KEY_Armenian_nu 0x1000576 /* U+0576 ARMENIAN SMALL LETTER NOW */
1936+#define XKB_KEY_Armenian_SHA 0x1000547 /* U+0547 ARMENIAN CAPITAL LETTER SHA */
1937+#define XKB_KEY_Armenian_sha 0x1000577 /* U+0577 ARMENIAN SMALL LETTER SHA */
1938+#define XKB_KEY_Armenian_VO 0x1000548 /* U+0548 ARMENIAN CAPITAL LETTER VO */
1939+#define XKB_KEY_Armenian_vo 0x1000578 /* U+0578 ARMENIAN SMALL LETTER VO */
1940+#define XKB_KEY_Armenian_CHA 0x1000549 /* U+0549 ARMENIAN CAPITAL LETTER CHA */
1941+#define XKB_KEY_Armenian_cha 0x1000579 /* U+0579 ARMENIAN SMALL LETTER CHA */
1942+#define XKB_KEY_Armenian_PE 0x100054a /* U+054A ARMENIAN CAPITAL LETTER PEH */
1943+#define XKB_KEY_Armenian_pe 0x100057a /* U+057A ARMENIAN SMALL LETTER PEH */
1944+#define XKB_KEY_Armenian_JE 0x100054b /* U+054B ARMENIAN CAPITAL LETTER JHEH */
1945+#define XKB_KEY_Armenian_je 0x100057b /* U+057B ARMENIAN SMALL LETTER JHEH */
1946+#define XKB_KEY_Armenian_RA 0x100054c /* U+054C ARMENIAN CAPITAL LETTER RA */
1947+#define XKB_KEY_Armenian_ra 0x100057c /* U+057C ARMENIAN SMALL LETTER RA */
1948+#define XKB_KEY_Armenian_SE 0x100054d /* U+054D ARMENIAN CAPITAL LETTER SEH */
1949+#define XKB_KEY_Armenian_se 0x100057d /* U+057D ARMENIAN SMALL LETTER SEH */
1950+#define XKB_KEY_Armenian_VEV 0x100054e /* U+054E ARMENIAN CAPITAL LETTER VEW */
1951+#define XKB_KEY_Armenian_vev 0x100057e /* U+057E ARMENIAN SMALL LETTER VEW */
1952+#define XKB_KEY_Armenian_TYUN 0x100054f /* U+054F ARMENIAN CAPITAL LETTER TIWN */
1953+#define XKB_KEY_Armenian_tyun 0x100057f /* U+057F ARMENIAN SMALL LETTER TIWN */
1954+#define XKB_KEY_Armenian_RE 0x1000550 /* U+0550 ARMENIAN CAPITAL LETTER REH */
1955+#define XKB_KEY_Armenian_re 0x1000580 /* U+0580 ARMENIAN SMALL LETTER REH */
1956+#define XKB_KEY_Armenian_TSO 0x1000551 /* U+0551 ARMENIAN CAPITAL LETTER CO */
1957+#define XKB_KEY_Armenian_tso 0x1000581 /* U+0581 ARMENIAN SMALL LETTER CO */
1958+#define XKB_KEY_Armenian_VYUN 0x1000552 /* U+0552 ARMENIAN CAPITAL LETTER YIWN */
1959+#define XKB_KEY_Armenian_vyun 0x1000582 /* U+0582 ARMENIAN SMALL LETTER YIWN */
1960+#define XKB_KEY_Armenian_PYUR 0x1000553 /* U+0553 ARMENIAN CAPITAL LETTER PIWR */
1961+#define XKB_KEY_Armenian_pyur 0x1000583 /* U+0583 ARMENIAN SMALL LETTER PIWR */
1962+#define XKB_KEY_Armenian_KE 0x1000554 /* U+0554 ARMENIAN CAPITAL LETTER KEH */
1963+#define XKB_KEY_Armenian_ke 0x1000584 /* U+0584 ARMENIAN SMALL LETTER KEH */
1964+#define XKB_KEY_Armenian_O 0x1000555 /* U+0555 ARMENIAN CAPITAL LETTER OH */
1965+#define XKB_KEY_Armenian_o 0x1000585 /* U+0585 ARMENIAN SMALL LETTER OH */
1966+#define XKB_KEY_Armenian_FE 0x1000556 /* U+0556 ARMENIAN CAPITAL LETTER FEH */
1967+#define XKB_KEY_Armenian_fe 0x1000586 /* U+0586 ARMENIAN SMALL LETTER FEH */
1968+#define XKB_KEY_Armenian_apostrophe 0x100055a /* U+055A ARMENIAN APOSTROPHE */
1969+
1970+/*
1971+ * Georgian
1972+ */
1973+
1974+#define XKB_KEY_Georgian_an 0x10010d0 /* U+10D0 GEORGIAN LETTER AN */
1975+#define XKB_KEY_Georgian_ban 0x10010d1 /* U+10D1 GEORGIAN LETTER BAN */
1976+#define XKB_KEY_Georgian_gan 0x10010d2 /* U+10D2 GEORGIAN LETTER GAN */
1977+#define XKB_KEY_Georgian_don 0x10010d3 /* U+10D3 GEORGIAN LETTER DON */
1978+#define XKB_KEY_Georgian_en 0x10010d4 /* U+10D4 GEORGIAN LETTER EN */
1979+#define XKB_KEY_Georgian_vin 0x10010d5 /* U+10D5 GEORGIAN LETTER VIN */
1980+#define XKB_KEY_Georgian_zen 0x10010d6 /* U+10D6 GEORGIAN LETTER ZEN */
1981+#define XKB_KEY_Georgian_tan 0x10010d7 /* U+10D7 GEORGIAN LETTER TAN */
1982+#define XKB_KEY_Georgian_in 0x10010d8 /* U+10D8 GEORGIAN LETTER IN */
1983+#define XKB_KEY_Georgian_kan 0x10010d9 /* U+10D9 GEORGIAN LETTER KAN */
1984+#define XKB_KEY_Georgian_las 0x10010da /* U+10DA GEORGIAN LETTER LAS */
1985+#define XKB_KEY_Georgian_man 0x10010db /* U+10DB GEORGIAN LETTER MAN */
1986+#define XKB_KEY_Georgian_nar 0x10010dc /* U+10DC GEORGIAN LETTER NAR */
1987+#define XKB_KEY_Georgian_on 0x10010dd /* U+10DD GEORGIAN LETTER ON */
1988+#define XKB_KEY_Georgian_par 0x10010de /* U+10DE GEORGIAN LETTER PAR */
1989+#define XKB_KEY_Georgian_zhar 0x10010df /* U+10DF GEORGIAN LETTER ZHAR */
1990+#define XKB_KEY_Georgian_rae 0x10010e0 /* U+10E0 GEORGIAN LETTER RAE */
1991+#define XKB_KEY_Georgian_san 0x10010e1 /* U+10E1 GEORGIAN LETTER SAN */
1992+#define XKB_KEY_Georgian_tar 0x10010e2 /* U+10E2 GEORGIAN LETTER TAR */
1993+#define XKB_KEY_Georgian_un 0x10010e3 /* U+10E3 GEORGIAN LETTER UN */
1994+#define XKB_KEY_Georgian_phar 0x10010e4 /* U+10E4 GEORGIAN LETTER PHAR */
1995+#define XKB_KEY_Georgian_khar 0x10010e5 /* U+10E5 GEORGIAN LETTER KHAR */
1996+#define XKB_KEY_Georgian_ghan 0x10010e6 /* U+10E6 GEORGIAN LETTER GHAN */
1997+#define XKB_KEY_Georgian_qar 0x10010e7 /* U+10E7 GEORGIAN LETTER QAR */
1998+#define XKB_KEY_Georgian_shin 0x10010e8 /* U+10E8 GEORGIAN LETTER SHIN */
1999+#define XKB_KEY_Georgian_chin 0x10010e9 /* U+10E9 GEORGIAN LETTER CHIN */
2000+#define XKB_KEY_Georgian_can 0x10010ea /* U+10EA GEORGIAN LETTER CAN */
2001+#define XKB_KEY_Georgian_jil 0x10010eb /* U+10EB GEORGIAN LETTER JIL */
2002+#define XKB_KEY_Georgian_cil 0x10010ec /* U+10EC GEORGIAN LETTER CIL */
2003+#define XKB_KEY_Georgian_char 0x10010ed /* U+10ED GEORGIAN LETTER CHAR */
2004+#define XKB_KEY_Georgian_xan 0x10010ee /* U+10EE GEORGIAN LETTER XAN */
2005+#define XKB_KEY_Georgian_jhan 0x10010ef /* U+10EF GEORGIAN LETTER JHAN */
2006+#define XKB_KEY_Georgian_hae 0x10010f0 /* U+10F0 GEORGIAN LETTER HAE */
2007+#define XKB_KEY_Georgian_he 0x10010f1 /* U+10F1 GEORGIAN LETTER HE */
2008+#define XKB_KEY_Georgian_hie 0x10010f2 /* U+10F2 GEORGIAN LETTER HIE */
2009+#define XKB_KEY_Georgian_we 0x10010f3 /* U+10F3 GEORGIAN LETTER WE */
2010+#define XKB_KEY_Georgian_har 0x10010f4 /* U+10F4 GEORGIAN LETTER HAR */
2011+#define XKB_KEY_Georgian_hoe 0x10010f5 /* U+10F5 GEORGIAN LETTER HOE */
2012+#define XKB_KEY_Georgian_fi 0x10010f6 /* U+10F6 GEORGIAN LETTER FI */
2013+
2014+/*
2015+ * Azeri (and other Turkic or Caucasian languages)
2016+ */
2017+
2018+/* latin */
2019+#define XKB_KEY_Xabovedot 0x1001e8a /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */
2020+#define XKB_KEY_Ibreve 0x100012c /* U+012C LATIN CAPITAL LETTER I WITH BREVE */
2021+#define XKB_KEY_Zstroke 0x10001b5 /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */
2022+#define XKB_KEY_Gcaron 0x10001e6 /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */
2023+#define XKB_KEY_Ocaron 0x10001d1 /* U+01D1 LATIN CAPITAL LETTER O WITH CARON */
2024+#define XKB_KEY_Obarred 0x100019f /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */
2025+#define XKB_KEY_xabovedot 0x1001e8b /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */
2026+#define XKB_KEY_ibreve 0x100012d /* U+012D LATIN SMALL LETTER I WITH BREVE */
2027+#define XKB_KEY_zstroke 0x10001b6 /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */
2028+#define XKB_KEY_gcaron 0x10001e7 /* U+01E7 LATIN SMALL LETTER G WITH CARON */
2029+#define XKB_KEY_ocaron 0x10001d2 /* U+01D2 LATIN SMALL LETTER O WITH CARON */
2030+#define XKB_KEY_obarred 0x1000275 /* U+0275 LATIN SMALL LETTER BARRED O */
2031+#define XKB_KEY_SCHWA 0x100018f /* U+018F LATIN CAPITAL LETTER SCHWA */
2032+#define XKB_KEY_schwa 0x1000259 /* U+0259 LATIN SMALL LETTER SCHWA */
2033+#define XKB_KEY_EZH 0x10001b7 /* U+01B7 LATIN CAPITAL LETTER EZH */
2034+#define XKB_KEY_ezh 0x1000292 /* U+0292 LATIN SMALL LETTER EZH */
2035+/* those are not really Caucasus */
2036+/* For Inupiak */
2037+#define XKB_KEY_Lbelowdot 0x1001e36 /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */
2038+#define XKB_KEY_lbelowdot 0x1001e37 /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */
2039+
2040+/*
2041+ * Vietnamese
2042+ */
2043+
2044+#define XKB_KEY_Abelowdot 0x1001ea0 /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */
2045+#define XKB_KEY_abelowdot 0x1001ea1 /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */
2046+#define XKB_KEY_Ahook 0x1001ea2 /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */
2047+#define XKB_KEY_ahook 0x1001ea3 /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */
2048+#define XKB_KEY_Acircumflexacute 0x1001ea4 /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
2049+#define XKB_KEY_acircumflexacute 0x1001ea5 /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */
2050+#define XKB_KEY_Acircumflexgrave 0x1001ea6 /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
2051+#define XKB_KEY_acircumflexgrave 0x1001ea7 /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */
2052+#define XKB_KEY_Acircumflexhook 0x1001ea8 /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
2053+#define XKB_KEY_acircumflexhook 0x1001ea9 /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
2054+#define XKB_KEY_Acircumflextilde 0x1001eaa /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
2055+#define XKB_KEY_acircumflextilde 0x1001eab /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */
2056+#define XKB_KEY_Acircumflexbelowdot 0x1001eac /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
2057+#define XKB_KEY_acircumflexbelowdot 0x1001ead /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
2058+#define XKB_KEY_Abreveacute 0x1001eae /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
2059+#define XKB_KEY_abreveacute 0x1001eaf /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */
2060+#define XKB_KEY_Abrevegrave 0x1001eb0 /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
2061+#define XKB_KEY_abrevegrave 0x1001eb1 /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */
2062+#define XKB_KEY_Abrevehook 0x1001eb2 /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
2063+#define XKB_KEY_abrevehook 0x1001eb3 /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */
2064+#define XKB_KEY_Abrevetilde 0x1001eb4 /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
2065+#define XKB_KEY_abrevetilde 0x1001eb5 /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */
2066+#define XKB_KEY_Abrevebelowdot 0x1001eb6 /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
2067+#define XKB_KEY_abrevebelowdot 0x1001eb7 /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */
2068+#define XKB_KEY_Ebelowdot 0x1001eb8 /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */
2069+#define XKB_KEY_ebelowdot 0x1001eb9 /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */
2070+#define XKB_KEY_Ehook 0x1001eba /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */
2071+#define XKB_KEY_ehook 0x1001ebb /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */
2072+#define XKB_KEY_Etilde 0x1001ebc /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */
2073+#define XKB_KEY_etilde 0x1001ebd /* U+1EBD LATIN SMALL LETTER E WITH TILDE */
2074+#define XKB_KEY_Ecircumflexacute 0x1001ebe /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
2075+#define XKB_KEY_ecircumflexacute 0x1001ebf /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */
2076+#define XKB_KEY_Ecircumflexgrave 0x1001ec0 /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
2077+#define XKB_KEY_ecircumflexgrave 0x1001ec1 /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */
2078+#define XKB_KEY_Ecircumflexhook 0x1001ec2 /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
2079+#define XKB_KEY_ecircumflexhook 0x1001ec3 /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
2080+#define XKB_KEY_Ecircumflextilde 0x1001ec4 /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
2081+#define XKB_KEY_ecircumflextilde 0x1001ec5 /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */
2082+#define XKB_KEY_Ecircumflexbelowdot 0x1001ec6 /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
2083+#define XKB_KEY_ecircumflexbelowdot 0x1001ec7 /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
2084+#define XKB_KEY_Ihook 0x1001ec8 /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */
2085+#define XKB_KEY_ihook 0x1001ec9 /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */
2086+#define XKB_KEY_Ibelowdot 0x1001eca /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */
2087+#define XKB_KEY_ibelowdot 0x1001ecb /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */
2088+#define XKB_KEY_Obelowdot 0x1001ecc /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */
2089+#define XKB_KEY_obelowdot 0x1001ecd /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */
2090+#define XKB_KEY_Ohook 0x1001ece /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */
2091+#define XKB_KEY_ohook 0x1001ecf /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */
2092+#define XKB_KEY_Ocircumflexacute 0x1001ed0 /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
2093+#define XKB_KEY_ocircumflexacute 0x1001ed1 /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */
2094+#define XKB_KEY_Ocircumflexgrave 0x1001ed2 /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
2095+#define XKB_KEY_ocircumflexgrave 0x1001ed3 /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */
2096+#define XKB_KEY_Ocircumflexhook 0x1001ed4 /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
2097+#define XKB_KEY_ocircumflexhook 0x1001ed5 /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
2098+#define XKB_KEY_Ocircumflextilde 0x1001ed6 /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
2099+#define XKB_KEY_ocircumflextilde 0x1001ed7 /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */
2100+#define XKB_KEY_Ocircumflexbelowdot 0x1001ed8 /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
2101+#define XKB_KEY_ocircumflexbelowdot 0x1001ed9 /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
2102+#define XKB_KEY_Ohornacute 0x1001eda /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
2103+#define XKB_KEY_ohornacute 0x1001edb /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */
2104+#define XKB_KEY_Ohorngrave 0x1001edc /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
2105+#define XKB_KEY_ohorngrave 0x1001edd /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */
2106+#define XKB_KEY_Ohornhook 0x1001ede /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
2107+#define XKB_KEY_ohornhook 0x1001edf /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */
2108+#define XKB_KEY_Ohorntilde 0x1001ee0 /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */
2109+#define XKB_KEY_ohorntilde 0x1001ee1 /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */
2110+#define XKB_KEY_Ohornbelowdot 0x1001ee2 /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
2111+#define XKB_KEY_ohornbelowdot 0x1001ee3 /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */
2112+#define XKB_KEY_Ubelowdot 0x1001ee4 /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */
2113+#define XKB_KEY_ubelowdot 0x1001ee5 /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */
2114+#define XKB_KEY_Uhook 0x1001ee6 /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */
2115+#define XKB_KEY_uhook 0x1001ee7 /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */
2116+#define XKB_KEY_Uhornacute 0x1001ee8 /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
2117+#define XKB_KEY_uhornacute 0x1001ee9 /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */
2118+#define XKB_KEY_Uhorngrave 0x1001eea /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
2119+#define XKB_KEY_uhorngrave 0x1001eeb /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */
2120+#define XKB_KEY_Uhornhook 0x1001eec /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
2121+#define XKB_KEY_uhornhook 0x1001eed /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */
2122+#define XKB_KEY_Uhorntilde 0x1001eee /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */
2123+#define XKB_KEY_uhorntilde 0x1001eef /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */
2124+#define XKB_KEY_Uhornbelowdot 0x1001ef0 /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
2125+#define XKB_KEY_uhornbelowdot 0x1001ef1 /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */
2126+#define XKB_KEY_Ybelowdot 0x1001ef4 /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */
2127+#define XKB_KEY_ybelowdot 0x1001ef5 /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */
2128+#define XKB_KEY_Yhook 0x1001ef6 /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
2129+#define XKB_KEY_yhook 0x1001ef7 /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */
2130+#define XKB_KEY_Ytilde 0x1001ef8 /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */
2131+#define XKB_KEY_ytilde 0x1001ef9 /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */
2132+#define XKB_KEY_Ohorn 0x10001a0 /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */
2133+#define XKB_KEY_ohorn 0x10001a1 /* U+01A1 LATIN SMALL LETTER O WITH HORN */
2134+#define XKB_KEY_Uhorn 0x10001af /* U+01AF LATIN CAPITAL LETTER U WITH HORN */
2135+#define XKB_KEY_uhorn 0x10001b0 /* U+01B0 LATIN SMALL LETTER U WITH HORN */
2136+#define XKB_KEY_combining_tilde 0x1000303 /* U+0303 COMBINING TILDE */
2137+#define XKB_KEY_combining_grave 0x1000300 /* U+0300 COMBINING GRAVE ACCENT */
2138+#define XKB_KEY_combining_acute 0x1000301 /* U+0301 COMBINING ACUTE ACCENT */
2139+#define XKB_KEY_combining_hook 0x1000309 /* U+0309 COMBINING HOOK ABOVE */
2140+#define XKB_KEY_combining_belowdot 0x1000323 /* U+0323 COMBINING DOT BELOW */
2141+
2142+
2143+#define XKB_KEY_EcuSign 0x10020a0 /* U+20A0 EURO-CURRENCY SIGN */
2144+#define XKB_KEY_ColonSign 0x10020a1 /* U+20A1 COLON SIGN */
2145+#define XKB_KEY_CruzeiroSign 0x10020a2 /* U+20A2 CRUZEIRO SIGN */
2146+#define XKB_KEY_FFrancSign 0x10020a3 /* U+20A3 FRENCH FRANC SIGN */
2147+#define XKB_KEY_LiraSign 0x10020a4 /* U+20A4 LIRA SIGN */
2148+#define XKB_KEY_MillSign 0x10020a5 /* U+20A5 MILL SIGN */
2149+#define XKB_KEY_NairaSign 0x10020a6 /* U+20A6 NAIRA SIGN */
2150+#define XKB_KEY_PesetaSign 0x10020a7 /* U+20A7 PESETA SIGN */
2151+#define XKB_KEY_RupeeSign 0x10020a8 /* U+20A8 RUPEE SIGN */
2152+#define XKB_KEY_WonSign 0x10020a9 /* U+20A9 WON SIGN */
2153+#define XKB_KEY_NewSheqelSign 0x10020aa /* U+20AA NEW SHEQEL SIGN */
2154+#define XKB_KEY_DongSign 0x10020ab /* U+20AB DONG SIGN */
2155+#define XKB_KEY_EuroSign 0x20ac /* U+20AC EURO SIGN */
2156+
2157+/* one, two and three are defined above. */
2158+#define XKB_KEY_zerosuperior 0x1002070 /* U+2070 SUPERSCRIPT ZERO */
2159+#define XKB_KEY_foursuperior 0x1002074 /* U+2074 SUPERSCRIPT FOUR */
2160+#define XKB_KEY_fivesuperior 0x1002075 /* U+2075 SUPERSCRIPT FIVE */
2161+#define XKB_KEY_sixsuperior 0x1002076 /* U+2076 SUPERSCRIPT SIX */
2162+#define XKB_KEY_sevensuperior 0x1002077 /* U+2077 SUPERSCRIPT SEVEN */
2163+#define XKB_KEY_eightsuperior 0x1002078 /* U+2078 SUPERSCRIPT EIGHT */
2164+#define XKB_KEY_ninesuperior 0x1002079 /* U+2079 SUPERSCRIPT NINE */
2165+#define XKB_KEY_zerosubscript 0x1002080 /* U+2080 SUBSCRIPT ZERO */
2166+#define XKB_KEY_onesubscript 0x1002081 /* U+2081 SUBSCRIPT ONE */
2167+#define XKB_KEY_twosubscript 0x1002082 /* U+2082 SUBSCRIPT TWO */
2168+#define XKB_KEY_threesubscript 0x1002083 /* U+2083 SUBSCRIPT THREE */
2169+#define XKB_KEY_foursubscript 0x1002084 /* U+2084 SUBSCRIPT FOUR */
2170+#define XKB_KEY_fivesubscript 0x1002085 /* U+2085 SUBSCRIPT FIVE */
2171+#define XKB_KEY_sixsubscript 0x1002086 /* U+2086 SUBSCRIPT SIX */
2172+#define XKB_KEY_sevensubscript 0x1002087 /* U+2087 SUBSCRIPT SEVEN */
2173+#define XKB_KEY_eightsubscript 0x1002088 /* U+2088 SUBSCRIPT EIGHT */
2174+#define XKB_KEY_ninesubscript 0x1002089 /* U+2089 SUBSCRIPT NINE */
2175+#define XKB_KEY_partdifferential 0x1002202 /* U+2202 PARTIAL DIFFERENTIAL */
2176+#define XKB_KEY_emptyset 0x1002205 /* U+2205 EMPTY SET */
2177+#define XKB_KEY_elementof 0x1002208 /* U+2208 ELEMENT OF */
2178+#define XKB_KEY_notelementof 0x1002209 /* U+2209 NOT AN ELEMENT OF */
2179+#define XKB_KEY_containsas 0x100220b /* U+220B CONTAINS AS MEMBER */
2180+#define XKB_KEY_squareroot 0x100221a /* U+221A SQUARE ROOT */
2181+#define XKB_KEY_cuberoot 0x100221b /* U+221B CUBE ROOT */
2182+#define XKB_KEY_fourthroot 0x100221c /* U+221C FOURTH ROOT */
2183+#define XKB_KEY_dintegral 0x100222c /* U+222C DOUBLE INTEGRAL */
2184+#define XKB_KEY_tintegral 0x100222d /* U+222D TRIPLE INTEGRAL */
2185+#define XKB_KEY_because 0x1002235 /* U+2235 BECAUSE */
2186+#define XKB_KEY_approxeq 0x1002248 /*(U+2248 ALMOST EQUAL TO)*/
2187+#define XKB_KEY_notapproxeq 0x1002247 /*(U+2247 NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO)*/
2188+#define XKB_KEY_notidentical 0x1002262 /* U+2262 NOT IDENTICAL TO */
2189+#define XKB_KEY_stricteq 0x1002263 /* U+2263 STRICTLY EQUIVALENT TO */
2190+
2191+#define XKB_KEY_braille_dot_1 0xfff1
2192+#define XKB_KEY_braille_dot_2 0xfff2
2193+#define XKB_KEY_braille_dot_3 0xfff3
2194+#define XKB_KEY_braille_dot_4 0xfff4
2195+#define XKB_KEY_braille_dot_5 0xfff5
2196+#define XKB_KEY_braille_dot_6 0xfff6
2197+#define XKB_KEY_braille_dot_7 0xfff7
2198+#define XKB_KEY_braille_dot_8 0xfff8
2199+#define XKB_KEY_braille_dot_9 0xfff9
2200+#define XKB_KEY_braille_dot_10 0xfffa
2201+#define XKB_KEY_braille_blank 0x1002800 /* U+2800 BRAILLE PATTERN BLANK */
2202+#define XKB_KEY_braille_dots_1 0x1002801 /* U+2801 BRAILLE PATTERN DOTS-1 */
2203+#define XKB_KEY_braille_dots_2 0x1002802 /* U+2802 BRAILLE PATTERN DOTS-2 */
2204+#define XKB_KEY_braille_dots_12 0x1002803 /* U+2803 BRAILLE PATTERN DOTS-12 */
2205+#define XKB_KEY_braille_dots_3 0x1002804 /* U+2804 BRAILLE PATTERN DOTS-3 */
2206+#define XKB_KEY_braille_dots_13 0x1002805 /* U+2805 BRAILLE PATTERN DOTS-13 */
2207+#define XKB_KEY_braille_dots_23 0x1002806 /* U+2806 BRAILLE PATTERN DOTS-23 */
2208+#define XKB_KEY_braille_dots_123 0x1002807 /* U+2807 BRAILLE PATTERN DOTS-123 */
2209+#define XKB_KEY_braille_dots_4 0x1002808 /* U+2808 BRAILLE PATTERN DOTS-4 */
2210+#define XKB_KEY_braille_dots_14 0x1002809 /* U+2809 BRAILLE PATTERN DOTS-14 */
2211+#define XKB_KEY_braille_dots_24 0x100280a /* U+280A BRAILLE PATTERN DOTS-24 */
2212+#define XKB_KEY_braille_dots_124 0x100280b /* U+280B BRAILLE PATTERN DOTS-124 */
2213+#define XKB_KEY_braille_dots_34 0x100280c /* U+280C BRAILLE PATTERN DOTS-34 */
2214+#define XKB_KEY_braille_dots_134 0x100280d /* U+280D BRAILLE PATTERN DOTS-134 */
2215+#define XKB_KEY_braille_dots_234 0x100280e /* U+280E BRAILLE PATTERN DOTS-234 */
2216+#define XKB_KEY_braille_dots_1234 0x100280f /* U+280F BRAILLE PATTERN DOTS-1234 */
2217+#define XKB_KEY_braille_dots_5 0x1002810 /* U+2810 BRAILLE PATTERN DOTS-5 */
2218+#define XKB_KEY_braille_dots_15 0x1002811 /* U+2811 BRAILLE PATTERN DOTS-15 */
2219+#define XKB_KEY_braille_dots_25 0x1002812 /* U+2812 BRAILLE PATTERN DOTS-25 */
2220+#define XKB_KEY_braille_dots_125 0x1002813 /* U+2813 BRAILLE PATTERN DOTS-125 */
2221+#define XKB_KEY_braille_dots_35 0x1002814 /* U+2814 BRAILLE PATTERN DOTS-35 */
2222+#define XKB_KEY_braille_dots_135 0x1002815 /* U+2815 BRAILLE PATTERN DOTS-135 */
2223+#define XKB_KEY_braille_dots_235 0x1002816 /* U+2816 BRAILLE PATTERN DOTS-235 */
2224+#define XKB_KEY_braille_dots_1235 0x1002817 /* U+2817 BRAILLE PATTERN DOTS-1235 */
2225+#define XKB_KEY_braille_dots_45 0x1002818 /* U+2818 BRAILLE PATTERN DOTS-45 */
2226+#define XKB_KEY_braille_dots_145 0x1002819 /* U+2819 BRAILLE PATTERN DOTS-145 */
2227+#define XKB_KEY_braille_dots_245 0x100281a /* U+281A BRAILLE PATTERN DOTS-245 */
2228+#define XKB_KEY_braille_dots_1245 0x100281b /* U+281B BRAILLE PATTERN DOTS-1245 */
2229+#define XKB_KEY_braille_dots_345 0x100281c /* U+281C BRAILLE PATTERN DOTS-345 */
2230+#define XKB_KEY_braille_dots_1345 0x100281d /* U+281D BRAILLE PATTERN DOTS-1345 */
2231+#define XKB_KEY_braille_dots_2345 0x100281e /* U+281E BRAILLE PATTERN DOTS-2345 */
2232+#define XKB_KEY_braille_dots_12345 0x100281f /* U+281F BRAILLE PATTERN DOTS-12345 */
2233+#define XKB_KEY_braille_dots_6 0x1002820 /* U+2820 BRAILLE PATTERN DOTS-6 */
2234+#define XKB_KEY_braille_dots_16 0x1002821 /* U+2821 BRAILLE PATTERN DOTS-16 */
2235+#define XKB_KEY_braille_dots_26 0x1002822 /* U+2822 BRAILLE PATTERN DOTS-26 */
2236+#define XKB_KEY_braille_dots_126 0x1002823 /* U+2823 BRAILLE PATTERN DOTS-126 */
2237+#define XKB_KEY_braille_dots_36 0x1002824 /* U+2824 BRAILLE PATTERN DOTS-36 */
2238+#define XKB_KEY_braille_dots_136 0x1002825 /* U+2825 BRAILLE PATTERN DOTS-136 */
2239+#define XKB_KEY_braille_dots_236 0x1002826 /* U+2826 BRAILLE PATTERN DOTS-236 */
2240+#define XKB_KEY_braille_dots_1236 0x1002827 /* U+2827 BRAILLE PATTERN DOTS-1236 */
2241+#define XKB_KEY_braille_dots_46 0x1002828 /* U+2828 BRAILLE PATTERN DOTS-46 */
2242+#define XKB_KEY_braille_dots_146 0x1002829 /* U+2829 BRAILLE PATTERN DOTS-146 */
2243+#define XKB_KEY_braille_dots_246 0x100282a /* U+282A BRAILLE PATTERN DOTS-246 */
2244+#define XKB_KEY_braille_dots_1246 0x100282b /* U+282B BRAILLE PATTERN DOTS-1246 */
2245+#define XKB_KEY_braille_dots_346 0x100282c /* U+282C BRAILLE PATTERN DOTS-346 */
2246+#define XKB_KEY_braille_dots_1346 0x100282d /* U+282D BRAILLE PATTERN DOTS-1346 */
2247+#define XKB_KEY_braille_dots_2346 0x100282e /* U+282E BRAILLE PATTERN DOTS-2346 */
2248+#define XKB_KEY_braille_dots_12346 0x100282f /* U+282F BRAILLE PATTERN DOTS-12346 */
2249+#define XKB_KEY_braille_dots_56 0x1002830 /* U+2830 BRAILLE PATTERN DOTS-56 */
2250+#define XKB_KEY_braille_dots_156 0x1002831 /* U+2831 BRAILLE PATTERN DOTS-156 */
2251+#define XKB_KEY_braille_dots_256 0x1002832 /* U+2832 BRAILLE PATTERN DOTS-256 */
2252+#define XKB_KEY_braille_dots_1256 0x1002833 /* U+2833 BRAILLE PATTERN DOTS-1256 */
2253+#define XKB_KEY_braille_dots_356 0x1002834 /* U+2834 BRAILLE PATTERN DOTS-356 */
2254+#define XKB_KEY_braille_dots_1356 0x1002835 /* U+2835 BRAILLE PATTERN DOTS-1356 */
2255+#define XKB_KEY_braille_dots_2356 0x1002836 /* U+2836 BRAILLE PATTERN DOTS-2356 */
2256+#define XKB_KEY_braille_dots_12356 0x1002837 /* U+2837 BRAILLE PATTERN DOTS-12356 */
2257+#define XKB_KEY_braille_dots_456 0x1002838 /* U+2838 BRAILLE PATTERN DOTS-456 */
2258+#define XKB_KEY_braille_dots_1456 0x1002839 /* U+2839 BRAILLE PATTERN DOTS-1456 */
2259+#define XKB_KEY_braille_dots_2456 0x100283a /* U+283A BRAILLE PATTERN DOTS-2456 */
2260+#define XKB_KEY_braille_dots_12456 0x100283b /* U+283B BRAILLE PATTERN DOTS-12456 */
2261+#define XKB_KEY_braille_dots_3456 0x100283c /* U+283C BRAILLE PATTERN DOTS-3456 */
2262+#define XKB_KEY_braille_dots_13456 0x100283d /* U+283D BRAILLE PATTERN DOTS-13456 */
2263+#define XKB_KEY_braille_dots_23456 0x100283e /* U+283E BRAILLE PATTERN DOTS-23456 */
2264+#define XKB_KEY_braille_dots_123456 0x100283f /* U+283F BRAILLE PATTERN DOTS-123456 */
2265+#define XKB_KEY_braille_dots_7 0x1002840 /* U+2840 BRAILLE PATTERN DOTS-7 */
2266+#define XKB_KEY_braille_dots_17 0x1002841 /* U+2841 BRAILLE PATTERN DOTS-17 */
2267+#define XKB_KEY_braille_dots_27 0x1002842 /* U+2842 BRAILLE PATTERN DOTS-27 */
2268+#define XKB_KEY_braille_dots_127 0x1002843 /* U+2843 BRAILLE PATTERN DOTS-127 */
2269+#define XKB_KEY_braille_dots_37 0x1002844 /* U+2844 BRAILLE PATTERN DOTS-37 */
2270+#define XKB_KEY_braille_dots_137 0x1002845 /* U+2845 BRAILLE PATTERN DOTS-137 */
2271+#define XKB_KEY_braille_dots_237 0x1002846 /* U+2846 BRAILLE PATTERN DOTS-237 */
2272+#define XKB_KEY_braille_dots_1237 0x1002847 /* U+2847 BRAILLE PATTERN DOTS-1237 */
2273+#define XKB_KEY_braille_dots_47 0x1002848 /* U+2848 BRAILLE PATTERN DOTS-47 */
2274+#define XKB_KEY_braille_dots_147 0x1002849 /* U+2849 BRAILLE PATTERN DOTS-147 */
2275+#define XKB_KEY_braille_dots_247 0x100284a /* U+284A BRAILLE PATTERN DOTS-247 */
2276+#define XKB_KEY_braille_dots_1247 0x100284b /* U+284B BRAILLE PATTERN DOTS-1247 */
2277+#define XKB_KEY_braille_dots_347 0x100284c /* U+284C BRAILLE PATTERN DOTS-347 */
2278+#define XKB_KEY_braille_dots_1347 0x100284d /* U+284D BRAILLE PATTERN DOTS-1347 */
2279+#define XKB_KEY_braille_dots_2347 0x100284e /* U+284E BRAILLE PATTERN DOTS-2347 */
2280+#define XKB_KEY_braille_dots_12347 0x100284f /* U+284F BRAILLE PATTERN DOTS-12347 */
2281+#define XKB_KEY_braille_dots_57 0x1002850 /* U+2850 BRAILLE PATTERN DOTS-57 */
2282+#define XKB_KEY_braille_dots_157 0x1002851 /* U+2851 BRAILLE PATTERN DOTS-157 */
2283+#define XKB_KEY_braille_dots_257 0x1002852 /* U+2852 BRAILLE PATTERN DOTS-257 */
2284+#define XKB_KEY_braille_dots_1257 0x1002853 /* U+2853 BRAILLE PATTERN DOTS-1257 */
2285+#define XKB_KEY_braille_dots_357 0x1002854 /* U+2854 BRAILLE PATTERN DOTS-357 */
2286+#define XKB_KEY_braille_dots_1357 0x1002855 /* U+2855 BRAILLE PATTERN DOTS-1357 */
2287+#define XKB_KEY_braille_dots_2357 0x1002856 /* U+2856 BRAILLE PATTERN DOTS-2357 */
2288+#define XKB_KEY_braille_dots_12357 0x1002857 /* U+2857 BRAILLE PATTERN DOTS-12357 */
2289+#define XKB_KEY_braille_dots_457 0x1002858 /* U+2858 BRAILLE PATTERN DOTS-457 */
2290+#define XKB_KEY_braille_dots_1457 0x1002859 /* U+2859 BRAILLE PATTERN DOTS-1457 */
2291+#define XKB_KEY_braille_dots_2457 0x100285a /* U+285A BRAILLE PATTERN DOTS-2457 */
2292+#define XKB_KEY_braille_dots_12457 0x100285b /* U+285B BRAILLE PATTERN DOTS-12457 */
2293+#define XKB_KEY_braille_dots_3457 0x100285c /* U+285C BRAILLE PATTERN DOTS-3457 */
2294+#define XKB_KEY_braille_dots_13457 0x100285d /* U+285D BRAILLE PATTERN DOTS-13457 */
2295+#define XKB_KEY_braille_dots_23457 0x100285e /* U+285E BRAILLE PATTERN DOTS-23457 */
2296+#define XKB_KEY_braille_dots_123457 0x100285f /* U+285F BRAILLE PATTERN DOTS-123457 */
2297+#define XKB_KEY_braille_dots_67 0x1002860 /* U+2860 BRAILLE PATTERN DOTS-67 */
2298+#define XKB_KEY_braille_dots_167 0x1002861 /* U+2861 BRAILLE PATTERN DOTS-167 */
2299+#define XKB_KEY_braille_dots_267 0x1002862 /* U+2862 BRAILLE PATTERN DOTS-267 */
2300+#define XKB_KEY_braille_dots_1267 0x1002863 /* U+2863 BRAILLE PATTERN DOTS-1267 */
2301+#define XKB_KEY_braille_dots_367 0x1002864 /* U+2864 BRAILLE PATTERN DOTS-367 */
2302+#define XKB_KEY_braille_dots_1367 0x1002865 /* U+2865 BRAILLE PATTERN DOTS-1367 */
2303+#define XKB_KEY_braille_dots_2367 0x1002866 /* U+2866 BRAILLE PATTERN DOTS-2367 */
2304+#define XKB_KEY_braille_dots_12367 0x1002867 /* U+2867 BRAILLE PATTERN DOTS-12367 */
2305+#define XKB_KEY_braille_dots_467 0x1002868 /* U+2868 BRAILLE PATTERN DOTS-467 */
2306+#define XKB_KEY_braille_dots_1467 0x1002869 /* U+2869 BRAILLE PATTERN DOTS-1467 */
2307+#define XKB_KEY_braille_dots_2467 0x100286a /* U+286A BRAILLE PATTERN DOTS-2467 */
2308+#define XKB_KEY_braille_dots_12467 0x100286b /* U+286B BRAILLE PATTERN DOTS-12467 */
2309+#define XKB_KEY_braille_dots_3467 0x100286c /* U+286C BRAILLE PATTERN DOTS-3467 */
2310+#define XKB_KEY_braille_dots_13467 0x100286d /* U+286D BRAILLE PATTERN DOTS-13467 */
2311+#define XKB_KEY_braille_dots_23467 0x100286e /* U+286E BRAILLE PATTERN DOTS-23467 */
2312+#define XKB_KEY_braille_dots_123467 0x100286f /* U+286F BRAILLE PATTERN DOTS-123467 */
2313+#define XKB_KEY_braille_dots_567 0x1002870 /* U+2870 BRAILLE PATTERN DOTS-567 */
2314+#define XKB_KEY_braille_dots_1567 0x1002871 /* U+2871 BRAILLE PATTERN DOTS-1567 */
2315+#define XKB_KEY_braille_dots_2567 0x1002872 /* U+2872 BRAILLE PATTERN DOTS-2567 */
2316+#define XKB_KEY_braille_dots_12567 0x1002873 /* U+2873 BRAILLE PATTERN DOTS-12567 */
2317+#define XKB_KEY_braille_dots_3567 0x1002874 /* U+2874 BRAILLE PATTERN DOTS-3567 */
2318+#define XKB_KEY_braille_dots_13567 0x1002875 /* U+2875 BRAILLE PATTERN DOTS-13567 */
2319+#define XKB_KEY_braille_dots_23567 0x1002876 /* U+2876 BRAILLE PATTERN DOTS-23567 */
2320+#define XKB_KEY_braille_dots_123567 0x1002877 /* U+2877 BRAILLE PATTERN DOTS-123567 */
2321+#define XKB_KEY_braille_dots_4567 0x1002878 /* U+2878 BRAILLE PATTERN DOTS-4567 */
2322+#define XKB_KEY_braille_dots_14567 0x1002879 /* U+2879 BRAILLE PATTERN DOTS-14567 */
2323+#define XKB_KEY_braille_dots_24567 0x100287a /* U+287A BRAILLE PATTERN DOTS-24567 */
2324+#define XKB_KEY_braille_dots_124567 0x100287b /* U+287B BRAILLE PATTERN DOTS-124567 */
2325+#define XKB_KEY_braille_dots_34567 0x100287c /* U+287C BRAILLE PATTERN DOTS-34567 */
2326+#define XKB_KEY_braille_dots_134567 0x100287d /* U+287D BRAILLE PATTERN DOTS-134567 */
2327+#define XKB_KEY_braille_dots_234567 0x100287e /* U+287E BRAILLE PATTERN DOTS-234567 */
2328+#define XKB_KEY_braille_dots_1234567 0x100287f /* U+287F BRAILLE PATTERN DOTS-1234567 */
2329+#define XKB_KEY_braille_dots_8 0x1002880 /* U+2880 BRAILLE PATTERN DOTS-8 */
2330+#define XKB_KEY_braille_dots_18 0x1002881 /* U+2881 BRAILLE PATTERN DOTS-18 */
2331+#define XKB_KEY_braille_dots_28 0x1002882 /* U+2882 BRAILLE PATTERN DOTS-28 */
2332+#define XKB_KEY_braille_dots_128 0x1002883 /* U+2883 BRAILLE PATTERN DOTS-128 */
2333+#define XKB_KEY_braille_dots_38 0x1002884 /* U+2884 BRAILLE PATTERN DOTS-38 */
2334+#define XKB_KEY_braille_dots_138 0x1002885 /* U+2885 BRAILLE PATTERN DOTS-138 */
2335+#define XKB_KEY_braille_dots_238 0x1002886 /* U+2886 BRAILLE PATTERN DOTS-238 */
2336+#define XKB_KEY_braille_dots_1238 0x1002887 /* U+2887 BRAILLE PATTERN DOTS-1238 */
2337+#define XKB_KEY_braille_dots_48 0x1002888 /* U+2888 BRAILLE PATTERN DOTS-48 */
2338+#define XKB_KEY_braille_dots_148 0x1002889 /* U+2889 BRAILLE PATTERN DOTS-148 */
2339+#define XKB_KEY_braille_dots_248 0x100288a /* U+288A BRAILLE PATTERN DOTS-248 */
2340+#define XKB_KEY_braille_dots_1248 0x100288b /* U+288B BRAILLE PATTERN DOTS-1248 */
2341+#define XKB_KEY_braille_dots_348 0x100288c /* U+288C BRAILLE PATTERN DOTS-348 */
2342+#define XKB_KEY_braille_dots_1348 0x100288d /* U+288D BRAILLE PATTERN DOTS-1348 */
2343+#define XKB_KEY_braille_dots_2348 0x100288e /* U+288E BRAILLE PATTERN DOTS-2348 */
2344+#define XKB_KEY_braille_dots_12348 0x100288f /* U+288F BRAILLE PATTERN DOTS-12348 */
2345+#define XKB_KEY_braille_dots_58 0x1002890 /* U+2890 BRAILLE PATTERN DOTS-58 */
2346+#define XKB_KEY_braille_dots_158 0x1002891 /* U+2891 BRAILLE PATTERN DOTS-158 */
2347+#define XKB_KEY_braille_dots_258 0x1002892 /* U+2892 BRAILLE PATTERN DOTS-258 */
2348+#define XKB_KEY_braille_dots_1258 0x1002893 /* U+2893 BRAILLE PATTERN DOTS-1258 */
2349+#define XKB_KEY_braille_dots_358 0x1002894 /* U+2894 BRAILLE PATTERN DOTS-358 */
2350+#define XKB_KEY_braille_dots_1358 0x1002895 /* U+2895 BRAILLE PATTERN DOTS-1358 */
2351+#define XKB_KEY_braille_dots_2358 0x1002896 /* U+2896 BRAILLE PATTERN DOTS-2358 */
2352+#define XKB_KEY_braille_dots_12358 0x1002897 /* U+2897 BRAILLE PATTERN DOTS-12358 */
2353+#define XKB_KEY_braille_dots_458 0x1002898 /* U+2898 BRAILLE PATTERN DOTS-458 */
2354+#define XKB_KEY_braille_dots_1458 0x1002899 /* U+2899 BRAILLE PATTERN DOTS-1458 */
2355+#define XKB_KEY_braille_dots_2458 0x100289a /* U+289A BRAILLE PATTERN DOTS-2458 */
2356+#define XKB_KEY_braille_dots_12458 0x100289b /* U+289B BRAILLE PATTERN DOTS-12458 */
2357+#define XKB_KEY_braille_dots_3458 0x100289c /* U+289C BRAILLE PATTERN DOTS-3458 */
2358+#define XKB_KEY_braille_dots_13458 0x100289d /* U+289D BRAILLE PATTERN DOTS-13458 */
2359+#define XKB_KEY_braille_dots_23458 0x100289e /* U+289E BRAILLE PATTERN DOTS-23458 */
2360+#define XKB_KEY_braille_dots_123458 0x100289f /* U+289F BRAILLE PATTERN DOTS-123458 */
2361+#define XKB_KEY_braille_dots_68 0x10028a0 /* U+28A0 BRAILLE PATTERN DOTS-68 */
2362+#define XKB_KEY_braille_dots_168 0x10028a1 /* U+28A1 BRAILLE PATTERN DOTS-168 */
2363+#define XKB_KEY_braille_dots_268 0x10028a2 /* U+28A2 BRAILLE PATTERN DOTS-268 */
2364+#define XKB_KEY_braille_dots_1268 0x10028a3 /* U+28A3 BRAILLE PATTERN DOTS-1268 */
2365+#define XKB_KEY_braille_dots_368 0x10028a4 /* U+28A4 BRAILLE PATTERN DOTS-368 */
2366+#define XKB_KEY_braille_dots_1368 0x10028a5 /* U+28A5 BRAILLE PATTERN DOTS-1368 */
2367+#define XKB_KEY_braille_dots_2368 0x10028a6 /* U+28A6 BRAILLE PATTERN DOTS-2368 */
2368+#define XKB_KEY_braille_dots_12368 0x10028a7 /* U+28A7 BRAILLE PATTERN DOTS-12368 */
2369+#define XKB_KEY_braille_dots_468 0x10028a8 /* U+28A8 BRAILLE PATTERN DOTS-468 */
2370+#define XKB_KEY_braille_dots_1468 0x10028a9 /* U+28A9 BRAILLE PATTERN DOTS-1468 */
2371+#define XKB_KEY_braille_dots_2468 0x10028aa /* U+28AA BRAILLE PATTERN DOTS-2468 */
2372+#define XKB_KEY_braille_dots_12468 0x10028ab /* U+28AB BRAILLE PATTERN DOTS-12468 */
2373+#define XKB_KEY_braille_dots_3468 0x10028ac /* U+28AC BRAILLE PATTERN DOTS-3468 */
2374+#define XKB_KEY_braille_dots_13468 0x10028ad /* U+28AD BRAILLE PATTERN DOTS-13468 */
2375+#define XKB_KEY_braille_dots_23468 0x10028ae /* U+28AE BRAILLE PATTERN DOTS-23468 */
2376+#define XKB_KEY_braille_dots_123468 0x10028af /* U+28AF BRAILLE PATTERN DOTS-123468 */
2377+#define XKB_KEY_braille_dots_568 0x10028b0 /* U+28B0 BRAILLE PATTERN DOTS-568 */
2378+#define XKB_KEY_braille_dots_1568 0x10028b1 /* U+28B1 BRAILLE PATTERN DOTS-1568 */
2379+#define XKB_KEY_braille_dots_2568 0x10028b2 /* U+28B2 BRAILLE PATTERN DOTS-2568 */
2380+#define XKB_KEY_braille_dots_12568 0x10028b3 /* U+28B3 BRAILLE PATTERN DOTS-12568 */
2381+#define XKB_KEY_braille_dots_3568 0x10028b4 /* U+28B4 BRAILLE PATTERN DOTS-3568 */
2382+#define XKB_KEY_braille_dots_13568 0x10028b5 /* U+28B5 BRAILLE PATTERN DOTS-13568 */
2383+#define XKB_KEY_braille_dots_23568 0x10028b6 /* U+28B6 BRAILLE PATTERN DOTS-23568 */
2384+#define XKB_KEY_braille_dots_123568 0x10028b7 /* U+28B7 BRAILLE PATTERN DOTS-123568 */
2385+#define XKB_KEY_braille_dots_4568 0x10028b8 /* U+28B8 BRAILLE PATTERN DOTS-4568 */
2386+#define XKB_KEY_braille_dots_14568 0x10028b9 /* U+28B9 BRAILLE PATTERN DOTS-14568 */
2387+#define XKB_KEY_braille_dots_24568 0x10028ba /* U+28BA BRAILLE PATTERN DOTS-24568 */
2388+#define XKB_KEY_braille_dots_124568 0x10028bb /* U+28BB BRAILLE PATTERN DOTS-124568 */
2389+#define XKB_KEY_braille_dots_34568 0x10028bc /* U+28BC BRAILLE PATTERN DOTS-34568 */
2390+#define XKB_KEY_braille_dots_134568 0x10028bd /* U+28BD BRAILLE PATTERN DOTS-134568 */
2391+#define XKB_KEY_braille_dots_234568 0x10028be /* U+28BE BRAILLE PATTERN DOTS-234568 */
2392+#define XKB_KEY_braille_dots_1234568 0x10028bf /* U+28BF BRAILLE PATTERN DOTS-1234568 */
2393+#define XKB_KEY_braille_dots_78 0x10028c0 /* U+28C0 BRAILLE PATTERN DOTS-78 */
2394+#define XKB_KEY_braille_dots_178 0x10028c1 /* U+28C1 BRAILLE PATTERN DOTS-178 */
2395+#define XKB_KEY_braille_dots_278 0x10028c2 /* U+28C2 BRAILLE PATTERN DOTS-278 */
2396+#define XKB_KEY_braille_dots_1278 0x10028c3 /* U+28C3 BRAILLE PATTERN DOTS-1278 */
2397+#define XKB_KEY_braille_dots_378 0x10028c4 /* U+28C4 BRAILLE PATTERN DOTS-378 */
2398+#define XKB_KEY_braille_dots_1378 0x10028c5 /* U+28C5 BRAILLE PATTERN DOTS-1378 */
2399+#define XKB_KEY_braille_dots_2378 0x10028c6 /* U+28C6 BRAILLE PATTERN DOTS-2378 */
2400+#define XKB_KEY_braille_dots_12378 0x10028c7 /* U+28C7 BRAILLE PATTERN DOTS-12378 */
2401+#define XKB_KEY_braille_dots_478 0x10028c8 /* U+28C8 BRAILLE PATTERN DOTS-478 */
2402+#define XKB_KEY_braille_dots_1478 0x10028c9 /* U+28C9 BRAILLE PATTERN DOTS-1478 */
2403+#define XKB_KEY_braille_dots_2478 0x10028ca /* U+28CA BRAILLE PATTERN DOTS-2478 */
2404+#define XKB_KEY_braille_dots_12478 0x10028cb /* U+28CB BRAILLE PATTERN DOTS-12478 */
2405+#define XKB_KEY_braille_dots_3478 0x10028cc /* U+28CC BRAILLE PATTERN DOTS-3478 */
2406+#define XKB_KEY_braille_dots_13478 0x10028cd /* U+28CD BRAILLE PATTERN DOTS-13478 */
2407+#define XKB_KEY_braille_dots_23478 0x10028ce /* U+28CE BRAILLE PATTERN DOTS-23478 */
2408+#define XKB_KEY_braille_dots_123478 0x10028cf /* U+28CF BRAILLE PATTERN DOTS-123478 */
2409+#define XKB_KEY_braille_dots_578 0x10028d0 /* U+28D0 BRAILLE PATTERN DOTS-578 */
2410+#define XKB_KEY_braille_dots_1578 0x10028d1 /* U+28D1 BRAILLE PATTERN DOTS-1578 */
2411+#define XKB_KEY_braille_dots_2578 0x10028d2 /* U+28D2 BRAILLE PATTERN DOTS-2578 */
2412+#define XKB_KEY_braille_dots_12578 0x10028d3 /* U+28D3 BRAILLE PATTERN DOTS-12578 */
2413+#define XKB_KEY_braille_dots_3578 0x10028d4 /* U+28D4 BRAILLE PATTERN DOTS-3578 */
2414+#define XKB_KEY_braille_dots_13578 0x10028d5 /* U+28D5 BRAILLE PATTERN DOTS-13578 */
2415+#define XKB_KEY_braille_dots_23578 0x10028d6 /* U+28D6 BRAILLE PATTERN DOTS-23578 */
2416+#define XKB_KEY_braille_dots_123578 0x10028d7 /* U+28D7 BRAILLE PATTERN DOTS-123578 */
2417+#define XKB_KEY_braille_dots_4578 0x10028d8 /* U+28D8 BRAILLE PATTERN DOTS-4578 */
2418+#define XKB_KEY_braille_dots_14578 0x10028d9 /* U+28D9 BRAILLE PATTERN DOTS-14578 */
2419+#define XKB_KEY_braille_dots_24578 0x10028da /* U+28DA BRAILLE PATTERN DOTS-24578 */
2420+#define XKB_KEY_braille_dots_124578 0x10028db /* U+28DB BRAILLE PATTERN DOTS-124578 */
2421+#define XKB_KEY_braille_dots_34578 0x10028dc /* U+28DC BRAILLE PATTERN DOTS-34578 */
2422+#define XKB_KEY_braille_dots_134578 0x10028dd /* U+28DD BRAILLE PATTERN DOTS-134578 */
2423+#define XKB_KEY_braille_dots_234578 0x10028de /* U+28DE BRAILLE PATTERN DOTS-234578 */
2424+#define XKB_KEY_braille_dots_1234578 0x10028df /* U+28DF BRAILLE PATTERN DOTS-1234578 */
2425+#define XKB_KEY_braille_dots_678 0x10028e0 /* U+28E0 BRAILLE PATTERN DOTS-678 */
2426+#define XKB_KEY_braille_dots_1678 0x10028e1 /* U+28E1 BRAILLE PATTERN DOTS-1678 */
2427+#define XKB_KEY_braille_dots_2678 0x10028e2 /* U+28E2 BRAILLE PATTERN DOTS-2678 */
2428+#define XKB_KEY_braille_dots_12678 0x10028e3 /* U+28E3 BRAILLE PATTERN DOTS-12678 */
2429+#define XKB_KEY_braille_dots_3678 0x10028e4 /* U+28E4 BRAILLE PATTERN DOTS-3678 */
2430+#define XKB_KEY_braille_dots_13678 0x10028e5 /* U+28E5 BRAILLE PATTERN DOTS-13678 */
2431+#define XKB_KEY_braille_dots_23678 0x10028e6 /* U+28E6 BRAILLE PATTERN DOTS-23678 */
2432+#define XKB_KEY_braille_dots_123678 0x10028e7 /* U+28E7 BRAILLE PATTERN DOTS-123678 */
2433+#define XKB_KEY_braille_dots_4678 0x10028e8 /* U+28E8 BRAILLE PATTERN DOTS-4678 */
2434+#define XKB_KEY_braille_dots_14678 0x10028e9 /* U+28E9 BRAILLE PATTERN DOTS-14678 */
2435+#define XKB_KEY_braille_dots_24678 0x10028ea /* U+28EA BRAILLE PATTERN DOTS-24678 */
2436+#define XKB_KEY_braille_dots_124678 0x10028eb /* U+28EB BRAILLE PATTERN DOTS-124678 */
2437+#define XKB_KEY_braille_dots_34678 0x10028ec /* U+28EC BRAILLE PATTERN DOTS-34678 */
2438+#define XKB_KEY_braille_dots_134678 0x10028ed /* U+28ED BRAILLE PATTERN DOTS-134678 */
2439+#define XKB_KEY_braille_dots_234678 0x10028ee /* U+28EE BRAILLE PATTERN DOTS-234678 */
2440+#define XKB_KEY_braille_dots_1234678 0x10028ef /* U+28EF BRAILLE PATTERN DOTS-1234678 */
2441+#define XKB_KEY_braille_dots_5678 0x10028f0 /* U+28F0 BRAILLE PATTERN DOTS-5678 */
2442+#define XKB_KEY_braille_dots_15678 0x10028f1 /* U+28F1 BRAILLE PATTERN DOTS-15678 */
2443+#define XKB_KEY_braille_dots_25678 0x10028f2 /* U+28F2 BRAILLE PATTERN DOTS-25678 */
2444+#define XKB_KEY_braille_dots_125678 0x10028f3 /* U+28F3 BRAILLE PATTERN DOTS-125678 */
2445+#define XKB_KEY_braille_dots_35678 0x10028f4 /* U+28F4 BRAILLE PATTERN DOTS-35678 */
2446+#define XKB_KEY_braille_dots_135678 0x10028f5 /* U+28F5 BRAILLE PATTERN DOTS-135678 */
2447+#define XKB_KEY_braille_dots_235678 0x10028f6 /* U+28F6 BRAILLE PATTERN DOTS-235678 */
2448+#define XKB_KEY_braille_dots_1235678 0x10028f7 /* U+28F7 BRAILLE PATTERN DOTS-1235678 */
2449+#define XKB_KEY_braille_dots_45678 0x10028f8 /* U+28F8 BRAILLE PATTERN DOTS-45678 */
2450+#define XKB_KEY_braille_dots_145678 0x10028f9 /* U+28F9 BRAILLE PATTERN DOTS-145678 */
2451+#define XKB_KEY_braille_dots_245678 0x10028fa /* U+28FA BRAILLE PATTERN DOTS-245678 */
2452+#define XKB_KEY_braille_dots_1245678 0x10028fb /* U+28FB BRAILLE PATTERN DOTS-1245678 */
2453+#define XKB_KEY_braille_dots_345678 0x10028fc /* U+28FC BRAILLE PATTERN DOTS-345678 */
2454+#define XKB_KEY_braille_dots_1345678 0x10028fd /* U+28FD BRAILLE PATTERN DOTS-1345678 */
2455+#define XKB_KEY_braille_dots_2345678 0x10028fe /* U+28FE BRAILLE PATTERN DOTS-2345678 */
2456+#define XKB_KEY_braille_dots_12345678 0x10028ff /* U+28FF BRAILLE PATTERN DOTS-12345678 */
2457+
2458+/*
2459+ * Sinhala (http://unicode.org/charts/PDF/U0D80.pdf)
2460+ * http://www.nongnu.org/sinhala/doc/transliteration/sinhala-transliteration_6.html
2461+ */
2462+
2463+#define XKB_KEY_Sinh_ng 0x1000d82 /* U+0D82 SINHALA SIGN ANUSVARAYA */
2464+#define XKB_KEY_Sinh_h2 0x1000d83 /* U+0D83 SINHALA SIGN VISARGAYA */
2465+#define XKB_KEY_Sinh_a 0x1000d85 /* U+0D85 SINHALA LETTER AYANNA */
2466+#define XKB_KEY_Sinh_aa 0x1000d86 /* U+0D86 SINHALA LETTER AAYANNA */
2467+#define XKB_KEY_Sinh_ae 0x1000d87 /* U+0D87 SINHALA LETTER AEYANNA */
2468+#define XKB_KEY_Sinh_aee 0x1000d88 /* U+0D88 SINHALA LETTER AEEYANNA */
2469+#define XKB_KEY_Sinh_i 0x1000d89 /* U+0D89 SINHALA LETTER IYANNA */
2470+#define XKB_KEY_Sinh_ii 0x1000d8a /* U+0D8A SINHALA LETTER IIYANNA */
2471+#define XKB_KEY_Sinh_u 0x1000d8b /* U+0D8B SINHALA LETTER UYANNA */
2472+#define XKB_KEY_Sinh_uu 0x1000d8c /* U+0D8C SINHALA LETTER UUYANNA */
2473+#define XKB_KEY_Sinh_ri 0x1000d8d /* U+0D8D SINHALA LETTER IRUYANNA */
2474+#define XKB_KEY_Sinh_rii 0x1000d8e /* U+0D8E SINHALA LETTER IRUUYANNA */
2475+#define XKB_KEY_Sinh_lu 0x1000d8f /* U+0D8F SINHALA LETTER ILUYANNA */
2476+#define XKB_KEY_Sinh_luu 0x1000d90 /* U+0D90 SINHALA LETTER ILUUYANNA */
2477+#define XKB_KEY_Sinh_e 0x1000d91 /* U+0D91 SINHALA LETTER EYANNA */
2478+#define XKB_KEY_Sinh_ee 0x1000d92 /* U+0D92 SINHALA LETTER EEYANNA */
2479+#define XKB_KEY_Sinh_ai 0x1000d93 /* U+0D93 SINHALA LETTER AIYANNA */
2480+#define XKB_KEY_Sinh_o 0x1000d94 /* U+0D94 SINHALA LETTER OYANNA */
2481+#define XKB_KEY_Sinh_oo 0x1000d95 /* U+0D95 SINHALA LETTER OOYANNA */
2482+#define XKB_KEY_Sinh_au 0x1000d96 /* U+0D96 SINHALA LETTER AUYANNA */
2483+#define XKB_KEY_Sinh_ka 0x1000d9a /* U+0D9A SINHALA LETTER ALPAPRAANA KAYANNA */
2484+#define XKB_KEY_Sinh_kha 0x1000d9b /* U+0D9B SINHALA LETTER MAHAAPRAANA KAYANNA */
2485+#define XKB_KEY_Sinh_ga 0x1000d9c /* U+0D9C SINHALA LETTER ALPAPRAANA GAYANNA */
2486+#define XKB_KEY_Sinh_gha 0x1000d9d /* U+0D9D SINHALA LETTER MAHAAPRAANA GAYANNA */
2487+#define XKB_KEY_Sinh_ng2 0x1000d9e /* U+0D9E SINHALA LETTER KANTAJA NAASIKYAYA */
2488+#define XKB_KEY_Sinh_nga 0x1000d9f /* U+0D9F SINHALA LETTER SANYAKA GAYANNA */
2489+#define XKB_KEY_Sinh_ca 0x1000da0 /* U+0DA0 SINHALA LETTER ALPAPRAANA CAYANNA */
2490+#define XKB_KEY_Sinh_cha 0x1000da1 /* U+0DA1 SINHALA LETTER MAHAAPRAANA CAYANNA */
2491+#define XKB_KEY_Sinh_ja 0x1000da2 /* U+0DA2 SINHALA LETTER ALPAPRAANA JAYANNA */
2492+#define XKB_KEY_Sinh_jha 0x1000da3 /* U+0DA3 SINHALA LETTER MAHAAPRAANA JAYANNA */
2493+#define XKB_KEY_Sinh_nya 0x1000da4 /* U+0DA4 SINHALA LETTER TAALUJA NAASIKYAYA */
2494+#define XKB_KEY_Sinh_jnya 0x1000da5 /* U+0DA5 SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA */
2495+#define XKB_KEY_Sinh_nja 0x1000da6 /* U+0DA6 SINHALA LETTER SANYAKA JAYANNA */
2496+#define XKB_KEY_Sinh_tta 0x1000da7 /* U+0DA7 SINHALA LETTER ALPAPRAANA TTAYANNA */
2497+#define XKB_KEY_Sinh_ttha 0x1000da8 /* U+0DA8 SINHALA LETTER MAHAAPRAANA TTAYANNA */
2498+#define XKB_KEY_Sinh_dda 0x1000da9 /* U+0DA9 SINHALA LETTER ALPAPRAANA DDAYANNA */
2499+#define XKB_KEY_Sinh_ddha 0x1000daa /* U+0DAA SINHALA LETTER MAHAAPRAANA DDAYANNA */
2500+#define XKB_KEY_Sinh_nna 0x1000dab /* U+0DAB SINHALA LETTER MUURDHAJA NAYANNA */
2501+#define XKB_KEY_Sinh_ndda 0x1000dac /* U+0DAC SINHALA LETTER SANYAKA DDAYANNA */
2502+#define XKB_KEY_Sinh_tha 0x1000dad /* U+0DAD SINHALA LETTER ALPAPRAANA TAYANNA */
2503+#define XKB_KEY_Sinh_thha 0x1000dae /* U+0DAE SINHALA LETTER MAHAAPRAANA TAYANNA */
2504+#define XKB_KEY_Sinh_dha 0x1000daf /* U+0DAF SINHALA LETTER ALPAPRAANA DAYANNA */
2505+#define XKB_KEY_Sinh_dhha 0x1000db0 /* U+0DB0 SINHALA LETTER MAHAAPRAANA DAYANNA */
2506+#define XKB_KEY_Sinh_na 0x1000db1 /* U+0DB1 SINHALA LETTER DANTAJA NAYANNA */
2507+#define XKB_KEY_Sinh_ndha 0x1000db3 /* U+0DB3 SINHALA LETTER SANYAKA DAYANNA */
2508+#define XKB_KEY_Sinh_pa 0x1000db4 /* U+0DB4 SINHALA LETTER ALPAPRAANA PAYANNA */
2509+#define XKB_KEY_Sinh_pha 0x1000db5 /* U+0DB5 SINHALA LETTER MAHAAPRAANA PAYANNA */
2510+#define XKB_KEY_Sinh_ba 0x1000db6 /* U+0DB6 SINHALA LETTER ALPAPRAANA BAYANNA */
2511+#define XKB_KEY_Sinh_bha 0x1000db7 /* U+0DB7 SINHALA LETTER MAHAAPRAANA BAYANNA */
2512+#define XKB_KEY_Sinh_ma 0x1000db8 /* U+0DB8 SINHALA LETTER MAYANNA */
2513+#define XKB_KEY_Sinh_mba 0x1000db9 /* U+0DB9 SINHALA LETTER AMBA BAYANNA */
2514+#define XKB_KEY_Sinh_ya 0x1000dba /* U+0DBA SINHALA LETTER YAYANNA */
2515+#define XKB_KEY_Sinh_ra 0x1000dbb /* U+0DBB SINHALA LETTER RAYANNA */
2516+#define XKB_KEY_Sinh_la 0x1000dbd /* U+0DBD SINHALA LETTER DANTAJA LAYANNA */
2517+#define XKB_KEY_Sinh_va 0x1000dc0 /* U+0DC0 SINHALA LETTER VAYANNA */
2518+#define XKB_KEY_Sinh_sha 0x1000dc1 /* U+0DC1 SINHALA LETTER TAALUJA SAYANNA */
2519+#define XKB_KEY_Sinh_ssha 0x1000dc2 /* U+0DC2 SINHALA LETTER MUURDHAJA SAYANNA */
2520+#define XKB_KEY_Sinh_sa 0x1000dc3 /* U+0DC3 SINHALA LETTER DANTAJA SAYANNA */
2521+#define XKB_KEY_Sinh_ha 0x1000dc4 /* U+0DC4 SINHALA LETTER HAYANNA */
2522+#define XKB_KEY_Sinh_lla 0x1000dc5 /* U+0DC5 SINHALA LETTER MUURDHAJA LAYANNA */
2523+#define XKB_KEY_Sinh_fa 0x1000dc6 /* U+0DC6 SINHALA LETTER FAYANNA */
2524+#define XKB_KEY_Sinh_al 0x1000dca /* U+0DCA SINHALA SIGN AL-LAKUNA */
2525+#define XKB_KEY_Sinh_aa2 0x1000dcf /* U+0DCF SINHALA VOWEL SIGN AELA-PILLA */
2526+#define XKB_KEY_Sinh_ae2 0x1000dd0 /* U+0DD0 SINHALA VOWEL SIGN KETTI AEDA-PILLA */
2527+#define XKB_KEY_Sinh_aee2 0x1000dd1 /* U+0DD1 SINHALA VOWEL SIGN DIGA AEDA-PILLA */
2528+#define XKB_KEY_Sinh_i2 0x1000dd2 /* U+0DD2 SINHALA VOWEL SIGN KETTI IS-PILLA */
2529+#define XKB_KEY_Sinh_ii2 0x1000dd3 /* U+0DD3 SINHALA VOWEL SIGN DIGA IS-PILLA */
2530+#define XKB_KEY_Sinh_u2 0x1000dd4 /* U+0DD4 SINHALA VOWEL SIGN KETTI PAA-PILLA */
2531+#define XKB_KEY_Sinh_uu2 0x1000dd6 /* U+0DD6 SINHALA VOWEL SIGN DIGA PAA-PILLA */
2532+#define XKB_KEY_Sinh_ru2 0x1000dd8 /* U+0DD8 SINHALA VOWEL SIGN GAETTA-PILLA */
2533+#define XKB_KEY_Sinh_e2 0x1000dd9 /* U+0DD9 SINHALA VOWEL SIGN KOMBUVA */
2534+#define XKB_KEY_Sinh_ee2 0x1000dda /* U+0DDA SINHALA VOWEL SIGN DIGA KOMBUVA */
2535+#define XKB_KEY_Sinh_ai2 0x1000ddb /* U+0DDB SINHALA VOWEL SIGN KOMBU DEKA */
2536+#define XKB_KEY_Sinh_o2 0x1000ddc /* U+0DDC SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA */
2537+#define XKB_KEY_Sinh_oo2 0x1000ddd /* U+0DDD SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA */
2538+#define XKB_KEY_Sinh_au2 0x1000dde /* U+0DDE SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA */
2539+#define XKB_KEY_Sinh_lu2 0x1000ddf /* U+0DDF SINHALA VOWEL SIGN GAYANUKITTA */
2540+#define XKB_KEY_Sinh_ruu2 0x1000df2 /* U+0DF2 SINHALA VOWEL SIGN DIGA GAETTA-PILLA */
2541+#define XKB_KEY_Sinh_luu2 0x1000df3 /* U+0DF3 SINHALA VOWEL SIGN DIGA GAYANUKITTA */
2542+#define XKB_KEY_Sinh_kunddaliya 0x1000df4 /* U+0DF4 SINHALA PUNCTUATION KUNDDALIYA */
2543+
2544+/*
2545+ * German
2546+ */
2547+
2548+#define XKB_KEY_SSHARP 0x1001e9e /* U+1E9E LATIN CAPITAL LETTER SHARP S */
2549+
2550+/*
2551+ * General punctuation
2552+ */
2553+
2554+#define XKB_KEY_leftsingleanglequotemark 0x1002039 /* U+2039 SINGLE LEFT-POINTING ANGLE QUOTATION MARK */
2555+#define XKB_KEY_rightsingleanglequotemark 0x100203a /* U+203A SINGLE RIGHT-POINTING ANGLE QUOTATION MARK */
2556+
2557+/*
2558+ * XFree86 vendor specific keysyms.
2559+ *
2560+ * The XFree86 keysym range is 0x10080001 - 0x1008ffff.
2561+ *
2562+ * The XF86 set of keysyms is a catch-all set of defines for keysyms found
2563+ * on various multimedia keyboards. Originally specific to XFree86 they have
2564+ * been been adopted over time and are considered a "standard" part of X
2565+ * keysym definitions.
2566+ * XFree86 never properly commented these keysyms, so we have done our
2567+ * best to explain the semantic meaning of these keys.
2568+ *
2569+ * XFree86 has removed their mail archives of the period, that might have
2570+ * shed more light on some of these definitions. Until/unless we resurrect
2571+ * these archives, these are from memory and usage.
2572+ */
2573+
2574+/*
2575+ * ModeLock
2576+ *
2577+ * This one is old, and not really used any more since XKB offers this
2578+ * functionality.
2579+ */
2580+
2581+#define XKB_KEY_XF86ModeLock 0x1008ff01 /* Mode Switch Lock */
2582+
2583+/* Backlight controls. */
2584+#define XKB_KEY_XF86MonBrightnessUp 0x1008ff02 /* Monitor/panel brightness */
2585+#define XKB_KEY_XF86MonBrightnessDown 0x1008ff03 /* Monitor/panel brightness */
2586+#define XKB_KEY_XF86KbdLightOnOff 0x1008ff04 /* Keyboards may be lit */
2587+#define XKB_KEY_XF86KbdBrightnessUp 0x1008ff05 /* Keyboards may be lit */
2588+#define XKB_KEY_XF86KbdBrightnessDown 0x1008ff06 /* Keyboards may be lit */
2589+#define XKB_KEY_XF86MonBrightnessCycle 0x1008ff07 /* Monitor/panel brightness */
2590+
2591+/*
2592+ * Keys found on some "Internet" keyboards.
2593+ */
2594+#define XKB_KEY_XF86Standby 0x1008ff10 /* System into standby mode */
2595+#define XKB_KEY_XF86AudioLowerVolume 0x1008ff11 /* Volume control down */
2596+#define XKB_KEY_XF86AudioMute 0x1008ff12 /* Mute sound from the system */
2597+#define XKB_KEY_XF86AudioRaiseVolume 0x1008ff13 /* Volume control up */
2598+#define XKB_KEY_XF86AudioPlay 0x1008ff14 /* Start playing of audio > */
2599+#define XKB_KEY_XF86AudioStop 0x1008ff15 /* Stop playing audio */
2600+#define XKB_KEY_XF86AudioPrev 0x1008ff16 /* Previous track */
2601+#define XKB_KEY_XF86AudioNext 0x1008ff17 /* Next track */
2602+#define XKB_KEY_XF86HomePage 0x1008ff18 /* Display user's home page */
2603+#define XKB_KEY_XF86Mail 0x1008ff19 /* Invoke user's mail program */
2604+#define XKB_KEY_XF86Start 0x1008ff1a /* Start application */
2605+#define XKB_KEY_XF86Search 0x1008ff1b /* Search */
2606+#define XKB_KEY_XF86AudioRecord 0x1008ff1c /* Record audio application */
2607+
2608+/* These are sometimes found on PDA's (e.g. Palm, PocketPC or elsewhere) */
2609+#define XKB_KEY_XF86Calculator 0x1008ff1d /* Invoke calculator program */
2610+#define XKB_KEY_XF86Memo 0x1008ff1e /* Invoke Memo taking program */
2611+#define XKB_KEY_XF86ToDoList 0x1008ff1f /* Invoke To Do List program */
2612+#define XKB_KEY_XF86Calendar 0x1008ff20 /* Invoke Calendar program */
2613+#define XKB_KEY_XF86PowerDown 0x1008ff21 /* Deep sleep the system */
2614+#define XKB_KEY_XF86ContrastAdjust 0x1008ff22 /* Adjust screen contrast */
2615+#define XKB_KEY_XF86RockerUp 0x1008ff23 /* Rocker switches exist up */
2616+#define XKB_KEY_XF86RockerDown 0x1008ff24 /* and down */
2617+#define XKB_KEY_XF86RockerEnter 0x1008ff25 /* and let you press them */
2618+
2619+/* Some more "Internet" keyboard symbols */
2620+#define XKB_KEY_XF86Back 0x1008ff26 /* Like back on a browser */
2621+#define XKB_KEY_XF86Forward 0x1008ff27 /* Like forward on a browser */
2622+#define XKB_KEY_XF86Stop 0x1008ff28 /* Stop current operation */
2623+#define XKB_KEY_XF86Refresh 0x1008ff29 /* Refresh the page */
2624+#define XKB_KEY_XF86PowerOff 0x1008ff2a /* Power off system entirely */
2625+#define XKB_KEY_XF86WakeUp 0x1008ff2b /* Wake up system from sleep */
2626+#define XKB_KEY_XF86Eject 0x1008ff2c /* Eject device (e.g. DVD) */
2627+#define XKB_KEY_XF86ScreenSaver 0x1008ff2d /* Invoke screensaver */
2628+#define XKB_KEY_XF86WWW 0x1008ff2e /* Invoke web browser */
2629+#define XKB_KEY_XF86Sleep 0x1008ff2f /* Put system to sleep */
2630+#define XKB_KEY_XF86Favorites 0x1008ff30 /* Show favorite locations */
2631+#define XKB_KEY_XF86AudioPause 0x1008ff31 /* Pause audio playing */
2632+#define XKB_KEY_XF86AudioMedia 0x1008ff32 /* Launch media collection app */
2633+#define XKB_KEY_XF86MyComputer 0x1008ff33 /* Display "My Computer" window */
2634+#define XKB_KEY_XF86VendorHome 0x1008ff34 /* Display vendor home web site */
2635+#define XKB_KEY_XF86LightBulb 0x1008ff35 /* Light bulb keys exist */
2636+#define XKB_KEY_XF86Shop 0x1008ff36 /* Display shopping web site */
2637+#define XKB_KEY_XF86History 0x1008ff37 /* Show history of web surfing */
2638+#define XKB_KEY_XF86OpenURL 0x1008ff38 /* Open selected URL */
2639+#define XKB_KEY_XF86AddFavorite 0x1008ff39 /* Add URL to favorites list */
2640+#define XKB_KEY_XF86HotLinks 0x1008ff3a /* Show "hot" links */
2641+#define XKB_KEY_XF86BrightnessAdjust 0x1008ff3b /* Invoke brightness adj. UI */
2642+#define XKB_KEY_XF86Finance 0x1008ff3c /* Display financial site */
2643+#define XKB_KEY_XF86Community 0x1008ff3d /* Display user's community */
2644+#define XKB_KEY_XF86AudioRewind 0x1008ff3e /* "rewind" audio track */
2645+#define XKB_KEY_XF86BackForward 0x1008ff3f /* ??? */
2646+#define XKB_KEY_XF86Launch0 0x1008ff40 /* Launch Application */
2647+#define XKB_KEY_XF86Launch1 0x1008ff41 /* Launch Application */
2648+#define XKB_KEY_XF86Launch2 0x1008ff42 /* Launch Application */
2649+#define XKB_KEY_XF86Launch3 0x1008ff43 /* Launch Application */
2650+#define XKB_KEY_XF86Launch4 0x1008ff44 /* Launch Application */
2651+#define XKB_KEY_XF86Launch5 0x1008ff45 /* Launch Application */
2652+#define XKB_KEY_XF86Launch6 0x1008ff46 /* Launch Application */
2653+#define XKB_KEY_XF86Launch7 0x1008ff47 /* Launch Application */
2654+#define XKB_KEY_XF86Launch8 0x1008ff48 /* Launch Application */
2655+#define XKB_KEY_XF86Launch9 0x1008ff49 /* Launch Application */
2656+#define XKB_KEY_XF86LaunchA 0x1008ff4a /* Launch Application */
2657+#define XKB_KEY_XF86LaunchB 0x1008ff4b /* Launch Application */
2658+#define XKB_KEY_XF86LaunchC 0x1008ff4c /* Launch Application */
2659+#define XKB_KEY_XF86LaunchD 0x1008ff4d /* Launch Application */
2660+#define XKB_KEY_XF86LaunchE 0x1008ff4e /* Launch Application */
2661+#define XKB_KEY_XF86LaunchF 0x1008ff4f /* Launch Application */
2662+
2663+#define XKB_KEY_XF86ApplicationLeft 0x1008ff50 /* switch to application, left */
2664+#define XKB_KEY_XF86ApplicationRight 0x1008ff51 /* switch to application, right*/
2665+#define XKB_KEY_XF86Book 0x1008ff52 /* Launch bookreader */
2666+#define XKB_KEY_XF86CD 0x1008ff53 /* Launch CD/DVD player */
2667+#define XKB_KEY_XF86MediaSelectCD 0x1008ff53 /* Alias for XF86CD */
2668+#define XKB_KEY_XF86Calculater 0x1008ff54 /* Launch Calculater */
2669+#define XKB_KEY_XF86Clear 0x1008ff55 /* Clear window, screen */
2670+#define XKB_KEY_XF86Close 0x1008ff56 /* Close window */
2671+#define XKB_KEY_XF86Copy 0x1008ff57 /* Copy selection */
2672+#define XKB_KEY_XF86Cut 0x1008ff58 /* Cut selection */
2673+#define XKB_KEY_XF86Display 0x1008ff59 /* Output switch key */
2674+#define XKB_KEY_XF86DOS 0x1008ff5a /* Launch DOS (emulation) */
2675+#define XKB_KEY_XF86Documents 0x1008ff5b /* Open documents window */
2676+#define XKB_KEY_XF86Excel 0x1008ff5c /* Launch spread sheet */
2677+#define XKB_KEY_XF86Explorer 0x1008ff5d /* Launch file explorer */
2678+#define XKB_KEY_XF86Game 0x1008ff5e /* Launch game */
2679+#define XKB_KEY_XF86Go 0x1008ff5f /* Go to URL */
2680+#define XKB_KEY_XF86iTouch 0x1008ff60 /* Logitech iTouch- don't use */
2681+#define XKB_KEY_XF86LogOff 0x1008ff61 /* Log off system */
2682+#define XKB_KEY_XF86Market 0x1008ff62 /* ?? */
2683+#define XKB_KEY_XF86Meeting 0x1008ff63 /* enter meeting in calendar */
2684+#define XKB_KEY_XF86MenuKB 0x1008ff65 /* distinguish keyboard from PB */
2685+#define XKB_KEY_XF86MenuPB 0x1008ff66 /* distinguish PB from keyboard */
2686+#define XKB_KEY_XF86MySites 0x1008ff67 /* Favourites */
2687+#define XKB_KEY_XF86New 0x1008ff68 /* New (folder, document... */
2688+#define XKB_KEY_XF86News 0x1008ff69 /* News */
2689+#define XKB_KEY_XF86OfficeHome 0x1008ff6a /* Office home (old Staroffice)*/
2690+#define XKB_KEY_XF86Open 0x1008ff6b /* Open */
2691+#define XKB_KEY_XF86Option 0x1008ff6c /* ?? */
2692+#define XKB_KEY_XF86Paste 0x1008ff6d /* Paste */
2693+#define XKB_KEY_XF86Phone 0x1008ff6e /* Launch phone; dial number */
2694+#define XKB_KEY_XF86Q 0x1008ff70 /* Compaq's Q - don't use */
2695+#define XKB_KEY_XF86Reply 0x1008ff72 /* Reply e.g., mail */
2696+#define XKB_KEY_XF86Reload 0x1008ff73 /* Reload web page, file, etc. */
2697+#define XKB_KEY_XF86RotateWindows 0x1008ff74 /* Rotate windows e.g. xrandr */
2698+#define XKB_KEY_XF86RotationPB 0x1008ff75 /* don't use */
2699+#define XKB_KEY_XF86RotationKB 0x1008ff76 /* don't use */
2700+#define XKB_KEY_XF86Save 0x1008ff77 /* Save (file, document, state */
2701+#define XKB_KEY_XF86ScrollUp 0x1008ff78 /* Scroll window/contents up */
2702+#define XKB_KEY_XF86ScrollDown 0x1008ff79 /* Scrool window/contentd down */
2703+#define XKB_KEY_XF86ScrollClick 0x1008ff7a /* Use XKB mousekeys instead */
2704+#define XKB_KEY_XF86Send 0x1008ff7b /* Send mail, file, object */
2705+#define XKB_KEY_XF86Spell 0x1008ff7c /* Spell checker */
2706+#define XKB_KEY_XF86SplitScreen 0x1008ff7d /* Split window or screen */
2707+#define XKB_KEY_XF86Support 0x1008ff7e /* Get support (??) */
2708+#define XKB_KEY_XF86TaskPane 0x1008ff7f /* Show tasks */
2709+#define XKB_KEY_XF86Terminal 0x1008ff80 /* Launch terminal emulator */
2710+#define XKB_KEY_XF86Tools 0x1008ff81 /* toolbox of desktop/app. */
2711+#define XKB_KEY_XF86Travel 0x1008ff82 /* ?? */
2712+#define XKB_KEY_XF86UserPB 0x1008ff84 /* ?? */
2713+#define XKB_KEY_XF86User1KB 0x1008ff85 /* ?? */
2714+#define XKB_KEY_XF86User2KB 0x1008ff86 /* ?? */
2715+#define XKB_KEY_XF86Video 0x1008ff87 /* Launch video player */
2716+#define XKB_KEY_XF86WheelButton 0x1008ff88 /* button from a mouse wheel */
2717+#define XKB_KEY_XF86Word 0x1008ff89 /* Launch word processor */
2718+#define XKB_KEY_XF86Xfer 0x1008ff8a
2719+#define XKB_KEY_XF86ZoomIn 0x1008ff8b /* zoom in view, map, etc. */
2720+#define XKB_KEY_XF86ZoomOut 0x1008ff8c /* zoom out view, map, etc. */
2721+
2722+#define XKB_KEY_XF86Away 0x1008ff8d /* mark yourself as away */
2723+#define XKB_KEY_XF86Messenger 0x1008ff8e /* as in instant messaging */
2724+#define XKB_KEY_XF86WebCam 0x1008ff8f /* Launch web camera app. */
2725+#define XKB_KEY_XF86MailForward 0x1008ff90 /* Forward in mail */
2726+#define XKB_KEY_XF86Pictures 0x1008ff91 /* Show pictures */
2727+#define XKB_KEY_XF86Music 0x1008ff92 /* Launch music application */
2728+
2729+#define XKB_KEY_XF86Battery 0x1008ff93 /* Display battery information */
2730+#define XKB_KEY_XF86Bluetooth 0x1008ff94 /* Enable/disable Bluetooth */
2731+#define XKB_KEY_XF86WLAN 0x1008ff95 /* Enable/disable WLAN */
2732+#define XKB_KEY_XF86UWB 0x1008ff96 /* Enable/disable UWB */
2733+
2734+#define XKB_KEY_XF86AudioForward 0x1008ff97 /* fast-forward audio track */
2735+#define XKB_KEY_XF86AudioRepeat 0x1008ff98 /* toggle repeat mode */
2736+#define XKB_KEY_XF86AudioRandomPlay 0x1008ff99 /* toggle shuffle mode */
2737+#define XKB_KEY_XF86Subtitle 0x1008ff9a /* cycle through subtitle */
2738+#define XKB_KEY_XF86AudioCycleTrack 0x1008ff9b /* cycle through audio tracks */
2739+#define XKB_KEY_XF86CycleAngle 0x1008ff9c /* cycle through angles */
2740+#define XKB_KEY_XF86FrameBack 0x1008ff9d /* video: go one frame back */
2741+#define XKB_KEY_XF86FrameForward 0x1008ff9e /* video: go one frame forward */
2742+#define XKB_KEY_XF86Time 0x1008ff9f /* display, or shows an entry for time seeking */
2743+#define XKB_KEY_XF86Select 0x1008ffa0 /* Select button on joypads and remotes */
2744+#define XKB_KEY_XF86View 0x1008ffa1 /* Show a view options/properties */
2745+#define XKB_KEY_XF86TopMenu 0x1008ffa2 /* Go to a top-level menu in a video */
2746+
2747+#define XKB_KEY_XF86Red 0x1008ffa3 /* Red button */
2748+#define XKB_KEY_XF86Green 0x1008ffa4 /* Green button */
2749+#define XKB_KEY_XF86Yellow 0x1008ffa5 /* Yellow button */
2750+#define XKB_KEY_XF86Blue 0x1008ffa6 /* Blue button */
2751+
2752+#define XKB_KEY_XF86Suspend 0x1008ffa7 /* Sleep to RAM */
2753+#define XKB_KEY_XF86Hibernate 0x1008ffa8 /* Sleep to disk */
2754+#define XKB_KEY_XF86TouchpadToggle 0x1008ffa9 /* Toggle between touchpad/trackstick */
2755+#define XKB_KEY_XF86TouchpadOn 0x1008ffb0 /* The touchpad got switched on */
2756+#define XKB_KEY_XF86TouchpadOff 0x1008ffb1 /* The touchpad got switched off */
2757+
2758+#define XKB_KEY_XF86AudioMicMute 0x1008ffb2 /* Mute the Mic from the system */
2759+
2760+#define XKB_KEY_XF86Keyboard 0x1008ffb3 /* User defined keyboard related action */
2761+
2762+#define XKB_KEY_XF86WWAN 0x1008ffb4 /* Toggle WWAN (LTE, UMTS, etc.) radio */
2763+#define XKB_KEY_XF86RFKill 0x1008ffb5 /* Toggle radios on/off */
2764+
2765+#define XKB_KEY_XF86AudioPreset 0x1008ffb6 /* Select equalizer preset, e.g. theatre-mode */
2766+
2767+#define XKB_KEY_XF86RotationLockToggle 0x1008ffb7 /* Toggle screen rotation lock on/off */
2768+
2769+#define XKB_KEY_XF86FullScreen 0x1008ffb8 /* Toggle fullscreen */
2770+
2771+/* Keys for special action keys (hot keys) */
2772+/* Virtual terminals on some operating systems */
2773+#define XKB_KEY_XF86Switch_VT_1 0x1008fe01
2774+#define XKB_KEY_XF86Switch_VT_2 0x1008fe02
2775+#define XKB_KEY_XF86Switch_VT_3 0x1008fe03
2776+#define XKB_KEY_XF86Switch_VT_4 0x1008fe04
2777+#define XKB_KEY_XF86Switch_VT_5 0x1008fe05
2778+#define XKB_KEY_XF86Switch_VT_6 0x1008fe06
2779+#define XKB_KEY_XF86Switch_VT_7 0x1008fe07
2780+#define XKB_KEY_XF86Switch_VT_8 0x1008fe08
2781+#define XKB_KEY_XF86Switch_VT_9 0x1008fe09
2782+#define XKB_KEY_XF86Switch_VT_10 0x1008fe0a
2783+#define XKB_KEY_XF86Switch_VT_11 0x1008fe0b
2784+#define XKB_KEY_XF86Switch_VT_12 0x1008fe0c
2785+
2786+#define XKB_KEY_XF86Ungrab 0x1008fe20 /* force ungrab */
2787+#define XKB_KEY_XF86ClearGrab 0x1008fe21 /* kill application with grab */
2788+#define XKB_KEY_XF86Next_VMode 0x1008fe22 /* next video mode available */
2789+#define XKB_KEY_XF86Prev_VMode 0x1008fe23 /* prev. video mode available */
2790+#define XKB_KEY_XF86LogWindowTree 0x1008fe24 /* print window tree to log */
2791+#define XKB_KEY_XF86LogGrabInfo 0x1008fe25 /* print all active grabs to log */
2792+
2793+
2794+/*
2795+ * Reserved range for evdev symbols: 0x10081000-0x10081FFF
2796+ *
2797+ * Key symbols within this range are intended for a 1:1 mapping to the
2798+ * Linux kernel input-event-codes.h file:
2799+ * - Keysym value: `_EVDEVK(kernel value)`
2800+ * - Keysym name: it must be prefixed by `XKB_KEY_XF86`. The recommended *default*
2801+ * name uses the following pattern: `XKB_KEY_XF86CamelCaseKernelName`. CamelCasing
2802+ * is done with a human control as last authority, e.g. see VOD instead of Vod
2803+ * for the Video on Demand key. In case that the kernel key name is too
2804+ * ambiguous, it is recommended to create a more explicit name with the
2805+ * following guidelines:
2806+ * 1. Names should be mnemonic.
2807+ * 2. Names should avoid acronyms, unless sufficiently common and documented
2808+ * in a comment.
2809+ * 3. Names should identify a function.
2810+ * 4. Keysyms share a common namespace, so keys with a generic name should
2811+ * denote a generic function, otherwise it should be renamed to add context.
2812+ * E.g. `KEY_OK` has the associated keysym `XKB_KEY_XF86OK`, while `KEY_TITLE`
2813+ * (used to open a menu to select a chapter of a media) is associated to
2814+ * the keysym `XKB_KEY_XF86MediaTitleMenu` to avoid ambiguity.
2815+ * 5. Keysyms should support designing *portable* applications, therefore
2816+ * their names should be self-explaining to facilitate finding them and
2817+ * to avoid misuse.
2818+ * 6. The “HID usage tables for USB” can be used if there is an unambiguous
2819+ * mapping. See:
2820+ * - Reference document: https://usb.org/document-library/hid-usage-tables-16
2821+ * - Mapping in the Linux source file: `drivers/hid/hid-input.c` as of 2025-07
2822+ *
2823+ * For example, the kernel
2824+ * #define KEY_MACRO_RECORD_START 0x2b0
2825+ * effectively ends up as:
2826+ * #define XKB_KEY_XF86MacroRecordStart 0x100812b0
2827+ *
2828+ * For historical reasons, some keysyms within the reserved range will be
2829+ * missing, most notably all "normal" keys that are mapped through default
2830+ * XKB layouts (e.g. KEY_Q).
2831+ *
2832+ * The format for #defines is strict:
2833+ *
2834+ * #define XKB_KEY_XF86Foo<spaces…>_EVDEVK(0xABC)<spaces…> |* kver KEY_FOO *|
2835+ * #define XKB_KEY_XF86Foo<spaces…>_EVDEVK(0xABC)<spaces…> |* Alias for XF86Bar *|
2836+ * #define XKB_KEY_XF86Foo<spaces…>_EVDEVK(0xABC)<spaces…> |* Deprecated alias for XF86Bar *|
2837+ *
2838+ * Where
2839+ * - alignment by spaces
2840+ * - the _EVDEVK macro must be used
2841+ * - the hex code must be in uppercase hex
2842+ * - the kernel version (kver) is in the form v5.10
2843+ * - kver and key name are within a slash-star comment (a pipe is used in
2844+ * this example for technical reasons)
2845+ * These #defines are parsed by scripts. Do not stray from the given format.
2846+ *
2847+ * Where the evdev keycode is mapped to a different symbol, please add a
2848+ * comment line starting with Use: but otherwise the same format, e.g.
2849+ * Use: XKB_KEY_XF86RotationLockToggle _EVDEVK(0x231) v4.16 KEY_ROTATE_LOCK_TOGGLE
2850+ *
2851+ */
2852+/* Use: XKB_KEY_XF86Eject _EVDEVK(0x0a2) KEY_EJECTCLOSECD */
2853+/* Use: XKB_KEY_XF86AudioNext _EVDEVK(0x0a3) KEY_NEXTSONG */
2854+#define XKB_KEY_XF86MediaPlayPause 0x100810a4 /* KEY_PLAYPAUSE */
2855+/* Use: XKB_KEY_XF86AudioPrev _EVDEVK(0x0a5) KEY_PREVIOUSSONG */
2856+/* NOTE: Currently no use case for CD-specific keysyms */
2857+/* Use: XKB_KEY_XF86AudioStop _EVDEVK(0x0a6) KEY_STOPCD */
2858+/* Use: XKB_KEY_XF86AudioRecord _EVDEVK(0x0a7) KEY_RECORD */
2859+/* Use: XKB_KEY_XF86AudioRewind _EVDEVK(0x0a8) KEY_REWIND */
2860+/* Use: XKB_KEY_XF86Phone _EVDEVK(0x0a9) KEY_PHONE */
2861+/* TODO: unclear function _EVDEVK(0x0aa) KEY_ISO */
2862+/* TODO: unclear function _EVDEVK(0x0ab) KEY_CONFIG */
2863+/* Use: XKB_KEY_XF86HomePage _EVDEVK(0x0ac) KEY_HOMEPAGE */
2864+/* Use: XKB_KEY_XF86Refresh _EVDEVK(0x0ad) KEY_REFRESH */
2865+#define XKB_KEY_XF86Exit 0x100810ae /* KEY_EXIT */
2866+/* TODO: unclear function _EVDEVK(0x0af) KEY_MOVE */
2867+/* TODO: unclear function _EVDEVK(0x0b0) KEY_EDIT */
2868+/* Use: XKB_KEY_XF86ScrollUp _EVDEVK(0x0b1) KEY_SCROLLUP */
2869+/* Use: XKB_KEY_XF86ScrollDown _EVDEVK(0x0b2) KEY_SCROLLDOWN */
2870+/* NOTE: Unless there are special actions bound to the keys KEY_KPLEFTPAREN and
2871+ * KEY_KPRIGHTPAREN, there is no reason to introduce keypad-specific keysyms */
2872+/* Use: XKB_KEY_parenleft _EVDEVK(0x0b3) KEY_KPLEFTPAREN */
2873+/* Use: XKB_KEY_parenright _EVDEVK(0x0b4) KEY_KPRIGHTPAREN */
2874+/* Use: XKB_KEY_XF86New _EVDEVK(0x0b5) v2.6.14 KEY_NEW */
2875+/* Use: XKB_KEY_Redo _EVDEVK(0x0b6) v2.6.14 KEY_REDO */
2876+/* Use: XKB_KEY_F13 _EVDEVK(0x0b7) KEY_F13 */
2877+/* Use: XKB_KEY_F14 _EVDEVK(0x0b8) KEY_F14 */
2878+/* Use: XKB_KEY_F15 _EVDEVK(0x0b9) KEY_F15 */
2879+/* Use: XKB_KEY_F16 _EVDEVK(0x0ba) KEY_F16 */
2880+/* Use: XKB_KEY_F17 _EVDEVK(0x0bb) KEY_F17 */
2881+/* Use: XKB_KEY_F18 _EVDEVK(0x0bc) KEY_F18 */
2882+/* Use: XKB_KEY_F19 _EVDEVK(0x0bd) KEY_F19 */
2883+/* Use: XKB_KEY_F20 _EVDEVK(0x0be) KEY_F20 */
2884+/* Use: XKB_KEY_F21 _EVDEVK(0x0bf) KEY_F21 */
2885+/* Use: XKB_KEY_F22 _EVDEVK(0x0c0) KEY_F22 */
2886+/* Use: XKB_KEY_F23 _EVDEVK(0x0c1) KEY_F23 */
2887+/* Use: XKB_KEY_F24 _EVDEVK(0x0c2) KEY_F24 */
2888+/* NOTE: Currently no use case for CD-specific keysyms */
2889+/* Use: XKB_KEY_XF86AudioPlay _EVDEVK(0x0c8) KEY_PLAYCD */
2890+/* Use: XKB_KEY_XF86AudioPause _EVDEVK(0x0c9) KEY_PAUSECD */
2891+/* Use: XKB_KEY_XF86Launch3 _EVDEVK(0x0ca) KEY_PROG3 */
2892+/* Use: XKB_KEY_XF86Launch4 _EVDEVK(0x0cb) KEY_PROG4 */
2893+/* NOTE: KEY_DASHBOARD has been mapped to LaunchB in xkeyboard-config since 2011 */
2894+/* Use: XKB_KEY_XF86LaunchB _EVDEVK(0x0cc) v2.6.28 KEY_DASHBOARD */
2895+/* Use: XKB_KEY_XF86Suspend _EVDEVK(0x0cd) KEY_SUSPEND */
2896+/* Use: XKB_KEY_XF86Close _EVDEVK(0x0ce) KEY_CLOSE */
2897+/* Use: XKB_KEY_XF86AudioPlay _EVDEVK(0x0cf) KEY_PLAY */
2898+/* Use: XKB_KEY_XF86AudioForward _EVDEVK(0x0d0) KEY_FASTFORWARD */
2899+#define XKB_KEY_XF86AudioBassBoost 0x100810d1 /* KEY_BASSBOOST */
2900+/* Use: XKB_KEY_Print _EVDEVK(0x0d2) KEY_PRINT */
2901+/* NOTE: The following keys seem specific to some HP keyboards such as SK-2565 USB */
2902+/* TODO: unclear HP-specific function? _EVDEVK(0x0d3) KEY_HP */
2903+/* Use: XKB_KEY_XF86WebCam _EVDEVK(0x0d4) KEY_CAMERA */
2904+/* TODO: unclear HP-specific function? _EVDEVK(0x0d5) KEY_SOUND */
2905+/* TODO: unclear HP-specific function? _EVDEVK(0x0d6) KEY_QUESTION */
2906+/* Use: XKB_KEY_XF86Mail _EVDEVK(0x0d7) KEY_EMAIL */
2907+/* Use: XKB_KEY_XF86Messenger _EVDEVK(0x0d8) KEY_CHAT */
2908+/* Use: XKB_KEY_XF86Search _EVDEVK(0x0d9) KEY_SEARCH */
2909+/* TODO: unclear HP-specific function? _EVDEVK(0x0da) KEY_CONNECT */
2910+/* Use: XKB_KEY_XF86Finance _EVDEVK(0x0db) KEY_FINANCE */
2911+#define XKB_KEY_XF86Sport 0x100810dc /* KEY_SPORT */
2912+/* Use: XKB_KEY_XF86Shop _EVDEVK(0x0dd) KEY_SHOP */
2913+/* TODO: unclear function _EVDEVK(0x0de) KEY_ALTERASE */
2914+/* Use: XKB_KEY_Cancel _EVDEVK(0x0df) KEY_CANCEL */
2915+/* Use: XKB_KEY_XF86MonBrightnessDown _EVDEVK(0x0e0) KEY_BRIGHTNESSDOWN */
2916+/* Use: XKB_KEY_XF86MonBrightnessUp _EVDEVK(0x0e1) KEY_BRIGHTNESSUP */
2917+/* Use: XKB_KEY_XF86AudioMedia _EVDEVK(0x0e2) KEY_MEDIA */
2918+/* Use: XKB_KEY_XF86Display _EVDEVK(0x0e3) v2.6.12 KEY_SWITCHVIDEOMODE */
2919+/* Use: XKB_KEY_XF86KbdLightOnOff _EVDEVK(0x0e4) v2.6.12 KEY_KBDILLUMTOGGLE */
2920+/* Use: XKB_KEY_XF86KbdBrightnessDown _EVDEVK(0x0e5) v2.6.12 KEY_KBDILLUMDOWN */
2921+/* Use: XKB_KEY_XF86KbdBrightnessUp _EVDEVK(0x0e6) v2.6.12 KEY_KBDILLUMUP */
2922+/* Use: XKB_KEY_XF86Send _EVDEVK(0x0e7) v2.6.14 KEY_SEND */
2923+/* Use: XKB_KEY_XF86Reply _EVDEVK(0x0e8) v2.6.14 KEY_REPLY */
2924+/* Use: XKB_KEY_XF86MailForward _EVDEVK(0x0e9) v2.6.14 KEY_FORWARDMAIL */
2925+/* Use: XKB_KEY_XF86Save _EVDEVK(0x0ea) v2.6.14 KEY_SAVE */
2926+/* Use: XKB_KEY_XF86Documents _EVDEVK(0x0eb) v2.6.14 KEY_DOCUMENTS */
2927+/* Use: XKB_KEY_XF86Battery _EVDEVK(0x0ec) v2.6.17 KEY_BATTERY */
2928+/* Use: XKB_KEY_XF86Bluetooth _EVDEVK(0x0ed) v2.6.19 KEY_BLUETOOTH */
2929+/* Use: XKB_KEY_XF86WLAN _EVDEVK(0x0ee) v2.6.19 KEY_WLAN */
2930+/* Use: XKB_KEY_XF86UWB _EVDEVK(0x0ef) v2.6.24 KEY_UWB */
2931+/* Use: NoSymbol _EVDEVK(0x0f0) KEY_UNKNOWN */
2932+/* Use: XKB_KEY_XF86Next_VMode _EVDEVK(0x0f1) v2.6.23 KEY_VIDEO_NEXT */
2933+/* Use: XKB_KEY_XF86Prev_VMode _EVDEVK(0x0f2) v2.6.23 KEY_VIDEO_PREV */
2934+/* Use: XKB_KEY_XF86MonBrightnessCycle _EVDEVK(0x0f3) v2.6.23 KEY_BRIGHTNESS_CYCLE */
2935+#define XKB_KEY_XF86BrightnessAuto 0x100810f4 /* Deprecated alias for XF86MonBrightnessAuto */
2936+#define XKB_KEY_XF86MonBrightnessAuto 0x100810f4 /* v3.16 KEY_BRIGHTNESS_AUTO */
2937+#define XKB_KEY_XF86DisplayOff 0x100810f5 /* v2.6.23 KEY_DISPLAY_OFF */
2938+/* Use: XKB_KEY_XF86WWAN _EVDEVK(0x0f6) v3.13 KEY_WWAN */
2939+/* Use: XKB_KEY_XF86RFKill _EVDEVK(0x0f7) v2.6.33 KEY_RFKILL */
2940+/* Use: XKB_KEY_XF86AudioMicMute _EVDEVK(0x0f8) v3.1 KEY_MICMUTE */
2941+#define XKB_KEY_XF86OK 0x10081160 /* v2.5.26 KEY_OK */
2942+/* Use: XKB_KEY_XF86Select _EVDEVK(0x161) v2.5.26 KEY_SELECT */
2943+#define XKB_KEY_XF86GoTo 0x10081162 /* v2.5.26 KEY_GOTO */
2944+/* Use: XKB_KEY_XF86Clear _EVDEVK(0x163) v2.5.26 KEY_CLEAR */
2945+/* TODO: Unclear function _EVDEVK(0x164) v2.5.26 KEY_POWER2 */
2946+/* Use: XKB_KEY_XF86Option _EVDEVK(0x165) v2.5.26 KEY_OPTION */
2947+#define XKB_KEY_XF86Info 0x10081166 /* v2.5.26 KEY_INFO */
2948+/* Use: XKB_KEY_XF86Time _EVDEVK(0x167) v2.5.26 KEY_TIME */
2949+#define XKB_KEY_XF86VendorLogo 0x10081168 /* v2.5.26 KEY_VENDOR */
2950+/* TODO: unclear function _EVDEVK(0x169) v2.5.26 KEY_ARCHIVE */
2951+#define XKB_KEY_XF86MediaSelectProgramGuide 0x1008116a /* v2.5.26 KEY_PROGRAM */
2952+/* Use: XKB_KEY_XF86NextFavorite _EVDEVK(0x16b) v2.5.26 KEY_CHANNEL */
2953+/* Use: XKB_KEY_XF86Favorites _EVDEVK(0x16c) v2.5.26 KEY_FAVORITES */
2954+/* Use: XKB_KEY_XF86MediaSelectProgramGuide _EVDEVK(0x16d) v2.5.26 KEY_EPG */
2955+#define XKB_KEY_XF86MediaSelectHome 0x1008116e /* v2.5.26 KEY_PVR */
2956+/* TODO: Multimedia Home Platform _EVDEVK(0x16f) v2.5.26 KEY_MHP */
2957+#define XKB_KEY_XF86MediaLanguageMenu 0x10081170 /* v2.5.26 KEY_LANGUAGE */
2958+#define XKB_KEY_XF86MediaTitleMenu 0x10081171 /* v2.5.26 KEY_TITLE */
2959+/* Use: XKB_KEY_XF86Subtitle _EVDEVK(0x172) v2.5.26 KEY_SUBTITLE */
2960+/* Use: XKB_KEY_XF86CycleAngle _EVDEVK(0x173) v2.5.26 KEY_ANGLE */
2961+/* Use: XKB_KEY_XF86FullScreen _EVDEVK(0x174) v5.1 KEY_FULL_SCREEN */
2962+#define XKB_KEY_XF86AudioChannelMode 0x10081175 /* v2.5.26 KEY_MODE */
2963+/* Use: XKB_KEY_XF86Keyboard _EVDEVK(0x176) v2.5.26 KEY_KEYBOARD */
2964+#define XKB_KEY_XF86AspectRatio 0x10081177 /* v5.1 KEY_ASPECT_RATIO */
2965+#define XKB_KEY_XF86MediaSelectPC 0x10081178 /* v2.5.26 KEY_PC */
2966+#define XKB_KEY_XF86MediaSelectTV 0x10081179 /* v2.5.26 KEY_TV */
2967+#define XKB_KEY_XF86MediaSelectCable 0x1008117a /* v2.5.26 KEY_TV2 */
2968+#define XKB_KEY_XF86MediaSelectVCR 0x1008117b /* v2.5.26 KEY_VCR */
2969+#define XKB_KEY_XF86MediaSelectVCRPlus 0x1008117c /* v2.5.26 KEY_VCR2 */
2970+#define XKB_KEY_XF86MediaSelectSatellite 0x1008117d /* v2.5.26 KEY_SAT */
2971+/* TODO: unclear media selector _EVDEVK(0x17e) v2.5.26 KEY_SAT2 */
2972+/* Use: XKB_KEY_XF86MediaSelectCD _EVDEVK(0x17f) v2.5.26 KEY_CD */
2973+#define XKB_KEY_XF86MediaSelectTape 0x10081180 /* v2.5.26 KEY_TAPE */
2974+#define XKB_KEY_XF86MediaSelectRadio 0x10081181 /* v2.5.26 KEY_RADIO */
2975+#define XKB_KEY_XF86MediaSelectTuner 0x10081182 /* v2.5.26 KEY_TUNER */
2976+#define XKB_KEY_XF86MediaPlayer 0x10081183 /* v2.5.26 KEY_PLAYER */
2977+#define XKB_KEY_XF86MediaSelectTeletext 0x10081184 /* v2.5.26 KEY_TEXT */
2978+#define XKB_KEY_XF86DVD 0x10081185 /* v2.5.26 KEY_DVD */
2979+#define XKB_KEY_XF86MediaSelectDVD 0x10081185 /* Alias for XF86DVD */
2980+#define XKB_KEY_XF86MediaSelectAuxiliary 0x10081186 /* v2.5.26 KEY_AUX */
2981+/* TODO: unclear media selector _EVDEVK(0x187) v2.5.26 KEY_MP3 */
2982+#define XKB_KEY_XF86Audio 0x10081188 /* v2.5.26 KEY_AUDIO */
2983+/* Use: XKB_KEY_XF86Video _EVDEVK(0x189) v2.5.26 KEY_VIDEO */
2984+/* TODO: unclear function _EVDEVK(0x18a) v2.5.26 KEY_DIRECTORY */
2985+/* TODO: unclear function _EVDEVK(0x18b) v2.5.26 KEY_LIST */
2986+/* Use: XKB_KEY_XF86Memo _EVDEVK(0x18c) v2.5.26 KEY_MEMO */
2987+/* Use: XKB_KEY_XF86Calendar _EVDEVK(0x18d) v2.5.26 KEY_CALENDAR */
2988+/* Use: XKB_KEY_XF86Red _EVDEVK(0x18e) v2.5.26 KEY_RED */
2989+/* Use: XKB_KEY_XF86Green _EVDEVK(0x18f) v2.5.26 KEY_GREEN */
2990+/* Use: XKB_KEY_XF86Yellow _EVDEVK(0x190) v2.5.26 KEY_YELLOW */
2991+/* Use: XKB_KEY_XF86Blue _EVDEVK(0x191) v2.5.26 KEY_BLUE */
2992+#define XKB_KEY_XF86ChannelUp 0x10081192 /* v2.5.26 KEY_CHANNELUP */
2993+#define XKB_KEY_XF86ChannelDown 0x10081193 /* v2.5.26 KEY_CHANNELDOWN */
2994+/* TODO: unclear function _EVDEVK(0x194) v2.5.26 KEY_FIRST */
2995+/* TODO: unclear function _EVDEVK(0x195) v2.5.26 KEY_LAST */
2996+/* TODO: unclear function _EVDEVK(0x196) v2.5.26 KEY_AB */
2997+/* TODO: unclear function _EVDEVK(0x197) v2.5.26 KEY_NEXT */
2998+/* TODO: unclear function _EVDEVK(0x198) v2.5.26 KEY_RESTART */
2999+#define XKB_KEY_XF86MediaPlaySlow 0x10081199 /* v2.5.26 KEY_SLOW */
3000+/* Use: XKB_KEY_XF86AudioRandomPlay _EVDEVK(0x19a) v2.5.26 KEY_SHUFFLE */
3001+#define XKB_KEY_XF86Break 0x1008119b /* v2.5.26 KEY_BREAK */
3002+/* TODO: unclear function _EVDEVK(0x19c) v2.5.26 KEY_PREVIOUS */
3003+#define XKB_KEY_XF86NumberEntryMode 0x1008119d /* v2.5.26 KEY_DIGITS */
3004+/* TODO: unclear function _EVDEVK(0x19e) v2.5.26 KEY_TEEN */
3005+/* TODO: unclear function (Twenties?) _EVDEVK(0x19f) v2.5.26 KEY_TWEN */
3006+#define XKB_KEY_XF86VideoPhone 0x100811a0 /* v2.6.20 KEY_VIDEOPHONE */
3007+/* Use: XKB_KEY_XF86Game _EVDEVK(0x1a1) v2.6.20 KEY_GAMES */
3008+/* Use: XKB_KEY_XF86ZoomIn _EVDEVK(0x1a2) v2.6.20 KEY_ZOOMIN */
3009+/* Use: XKB_KEY_XF86ZoomOut _EVDEVK(0x1a3) v2.6.20 KEY_ZOOMOUT */
3010+#define XKB_KEY_XF86ZoomReset 0x100811a4 /* v2.6.20 KEY_ZOOMRESET */
3011+/* Use: XKB_KEY_XF86Word _EVDEVK(0x1a5) v2.6.20 KEY_WORDPROCESSOR */
3012+#define XKB_KEY_XF86Editor 0x100811a6 /* v2.6.20 KEY_EDITOR */
3013+/* Use: XKB_KEY_XF86Excel _EVDEVK(0x1a7) v2.6.20 KEY_SPREADSHEET */
3014+#define XKB_KEY_XF86GraphicsEditor 0x100811a8 /* v2.6.20 KEY_GRAPHICSEDITOR */
3015+#define XKB_KEY_XF86Presentation 0x100811a9 /* v2.6.20 KEY_PRESENTATION */
3016+#define XKB_KEY_XF86Database 0x100811aa /* v2.6.20 KEY_DATABASE */
3017+/* Use: XKB_KEY_XF86News _EVDEVK(0x1ab) v2.6.20 KEY_NEWS */
3018+#define XKB_KEY_XF86Voicemail 0x100811ac /* v2.6.20 KEY_VOICEMAIL */
3019+#define XKB_KEY_XF86Addressbook 0x100811ad /* v2.6.20 KEY_ADDRESSBOOK */
3020+/* Use: XKB_KEY_XF86Messenger _EVDEVK(0x1ae) v2.6.20 KEY_MESSENGER */
3021+#define XKB_KEY_XF86DisplayToggle 0x100811af /* v2.6.20 KEY_DISPLAYTOGGLE */
3022+#define XKB_KEY_XF86SpellCheck 0x100811b0 /* v2.6.24 KEY_SPELLCHECK */
3023+/* Use: XKB_KEY_XF86LogOff _EVDEVK(0x1b1) v2.6.24 KEY_LOGOFF */
3024+/* Use: XKB_KEY_dollar _EVDEVK(0x1b2) v2.6.24 KEY_DOLLAR */
3025+/* Use: XKB_KEY_EuroSign _EVDEVK(0x1b3) v2.6.24 KEY_EURO */
3026+/* Use: XKB_KEY_XF86FrameBack _EVDEVK(0x1b4) v2.6.24 KEY_FRAMEBACK */
3027+/* Use: XKB_KEY_XF86FrameForward _EVDEVK(0x1b5) v2.6.24 KEY_FRAMEFORWARD */
3028+#define XKB_KEY_XF86ContextMenu 0x100811b6 /* v2.6.24 KEY_CONTEXT_MENU */
3029+#define XKB_KEY_XF86MediaRepeat 0x100811b7 /* v2.6.26 KEY_MEDIA_REPEAT */
3030+#define XKB_KEY_XF8610ChannelsUp 0x100811b8 /* v2.6.38 KEY_10CHANNELSUP */
3031+#define XKB_KEY_XF8610ChannelsDown 0x100811b9 /* v2.6.38 KEY_10CHANNELSDOWN */
3032+#define XKB_KEY_XF86Images 0x100811ba /* v2.6.39 KEY_IMAGES */
3033+#define XKB_KEY_XF86NotificationCenter 0x100811bc /* v5.10 KEY_NOTIFICATION_CENTER */
3034+#define XKB_KEY_XF86PickupPhone 0x100811bd /* v5.10 KEY_PICKUP_PHONE */
3035+#define XKB_KEY_XF86HangupPhone 0x100811be /* v5.10 KEY_HANGUP_PHONE */
3036+#define XKB_KEY_XF86LinkPhone 0x100811bf /* v6.14 KEY_LINK_PHONE */
3037+/* NOTE: The following seem to be legacy terminal keys. Ignored due to lack of use cases */
3038+/* TODO: XKB_KEY_XF86DeleteToEndOfLine? _EVDEVK(0x1c0) KEY_DEL_EOL */
3039+/* TODO: XKB_KEY_XF86DeleteToEndOfScreen? _EVDEVK(0x1c1) KEY_DEL_EOS */
3040+/* TODO: XKB_KEY_XF86InsertLine? _EVDEVK(0x1c2) KEY_INS_LINE */
3041+/* TODO: XKB_KEY_XF86DeleteLine? _EVDEVK(0x1c3) KEY_DEL_LINE */
3042+#define XKB_KEY_XF86Fn 0x100811d0 /* KEY_FN */
3043+#define XKB_KEY_XF86Fn_Esc 0x100811d1 /* KEY_FN_ESC */
3044+#define XKB_KEY_XF86Fn_F1 0x100811d2 /* KEY_FN_F1 */
3045+#define XKB_KEY_XF86Fn_F2 0x100811d3 /* KEY_FN_F2 */
3046+#define XKB_KEY_XF86Fn_F3 0x100811d4 /* KEY_FN_F3 */
3047+#define XKB_KEY_XF86Fn_F4 0x100811d5 /* KEY_FN_F4 */
3048+#define XKB_KEY_XF86Fn_F5 0x100811d6 /* KEY_FN_F5 */
3049+#define XKB_KEY_XF86Fn_F6 0x100811d7 /* KEY_FN_F6 */
3050+#define XKB_KEY_XF86Fn_F7 0x100811d8 /* KEY_FN_F7 */
3051+#define XKB_KEY_XF86Fn_F8 0x100811d9 /* KEY_FN_F8 */
3052+#define XKB_KEY_XF86Fn_F9 0x100811da /* KEY_FN_F9 */
3053+#define XKB_KEY_XF86Fn_F10 0x100811db /* KEY_FN_F10 */
3054+#define XKB_KEY_XF86Fn_F11 0x100811dc /* KEY_FN_F11 */
3055+#define XKB_KEY_XF86Fn_F12 0x100811dd /* KEY_FN_F12 */
3056+#define XKB_KEY_XF86Fn_1 0x100811de /* KEY_FN_1 */
3057+#define XKB_KEY_XF86Fn_2 0x100811df /* KEY_FN_2 */
3058+#define XKB_KEY_XF86Fn_D 0x100811e0 /* KEY_FN_D */
3059+#define XKB_KEY_XF86Fn_E 0x100811e1 /* KEY_FN_E */
3060+#define XKB_KEY_XF86Fn_F 0x100811e2 /* KEY_FN_F */
3061+#define XKB_KEY_XF86Fn_S 0x100811e3 /* KEY_FN_S */
3062+#define XKB_KEY_XF86Fn_B 0x100811e4 /* KEY_FN_B */
3063+#define XKB_KEY_XF86FnRightShift 0x100811e5 /* v5.10 KEY_FN_RIGHT_SHIFT */
3064+/* Use: XKB_KEY_braille_dot_1 _EVDEVK(0x1f1) v2.6.17 KEY_BRL_DOT1 */
3065+/* Use: XKB_KEY_braille_dot_2 _EVDEVK(0x1f2) v2.6.17 KEY_BRL_DOT2 */
3066+/* Use: XKB_KEY_braille_dot_3 _EVDEVK(0x1f3) v2.6.17 KEY_BRL_DOT3 */
3067+/* Use: XKB_KEY_braille_dot_4 _EVDEVK(0x1f4) v2.6.17 KEY_BRL_DOT4 */
3068+/* Use: XKB_KEY_braille_dot_5 _EVDEVK(0x1f5) v2.6.17 KEY_BRL_DOT5 */
3069+/* Use: XKB_KEY_braille_dot_6 _EVDEVK(0x1f6) v2.6.17 KEY_BRL_DOT6 */
3070+/* Use: XKB_KEY_braille_dot_7 _EVDEVK(0x1f7) v2.6.17 KEY_BRL_DOT7 */
3071+/* Use: XKB_KEY_braille_dot_8 _EVDEVK(0x1f8) v2.6.17 KEY_BRL_DOT8 */
3072+/* Use: XKB_KEY_braille_dot_9 _EVDEVK(0x1f9) v2.6.23 KEY_BRL_DOT9 */
3073+/* Use: XKB_KEY_braille_dot_1 _EVDEVK(0x1fa) v2.6.23 KEY_BRL_DOT10 */
3074+#define XKB_KEY_XF86Numeric0 0x10081200 /* v2.6.28 KEY_NUMERIC_0 <U+0030 DIGIT ZERO> */
3075+#define XKB_KEY_XF86Numeric1 0x10081201 /* v2.6.28 KEY_NUMERIC_1 <U+0031 DIGIT ONE> */
3076+#define XKB_KEY_XF86Numeric2 0x10081202 /* v2.6.28 KEY_NUMERIC_2 <U+0032 DIGIT TWO> */
3077+#define XKB_KEY_XF86Numeric3 0x10081203 /* v2.6.28 KEY_NUMERIC_3 <U+0033 DIGIT THREE> */
3078+#define XKB_KEY_XF86Numeric4 0x10081204 /* v2.6.28 KEY_NUMERIC_4 <U+0034 DIGIT FOUR> */
3079+#define XKB_KEY_XF86Numeric5 0x10081205 /* v2.6.28 KEY_NUMERIC_5 <U+0035 DIGIT FIVE> */
3080+#define XKB_KEY_XF86Numeric6 0x10081206 /* v2.6.28 KEY_NUMERIC_6 <U+0036 DIGIT SIX> */
3081+#define XKB_KEY_XF86Numeric7 0x10081207 /* v2.6.28 KEY_NUMERIC_7 <U+0037 DIGIT SEVEN> */
3082+#define XKB_KEY_XF86Numeric8 0x10081208 /* v2.6.28 KEY_NUMERIC_8 <U+0038 DIGIT EIGHT> */
3083+#define XKB_KEY_XF86Numeric9 0x10081209 /* v2.6.28 KEY_NUMERIC_9 <U+0039 DIGIT NINE> */
3084+#define XKB_KEY_XF86NumericStar 0x1008120a /* v2.6.28 KEY_NUMERIC_STAR <U+002A ASTERISK> */
3085+#define XKB_KEY_XF86NumericPound 0x1008120b /* v2.6.28 KEY_NUMERIC_POUND <U+0023 NUMBER SIGN> */
3086+#define XKB_KEY_XF86NumericA 0x1008120c /* v4.1 KEY_NUMERIC_A */
3087+#define XKB_KEY_XF86NumericB 0x1008120d /* v4.1 KEY_NUMERIC_B */
3088+#define XKB_KEY_XF86NumericC 0x1008120e /* v4.1 KEY_NUMERIC_C */
3089+#define XKB_KEY_XF86NumericD 0x1008120f /* v4.1 KEY_NUMERIC_D */
3090+#define XKB_KEY_XF86CameraFocus 0x10081210 /* v2.6.33 KEY_CAMERA_FOCUS */
3091+#define XKB_KEY_XF86WPSButton 0x10081211 /* v2.6.34 KEY_WPS_BUTTON */
3092+/* Use: XKB_KEY_XF86TouchpadToggle _EVDEVK(0x212) v2.6.37 KEY_TOUCHPAD_TOGGLE */
3093+/* Use: XKB_KEY_XF86TouchpadOn _EVDEVK(0x213) v2.6.37 KEY_TOUCHPAD_ON */
3094+/* Use: XKB_KEY_XF86TouchpadOff _EVDEVK(0x214) v2.6.37 KEY_TOUCHPAD_OFF */
3095+#define XKB_KEY_XF86CameraZoomIn 0x10081215 /* v2.6.39 KEY_CAMERA_ZOOMIN */
3096+#define XKB_KEY_XF86CameraZoomOut 0x10081216 /* v2.6.39 KEY_CAMERA_ZOOMOUT */
3097+#define XKB_KEY_XF86CameraUp 0x10081217 /* v2.6.39 KEY_CAMERA_UP */
3098+#define XKB_KEY_XF86CameraDown 0x10081218 /* v2.6.39 KEY_CAMERA_DOWN */
3099+#define XKB_KEY_XF86CameraLeft 0x10081219 /* v2.6.39 KEY_CAMERA_LEFT */
3100+#define XKB_KEY_XF86CameraRight 0x1008121a /* v2.6.39 KEY_CAMERA_RIGHT */
3101+#define XKB_KEY_XF86AttendantOn 0x1008121b /* v3.10 KEY_ATTENDANT_ON */
3102+#define XKB_KEY_XF86AttendantOff 0x1008121c /* v3.10 KEY_ATTENDANT_OFF */
3103+#define XKB_KEY_XF86AttendantToggle 0x1008121d /* v3.10 KEY_ATTENDANT_TOGGLE */
3104+#define XKB_KEY_XF86LightsToggle 0x1008121e /* v3.10 KEY_LIGHTS_TOGGLE */
3105+#define XKB_KEY_XF86ALSToggle 0x10081230 /* v3.13 KEY_ALS_TOGGLE */
3106+/* Use: XKB_KEY_XF86RotationLockToggle _EVDEVK(0x231) v4.16 KEY_ROTATE_LOCK_TOGGLE */
3107+#define XKB_KEY_XF86RefreshRateToggle 0x10081232 /* v6.9 KEY_REFRESH_RATE_TOGGLE */
3108+#define XKB_KEY_XF86Buttonconfig 0x10081240 /* v3.16 KEY_BUTTONCONFIG */
3109+#define XKB_KEY_XF86Taskmanager 0x10081241 /* v3.16 KEY_TASKMANAGER */
3110+#define XKB_KEY_XF86Journal 0x10081242 /* v3.16 KEY_JOURNAL */
3111+#define XKB_KEY_XF86ControlPanel 0x10081243 /* v3.16 KEY_CONTROLPANEL */
3112+#define XKB_KEY_XF86AppSelect 0x10081244 /* v3.16 KEY_APPSELECT */
3113+#define XKB_KEY_XF86Screensaver 0x10081245 /* v3.16 KEY_SCREENSAVER */
3114+#define XKB_KEY_XF86VoiceCommand 0x10081246 /* v3.16 KEY_VOICECOMMAND */
3115+#define XKB_KEY_XF86Assistant 0x10081247 /* v4.13 KEY_ASSISTANT */
3116+/* Use: XKB_KEY_ISO_Next_Group _EVDEVK(0x248) v5.2 KEY_KBD_LAYOUT_NEXT */
3117+#define XKB_KEY_XF86EmojiPicker 0x10081249 /* v5.13 KEY_EMOJI_PICKER */
3118+#define XKB_KEY_XF86Dictate 0x1008124a /* v5.17 KEY_DICTATE */
3119+#define XKB_KEY_XF86CameraAccessEnable 0x1008124b /* v6.2 KEY_CAMERA_ACCESS_ENABLE */
3120+#define XKB_KEY_XF86CameraAccessDisable 0x1008124c /* v6.2 KEY_CAMERA_ACCESS_DISABLE */
3121+#define XKB_KEY_XF86CameraAccessToggle 0x1008124d /* v6.2 KEY_CAMERA_ACCESS_TOGGLE */
3122+#define XKB_KEY_XF86Accessibility 0x1008124e /* v6.10 KEY_ACCESSIBILITY */
3123+#define XKB_KEY_XF86DoNotDisturb 0x1008124f /* v6.10 KEY_DO_NOT_DISTURB */
3124+#define XKB_KEY_XF86BrightnessMin 0x10081250 /* v3.16 KEY_BRIGHTNESS_MIN */
3125+#define XKB_KEY_XF86BrightnessMax 0x10081251 /* v3.16 KEY_BRIGHTNESS_MAX */
3126+#define XKB_KEY_XF86ElectronicPrivacyScreenOn 0x10081252 /* v6.18 KEY_EPRIVACY_SCREEN_ON */
3127+#define XKB_KEY_XF86ElectronicPrivacyScreenOff 0x10081253 /* v6.18 KEY_EPRIVACY_SCREEN_OFF */
3128+#define XKB_KEY_XF86ActionOnSelection 0x10081254 /* v7.0 KEY_ACTION_ON_SELECTION */
3129+#define XKB_KEY_XF86ContextualInsert 0x10081255 /* v7.0 KEY_CONTEXTUAL_INSERT */
3130+#define XKB_KEY_XF86ContextualQuery 0x10081256 /* v7.0 KEY_CONTEXTUAL_QUERY */
3131+#define XKB_KEY_XF86KbdInputAssistPrev 0x10081260 /* v3.18 KEY_KBDINPUTASSIST_PREV */
3132+#define XKB_KEY_XF86KbdInputAssistNext 0x10081261 /* v3.18 KEY_KBDINPUTASSIST_NEXT */
3133+#define XKB_KEY_XF86KbdInputAssistPrevgroup 0x10081262 /* v3.18 KEY_KBDINPUTASSIST_PREVGROUP */
3134+#define XKB_KEY_XF86KbdInputAssistNextgroup 0x10081263 /* v3.18 KEY_KBDINPUTASSIST_NEXTGROUP */
3135+#define XKB_KEY_XF86KbdInputAssistAccept 0x10081264 /* v3.18 KEY_KBDINPUTASSIST_ACCEPT */
3136+#define XKB_KEY_XF86KbdInputAssistCancel 0x10081265 /* v3.18 KEY_KBDINPUTASSIST_CANCEL */
3137+#define XKB_KEY_XF86RightUp 0x10081266 /* v4.7 KEY_RIGHT_UP */
3138+#define XKB_KEY_XF86RightDown 0x10081267 /* v4.7 KEY_RIGHT_DOWN */
3139+#define XKB_KEY_XF86LeftUp 0x10081268 /* v4.7 KEY_LEFT_UP */
3140+#define XKB_KEY_XF86LeftDown 0x10081269 /* v4.7 KEY_LEFT_DOWN */
3141+#define XKB_KEY_XF86RootMenu 0x1008126a /* v4.7 KEY_ROOT_MENU */
3142+#define XKB_KEY_XF86MediaTopMenu 0x1008126b /* v4.7 KEY_MEDIA_TOP_MENU */
3143+#define XKB_KEY_XF86Numeric11 0x1008126c /* v4.7 KEY_NUMERIC_11 */
3144+#define XKB_KEY_XF86Numeric12 0x1008126d /* v4.7 KEY_NUMERIC_12 */
3145+#define XKB_KEY_XF86AudioDesc 0x1008126e /* v4.7 KEY_AUDIO_DESC */
3146+#define XKB_KEY_XF863DMode 0x1008126f /* v4.7 KEY_3D_MODE */
3147+#define XKB_KEY_XF86NextFavorite 0x10081270 /* v4.7 KEY_NEXT_FAVORITE */
3148+#define XKB_KEY_XF86StopRecord 0x10081271 /* v4.7 KEY_STOP_RECORD */
3149+#define XKB_KEY_XF86PauseRecord 0x10081272 /* v4.7 KEY_PAUSE_RECORD */
3150+#define XKB_KEY_XF86VOD 0x10081273 /* v4.7 KEY_VOD */
3151+#define XKB_KEY_XF86Unmute 0x10081274 /* v4.7 KEY_UNMUTE */
3152+#define XKB_KEY_XF86FastReverse 0x10081275 /* v4.7 KEY_FASTREVERSE */
3153+#define XKB_KEY_XF86SlowReverse 0x10081276 /* v4.7 KEY_SLOWREVERSE */
3154+#define XKB_KEY_XF86Data 0x10081277 /* v4.7 KEY_DATA */
3155+#define XKB_KEY_XF86OnScreenKeyboard 0x10081278 /* v4.12 KEY_ONSCREEN_KEYBOARD */
3156+#define XKB_KEY_XF86PrivacyScreenToggle 0x10081279 /* v5.5 KEY_PRIVACY_SCREEN_TOGGLE */
3157+#define XKB_KEY_XF86SelectiveScreenshot 0x1008127a /* v5.6 KEY_SELECTIVE_SCREENSHOT */
3158+#define XKB_KEY_XF86NextElement 0x1008127b /* v5.18 KEY_NEXT_ELEMENT */
3159+#define XKB_KEY_XF86PreviousElement 0x1008127c /* v5.18 KEY_PREVIOUS_ELEMENT */
3160+#define XKB_KEY_XF86AutopilotEngageToggle 0x1008127d /* v5.18 KEY_AUTOPILOT_ENGAGE_TOGGLE */
3161+#define XKB_KEY_XF86MarkWaypoint 0x1008127e /* v5.18 KEY_MARK_WAYPOINT */
3162+#define XKB_KEY_XF86Sos 0x1008127f /* v5.18 KEY_SOS */
3163+#define XKB_KEY_XF86NavChart 0x10081280 /* v5.18 KEY_NAV_CHART */
3164+#define XKB_KEY_XF86FishingChart 0x10081281 /* v5.18 KEY_FISHING_CHART */
3165+#define XKB_KEY_XF86SingleRangeRadar 0x10081282 /* v5.18 KEY_SINGLE_RANGE_RADAR */
3166+#define XKB_KEY_XF86DualRangeRadar 0x10081283 /* v5.18 KEY_DUAL_RANGE_RADAR */
3167+#define XKB_KEY_XF86RadarOverlay 0x10081284 /* v5.18 KEY_RADAR_OVERLAY */
3168+#define XKB_KEY_XF86TraditionalSonar 0x10081285 /* v5.18 KEY_TRADITIONAL_SONAR */
3169+#define XKB_KEY_XF86ClearvuSonar 0x10081286 /* v5.18 KEY_CLEARVU_SONAR */
3170+#define XKB_KEY_XF86SidevuSonar 0x10081287 /* v5.18 KEY_SIDEVU_SONAR */
3171+#define XKB_KEY_XF86NavInfo 0x10081288 /* v5.18 KEY_NAV_INFO */
3172+/* Use: XKB_KEY_XF86BrightnessAdjust _EVDEVK(0x289) v5.18 KEY_BRIGHTNESS_MENU */
3173+#define XKB_KEY_XF86Macro1 0x10081290 /* v5.5 KEY_MACRO1 */
3174+#define XKB_KEY_XF86Macro2 0x10081291 /* v5.5 KEY_MACRO2 */
3175+#define XKB_KEY_XF86Macro3 0x10081292 /* v5.5 KEY_MACRO3 */
3176+#define XKB_KEY_XF86Macro4 0x10081293 /* v5.5 KEY_MACRO4 */
3177+#define XKB_KEY_XF86Macro5 0x10081294 /* v5.5 KEY_MACRO5 */
3178+#define XKB_KEY_XF86Macro6 0x10081295 /* v5.5 KEY_MACRO6 */
3179+#define XKB_KEY_XF86Macro7 0x10081296 /* v5.5 KEY_MACRO7 */
3180+#define XKB_KEY_XF86Macro8 0x10081297 /* v5.5 KEY_MACRO8 */
3181+#define XKB_KEY_XF86Macro9 0x10081298 /* v5.5 KEY_MACRO9 */
3182+#define XKB_KEY_XF86Macro10 0x10081299 /* v5.5 KEY_MACRO10 */
3183+#define XKB_KEY_XF86Macro11 0x1008129a /* v5.5 KEY_MACRO11 */
3184+#define XKB_KEY_XF86Macro12 0x1008129b /* v5.5 KEY_MACRO12 */
3185+#define XKB_KEY_XF86Macro13 0x1008129c /* v5.5 KEY_MACRO13 */
3186+#define XKB_KEY_XF86Macro14 0x1008129d /* v5.5 KEY_MACRO14 */
3187+#define XKB_KEY_XF86Macro15 0x1008129e /* v5.5 KEY_MACRO15 */
3188+#define XKB_KEY_XF86Macro16 0x1008129f /* v5.5 KEY_MACRO16 */
3189+#define XKB_KEY_XF86Macro17 0x100812a0 /* v5.5 KEY_MACRO17 */
3190+#define XKB_KEY_XF86Macro18 0x100812a1 /* v5.5 KEY_MACRO18 */
3191+#define XKB_KEY_XF86Macro19 0x100812a2 /* v5.5 KEY_MACRO19 */
3192+#define XKB_KEY_XF86Macro20 0x100812a3 /* v5.5 KEY_MACRO20 */
3193+#define XKB_KEY_XF86Macro21 0x100812a4 /* v5.5 KEY_MACRO21 */
3194+#define XKB_KEY_XF86Macro22 0x100812a5 /* v5.5 KEY_MACRO22 */
3195+#define XKB_KEY_XF86Macro23 0x100812a6 /* v5.5 KEY_MACRO23 */
3196+#define XKB_KEY_XF86Macro24 0x100812a7 /* v5.5 KEY_MACRO24 */
3197+#define XKB_KEY_XF86Macro25 0x100812a8 /* v5.5 KEY_MACRO25 */
3198+#define XKB_KEY_XF86Macro26 0x100812a9 /* v5.5 KEY_MACRO26 */
3199+#define XKB_KEY_XF86Macro27 0x100812aa /* v5.5 KEY_MACRO27 */
3200+#define XKB_KEY_XF86Macro28 0x100812ab /* v5.5 KEY_MACRO28 */
3201+#define XKB_KEY_XF86Macro29 0x100812ac /* v5.5 KEY_MACRO29 */
3202+#define XKB_KEY_XF86Macro30 0x100812ad /* v5.5 KEY_MACRO30 */
3203+#define XKB_KEY_XF86MacroRecordStart 0x100812b0 /* v5.5 KEY_MACRO_RECORD_START */
3204+#define XKB_KEY_XF86MacroRecordStop 0x100812b1 /* v5.5 KEY_MACRO_RECORD_STOP */
3205+#define XKB_KEY_XF86MacroPresetCycle 0x100812b2 /* v5.5 KEY_MACRO_PRESET_CYCLE */
3206+#define XKB_KEY_XF86MacroPreset1 0x100812b3 /* v5.5 KEY_MACRO_PRESET1 */
3207+#define XKB_KEY_XF86MacroPreset2 0x100812b4 /* v5.5 KEY_MACRO_PRESET2 */
3208+#define XKB_KEY_XF86MacroPreset3 0x100812b5 /* v5.5 KEY_MACRO_PRESET3 */
3209+#define XKB_KEY_XF86KbdLcdMenu1 0x100812b8 /* v5.5 KEY_KBD_LCD_MENU1 */
3210+#define XKB_KEY_XF86KbdLcdMenu2 0x100812b9 /* v5.5 KEY_KBD_LCD_MENU2 */
3211+#define XKB_KEY_XF86KbdLcdMenu3 0x100812ba /* v5.5 KEY_KBD_LCD_MENU3 */
3212+#define XKB_KEY_XF86KbdLcdMenu4 0x100812bb /* v5.5 KEY_KBD_LCD_MENU4 */
3213+#define XKB_KEY_XF86KbdLcdMenu5 0x100812bc /* v5.5 KEY_KBD_LCD_MENU5 */
3214+#define XKB_KEY_XF86PerformanceMode 0x100812bd /* v6.17 KEY_PERFORMANCE */
3215+
3216+/*
3217+ * Copyright (c) 1991, Oracle and/or its affiliates.
3218+ *
3219+ * Permission is hereby granted, free of charge, to any person obtaining a
3220+ * copy of this software and associated documentation files (the "Software"),
3221+ * to deal in the Software without restriction, including without limitation
3222+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
3223+ * and/or sell copies of the Software, and to permit persons to whom the
3224+ * Software is furnished to do so, subject to the following conditions:
3225+ *
3226+ * The above copyright notice and this permission notice (including the next
3227+ * paragraph) shall be included in all copies or substantial portions of the
3228+ * Software.
3229+ *
3230+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3231+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3232+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
3233+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
3234+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
3235+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
3236+ * DEALINGS IN THE SOFTWARE.
3237+ */
3238+/************************************************************
3239+
3240+Copyright 1991, 1998 The Open Group
3241+
3242+Permission to use, copy, modify, distribute, and sell this software and its
3243+documentation for any purpose is hereby granted without fee, provided that
3244+the above copyright notice appear in all copies and that both that
3245+copyright notice and this permission notice appear in supporting
3246+documentation.
3247+
3248+The above copyright notice and this permission notice shall be included in
3249+all copies or substantial portions of the Software.
3250+
3251+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3252+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3253+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3254+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
3255+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3256+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3257+
3258+Except as contained in this notice, the name of The Open Group shall not be
3259+used in advertising or otherwise to promote the sale, use or other dealings
3260+in this Software without prior written authorization from The Open Group.
3261+
3262+***********************************************************/
3263+
3264+/*
3265+ * Floating Accent
3266+ */
3267+
3268+#define XKB_KEY_SunFA_Grave 0x1005ff00
3269+#define XKB_KEY_SunFA_Circum 0x1005ff01
3270+#define XKB_KEY_SunFA_Tilde 0x1005ff02
3271+#define XKB_KEY_SunFA_Acute 0x1005ff03
3272+#define XKB_KEY_SunFA_Diaeresis 0x1005ff04
3273+#define XKB_KEY_SunFA_Cedilla 0x1005ff05
3274+
3275+/*
3276+ * Miscellaneous Functions
3277+ */
3278+
3279+#define XKB_KEY_SunF36 0x1005ff10 /* Labeled F11 */
3280+#define XKB_KEY_SunF37 0x1005ff11 /* Labeled F12 */
3281+
3282+#define XKB_KEY_SunSys_Req 0x1005ff60
3283+#define XKB_KEY_SunPrint_Screen 0x0000ff61 /* Same as XKB_KEY_Print */
3284+
3285+/*
3286+ * International & Multi-Key Character Composition
3287+ */
3288+
3289+#define XKB_KEY_SunCompose 0x0000ff20 /* Same as XKB_KEY_Multi_key */
3290+#define XKB_KEY_SunAltGraph 0x0000ff7e /* Same as XKB_KEY_Mode_switch */
3291+
3292+/*
3293+ * Cursor Control
3294+ */
3295+
3296+#define XKB_KEY_SunPageUp 0x0000ff55 /* Same as XKB_KEY_Prior */
3297+#define XKB_KEY_SunPageDown 0x0000ff56 /* Same as XKB_KEY_Next */
3298+
3299+/*
3300+ * Open Look Functions
3301+ */
3302+
3303+#define XKB_KEY_SunUndo 0x0000ff65 /* Same as XKB_KEY_Undo */
3304+#define XKB_KEY_SunAgain 0x0000ff66 /* Same as XKB_KEY_Redo */
3305+#define XKB_KEY_SunFind 0x0000ff68 /* Same as XKB_KEY_Find */
3306+#define XKB_KEY_SunStop 0x0000ff69 /* Same as XKB_KEY_Cancel */
3307+#define XKB_KEY_SunProps 0x1005ff70
3308+#define XKB_KEY_SunFront 0x1005ff71
3309+#define XKB_KEY_SunCopy 0x1005ff72
3310+#define XKB_KEY_SunOpen 0x1005ff73
3311+#define XKB_KEY_SunPaste 0x1005ff74
3312+#define XKB_KEY_SunCut 0x1005ff75
3313+
3314+#define XKB_KEY_SunPowerSwitch 0x1005ff76
3315+#define XKB_KEY_SunAudioLowerVolume 0x1005ff77
3316+#define XKB_KEY_SunAudioMute 0x1005ff78
3317+#define XKB_KEY_SunAudioRaiseVolume 0x1005ff79
3318+#define XKB_KEY_SunVideoDegauss 0x1005ff7a
3319+#define XKB_KEY_SunVideoLowerBrightness 0x1005ff7b
3320+#define XKB_KEY_SunVideoRaiseBrightness 0x1005ff7c
3321+#define XKB_KEY_SunPowerSwitchShift 0x1005ff7d
3322+
3323+/***********************************************************
3324+
3325+Copyright 1988, 1998 The Open Group
3326+
3327+Permission to use, copy, modify, distribute, and sell this software and its
3328+documentation for any purpose is hereby granted without fee, provided that
3329+the above copyright notice appear in all copies and that both that
3330+copyright notice and this permission notice appear in supporting
3331+documentation.
3332+
3333+The above copyright notice and this permission notice shall be included in
3334+all copies or substantial portions of the Software.
3335+
3336+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
3337+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
3338+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
3339+OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
3340+AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
3341+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
3342+
3343+Except as contained in this notice, the name of The Open Group shall not be
3344+used in advertising or otherwise to promote the sale, use or other dealings
3345+in this Software without prior written authorization from The Open Group.
3346+
3347+
3348+Copyright 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
3349+
3350+ All Rights Reserved
3351+
3352+Permission to use, copy, modify, and distribute this software and its
3353+documentation for any purpose and without fee is hereby granted,
3354+provided that the above copyright notice appear in all copies and that
3355+both that copyright notice and this permission notice appear in
3356+supporting documentation, and that the name of Digital not be
3357+used in advertising or publicity pertaining to distribution of the
3358+software without specific, written prior permission.
3359+
3360+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
3361+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
3362+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
3363+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
3364+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
3365+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
3366+SOFTWARE.
3367+
3368+******************************************************************/
3369+
3370+/*
3371+ * DEC private keysyms
3372+ * (29th bit set)
3373+ */
3374+
3375+/* two-key compose sequence initiators, chosen to map to Latin1 characters */
3376+
3377+#define XKB_KEY_Dring_accent 0x1000feb0
3378+#define XKB_KEY_Dcircumflex_accent 0x1000fe5e
3379+#define XKB_KEY_Dcedilla_accent 0x1000fe2c
3380+#define XKB_KEY_Dacute_accent 0x1000fe27
3381+#define XKB_KEY_Dgrave_accent 0x1000fe60
3382+#define XKB_KEY_Dtilde 0x1000fe7e
3383+#define XKB_KEY_Ddiaeresis 0x1000fe22
3384+
3385+/* special keysym for LK2** "Remove" key on editing keypad */
3386+
3387+#define XKB_KEY_DRemove 0x1000ff00 /* Remove */
3388+
3389+/*
3390+
3391+Copyright 1987, 1998 The Open Group
3392+
3393+Permission to use, copy, modify, distribute, and sell this software and its
3394+documentation for any purpose is hereby granted without fee, provided that
3395+the above copyright notice appear in all copies and that both that
3396+copyright notice and this permission notice appear in supporting
3397+documentation.
3398+
3399+The above copyright notice and this permission notice shall be included
3400+in all copies or substantial portions of the Software.
3401+
3402+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
3403+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
3404+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
3405+IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
3406+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
3407+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
3408+OTHER DEALINGS IN THE SOFTWARE.
3409+
3410+Except as contained in this notice, the name of The Open Group shall
3411+not be used in advertising or otherwise to promote the sale, use or
3412+other dealings in this Software without prior written authorization
3413+from The Open Group.
3414+
3415+Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts,
3416+
3417+ All Rights Reserved
3418+
3419+Permission to use, copy, modify, and distribute this software and its
3420+documentation for any purpose and without fee is hereby granted,
3421+provided that the above copyright notice appear in all copies and that
3422+both that copyright notice and this permission notice appear in
3423+supporting documentation, and that the names of Hewlett Packard
3424+or Digital not be
3425+used in advertising or publicity pertaining to distribution of the
3426+software without specific, written prior permission.
3427+
3428+DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
3429+ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
3430+DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
3431+ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
3432+WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
3433+ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
3434+SOFTWARE.
3435+
3436+HEWLETT-PACKARD MAKES NO WARRANTY OF ANY KIND WITH REGARD
3437+TO THIS SOFTWARE, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
3438+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
3439+PURPOSE. Hewlett-Packard shall not be liable for errors
3440+contained herein or direct, indirect, special, incidental or
3441+consequential damages in connection with the furnishing,
3442+performance, or use of this material.
3443+
3444+*/
3445+
3446+
3447+
3448+#define XKB_KEY_hpClearLine 0x1000ff6f
3449+#define XKB_KEY_hpInsertLine 0x1000ff70
3450+#define XKB_KEY_hpDeleteLine 0x1000ff71
3451+#define XKB_KEY_hpInsertChar 0x1000ff72
3452+#define XKB_KEY_hpDeleteChar 0x1000ff73
3453+#define XKB_KEY_hpBackTab 0x1000ff74
3454+#define XKB_KEY_hpKP_BackTab 0x1000ff75
3455+#define XKB_KEY_hpModelock1 0x1000ff48
3456+#define XKB_KEY_hpModelock2 0x1000ff49
3457+#define XKB_KEY_hpReset 0x1000ff6c
3458+#define XKB_KEY_hpSystem 0x1000ff6d
3459+#define XKB_KEY_hpUser 0x1000ff6e
3460+#define XKB_KEY_hpmute_acute 0x100000a8
3461+#define XKB_KEY_hpmute_grave 0x100000a9
3462+#define XKB_KEY_hpmute_asciicircum 0x100000aa
3463+#define XKB_KEY_hpmute_diaeresis 0x100000ab
3464+#define XKB_KEY_hpmute_asciitilde 0x100000ac
3465+#define XKB_KEY_hplira 0x100000af
3466+#define XKB_KEY_hpguilder 0x100000be
3467+#define XKB_KEY_hpYdiaeresis 0x100000ee
3468+#define XKB_KEY_hpIO 0x100000ee /* deprecated alias for hpYdiaeresis */
3469+#define XKB_KEY_hplongminus 0x100000f6
3470+#define XKB_KEY_hpblock 0x100000fc
3471+
3472+
3473+
3474+#define XKB_KEY_osfCopy 0x1004ff02
3475+#define XKB_KEY_osfCut 0x1004ff03
3476+#define XKB_KEY_osfPaste 0x1004ff04
3477+#define XKB_KEY_osfBackTab 0x1004ff07
3478+#define XKB_KEY_osfBackSpace 0x1004ff08
3479+#define XKB_KEY_osfClear 0x1004ff0b
3480+#define XKB_KEY_osfEscape 0x1004ff1b
3481+#define XKB_KEY_osfAddMode 0x1004ff31
3482+#define XKB_KEY_osfPrimaryPaste 0x1004ff32
3483+#define XKB_KEY_osfQuickPaste 0x1004ff33
3484+#define XKB_KEY_osfPageLeft 0x1004ff40
3485+#define XKB_KEY_osfPageUp 0x1004ff41
3486+#define XKB_KEY_osfPageDown 0x1004ff42
3487+#define XKB_KEY_osfPageRight 0x1004ff43
3488+#define XKB_KEY_osfActivate 0x1004ff44
3489+#define XKB_KEY_osfMenuBar 0x1004ff45
3490+#define XKB_KEY_osfLeft 0x1004ff51
3491+#define XKB_KEY_osfUp 0x1004ff52
3492+#define XKB_KEY_osfRight 0x1004ff53
3493+#define XKB_KEY_osfDown 0x1004ff54
3494+#define XKB_KEY_osfEndLine 0x1004ff57
3495+#define XKB_KEY_osfBeginLine 0x1004ff58
3496+#define XKB_KEY_osfEndData 0x1004ff59
3497+#define XKB_KEY_osfBeginData 0x1004ff5a
3498+#define XKB_KEY_osfPrevMenu 0x1004ff5b
3499+#define XKB_KEY_osfNextMenu 0x1004ff5c
3500+#define XKB_KEY_osfPrevField 0x1004ff5d
3501+#define XKB_KEY_osfNextField 0x1004ff5e
3502+#define XKB_KEY_osfSelect 0x1004ff60
3503+#define XKB_KEY_osfInsert 0x1004ff63
3504+#define XKB_KEY_osfUndo 0x1004ff65
3505+#define XKB_KEY_osfMenu 0x1004ff67
3506+#define XKB_KEY_osfCancel 0x1004ff69
3507+#define XKB_KEY_osfHelp 0x1004ff6a
3508+#define XKB_KEY_osfSelectAll 0x1004ff71
3509+#define XKB_KEY_osfDeselectAll 0x1004ff72
3510+#define XKB_KEY_osfReselect 0x1004ff73
3511+#define XKB_KEY_osfExtend 0x1004ff74
3512+#define XKB_KEY_osfRestore 0x1004ff78
3513+#define XKB_KEY_osfDelete 0x1004ffff
3514+
3515+
3516+
3517+/**************************************************************
3518+ * The use of the following macros is deprecated.
3519+ * They are listed below only for backwards compatibility.
3520+ */
3521+#define XKB_KEY_Reset 0x1000ff6c /* deprecated alias for hpReset */
3522+#define XKB_KEY_System 0x1000ff6d /* deprecated alias for hpSystem */
3523+#define XKB_KEY_User 0x1000ff6e /* deprecated alias for hpUser */
3524+#define XKB_KEY_ClearLine 0x1000ff6f /* deprecated alias for hpClearLine */
3525+#define XKB_KEY_InsertLine 0x1000ff70 /* deprecated alias for hpInsertLine */
3526+#define XKB_KEY_DeleteLine 0x1000ff71 /* deprecated alias for hpDeleteLine */
3527+#define XKB_KEY_InsertChar 0x1000ff72 /* deprecated alias for hpInsertChar */
3528+#define XKB_KEY_DeleteChar 0x1000ff73 /* deprecated alias for hpDeleteChar */
3529+#define XKB_KEY_BackTab 0x1000ff74 /* deprecated alias for hpBackTab */
3530+#define XKB_KEY_KP_BackTab 0x1000ff75 /* deprecated alias for hpKP_BackTab */
3531+#define XKB_KEY_Ext16bit_L 0x1000ff76 /* deprecated */
3532+#define XKB_KEY_Ext16bit_R 0x1000ff77 /* deprecated */
3533+#define XKB_KEY_mute_acute 0x100000a8 /* deprecated alias for hpmute_acute */
3534+#define XKB_KEY_mute_grave 0x100000a9 /* deprecated alias for hpmute_grave */
3535+#define XKB_KEY_mute_asciicircum 0x100000aa /* deprecated alias for hpmute_asciicircum */
3536+#define XKB_KEY_mute_diaeresis 0x100000ab /* deprecated alias for hpmute_diaeresis */
3537+#define XKB_KEY_mute_asciitilde 0x100000ac /* deprecated alias for hpmute_asciitilde */
3538+#define XKB_KEY_lira 0x100000af /* deprecated alias for hplira */
3539+#define XKB_KEY_guilder 0x100000be /* deprecated alias for hpguilder */
3540+#define XKB_KEY_IO 0x100000ee /* deprecated alias for hpYdiaeresis */
3541+#define XKB_KEY_longminus 0x100000f6 /* deprecated alias for hplongminus */
3542+#define XKB_KEY_block 0x100000fc /* deprecated alias for hpblock */
3543+
3544+
3545+#endif
A upstream/xkbcommon-names.h +144 -0
@@ -0,0 +1,144 @@
1+/*
2+ * Copyright © 2012 Intel Corporation
3+ * SPDX-License-Identifier: MIT
4+ *
5+ * Author: Daniel Stone <daniel@fooishbar.org>
6+ */
7+
8+#ifndef _XKBCOMMON_NAMES_H
9+#define _XKBCOMMON_NAMES_H
10+
11+/**
12+ * @file
13+ * @brief Predefined names for common modifiers and LEDs.
14+ */
15+
16+/**
17+ * @defgroup modifier-names Predefined names for common modifiers and LEDs
18+ *
19+ * @{
20+ */
21+
22+/**
23+ * @defgroup real-modifier-names Real modifiers names
24+ *
25+ * [*Real* modifiers][real modifier] names are hardcoded in libxkbcommon.
26+ *
27+ * [real modifier]: @ref real-modifier-def
28+ *
29+ * @{
30+ */
31+#define XKB_MOD_NAME_SHIFT "Shift"
32+#define XKB_MOD_NAME_CAPS "Lock"
33+#define XKB_MOD_NAME_CTRL "Control"
34+#define XKB_MOD_NAME_MOD1 "Mod1"
35+#define XKB_MOD_NAME_MOD2 "Mod2"
36+#define XKB_MOD_NAME_MOD3 "Mod3"
37+#define XKB_MOD_NAME_MOD4 "Mod4"
38+#define XKB_MOD_NAME_MOD5 "Mod5"
39+/** @} */
40+
41+/**
42+ * @defgroup virtual-modifier-names Virtual modifiers names
43+ *
44+ * Common [*virtual* modifiers][virtual modifiers], encoded in [xkeyboard-config]
45+ * in the [compat] and [symbols] files. They have been stable since the beginning
46+ * of the project and are unlikely to ever change.
47+ *
48+ * [virtual modifiers]: @ref virtual-modifier-def
49+ * [xkeyboard-config]: https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config
50+ * [compat]: @ref the-xkb_compat-section
51+ * [symbols]: @ref the-xkb_symbols-section
52+ *
53+ * @{
54+ */
55+/** @since 1.8.0 */
56+#define XKB_VMOD_NAME_ALT "Alt"
57+/** @since 1.8.0 */
58+#define XKB_VMOD_NAME_HYPER "Hyper"
59+/** @since 1.8.0 */
60+#define XKB_VMOD_NAME_LEVEL3 "LevelThree"
61+/** @since 1.8.0 */
62+#define XKB_VMOD_NAME_LEVEL5 "LevelFive"
63+/** @since 1.8.0 */
64+#define XKB_VMOD_NAME_META "Meta"
65+/** @since 1.8.0 */
66+#define XKB_VMOD_NAME_NUM "NumLock"
67+/** @since 1.8.0 */
68+#define XKB_VMOD_NAME_SCROLL "ScrollLock"
69+/** @since 1.8.0 */
70+#define XKB_VMOD_NAME_SUPER "Super"
71+/** @} */
72+
73+/**
74+ * @defgroup legacy-virtual-modifier-names Legacy virtual modifier names
75+ *
76+ * Usual [*virtual* modifiers][virtual modifiers] mappings to
77+ * [*real* modifiers][real modifiers].
78+ *
79+ * @deprecated Use @ref virtual-modifier-names instead
80+ *
81+ * [virtual modifiers]: @ref virtual-modifier-def
82+ * [real modifiers]: @ref real-modifier-def
83+ *
84+ * @{
85+ */
86+/**
87+ * Usual [*real* modifier][real modifier] for the
88+ * [*virtual* modifier][virtual modifier] `Alt`.
89+ *
90+ * @deprecated Use `::XKB_VMOD_NAME_ALT` instead.
91+ * @since 1.10: deprecated
92+ *
93+ * [virtual modifier]: @ref virtual-modifier-def
94+ * [real modifier]: @ref real-modifier-def
95+ */
96+#define XKB_MOD_NAME_ALT "Mod1"
97+/**
98+ * Usual [*real* modifier][real modifier] for the
99+ * [*virtual* modifier][virtual modifier] `Super`.
100+ *
101+ * @deprecated Use `::XKB_VMOD_NAME_SUPER` instead.
102+ * @since 1.10: deprecated
103+ *
104+ * [virtual modifier]: @ref virtual-modifier-def
105+ * [real modifier]: @ref real-modifier-def
106+ */
107+#define XKB_MOD_NAME_LOGO "Mod4"
108+/**
109+ * Usual [*real* modifier][real modifier] for the
110+ * [*virtual* modifier][virtual modifier] `NumLock`.
111+ *
112+ * @deprecated Use `::XKB_VMOD_NAME_NUM` instead.
113+ * @since 1.10: deprecated
114+ *
115+ * [virtual modifier]: @ref virtual-modifier-def
116+ * [real modifier]: @ref real-modifier-def
117+ */
118+#define XKB_MOD_NAME_NUM "Mod2"
119+/** @} */
120+
121+/**
122+ * @defgroup led-names LEDs names
123+ *
124+ * LEDs names are encoded in [xkeyboard-config], in the [keycodes] and [compat]
125+ * files. They have been stable since the beginning of the project and are
126+ * unlikely to ever change.
127+ *
128+ * [xkeyboard-config]: https://gitlab.freedesktop.org/xkeyboard-config/xkeyboard-config
129+ * [keycodes]: @ref the-xkb_keycodes-section
130+ * [compat]: @ref the-xkb_compat-section
131+ *
132+ * @{
133+ */
134+#define XKB_LED_NAME_NUM "Num Lock"
135+#define XKB_LED_NAME_CAPS "Caps Lock"
136+#define XKB_LED_NAME_SCROLL "Scroll Lock"
137+/** @since 1.8.0 */
138+#define XKB_LED_NAME_COMPOSE "Compose"
139+#define XKB_LED_NAME_KANA "Kana"
140+/** @} */
141+
142+/** @} */
143+
144+#endif
A upstream/xkbcommon.h +2598 -0 large diff (2598 lines changed): collapsed
A xkbcommon.go +500 -0
@@ -0,0 +1,500 @@
1+// Package xkbcommon interprets Wayland keyboard maps with libxkbcommon,
2+// loaded at runtime without cgo. Close owned values when they are no longer used.
3+package xkbcommon
4+
5+import (
6+ "errors"
7+ "fmt"
8+ "runtime"
9+ "strings"
10+ "sync"
11+ "syscall"
12+ "unsafe"
13+
14+ "github.com/bnema/purego-xkbcommon/raw"
15+)
16+
17+var ErrClosed = errors.New("xkbcommon: closed handle")
18+
19+func cstr(s string) []byte { return append([]byte(s), 0) }
20+func ptr(b []byte) uintptr {
21+ if len(b) == 0 {
22+ return 0
23+ }
24+ return uintptr(unsafe.Pointer(&b[0]))
25+}
26+func validString(s string) error {
27+ if strings.IndexByte(s, 0) >= 0 {
28+ return errors.New("xkbcommon: embedded NUL")
29+ }
30+ return nil
31+}
32+
33+// Keycodes from wl_keyboard are evdev codes; add 8 before calling State.KeySym or State.UTF8.
34+func WaylandKeycode(evdev uint32) uint32 { return evdev + 8 }
35+
36+type Context struct {
37+ mu sync.Mutex
38+ h uintptr
39+}
40+
41+func NewContext() (*Context, error) {
42+ if err := Available(); err != nil {
43+ return nil, err
44+ }
45+ h := loader.f.Xkb_context_new(0)
46+ if h == 0 {
47+ return nil, errors.New("xkbcommon: create context failed")
48+ }
49+ return &Context{h: h}, nil
50+}
51+func (c *Context) Close() error {
52+ if c == nil {
53+ return nil
54+ }
55+ c.mu.Lock()
56+ defer c.mu.Unlock()
57+ if c.h != 0 {
58+ loader.f.Xkb_context_unref(c.h)
59+ c.h = 0
60+ }
61+ return nil
62+}
63+func (c *Context) retain() (uintptr, error) {
64+ if c == nil {
65+ return 0, ErrClosed
66+ }
67+ c.mu.Lock()
68+ defer c.mu.Unlock()
69+ if c.h == 0 {
70+ return 0, ErrClosed
71+ }
72+ loader.f.Xkb_context_ref(c.h)
73+ return c.h, nil
74+}
75+func releaseContext(h uintptr) { loader.f.Xkb_context_unref(h) }
76+
77+type Keymap struct {
78+ mu sync.Mutex
79+ h, context uintptr
80+}
81+
82+func newKeymap(ctx *Context, build func(uintptr) uintptr) (*Keymap, error) {
83+ h, e := ctx.retain()
84+ if e != nil {
85+ return nil, e
86+ }
87+ k := build(h)
88+ if k == 0 {
89+ releaseContext(h)
90+ return nil, errors.New("xkbcommon: invalid keymap")
91+ }
92+ return &Keymap{h: k, context: h}, nil
93+}
94+
95+// NewKeymapString compiles a NUL-free xkb_v1 text keymap.
96+func (c *Context) NewKeymapString(text string) (*Keymap, error) {
97+ if e := validString(text); e != nil {
98+ return nil, e
99+ }
100+ b := cstr(text)
101+ return newKeymap(c, func(h uintptr) uintptr {
102+ v := loader.f.Xkb_keymap_new_from_string(h, ptr(b), raw.XKB_KEYMAP_FORMAT_TEXT_V1, 0)
103+ runtime.KeepAlive(b)
104+ return v
105+ })
106+}
107+
108+// NewKeymapRules compiles an evdev rules keymap. Empty rules/model/variant/options
109+// use libxkbcommon defaults; layout is e.g. "us", "fr", "de", or "us,de".
110+func (c *Context) NewKeymapRules(rules, model, layout, variant, options string) (*Keymap, error) {
111+ args := []string{rules, model, layout, variant, options}
112+ var b [5][]byte
113+ var n raw.RuleNames
114+ p := []*uintptr{&n.Rules, &n.Model, &n.Layout, &n.Variant, &n.Options}
115+ for i, s := range args {
116+ if e := validString(s); e != nil {
117+ return nil, e
118+ }
119+ if s != "" {
120+ b[i] = cstr(s)
121+ *p[i] = ptr(b[i])
122+ }
123+ }
124+ return newKeymap(c, func(h uintptr) uintptr {
125+ v := loader.f.Xkb_keymap_new_from_names(h, uintptr(unsafe.Pointer(&n)), 0)
126+ runtime.KeepAlive(b)
127+ runtime.KeepAlive(n)
128+ return v
129+ })
130+}
131+
132+// NewKeymapFD copies exactly size bytes from offset zero of a Wayland xkb_v1
133+// keymap FD (at most 16 MiB). A trailing Wayland NUL, if present, is excluded
134+// from the compiled text. The caller retains ownership of fd, even on error.
135+func (c *Context) NewKeymapFD(fd int, size int) (*Keymap, error) {
136+ if fd < 0 || size < 1 || size > 16<<20 {
137+ return nil, errors.New("xkbcommon: invalid keymap FD or size (limit 16 MiB)")
138+ }
139+ var stat syscall.Stat_t
140+ if e := syscall.Fstat(fd, &stat); e != nil {
141+ return nil, fmt.Errorf("xkbcommon: stat keymap FD: %w", e)
142+ }
143+ if stat.Mode&syscall.S_IFMT != syscall.S_IFREG {
144+ return nil, errors.New("xkbcommon: keymap FD is not a regular file")
145+ }
146+ b := make([]byte, size)
147+ for offset := 0; offset < size; {
148+ n, e := syscall.Pread(fd, b[offset:], int64(offset))
149+ offset += n
150+ if e == syscall.EINTR {
151+ continue
152+ }
153+ if e != nil {
154+ return nil, fmt.Errorf("xkbcommon: read keymap FD: %w", e)
155+ }
156+ if n == 0 {
157+ return nil, fmt.Errorf("xkbcommon: read keymap FD: %w", errors.New("short read"))
158+ }
159+ }
160+ if b[len(b)-1] == 0 {
161+ b = b[:len(b)-1]
162+ }
163+ return newKeymap(c, func(h uintptr) uintptr {
164+ v := loader.f.Xkb_keymap_new_from_buffer(h, ptr(b), uintptr(len(b)), raw.XKB_KEYMAP_FORMAT_TEXT_V1, 0)
165+ runtime.KeepAlive(b)
166+ return v
167+ })
168+}
169+func (k *Keymap) Close() error {
170+ if k == nil {
171+ return nil
172+ }
173+ k.mu.Lock()
174+ h, ctx := k.h, k.context
175+ k.h = 0
176+ k.context = 0
177+ if h != 0 {
178+ loader.f.Xkb_keymap_unref(h)
179+ }
180+ k.mu.Unlock()
181+ if ctx != 0 {
182+ releaseContext(ctx)
183+ }
184+ return nil
185+}
186+func (k *Keymap) retain() (uintptr, error) {
187+ if k == nil {
188+ return 0, ErrClosed
189+ }
190+ k.mu.Lock()
191+ defer k.mu.Unlock()
192+ if k.h == 0 {
193+ return 0, ErrClosed
194+ }
195+ loader.f.Xkb_keymap_ref(k.h)
196+ return k.h, nil
197+}
198+func (k *Keymap) ModIndex(name string) (uint32, error) {
199+ if e := validString(name); e != nil {
200+ return 0, e
201+ }
202+ if k == nil {
203+ return 0, ErrClosed
204+ }
205+ b := cstr(name)
206+ k.mu.Lock()
207+ defer k.mu.Unlock()
208+ if k.h == 0 {
209+ return 0, ErrClosed
210+ }
211+ v := loader.f.Xkb_keymap_mod_get_index(k.h, ptr(b))
212+ runtime.KeepAlive(b)
213+ return v, nil
214+}
215+func (k *Keymap) LayoutCount() (uint32, error) {
216+ if k == nil {
217+ return 0, ErrClosed
218+ }
219+ k.mu.Lock()
220+ defer k.mu.Unlock()
221+ if k.h == 0 {
222+ return 0, ErrClosed
223+ }
224+ return loader.f.Xkb_keymap_num_layouts(k.h), nil
225+}
226+func (k *Keymap) NewState() (*State, error) {
227+ h, e := k.retain()
228+ if e != nil {
229+ return nil, e
230+ }
231+ s := loader.f.Xkb_state_new(h)
232+ if s == 0 {
233+ loader.f.Xkb_keymap_unref(h)
234+ return nil, errors.New("xkbcommon: create state failed")
235+ }
236+ return &State{h: s, keymap: h}, nil
237+}
238+
239+type State struct {
240+ mu sync.Mutex
241+ h, keymap uintptr
242+}
243+
244+func (s *State) Close() error {
245+ if s == nil {
246+ return nil
247+ }
248+ s.mu.Lock()
249+ h, k := s.h, s.keymap
250+ s.h = 0
251+ s.keymap = 0
252+ if h != 0 {
253+ loader.f.Xkb_state_unref(h)
254+ }
255+ s.mu.Unlock()
256+ if k != 0 {
257+ loader.f.Xkb_keymap_unref(k)
258+ }
259+ return nil
260+}
261+
262+// UpdateMask accepts depressed/latched/locked modifier masks and layout group indices
263+// in the order supplied by wl_keyboard.modifiers. It returns changed components.
264+func (s *State) UpdateMask(depressed, latched, locked, groupDepressed, groupLatched, groupLocked uint32) (uint32, error) {
265+ if s == nil {
266+ return 0, ErrClosed
267+ }
268+ s.mu.Lock()
269+ defer s.mu.Unlock()
270+ if s.h == 0 {
271+ return 0, ErrClosed
272+ }
273+ return loader.f.Xkb_state_update_mask(s.h, depressed, latched, locked, groupDepressed, groupLatched, groupLocked), nil
274+}
275+func (s *State) Layout() (uint32, error) {
276+ if s == nil {
277+ return 0, ErrClosed
278+ }
279+ s.mu.Lock()
280+ defer s.mu.Unlock()
281+ if s.h == 0 {
282+ return 0, ErrClosed
283+ }
284+ return loader.f.Xkb_state_serialize_layout(s.h, raw.XKB_STATE_LAYOUT_EFFECTIVE), nil
285+}
286+func (s *State) Mods() (uint32, error) {
287+ if s == nil {
288+ return 0, ErrClosed
289+ }
290+ s.mu.Lock()
291+ defer s.mu.Unlock()
292+ if s.h == 0 {
293+ return 0, ErrClosed
294+ }
295+ return loader.f.Xkb_state_serialize_mods(s.h, raw.XKB_STATE_MODS_EFFECTIVE), nil
296+}
297+func (s *State) KeySym(keycode uint32) (uint32, error) {
298+ if s == nil {
299+ return 0, ErrClosed
300+ }
301+ s.mu.Lock()
302+ defer s.mu.Unlock()
303+ if s.h == 0 {
304+ return 0, ErrClosed
305+ }
306+ return loader.f.Xkb_state_key_get_one_sym(s.h, keycode), nil
307+}
308+
309+// sizedUTF8 probes the required byte count (excluding NUL) and retries if it grows.
310+func sizedUTF8(call func(uintptr, uintptr) int32) (string, error) {
311+ n := call(0, 0)
312+ if n < 0 {
313+ return "", errors.New("xkbcommon: UTF-8 conversion failed")
314+ }
315+ if n == 0 {
316+ return "", nil
317+ }
318+ for attempt := 0; attempt < 3; attempt++ {
319+ if n > 1<<20 {
320+ return "", errors.New("xkbcommon: UTF-8 result exceeds 1 MiB")
321+ }
322+ b := make([]byte, int(n)+1)
323+ got := call(ptr(b), uintptr(len(b)))
324+ runtime.KeepAlive(b)
325+ if got < 0 {
326+ return "", errors.New("xkbcommon: UTF-8 conversion failed")
327+ }
328+ if int(got) < len(b) {
329+ return string(b[:got]), nil
330+ }
331+ n = got
332+ }
333+ return "", errors.New("xkbcommon: UTF-8 result changed during sizing")
334+}
335+func (s *State) UTF8(keycode uint32) (string, error) {
336+ if s == nil {
337+ return "", ErrClosed
338+ }
339+ s.mu.Lock()
340+ defer s.mu.Unlock()
341+ if s.h == 0 {
342+ return "", ErrClosed
343+ }
344+ return sizedUTF8(func(p, n uintptr) int32 { return loader.f.Xkb_state_key_get_utf8(s.h, keycode, p, n) })
345+}
346+func KeysymName(sym uint32) (string, error) {
347+ if e := Available(); e != nil {
348+ return "", e
349+ }
350+ return sizedUTF8(func(p, n uintptr) int32 { return loader.f.Xkb_keysym_get_name(sym, p, n) })
351+}
352+func KeysymFromName(name string) (uint32, error) {
353+ if e := Available(); e != nil {
354+ return 0, e
355+ }
356+ if e := validString(name); e != nil {
357+ return 0, e
358+ }
359+ b := cstr(name)
360+ v := loader.f.Xkb_keysym_from_name(ptr(b), 0)
361+ runtime.KeepAlive(b)
362+ return v, nil
363+}
364+
365+type ComposeTable struct {
366+ mu sync.Mutex
367+ h, context uintptr
368+}
369+
370+func (c *Context) NewComposeTable(locale string) (*ComposeTable, error) {
371+ if e := validString(locale); e != nil {
372+ return nil, e
373+ }
374+ ctx, e := c.retain()
375+ if e != nil {
376+ return nil, e
377+ }
378+ b := cstr(locale)
379+ h := loader.f.Xkb_compose_table_new_from_locale(ctx, ptr(b), 0)
380+ runtime.KeepAlive(b)
381+ if h == 0 {
382+ releaseContext(ctx)
383+ return nil, fmt.Errorf("xkbcommon: no compose table for %q", locale)
384+ }
385+ return &ComposeTable{h: h, context: ctx}, nil
386+}
387+func (t *ComposeTable) Close() error {
388+ if t == nil {
389+ return nil
390+ }
391+ t.mu.Lock()
392+ h, ctx := t.h, t.context
393+ t.h = 0
394+ t.context = 0
395+ if h != 0 {
396+ loader.f.Xkb_compose_table_unref(h)
397+ }
398+ t.mu.Unlock()
399+ if ctx != 0 {
400+ releaseContext(ctx)
401+ }
402+ return nil
403+}
404+func (t *ComposeTable) NewState() (*ComposeState, error) {
405+ if t == nil {
406+ return nil, ErrClosed
407+ }
408+ t.mu.Lock()
409+ if t.h == 0 {
410+ t.mu.Unlock()
411+ return nil, ErrClosed
412+ }
413+ table := loader.f.Xkb_compose_table_ref(t.h)
414+ t.mu.Unlock()
415+ h := loader.f.Xkb_compose_state_new(table, 0)
416+ if h == 0 {
417+ loader.f.Xkb_compose_table_unref(table)
418+ return nil, errors.New("xkbcommon: create compose state failed")
419+ }
420+ return &ComposeState{h: h, table: table}, nil
421+}
422+
423+type ComposeState struct {
424+ mu sync.Mutex
425+ h, table uintptr
426+}
427+
428+func (s *ComposeState) Close() error {
429+ if s == nil {
430+ return nil
431+ }
432+ s.mu.Lock()
433+ h, t := s.h, s.table
434+ s.h = 0
435+ s.table = 0
436+ if h != 0 {
437+ loader.f.Xkb_compose_state_unref(h)
438+ }
439+ s.mu.Unlock()
440+ if t != 0 {
441+ loader.f.Xkb_compose_table_unref(t)
442+ }
443+ return nil
444+}
445+func (s *ComposeState) Feed(sym uint32) (uint32, error) {
446+ if s == nil {
447+ return 0, ErrClosed
448+ }
449+ s.mu.Lock()
450+ defer s.mu.Unlock()
451+ if s.h == 0 {
452+ return 0, ErrClosed
453+ }
454+ return loader.f.Xkb_compose_state_feed(s.h, sym), nil
455+}
456+func (s *ComposeState) Status() (uint32, error) {
457+ if s == nil {
458+ return 0, ErrClosed
459+ }
460+ s.mu.Lock()
461+ defer s.mu.Unlock()
462+ if s.h == 0 {
463+ return 0, ErrClosed
464+ }
465+ return loader.f.Xkb_compose_state_get_status(s.h), nil
466+}
467+func (s *ComposeState) UTF8() (string, error) {
468+ if s == nil {
469+ return "", ErrClosed
470+ }
471+ s.mu.Lock()
472+ defer s.mu.Unlock()
473+ if s.h == 0 {
474+ return "", ErrClosed
475+ }
476+ return sizedUTF8(func(p, n uintptr) int32 { return loader.f.Xkb_compose_state_get_utf8(s.h, p, n) })
477+}
478+func (s *ComposeState) KeySym() (uint32, error) {
479+ if s == nil {
480+ return 0, ErrClosed
481+ }
482+ s.mu.Lock()
483+ defer s.mu.Unlock()
484+ if s.h == 0 {
485+ return 0, ErrClosed
486+ }
487+ return loader.f.Xkb_compose_state_get_one_sym(s.h), nil
488+}
489+func (s *ComposeState) Reset() error {
490+ if s == nil {
491+ return ErrClosed
492+ }
493+ s.mu.Lock()
494+ defer s.mu.Unlock()
495+ if s.h == 0 {
496+ return ErrClosed
497+ }
498+ loader.f.Xkb_compose_state_reset(s.h)
499+ return nil
500+}
A xkbcommon_test.go +402 -0
@@ -0,0 +1,402 @@
1+package xkbcommon
2+
3+import (
4+ "errors"
5+ "fmt"
6+ "os"
7+ "os/exec"
8+ "regexp"
9+ "strings"
10+ "testing"
11+ "unsafe"
12+
13+ "github.com/bnema/purego-xkbcommon/raw"
14+)
15+
16+func live(t *testing.T) *Context {
17+ t.Helper()
18+ if err := Available(); err != nil {
19+ if strings.Contains(err.Error(), "load libxkbcommon.so.0") {
20+ t.Skipf("live libxkbcommon.so.0 absent: %v", err)
21+ }
22+ t.Fatal(err)
23+ }
24+ c, e := NewContext()
25+ if e != nil {
26+ t.Fatal(e)
27+ }
28+ t.Cleanup(func() { c.Close() })
29+ return c
30+}
31+func rules(t *testing.T, c *Context, layout string) *Keymap {
32+ t.Helper()
33+ k, e := c.NewKeymapRules("evdev", "pc105", layout, "", "")
34+ if e != nil {
35+ t.Fatalf("rules %s: %v", layout, e)
36+ }
37+ t.Cleanup(func() { k.Close() })
38+ return k
39+}
40+func state(t *testing.T, k *Keymap) *State {
41+ t.Helper()
42+ s, e := k.NewState()
43+ if e != nil {
44+ t.Fatal(e)
45+ }
46+ t.Cleanup(func() { s.Close() })
47+ return s
48+}
49+func TestABI(t *testing.T) {
50+ if unsafe.Sizeof(raw.RuleNames{}) != 5*unsafe.Sizeof(uintptr(0)) {
51+ t.Fatal("rule names ABI")
52+ }
53+ if unsafe.Sizeof(raw.Keycode(0)) != 4 || unsafe.Sizeof(raw.Keysym(0)) != 4 || unsafe.Sizeof(raw.ModMask(0)) != 4 {
54+ t.Fatal("scalar ABI")
55+ }
56+}
57+func TestSymbols(t *testing.T) {
58+ live(t)
59+ if len(raw.Symbols) < 25 {
60+ t.Fatal("incomplete required symbol set")
61+ }
62+}
63+func TestMalformedAndLifetime(t *testing.T) {
64+ c := live(t)
65+ if _, e := c.NewKeymapString("garbage"); e == nil {
66+ t.Fatal("malformed keymap compiled")
67+ }
68+ if _, e := c.NewKeymapString("foo\x00bar"); e == nil {
69+ t.Fatal("embedded NUL")
70+ }
71+ k := rules(t, c, "us")
72+ s := state(t, k)
73+ c.Close()
74+ k.Close()
75+ for i := 0; i < 3; i++ {
76+ c.Close()
77+ k.Close()
78+ }
79+ if _, e := k.NewState(); !errors.Is(e, ErrClosed) {
80+ t.Fatal(e)
81+ }
82+ v, e := s.UTF8(38)
83+ if e != nil || v != "a" {
84+ t.Fatalf("state after parent close: %q %v", v, e)
85+ }
86+ s.Close()
87+ s.Close()
88+ if _, e := s.KeySym(38); !errors.Is(e, ErrClosed) {
89+ t.Fatal(e)
90+ }
91+}
92+func TestFD(t *testing.T) {
93+ c := live(t)
94+ short := keymapFile(t, []byte("short"))
95+ if _, e := c.NewKeymapFD(int(short.Fd()), 4096); e == nil || !strings.Contains(e.Error(), "short read") {
96+ t.Fatalf("truncated keymap: %v", e)
97+ }
98+ if _, e := short.Stat(); e != nil {
99+ t.Fatalf("FD was closed on error: %v", e)
100+ }
101+ for _, size := range []int{0, 16<<20 + 1} {
102+ if _, e := c.NewKeymapFD(int(short.Fd()), size); e == nil {
103+ t.Fatalf("accepted size %d", size)
104+ }
105+ }
106+ if _, e := c.NewKeymapFD(-1, 5); e == nil {
107+ t.Fatal("negative FD")
108+ }
109+ if _, e := exec.LookPath("xkbcli"); e != nil {
110+ t.Skipf("xkbcli compile-keymap reference unavailable: %v", e)
111+ }
112+ out, e := exec.Command("xkbcli", "compile-keymap", "--rules", "evdev", "--model", "pc105", "--layout", "fr", "--output-format", "1").Output()
113+ if e != nil {
114+ t.Fatalf("reference xkbcli: %v", e)
115+ }
116+ f := keymapFile(t, append(out, 0))
117+ other, e := c.NewKeymapFD(int(f.Fd()), len(out)+1)
118+ if e != nil {
119+ t.Fatal(e)
120+ }
121+ other.Close()
122+ if _, e = f.Stat(); e != nil {
123+ t.Fatalf("FD was closed: %v", e)
124+ }
125+ if _, e = c.NewKeymapFD(int(f.Fd()), len(out)+2); e == nil || !strings.Contains(e.Error(), "short read") {
126+ t.Fatalf("truncated keymap: %v", e)
127+ }
128+ if _, e = c.NewKeymapFD(int(f.Fd()), len(out)); e != nil {
129+ t.Fatalf("non-NUL text: %v", e)
130+ }
131+}
132+
133+func keymapFile(t *testing.T, data []byte) *os.File {
134+ t.Helper()
135+ f, e := os.CreateTemp(t.TempDir(), "keymap")
136+ if e != nil {
137+ t.Fatal(e)
138+ }
139+ t.Cleanup(func() { f.Close() })
140+ if _, e = f.Write(data); e != nil {
141+ t.Fatal(e)
142+ }
143+ return f
144+}
145+
146+func TestLoaderDiagnostics(t *testing.T) {
147+ _, e := resolveLibrary("/no/such/libxkbcommon.so", raw.Symbols)
148+ if e == nil || !strings.Contains(e.Error(), "load /no/such/libxkbcommon.so") {
149+ t.Fatalf("missing library: %v", e)
150+ }
151+ if e := Available(); e != nil {
152+ if strings.Contains(e.Error(), "load libxkbcommon.so.0") {
153+ t.Skipf("missing symbol test needs libxkbcommon.so.0: %v", e)
154+ }
155+ t.Fatal(e)
156+ }
157+ _, e = resolveLibrary("libxkbcommon.so.0", []string{"xkb_nonexistent_test_symbol"})
158+ if e == nil || !strings.Contains(e.Error(), "missing xkb_nonexistent_test_symbol") {
159+ t.Fatalf("missing symbol: %v", e)
160+ }
161+}
162+func TestLayoutsAndDifferential(t *testing.T) {
163+ c := live(t)
164+ for _, tc := range []struct {
165+ layout string
166+ code uint32
167+ want string
168+ alt bool
169+ }{{"us", 38, "a", false}, {"fr", 24, "a", false}, {"de", 29, "z", false}, {"de", 26, "€", true}, {"fr", 26, "€", true}} {
170+ t.Run(tc.layout+tc.want, func(t *testing.T) {
171+ k := rules(t, c, tc.layout)
172+ s := state(t, k)
173+ if tc.alt {
174+ idx, e := k.ModIndex("LevelThree")
175+ if e != nil || idx == ^uint32(0) || idx >= 32 {
176+ t.Fatalf("LevelThree: %d %v", idx, e)
177+ }
178+ s.UpdateMask(1<<idx, 0, 0, 0, 0, 0)
179+ }
180+ got, e := s.UTF8(tc.code)
181+ if e != nil || got != tc.want {
182+ t.Fatalf("utf8 %q want %q: %v", got, tc.want, e)
183+ }
184+ sym, e := s.KeySym(tc.code)
185+ if e != nil {
186+ t.Fatal(e)
187+ }
188+ name, e := KeysymName(sym)
189+ if e != nil || name == "" {
190+ t.Fatalf("name %q: %v", name, e)
191+ }
192+ back, e := KeysymFromName(name)
193+ if e != nil || back != sym {
194+ t.Fatalf("name roundtrip %d %d %v", sym, back, e)
195+ }
196+ // Compare safe calls to the independently resolved native entry points for this real rules keymap.
197+ nativeSym := loader.f.Xkb_state_key_get_one_sym(s.h, tc.code)
198+ if nativeSym != sym {
199+ t.Fatalf("native sym %d != %d", nativeSym, sym)
200+ }
201+ nativeN := loader.f.Xkb_state_key_get_utf8(s.h, tc.code, 0, 0)
202+ if nativeN != int32(len(got)) {
203+ t.Fatalf("native bytes %d != %d", nativeN, len(got))
204+ }
205+ })
206+ }
207+ k := rules(t, c, "us,de")
208+ s := state(t, k)
209+ n, e := k.LayoutCount()
210+ if e != nil || n != 2 {
211+ t.Fatalf("layouts %d %v", n, e)
212+ }
213+ s.UpdateMask(0, 0, 0, 0, 0, 1)
214+ group, e := s.Layout()
215+ if e != nil || group != 1 {
216+ t.Fatalf("group %d %v", group, e)
217+ }
218+ v, _ := s.UTF8(29)
219+ if v != "z" {
220+ t.Fatalf("group 1 %q", v)
221+ }
222+ shift, e := k.ModIndex("Shift")
223+ if e != nil || shift >= 32 {
224+ t.Fatalf("shift %d %v", shift, e)
225+ }
226+ s.UpdateMask(1<<shift, 0, 0, 0, 0, 1)
227+ v, _ = s.UTF8(29)
228+ if v != "Z" {
229+ t.Fatalf("shift group 1 %q", v)
230+ }
231+ mods, _ := s.Mods()
232+ if mods&(1<<shift) == 0 {
233+ t.Fatalf("mods %#x", mods)
234+ }
235+}
236+
237+// These expectations are fixed evdev/XKB facts, not values computed by the
238+// binding under test. Every case compiles through the Wayland FD path.
239+func TestFDReferenceKeyEvents(t *testing.T) {
240+ c := live(t)
241+ for _, tc := range []struct {
242+ layout, key, utf8, modifiers string
243+ evdev, group, sym uint32
244+ }{
245+ {"us", "q", "q", "", 16, 0, raw.XKB_KEY_q},
246+ {"us", "Q", "Q", "Shift", 16, 0, raw.XKB_KEY_Q},
247+ {"us", "Q", "Q", "Lock", 16, 0, raw.XKB_KEY_Q},
248+ {"fr", "a", "a", "", 16, 0, raw.XKB_KEY_a},
249+ {"fr", "€", "€", "Mod5", 18, 0, raw.XKB_KEY_EuroSign},
250+ {"de", "z", "z", "", 21, 0, raw.XKB_KEY_z},
251+ {"de", "@", "@", "Mod5", 16, 0, raw.XKB_KEY_at},
252+ {"de", "dead_circumflex", "", "", 41, 0, raw.XKB_KEY_dead_circumflex},
253+ {"us,fr", "a", "a", "", 16, 1, raw.XKB_KEY_a},
254+ } {
255+ t.Run(tc.layout+"/"+tc.key+"/"+tc.modifiers, func(t *testing.T) {
256+ // Wayland-format keymaps pinned in testdata/keymaps were produced by
257+ // `xkbcli compile-keymap --output-format 1` (libxkbcommon 1.13.2), so
258+ // the FD path is always exercised without optional tools.
259+ text, e := os.ReadFile("testdata/keymaps/" + strings.ReplaceAll(tc.layout, ",", "_") + ".xkb")
260+ if e != nil {
261+ t.Fatal(e)
262+ }
263+ f := keymapFile(t, append(text, 0))
264+ k, e := c.NewKeymapFD(int(f.Fd()), len(text)+1)
265+ if e != nil {
266+ t.Fatal(e)
267+ }
268+ t.Cleanup(func() { k.Close() })
269+ s := state(t, k)
270+ var mask uint32
271+ if tc.modifiers != "" {
272+ idx, e := k.ModIndex(tc.modifiers)
273+ if e != nil || idx >= 32 {
274+ t.Fatalf("modifier %s: %d %v", tc.modifiers, idx, e)
275+ }
276+ mask = 1 << idx
277+ }
278+ var depressed, locked uint32
279+ if tc.modifiers == "Lock" {
280+ locked = mask
281+ } else {
282+ depressed = mask
283+ }
284+ if _, e := s.UpdateMask(depressed, 0, locked, 0, 0, tc.group); e != nil {
285+ t.Fatal(e)
286+ }
287+ if group, e := s.Layout(); e != nil || group != tc.group {
288+ t.Fatalf("group %d: %v", group, e)
289+ }
290+ code := WaylandKeycode(tc.evdev)
291+ if sym, e := s.KeySym(code); e != nil || sym != tc.sym {
292+ t.Fatalf("keysym %#x want %#x: %v", sym, tc.sym, e)
293+ }
294+ if v, e := s.UTF8(code); e != nil || v != tc.utf8 {
295+ t.Fatalf("utf8 %q want %q: %v", v, tc.utf8, e)
296+ }
297+ if tc.sym == raw.XKB_KEY_dead_circumflex {
298+ if v, e := s.UTF8(WaylandKeycode(18)); e != nil || v != "e" {
299+ t.Fatalf("compose input e: %q %v", v, e)
300+ }
301+ table, e := c.NewComposeTable("en_US.UTF-8")
302+ if e != nil {
303+ t.Fatal(e)
304+ }
305+ t.Cleanup(func() { table.Close() })
306+ compose, e := table.NewState()
307+ if e != nil {
308+ t.Fatal(e)
309+ }
310+ t.Cleanup(func() { compose.Close() })
311+ if _, e := compose.Feed(tc.sym); e != nil {
312+ t.Fatal(e)
313+ }
314+ if _, e := compose.Feed(raw.XKB_KEY_e); e != nil {
315+ t.Fatal(e)
316+ }
317+ if status, e := compose.Status(); e != nil || status != raw.XKB_COMPOSE_COMPOSED {
318+ t.Fatalf("compose status %d: %v", status, e)
319+ }
320+ if sym, e := compose.KeySym(); e != nil || sym != raw.XKB_KEY_ecircumflex {
321+ t.Fatalf("compose sym %#x: %v", sym, e)
322+ }
323+ if v, e := compose.UTF8(); e != nil || v != "ê" {
324+ t.Fatalf("compose utf8 %q: %v", v, e)
325+ }
326+ }
327+ if _, e := exec.LookPath("xkbcli"); e == nil && tc.group == 0 && tc.modifiers != "Lock" {
328+ args := []string{"how-to-type", "--layout", tc.layout}
329+ if tc.sym == raw.XKB_KEY_dead_circumflex {
330+ args = append(args, "--keysym")
331+ }
332+ out, e := exec.Command("xkbcli", append(args, tc.key)...).Output()
333+ if e != nil {
334+ t.Fatal(e)
335+ }
336+ // The CLI reports XKB keycodes, not evdev codes.
337+ pattern := regexp.MustCompile(`(?m)^\s*` + fmt.Sprint(code) + `\s+\S+\s+\d+\s+.*\[.*\]`)
338+ if !pattern.Match(out) {
339+ t.Fatalf("xkbcli how-to-type lacks keycode %d: %s", code, out)
340+ }
341+ }
342+ })
343+ }
344+}
345+
346+func TestCompose(t *testing.T) {
347+ c := live(t)
348+ table, e := c.NewComposeTable("en_US.UTF-8")
349+ if e != nil {
350+ t.Fatal(e)
351+ }
352+ s, e := table.NewState()
353+ if e != nil {
354+ t.Fatal(e)
355+ }
356+ table.Close()
357+ c.Close()
358+ if _, e = s.Feed(raw.XKB_KEY_dead_acute); e != nil {
359+ t.Fatal(e)
360+ }
361+ status, _ := s.Status()
362+ if status != raw.XKB_COMPOSE_COMPOSING {
363+ t.Fatalf("status %d", status)
364+ }
365+ s.Feed(raw.XKB_KEY_e)
366+ status, _ = s.Status()
367+ if status != raw.XKB_COMPOSE_COMPOSED {
368+ t.Fatalf("status %d", status)
369+ }
370+ v, e := s.UTF8()
371+ if e != nil || v != "é" {
372+ t.Fatalf("compose %q %v", v, e)
373+ }
374+ s.Reset()
375+ s.Feed(raw.XKB_KEY_Multi_key)
376+ s.Feed(raw.XKB_KEY_apostrophe)
377+ s.Feed(raw.XKB_KEY_e)
378+ v, _ = s.UTF8()
379+ if v != "é" {
380+ t.Fatalf("multikey %q", v)
381+ }
382+ s.Close()
383+ s.Close()
384+ table.Close()
385+ if _, e = s.UTF8(); !errors.Is(e, ErrClosed) {
386+ t.Fatal(e)
387+ }
388+}
389+func TestSizing(t *testing.T) {
390+ v, e := sizedUTF8(func(p, n uintptr) int32 { return 0 })
391+ if e != nil || v != "" {
392+ t.Fatalf("%q %v", v, e)
393+ }
394+ _, e = sizedUTF8(func(p, n uintptr) int32 { return -1 })
395+ if e == nil {
396+ t.Fatal("negative result accepted")
397+ }
398+ v, e = KeysymName(raw.XKB_KEY_EuroSign)
399+ if e != nil || v != "EuroSign" {
400+ t.Fatalf("name %q %v", v, e)
401+ }
402+}

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 1

Tags 2

↑↓ moveenter openesc close