Browse Source

Merge branch 'master' of github.com:odin-lang/Odin into posix-linux

Isaac Andrade 1 year ago
parent
commit
45322023e3
67 changed files with 2993 additions and 2652 deletions
  1. 2 0
      base/intrinsics/intrinsics.odin
  2. 2 2
      base/runtime/default_allocators_nil.odin
  3. 34 0
      base/runtime/thread_management.odin
  4. 20 15
      core/encoding/uuid/writing.odin
  5. 9 9
      core/hash/xxhash/xxhash_64.odin
  6. 2 0
      core/image/common.odin
  7. 1 1
      core/math/big/common.odin
  8. 2 2
      core/mem/alloc.odin
  9. 18 14
      core/net/dns_windows.odin
  10. 5 0
      core/os/os2/allocators.odin
  11. 0 3
      core/os/os2/file_util.odin
  12. 14 13
      core/os/os2/process.odin
  13. 5 11
      core/os/os2/process_linux.odin
  14. 8 11
      core/os/os2/process_posix.odin
  15. 133 89
      core/os/os2/process_windows.odin
  16. 3 3
      core/os/os_linux.odin
  17. 6 1
      core/reflect/iterator.odin
  18. 145 152
      core/sys/darwin/CoreFoundation/CFString.odin
  19. 3 3
      core/sys/darwin/xnu_system_call_helpers.odin
  20. 29 29
      core/sys/darwin/xnu_system_call_wrappers.odin
  21. 6 6
      core/sys/freebsd/types.odin
  22. 2 2
      core/sys/windows/dwmapi.odin
  23. 8 8
      core/sys/windows/kernel32.odin
  24. 26 26
      core/sys/windows/types.odin
  25. 1 1
      core/text/table/table.odin
  26. 6 2
      core/thread/thread_pool.odin
  27. 5 1
      core/thread/thread_unix.odin
  28. 5 1
      core/thread/thread_windows.odin
  29. 61 0
      src/check_builtin.cpp
  30. 32 9
      src/check_expr.cpp
  31. 10 1
      src/check_stmt.cpp
  32. 29 9
      src/checker.cpp
  33. 7 0
      src/checker_builtin_procs.hpp
  34. 13 3
      src/llvm_backend_debug.cpp
  35. 1 1
      src/llvm_backend_utility.cpp
  36. 39 9
      src/parser.cpp
  37. 5 1
      src/parser.hpp
  38. 12 12
      tests/core/c/libc/test_core_libc_complex_pow.odin
  39. 1 1
      tests/core/container/test_core_rbtree.odin
  40. 1 1
      tests/core/encoding/json/test_core_json.odin
  41. 5 5
      tests/core/encoding/xml/test_core_xml.odin
  42. 3 0
      tests/core/runtime/test_core_runtime.odin
  43. 1 2
      tests/core/unicode/test_core_unicode.odin
  44. 1 1
      vendor/commonmark/cmark.odin
  45. 4 4
      vendor/directx/d3d12/d3d12.odin
  46. 2 2
      vendor/directx/dxc/dxcapi.odin
  47. 1 1
      vendor/lua/5.4/lua.odin
  48. 3 3
      vendor/miniaudio/decoding.odin
  49. 3 3
      vendor/miniaudio/device_io_types.odin
  50. 23 8
      vendor/raylib/raylib.odin
  51. 6 0
      vendor/sdl2/sdl2.odin
  52. 4 4
      vendor/sdl2/sdl_events.odin
  53. 23 23
      vendor/sdl2/sdl_gamecontroller.odin
  54. 4 4
      vendor/sdl2/sdl_touch.odin
  55. 1 1
      vendor/stb/image/stb_image_resize.odin
  56. 2 2
      vendor/wgpu/README.md
  57. 3 1
      vendor/wgpu/examples/glfw/main.odin
  58. 3 1
      vendor/wgpu/examples/sdl2/main.odin
  59. BIN
      vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.dll
  60. BIN
      vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.dll.lib
  61. BIN
      vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.lib
  62. BIN
      vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.pdb
  63. 2 0
      vendor/wgpu/sdl2glue/glue_linux.odin
  64. 91 96
      vendor/wgpu/wgpu.js
  65. 111 53
      vendor/wgpu/wgpu.odin
  66. 1675 1675
      vendor/x11/xlib/xlib_keysym.odin
  67. 311 311
      vendor/x11/xlib/xlib_types.odin

+ 2 - 0
base/intrinsics/intrinsics.odin

@@ -219,6 +219,8 @@ type_map_cell_info :: proc($T: typeid)           -> ^runtime.Map_Cell_Info ---
 type_convert_variants_to_pointers :: proc($T: typeid) -> typeid where type_is_union(T) ---
 type_convert_variants_to_pointers :: proc($T: typeid) -> typeid where type_is_union(T) ---
 type_merge :: proc($U, $V: typeid) -> typeid where type_is_union(U), type_is_union(V) ---
 type_merge :: proc($U, $V: typeid) -> typeid where type_is_union(U), type_is_union(V) ---
 
 
+type_has_shared_fields :: proc($U, $V: typeid) -> bool typeid where type_is_struct(U), type_is_struct(V) ---
+
 constant_utf16_cstring :: proc($literal: string) -> [^]u16 ---
 constant_utf16_cstring :: proc($literal: string) -> [^]u16 ---
 
 
 constant_log2 :: proc($v: $T) -> T where type_is_integer(T) ---
 constant_log2 :: proc($v: $T) -> T where type_is_integer(T) ---

+ 2 - 2
base/runtime/default_allocators_nil.odin

@@ -1,8 +1,8 @@
 package runtime
 package runtime
 
 
 nil_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode,
 nil_allocator_proc :: proc(allocator_data: rawptr, mode: Allocator_Mode,
-                               size, alignment: int,
-                               old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) {
+                           size, alignment: int,
+                           old_memory: rawptr, old_size: int, loc := #caller_location) -> ([]byte, Allocator_Error) {
 	switch mode {
 	switch mode {
 	case .Alloc, .Alloc_Non_Zeroed:
 	case .Alloc, .Alloc_Non_Zeroed:
 		return nil, .Out_Of_Memory
 		return nil, .Out_Of_Memory

+ 34 - 0
base/runtime/thread_management.odin

@@ -0,0 +1,34 @@
+package runtime
+
+Thread_Local_Cleaner :: #type proc "odin" ()
+
+@(private="file")
+thread_local_cleaners: [8]Thread_Local_Cleaner
+
+// Add a procedure that will be run at the end of a thread for the purpose of
+// deallocating state marked as `thread_local`.
+//
+// Intended to be called in an `init` procedure of a package with
+// dynamically-allocated memory that is stored in `thread_local` variables.
+add_thread_local_cleaner :: proc "contextless" (p: Thread_Local_Cleaner) {
+	for &v in thread_local_cleaners {
+		if v == nil {
+			v = p
+			return
+		}
+	}
+	panic_contextless("There are no more thread-local cleaner slots available.")
+}
+
+// Run all of the thread-local cleaner procedures.
+//
+// Intended to be called by the internals of a threading API at the end of a
+// thread's lifetime.
+run_thread_local_cleaners :: proc "odin" () {
+	for p in thread_local_cleaners {
+		if p == nil {
+			break
+		}
+		p()
+	}
+}

+ 20 - 15
core/encoding/uuid/writing.odin

@@ -11,7 +11,7 @@ Write a UUID in the 8-4-4-4-12 format.
 This procedure performs error checking with every byte written.
 This procedure performs error checking with every byte written.
 
 
 If you can guarantee beforehand that your stream has enough space to hold the
 If you can guarantee beforehand that your stream has enough space to hold the
-UUID (32 bytes), then it is better to use `unsafe_write` instead as that will
+UUID (36 bytes), then it is better to use `unsafe_write` instead as that will
 be faster.
 be faster.
 
 
 Inputs:
 Inputs:
@@ -22,7 +22,7 @@ Returns:
 - error: An `io` error, if one occurred, otherwise `nil`.
 - error: An `io` error, if one occurred, otherwise `nil`.
 */
 */
 write :: proc(w: io.Writer, id: Identifier) -> (error: io.Error) #no_bounds_check {
 write :: proc(w: io.Writer, id: Identifier) -> (error: io.Error) #no_bounds_check {
-	write_octet :: proc (w: io.Writer, octet: u8) -> io.Error #no_bounds_check {
+	write_octet :: proc(w: io.Writer, octet: u8) -> io.Error #no_bounds_check {
 		high_nibble := octet >> 4
 		high_nibble := octet >> 4
 		low_nibble := octet & 0xF
 		low_nibble := octet & 0xF
 
 
@@ -31,15 +31,15 @@ write :: proc(w: io.Writer, id: Identifier) -> (error: io.Error) #no_bounds_chec
 		return nil
 		return nil
 	}
 	}
 
 
-	for index in  0 ..<  4 { write_octet(w, id[index]) or_return }
+	for index in 0 ..< 4 {write_octet(w, id[index]) or_return}
 	io.write_byte(w, '-') or_return
 	io.write_byte(w, '-') or_return
-	for index in  4 ..<  6 { write_octet(w, id[index]) or_return }
+	for index in 4 ..< 6 {write_octet(w, id[index]) or_return}
 	io.write_byte(w, '-') or_return
 	io.write_byte(w, '-') or_return
-	for index in  6 ..<  8 { write_octet(w, id[index]) or_return }
+	for index in 6 ..< 8 {write_octet(w, id[index]) or_return}
 	io.write_byte(w, '-') or_return
 	io.write_byte(w, '-') or_return
-	for index in  8 ..< 10 { write_octet(w, id[index]) or_return }
+	for index in 8 ..< 10 {write_octet(w, id[index]) or_return}
 	io.write_byte(w, '-') or_return
 	io.write_byte(w, '-') or_return
-	for index in 10 ..< 16 { write_octet(w, id[index]) or_return }
+	for index in 10 ..< 16 {write_octet(w, id[index]) or_return}
 
 
 	return nil
 	return nil
 }
 }
@@ -54,7 +54,7 @@ Inputs:
 - id: The identifier to convert.
 - id: The identifier to convert.
 */
 */
 unsafe_write :: proc(w: io.Writer, id: Identifier) #no_bounds_check {
 unsafe_write :: proc(w: io.Writer, id: Identifier) #no_bounds_check {
-	write_octet :: proc (w: io.Writer, octet: u8) #no_bounds_check {
+	write_octet :: proc(w: io.Writer, octet: u8) #no_bounds_check {
 		high_nibble := octet >> 4
 		high_nibble := octet >> 4
 		low_nibble := octet & 0xF
 		low_nibble := octet & 0xF
 
 
@@ -62,15 +62,15 @@ unsafe_write :: proc(w: io.Writer, id: Identifier) #no_bounds_check {
 		io.write_byte(w, strconv.digits[low_nibble])
 		io.write_byte(w, strconv.digits[low_nibble])
 	}
 	}
 
 
-	for index in  0 ..<  4 { write_octet(w, id[index]) }
+	for index in 0 ..< 4 {write_octet(w, id[index])}
 	io.write_byte(w, '-')
 	io.write_byte(w, '-')
-	for index in  4 ..<  6 { write_octet(w, id[index]) }
+	for index in 4 ..< 6 {write_octet(w, id[index])}
 	io.write_byte(w, '-')
 	io.write_byte(w, '-')
-	for index in  6 ..<  8 { write_octet(w, id[index]) }
+	for index in 6 ..< 8 {write_octet(w, id[index])}
 	io.write_byte(w, '-')
 	io.write_byte(w, '-')
-	for index in  8 ..< 10 { write_octet(w, id[index]) }
+	for index in 8 ..< 10 {write_octet(w, id[index])}
 	io.write_byte(w, '-')
 	io.write_byte(w, '-')
-	for index in 10 ..< 16 { write_octet(w, id[index]) }
+	for index in 10 ..< 16 {write_octet(w, id[index])}
 }
 }
 
 
 /*
 /*
@@ -106,7 +106,7 @@ Convert a UUID to a string in the 8-4-4-4-12 format.
 
 
 Inputs:
 Inputs:
 - id: The identifier to convert.
 - id: The identifier to convert.
-- buffer: A byte buffer to store the result. Must be at least 32 bytes large.
+- buffer: A byte buffer to store the result. Must be at least 36 bytes large.
 - loc: The caller location for debugging purposes (default: #caller_location)
 - loc: The caller location for debugging purposes (default: #caller_location)
 
 
 Returns:
 Returns:
@@ -119,7 +119,11 @@ to_string_buffer :: proc(
 ) -> (
 ) -> (
 	str: string,
 	str: string,
 ) {
 ) {
-	assert(len(buffer) >= EXPECTED_LENGTH, "The buffer provided is not at least 32 bytes large.", loc)
+	assert(
+		len(buffer) >= EXPECTED_LENGTH,
+		"The buffer provided is not at least 36 bytes large.",
+		loc,
+	)
 	builder := strings.builder_from_bytes(buffer)
 	builder := strings.builder_from_bytes(buffer)
 	unsafe_write(strings.to_writer(&builder), id)
 	unsafe_write(strings.to_writer(&builder), id)
 	return strings.to_string(builder)
 	return strings.to_string(builder)
@@ -129,3 +133,4 @@ to_string :: proc {
 	to_string_allocated,
 	to_string_allocated,
 	to_string_buffer,
 	to_string_buffer,
 }
 }
+

+ 9 - 9
core/hash/xxhash/xxhash_64.odin

@@ -19,15 +19,15 @@ xxh_u64    :: u64
 XXH64_DEFAULT_SEED :: XXH64_hash(0)
 XXH64_DEFAULT_SEED :: XXH64_hash(0)
 
 
 XXH64_state :: struct {
 XXH64_state :: struct {
-   total_len:    XXH64_hash,    /*!< Total length hashed. This is always 64-bit. */
-   v1:           XXH64_hash,    /*!< First accumulator lane */
-   v2:           XXH64_hash,    /*!< Second accumulator lane */
-   v3:           XXH64_hash,    /*!< Third accumulator lane */
-   v4:           XXH64_hash,    /*!< Fourth accumulator lane */
-   mem64:        [4]XXH64_hash, /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */
-   memsize:      XXH32_hash,    /*!< Amount of data in @ref mem64 */
-   reserved32:   XXH32_hash,    /*!< Reserved field, needed for padding anyways*/
-   reserved64:   XXH64_hash,    /*!< Reserved field. Do not read or write to it, it may be removed. */
+	total_len:    XXH64_hash,    /*!< Total length hashed. This is always 64-bit. */
+	v1:           XXH64_hash,    /*!< First accumulator lane */
+	v2:           XXH64_hash,    /*!< Second accumulator lane */
+	v3:           XXH64_hash,    /*!< Third accumulator lane */
+	v4:           XXH64_hash,    /*!< Fourth accumulator lane */
+	mem64:        [4]XXH64_hash, /*!< Internal buffer for partial reads. Treated as unsigned char[32]. */
+	memsize:      XXH32_hash,    /*!< Amount of data in @ref mem64 */
+	reserved32:   XXH32_hash,    /*!< Reserved field, needed for padding anyways*/
+	reserved64:   XXH64_hash,    /*!< Reserved field. Do not read or write to it, it may be removed. */
 }
 }
 
 
 XXH64_canonical :: struct {
 XXH64_canonical :: struct {

+ 2 - 0
core/image/common.odin

@@ -1393,6 +1393,7 @@ expand_grayscale :: proc(img: ^Image, allocator := context.allocator) -> (ok: bo
 			for p in inp {
 			for p in inp {
 				out[0].rgb = p.r // Gray component.
 				out[0].rgb = p.r // Gray component.
 				out[0].a   = p.g // Alpha component.
 				out[0].a   = p.g // Alpha component.
+				out    = out[1:]
 			}
 			}
 
 
 		case:
 		case:
@@ -1417,6 +1418,7 @@ expand_grayscale :: proc(img: ^Image, allocator := context.allocator) -> (ok: bo
 			for p in inp {
 			for p in inp {
 				out[0].rgb = p.r // Gray component.
 				out[0].rgb = p.r // Gray component.
 				out[0].a   = p.g // Alpha component.
 				out[0].a   = p.g // Alpha component.
+				out    = out[1:]
 			}
 			}
 
 
 		case:
 		case:

+ 1 - 1
core/math/big/common.odin

@@ -195,7 +195,7 @@ Error_String :: #sparse[Error]string{
 }
 }
 
 
 Primality_Flag :: enum u8 {
 Primality_Flag :: enum u8 {
- 	Blum_Blum_Shub = 0,  // Make prime congruent to 3 mod 4
+	Blum_Blum_Shub = 0,  // Make prime congruent to 3 mod 4
 	Safe           = 1,  // Make sure (p-1)/2 is prime as well (implies .Blum_Blum_Shub)
 	Safe           = 1,  // Make sure (p-1)/2 is prime as well (implies .Blum_Blum_Shub)
 	Second_MSB_On  = 3,  // Make the 2nd highest bit one
 	Second_MSB_On  = 3,  // Make the 2nd highest bit one
 }
 }

+ 2 - 2
core/mem/alloc.odin

@@ -178,11 +178,11 @@ make_dynamic_array :: proc($T: typeid/[dynamic]$E, allocator := context.allocato
 }
 }
 @(require_results)
 @(require_results)
 make_dynamic_array_len :: proc($T: typeid/[dynamic]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) {
 make_dynamic_array_len :: proc($T: typeid/[dynamic]$E, #any_int len: int, allocator := context.allocator, loc := #caller_location) -> (T, Allocator_Error) {
-	return runtime.make_dynamic_array(T, len, allocator, loc)
+	return runtime.make_dynamic_array_len_cap(T, len, len, allocator, loc)
 }
 }
 @(require_results)
 @(require_results)
 make_dynamic_array_len_cap :: proc($T: typeid/[dynamic]$E, #any_int len: int, #any_int cap: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) {
 make_dynamic_array_len_cap :: proc($T: typeid/[dynamic]$E, #any_int len: int, #any_int cap: int, allocator := context.allocator, loc := #caller_location) -> (array: T, err: Allocator_Error) {
-	return runtime.make_dynamic_array(T, len, cap, allocator, loc)
+	return runtime.make_dynamic_array_len_cap(T, len, cap, allocator, loc)
 }
 }
 @(require_results)
 @(require_results)
 make_map :: proc($T: typeid/map[$K]$E, #any_int cap: int = 1<<runtime.MAP_MIN_LOG2_CAPACITY, allocator := context.allocator, loc := #caller_location) -> (m: T, err: Allocator_Error) {
 make_map :: proc($T: typeid/map[$K]$E, #any_int cap: int = 1<<runtime.MAP_MIN_LOG2_CAPACITY, allocator := context.allocator, loc := #caller_location) -> (m: T, err: Allocator_Error) {

+ 18 - 14
core/net/dns_windows.odin

@@ -128,33 +128,37 @@ _get_dns_records_os :: proc(hostname: string, type: DNS_Record_Type, allocator :
 			append(&recs, record)
 			append(&recs, record)
 
 
 		case .SRV:
 		case .SRV:
-			target   := strings.clone(string(r.Data.SRV.pNameTarget)) // The target hostname/address that the service can be found on
-			priority := int(r.Data.SRV.wPriority)
-			weight   := int(r.Data.SRV.wWeight)
-			port     := int(r.Data.SRV.wPort)
-
 			// NOTE(tetra): Srv record name should be of the form '_servicename._protocol.hostname'
 			// NOTE(tetra): Srv record name should be of the form '_servicename._protocol.hostname'
 			// The record name is the name of the record.
 			// The record name is the name of the record.
 			// Not to be confused with the _target_ of the record, which is--in combination with the port--what we're looking up
 			// Not to be confused with the _target_ of the record, which is--in combination with the port--what we're looking up
 			// by making this request in the first place.
 			// by making this request in the first place.
 
 
-			// NOTE(Jeroen): Service Name and Protocol Name can probably just be string slices into the record name.
-			// It's already cloned, after all. I wouldn't put them on the temp allocator like this.
+			service_name, protocol_name: string
+
+			s := base_record.record_name
+			i := strings.index_byte(s, '.')
+			if i > -1 {
+				service_name = s[:i]
+				s = s[len(service_name) + 1:]
+			} else {
+				continue
+			}
 
 
-			parts := strings.split_n(base_record.record_name, ".", 3, context.temp_allocator)
-			if len(parts) != 3 {
+			i  = strings.index_byte(s, '.')
+			if i > -1 {
+				protocol_name = s[:i]
+			} else {
 				continue
 				continue
 			}
 			}
-			service_name, protocol_name := parts[0], parts[1]
 
 
 			append(&recs, DNS_Record_SRV {
 			append(&recs, DNS_Record_SRV {
 				base          = base_record,
 				base          = base_record,
-				target        = target,
-				port          = port,
+				target        = strings.clone(string(r.Data.SRV.pNameTarget)), // The target hostname/address that the service can be found on
+				port          = int(r.Data.SRV.wPort),
 				service_name  = service_name,
 				service_name  = service_name,
 				protocol_name = protocol_name,
 				protocol_name = protocol_name,
-				priority      = priority,
-				weight        = weight,
+				priority      = int(r.Data.SRV.wPriority),
+				weight        = int(r.Data.SRV.wWeight),
 
 
 			})
 			})
 		}
 		}

+ 5 - 0
core/os/os2/allocators.odin

@@ -61,3 +61,8 @@ TEMP_ALLOCATOR_GUARD :: #force_inline proc(loc := #caller_location) -> (runtime.
 	global_default_temp_allocator_index = (global_default_temp_allocator_index+1)%MAX_TEMP_ARENA_COUNT
 	global_default_temp_allocator_index = (global_default_temp_allocator_index+1)%MAX_TEMP_ARENA_COUNT
 	return tmp, loc
 	return tmp, loc
 }
 }
+
+@(init, private)
+init_thread_local_cleaner :: proc() {
+	runtime.add_thread_local_cleaner(temp_allocator_fini)
+}

+ 0 - 3
core/os/os2/file_util.odin

@@ -125,9 +125,6 @@ read_entire_file_from_file :: proc(f: ^File, allocator: runtime.Allocator) -> (d
 			has_size = true
 			has_size = true
 			size = int(size64)
 			size = int(size64)
 		}
 		}
-	} else if serr != .No_Size {
-		err = serr
-		return
 	}
 	}
 
 
 	if has_size && size > 0 {
 	if has_size && size > 0 {

+ 14 - 13
core/os/os2/process.odin

@@ -166,15 +166,15 @@ Process_Info :: struct {
 
 
 	This procedure obtains an information, specified by `selection` parameter of
 	This procedure obtains an information, specified by `selection` parameter of
 	a process given by `pid`.
 	a process given by `pid`.
-	
-	Use `free_process_info` to free the memory allocated by this procedure. In
-	case the function returns an error it may only have been an error for one part
-	of the information and you would still need to call it to free the other parts.
+
+	Use `free_process_info` to free the memory allocated by this procedure. The
+	`free_process_info` procedure needs to be called, even if this procedure
+	returned an error, as some of the fields may have been allocated.
 
 
 	**Note**: The resulting information may or may contain the fields specified
 	**Note**: The resulting information may or may contain the fields specified
 	by the `selection` parameter. Always check whether the returned
 	by the `selection` parameter. Always check whether the returned
 	`Process_Info` struct has the required fields before checking the error code
 	`Process_Info` struct has the required fields before checking the error code
-	returned by this function.
+	returned by this procedure.
 */
 */
 @(require_results)
 @(require_results)
 process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (Process_Info, Error) {
 process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (Process_Info, Error) {
@@ -188,14 +188,14 @@ process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator:
 	about a process that has been opened by the application, specified in
 	about a process that has been opened by the application, specified in
 	the `process` parameter.
 	the `process` parameter.
 
 
-	Use `free_process_info` to free the memory allocated by this procedure. In
-	case the function returns an error it may only have been an error for one part
-	of the information and you would still need to call it to free the other parts.
+	Use `free_process_info` to free the memory allocated by this procedure. The
+	`free_process_info` procedure needs to be called, even if this procedure
+	returned an error, as some of the fields may have been allocated.
 
 
 	**Note**: The resulting information may or may contain the fields specified
 	**Note**: The resulting information may or may contain the fields specified
 	by the `selection` parameter. Always check whether the returned
 	by the `selection` parameter. Always check whether the returned
 	`Process_Info` struct has the required fields before checking the error code
 	`Process_Info` struct has the required fields before checking the error code
-	returned by this function.
+	returned by this procedure.
 */
 */
 @(require_results)
 @(require_results)
 process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (Process_Info, Error) {
 process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (Process_Info, Error) {
@@ -208,14 +208,14 @@ process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields,
 	This procedure obtains the information, specified by `selection` parameter
 	This procedure obtains the information, specified by `selection` parameter
 	about the currently running process.
 	about the currently running process.
 
 
-	Use `free_process_info` to free the memory allocated by this procedure. In
-	case the function returns an error it may only have been an error for one part
-	of the information and you would still need to call it to free the other parts.
+	Use `free_process_info` to free the memory allocated by this procedure. The
+	`free_process_info` procedure needs to be called, even if this procedure
+	returned an error, as some of the fields may have been allocated.
 
 
 	**Note**: The resulting information may or may contain the fields specified
 	**Note**: The resulting information may or may contain the fields specified
 	by the `selection` parameter. Always check whether the returned
 	by the `selection` parameter. Always check whether the returned
 	`Process_Info` struct has the required fields before checking the error code
 	`Process_Info` struct has the required fields before checking the error code
-	returned by this function.
+	returned by this procedure.
 */
 */
 @(require_results)
 @(require_results)
 current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime.Allocator) -> (Process_Info, Error) {
 current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime.Allocator) -> (Process_Info, Error) {
@@ -305,6 +305,7 @@ Process_Desc :: struct {
 	// A slice of strings, each having the format `KEY=VALUE` representing the
 	// A slice of strings, each having the format `KEY=VALUE` representing the
 	// full environment that the child process will receive.
 	// full environment that the child process will receive.
 	// In case this slice is `nil`, the current process' environment is used.
 	// In case this slice is `nil`, the current process' environment is used.
+	// NOTE(laytan): maybe should be `Maybe([]string)` so you can do `nil` == current env, empty == empty/no env.
 	env: []string,
 	env: []string,
 	// The `stderr` handle to give to the child process. It can be either a file
 	// The `stderr` handle to give to the child process. It can be either a file
 	// or a writeable end of a pipe. Passing `nil` will shut down the process'
 	// or a writeable end of a pipe. Passing `nil` will shut down the process'

+ 5 - 11
core/os/os2/process_linux.odin

@@ -490,7 +490,6 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
 	if errno = linux.pipe2(&child_pipe_fds, {.CLOEXEC}); errno != .NONE {
 	if errno = linux.pipe2(&child_pipe_fds, {.CLOEXEC}); errno != .NONE {
 		return process, _get_platform_error(errno)
 		return process, _get_platform_error(errno)
 	}
 	}
-	defer linux.close(child_pipe_fds[WRITE])
 	defer linux.close(child_pipe_fds[READ])
 	defer linux.close(child_pipe_fds[READ])
 
 
 
 
@@ -508,6 +507,7 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
 	//
 	//
 	pid: linux.Pid
 	pid: linux.Pid
 	if pid, errno = linux.fork(); errno != .NONE {
 	if pid, errno = linux.fork(); errno != .NONE {
+		linux.close(child_pipe_fds[WRITE])
 		return process, _get_platform_error(errno)
 		return process, _get_platform_error(errno)
 	}
 	}
 
 
@@ -573,25 +573,19 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
 			write_errno_to_parent_and_abort(child_pipe_fds[WRITE], errno)
 			write_errno_to_parent_and_abort(child_pipe_fds[WRITE], errno)
 		}
 		}
 
 
-		success_byte: [1]u8
-		linux.write(child_pipe_fds[WRITE], success_byte[:])
-
 		errno = linux.execveat(exe_fd, "", &cargs[0], env, {.AT_EMPTY_PATH})
 		errno = linux.execveat(exe_fd, "", &cargs[0], env, {.AT_EMPTY_PATH})
-
-		// NOTE: we can't tell the parent about this failure because we already wrote the success byte.
-		// So if this happens the user will just see the process failed when they call process_wait.
-
 		assert(errno != nil)
 		assert(errno != nil)
-		intrinsics.trap()
+		write_errno_to_parent_and_abort(child_pipe_fds[WRITE], errno)
 	}
 	}
 
 
+	linux.close(child_pipe_fds[WRITE])
+
 	process.pid = int(pid)
 	process.pid = int(pid)
 
 
-	n: int
 	child_byte: [1]u8
 	child_byte: [1]u8
 	errno = .EINTR
 	errno = .EINTR
 	for errno == .EINTR {
 	for errno == .EINTR {
-		n, errno = linux.read(child_pipe_fds[READ], child_byte[:])
+		_, errno = linux.read(child_pipe_fds[READ], child_byte[:])
 	}
 	}
 
 
 	// If the read failed, something weird happened. Do not return the read
 	// If the read failed, something weird happened. Do not return the read

+ 8 - 11
core/os/os2/process_posix.odin

@@ -139,20 +139,22 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
 		err = _get_platform_error()
 		err = _get_platform_error()
 		return
 		return
 	}
 	}
-	defer posix.close(pipe[WRITE])
 	defer posix.close(pipe[READ])
 	defer posix.close(pipe[READ])
 
 
 	if posix.fcntl(pipe[READ], .SETFD, i32(posix.FD_CLOEXEC)) == -1 {
 	if posix.fcntl(pipe[READ], .SETFD, i32(posix.FD_CLOEXEC)) == -1 {
+		posix.close(pipe[WRITE])
 		err = _get_platform_error()
 		err = _get_platform_error()
 		return
 		return
 	}
 	}
 	if posix.fcntl(pipe[WRITE], .SETFD, i32(posix.FD_CLOEXEC)) == -1 {
 	if posix.fcntl(pipe[WRITE], .SETFD, i32(posix.FD_CLOEXEC)) == -1 {
+		posix.close(pipe[WRITE])
 		err = _get_platform_error()
 		err = _get_platform_error()
 		return
 		return
 	}
 	}
 
 
 	switch pid := posix.fork(); pid {
 	switch pid := posix.fork(); pid {
 	case -1:
 	case -1:
+		posix.close(pipe[WRITE])
 		err = _get_platform_error()
 		err = _get_platform_error()
 		return
 		return
 
 
@@ -179,25 +181,20 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) {
 			if posix.chdir(cwd) != .OK { abort(pipe[WRITE]) }
 			if posix.chdir(cwd) != .OK { abort(pipe[WRITE]) }
 		}
 		}
 
 
-		ok := u8(0)
-		posix.write(pipe[WRITE], &ok, 1)
-
 		res := posix.execve(strings.to_cstring(&exe_builder), raw_data(cmd), env)
 		res := posix.execve(strings.to_cstring(&exe_builder), raw_data(cmd), env)
-
-		// NOTE: we can't tell the parent about this failure because we already wrote the success byte.
-		// So if this happens the user will just see the process failed when they call process_wait.
-
 		assert(res == -1)
 		assert(res == -1)
-		runtime.trap()
+		abort(pipe[WRITE])
 
 
 	case:
 	case:
+		posix.close(pipe[WRITE])
+
 		errno: posix.Errno
 		errno: posix.Errno
 		for {
 		for {
 			errno_byte: u8
 			errno_byte: u8
 			switch posix.read(pipe[READ], &errno_byte, 1) {
 			switch posix.read(pipe[READ], &errno_byte, 1) {
-			case 1:
+			case  1:
 				errno = posix.Errno(errno_byte)
 				errno = posix.Errno(errno_byte)
-			case:
+			case -1:
 				errno = posix.errno()
 				errno = posix.errno()
 				if errno == .EINTR {
 				if errno == .EINTR {
 					continue
 					continue

+ 133 - 89
core/os/os2/process_windows.odin

@@ -93,16 +93,33 @@ read_memory_as_slice :: proc(h: win32.HANDLE, addr: rawptr, dest: []$T) -> (byte
 @(private="package")
 @(private="package")
 _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
 _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
 	info.pid = pid
 	info.pid = pid
-	defer if err != nil {
-		free_process_info(info, allocator)
+	// Note(flysand): Open the process handle right away to prevent some race
+	// conditions. Once the handle is open, the process will be kept alive by
+	// the OS.
+	ph := win32.INVALID_HANDLE_VALUE
+	if selection >= {.Command_Line, .Environment, .Working_Dir, .Username} {
+		ph = win32.OpenProcess(
+			win32.PROCESS_QUERY_LIMITED_INFORMATION | win32.PROCESS_VM_READ,
+			false,
+			u32(pid),
+		)
+		if ph == win32.INVALID_HANDLE_VALUE {
+			err = _get_platform_error()
+			return
+		}
 	}
 	}
-
-	// Data obtained from process snapshots
-	if selection >= {.PPid, .Priority} {
+	defer if ph != win32.INVALID_HANDLE_VALUE {
+		win32.CloseHandle(ph)
+	}
+	snapshot_process: if selection >= {.PPid, .Priority} {
 		entry, entry_err := _process_entry_by_pid(info.pid)
 		entry, entry_err := _process_entry_by_pid(info.pid)
 		if entry_err != nil {
 		if entry_err != nil {
-			err = General_Error.Not_Exist
-			return
+			err = entry_err
+			if entry_err == General_Error.Not_Exist {
+				return
+			} else {
+				break snapshot_process
+			}
 		}
 		}
 		if .PPid in selection {
 		if .PPid in selection {
 			info.fields += {.PPid}
 			info.fields += {.PPid}
@@ -113,29 +130,18 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator
 			info.priority = int(entry.pcPriClassBase)
 			info.priority = int(entry.pcPriClassBase)
 		}
 		}
 	}
 	}
-	if .Executable_Path in selection { // snap module
-		info.executable_path = _process_exe_by_pid(pid, allocator) or_return
-		info.fields += {.Executable_Path}
-	}
-
-	ph := win32.INVALID_HANDLE_VALUE
-
-	if selection >= {.Command_Line, .Environment, .Working_Dir, .Username} { // need process handle
-		ph = win32.OpenProcess(
-			win32.PROCESS_QUERY_LIMITED_INFORMATION | win32.PROCESS_VM_READ,
-			false,
-			u32(pid),
-		)
-		if ph == win32.INVALID_HANDLE_VALUE {
-			err = _get_platform_error()
+	snapshot_modules: if .Executable_Path in selection {
+		exe_path: string
+		exe_path, err = _process_exe_by_pid(pid, allocator)
+		if _, ok := err.(runtime.Allocator_Error); ok {
 			return
 			return
+		} else if err != nil {
+			break snapshot_modules
 		}
 		}
+		info.executable_path = exe_path
+		info.fields += {.Executable_Path}
 	}
 	}
-	defer if ph != win32.INVALID_HANDLE_VALUE {
-		win32.CloseHandle(ph)
-	}
-
-	if selection >= {.Command_Line, .Environment, .Working_Dir} { // need peb
+	read_peb: if selection >= {.Command_Line, .Environment, .Working_Dir} {
 		process_info_size: u32
 		process_info_size: u32
 		process_info: win32.PROCESS_BASIC_INFORMATION
 		process_info: win32.PROCESS_BASIC_INFORMATION
 		status := win32.NtQueryInformationProcess(ph, .ProcessBasicInformation, &process_info, size_of(process_info), &process_info_size)
 		status := win32.NtQueryInformationProcess(ph, .ProcessBasicInformation, &process_info, size_of(process_info), &process_info_size)
@@ -143,25 +149,26 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator
 			// TODO(flysand): There's probably a mismatch between NTSTATUS and
 			// TODO(flysand): There's probably a mismatch between NTSTATUS and
 			// windows userland error codes, I haven't checked.
 			// windows userland error codes, I haven't checked.
 			err = Platform_Error(status)
 			err = Platform_Error(status)
-			return
-		}
-		if process_info.PebBaseAddress == nil {
-			// Not sure what the error is
-			err = General_Error.Unsupported
-			return
+			break read_peb
 		}
 		}
+		assert(process_info.PebBaseAddress != nil)
 		process_peb: win32.PEB
 		process_peb: win32.PEB
-
-		_ = read_memory_as_struct(ph, process_info.PebBaseAddress, &process_peb) or_return
-
+		_, err = read_memory_as_struct(ph, process_info.PebBaseAddress, &process_peb)
+		if err != nil {
+			break read_peb
+		}
 		process_params: win32.RTL_USER_PROCESS_PARAMETERS
 		process_params: win32.RTL_USER_PROCESS_PARAMETERS
-		_ = read_memory_as_struct(ph, process_peb.ProcessParameters, &process_params) or_return
-
+		_, err = read_memory_as_struct(ph, process_peb.ProcessParameters, &process_params)
+		if err != nil {
+			break read_peb
+		}
 		if selection >= {.Command_Line, .Command_Args} {
 		if selection >= {.Command_Line, .Command_Args} {
 			TEMP_ALLOCATOR_GUARD()
 			TEMP_ALLOCATOR_GUARD()
 			cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator()) or_return
 			cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator()) or_return
-			_ = read_memory_as_slice(ph, process_params.CommandLine.Buffer, cmdline_w) or_return
-
+			_, err = read_memory_as_slice(ph, process_params.CommandLine.Buffer, cmdline_w)
+			if err != nil {
+				break read_peb
+			}
 			if .Command_Line in selection {
 			if .Command_Line in selection {
 				info.command_line = win32_utf16_to_utf8(cmdline_w, allocator) or_return
 				info.command_line = win32_utf16_to_utf8(cmdline_w, allocator) or_return
 				info.fields += {.Command_Line}
 				info.fields += {.Command_Line}
@@ -175,23 +182,33 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator
 			TEMP_ALLOCATOR_GUARD()
 			TEMP_ALLOCATOR_GUARD()
 			env_len := process_params.EnvironmentSize / 2
 			env_len := process_params.EnvironmentSize / 2
 			envs_w := make([]u16, env_len, temp_allocator()) or_return
 			envs_w := make([]u16, env_len, temp_allocator()) or_return
-			_ = read_memory_as_slice(ph, process_params.Environment, envs_w) or_return
-
+			_, err = read_memory_as_slice(ph, process_params.Environment, envs_w)
+			if err != nil {
+				break read_peb
+			}
 			info.environment = _parse_environment_block(raw_data(envs_w), allocator) or_return
 			info.environment = _parse_environment_block(raw_data(envs_w), allocator) or_return
 			info.fields += {.Environment}
 			info.fields += {.Environment}
 		}
 		}
 		if .Working_Dir in selection {
 		if .Working_Dir in selection {
 			TEMP_ALLOCATOR_GUARD()
 			TEMP_ALLOCATOR_GUARD()
 			cwd_w := make([]u16, process_params.CurrentDirectoryPath.Length, temp_allocator()) or_return
 			cwd_w := make([]u16, process_params.CurrentDirectoryPath.Length, temp_allocator()) or_return
-			_ = read_memory_as_slice(ph, process_params.CurrentDirectoryPath.Buffer, cwd_w) or_return
-
+			_, err = read_memory_as_slice(ph, process_params.CurrentDirectoryPath.Buffer, cwd_w)
+			if err != nil {
+				break read_peb
+			}
 			info.working_dir = win32_utf16_to_utf8(cwd_w, allocator) or_return
 			info.working_dir = win32_utf16_to_utf8(cwd_w, allocator) or_return
 			info.fields += {.Working_Dir}
 			info.fields += {.Working_Dir}
 		}
 		}
 	}
 	}
-
-	if .Username in selection {
-		info.username = _get_process_user(ph, allocator) or_return
+	read_username: if .Username in selection {
+		username: string
+		username, err = _get_process_user(ph, allocator)
+		if _, ok := err.(runtime.Allocator_Error); ok {
+			return
+		} else if err != nil {
+			break read_username
+		}
+		info.username = username
 		info.fields += {.Username}
 		info.fields += {.Username}
 	}
 	}
 	err = nil
 	err = nil
@@ -202,16 +219,16 @@ _process_info_by_pid :: proc(pid: int, selection: Process_Info_Fields, allocator
 _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
 _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
 	pid := process.pid
 	pid := process.pid
 	info.pid = pid
 	info.pid = pid
-	defer if err != nil {
-		free_process_info(info, allocator)
-	}
-
 	// Data obtained from process snapshots
 	// Data obtained from process snapshots
-	if selection >= {.PPid, .Priority} { // snap process
+	snapshot_process: if selection >= {.PPid, .Priority} {
 		entry, entry_err := _process_entry_by_pid(info.pid)
 		entry, entry_err := _process_entry_by_pid(info.pid)
 		if entry_err != nil {
 		if entry_err != nil {
-			err = General_Error.Not_Exist
-			return
+			err = entry_err
+			if entry_err == General_Error.Not_Exist {
+				return
+			} else {
+				break snapshot_process
+			}
 		}
 		}
 		if .PPid in selection {
 		if .PPid in selection {
 			info.fields += {.PPid}
 			info.fields += {.PPid}
@@ -222,12 +239,19 @@ _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields
 			info.priority = int(entry.pcPriClassBase)
 			info.priority = int(entry.pcPriClassBase)
 		}
 		}
 	}
 	}
-	if .Executable_Path in selection { // snap module
-		info.executable_path = _process_exe_by_pid(pid, allocator) or_return
+	snapshot_module: if .Executable_Path in selection {
+		exe_path: string
+		exe_path, err = _process_exe_by_pid(pid, allocator)
+		if _, ok := err.(runtime.Allocator_Error); ok {
+			return
+		} else if err != nil {
+			break snapshot_module
+		}
+		info.executable_path = exe_path
 		info.fields += {.Executable_Path}
 		info.fields += {.Executable_Path}
 	}
 	}
 	ph := win32.HANDLE(process.handle)
 	ph := win32.HANDLE(process.handle)
-	if selection >= {.Command_Line, .Environment, .Working_Dir} { // need peb
+	read_peb: if selection >= {.Command_Line, .Environment, .Working_Dir} {
 		process_info_size: u32
 		process_info_size: u32
 		process_info: win32.PROCESS_BASIC_INFORMATION
 		process_info: win32.PROCESS_BASIC_INFORMATION
 		status := win32.NtQueryInformationProcess(ph, .ProcessBasicInformation, &process_info, size_of(process_info), &process_info_size)
 		status := win32.NtQueryInformationProcess(ph, .ProcessBasicInformation, &process_info, size_of(process_info), &process_info_size)
@@ -237,23 +261,24 @@ _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields
 			err = Platform_Error(status)
 			err = Platform_Error(status)
 			return
 			return
 		}
 		}
-		if process_info.PebBaseAddress == nil {
-			// Not sure what the error is
-			err = General_Error.Unsupported
-			return
-		}
-
+		assert(process_info.PebBaseAddress != nil)
 		process_peb: win32.PEB
 		process_peb: win32.PEB
-		_ = read_memory_as_struct(ph, process_info.PebBaseAddress, &process_peb) or_return
-
+		_, err = read_memory_as_struct(ph, process_info.PebBaseAddress, &process_peb)
+		if err != nil {
+			break read_peb
+		}
 		process_params: win32.RTL_USER_PROCESS_PARAMETERS
 		process_params: win32.RTL_USER_PROCESS_PARAMETERS
-		_ = read_memory_as_struct(ph, process_peb.ProcessParameters, &process_params) or_return
-
+		_, err = read_memory_as_struct(ph, process_peb.ProcessParameters, &process_params)
+		if err != nil {
+			break read_peb
+		}
 		if selection >= {.Command_Line, .Command_Args} {
 		if selection >= {.Command_Line, .Command_Args} {
 			TEMP_ALLOCATOR_GUARD()
 			TEMP_ALLOCATOR_GUARD()
 			cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator()) or_return
 			cmdline_w := make([]u16, process_params.CommandLine.Length, temp_allocator()) or_return
-			_ = read_memory_as_slice(ph, process_params.CommandLine.Buffer, cmdline_w) or_return
-
+			_, err = read_memory_as_slice(ph, process_params.CommandLine.Buffer, cmdline_w)
+			if err != nil {
+				break read_peb
+			}
 			if .Command_Line in selection {
 			if .Command_Line in selection {
 				info.command_line = win32_utf16_to_utf8(cmdline_w, allocator) or_return
 				info.command_line = win32_utf16_to_utf8(cmdline_w, allocator) or_return
 				info.fields += {.Command_Line}
 				info.fields += {.Command_Line}
@@ -263,28 +288,37 @@ _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields
 				info.fields += {.Command_Args}
 				info.fields += {.Command_Args}
 			}
 			}
 		}
 		}
-
 		if .Environment in selection {
 		if .Environment in selection {
 			TEMP_ALLOCATOR_GUARD()
 			TEMP_ALLOCATOR_GUARD()
 			env_len := process_params.EnvironmentSize / 2
 			env_len := process_params.EnvironmentSize / 2
 			envs_w := make([]u16, env_len, temp_allocator()) or_return
 			envs_w := make([]u16, env_len, temp_allocator()) or_return
-			_ = read_memory_as_slice(ph, process_params.Environment, envs_w) or_return
-
+			_, err = read_memory_as_slice(ph, process_params.Environment, envs_w)
+			if err != nil {
+				break read_peb
+			}
 			info.environment =  _parse_environment_block(raw_data(envs_w), allocator) or_return
 			info.environment =  _parse_environment_block(raw_data(envs_w), allocator) or_return
 			info.fields += {.Environment}
 			info.fields += {.Environment}
 		}
 		}
-
 		if .Working_Dir in selection {
 		if .Working_Dir in selection {
 			TEMP_ALLOCATOR_GUARD()
 			TEMP_ALLOCATOR_GUARD()
 			cwd_w := make([]u16, process_params.CurrentDirectoryPath.Length, temp_allocator()) or_return
 			cwd_w := make([]u16, process_params.CurrentDirectoryPath.Length, temp_allocator()) or_return
-			_ = read_memory_as_slice(ph, process_params.CurrentDirectoryPath.Buffer, cwd_w) or_return
-
+			_, err = read_memory_as_slice(ph, process_params.CurrentDirectoryPath.Buffer, cwd_w)
+			if err != nil {
+				break read_peb
+			}
 			info.working_dir = win32_utf16_to_utf8(cwd_w, allocator) or_return
 			info.working_dir = win32_utf16_to_utf8(cwd_w, allocator) or_return
 			info.fields += {.Working_Dir}
 			info.fields += {.Working_Dir}
 		}
 		}
 	}
 	}
-	if .Username in selection {
-		info.username = _get_process_user(ph, allocator) or_return
+	read_username: if .Username in selection {
+		username: string
+		username, err = _get_process_user(ph, allocator)
+		if _, ok := err.(runtime.Allocator_Error); ok {
+			return
+		} else if err != nil {
+			break read_username
+		}
+		info.username = username
 		info.fields += {.Username}
 		info.fields += {.Username}
 	}
 	}
 	err = nil
 	err = nil
@@ -294,15 +328,15 @@ _process_info_by_handle :: proc(process: Process, selection: Process_Info_Fields
 @(private="package")
 @(private="package")
 _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
 _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime.Allocator) -> (info: Process_Info, err: Error) {
 	info.pid = get_pid()
 	info.pid = get_pid()
-	defer if err != nil {
-		free_process_info(info, allocator)
-	}
-
-	if selection >= {.PPid, .Priority} { // snap process
+	snapshot_process: if selection >= {.PPid, .Priority} {
 		entry, entry_err := _process_entry_by_pid(info.pid)
 		entry, entry_err := _process_entry_by_pid(info.pid)
 		if entry_err != nil {
 		if entry_err != nil {
-			err = General_Error.Not_Exist
-			return
+			err = entry_err
+			if entry_err == General_Error.Not_Exist {
+				return
+			} else {
+				break snapshot_process
+			}
 		}
 		}
 		if .PPid in selection {
 		if .PPid in selection {
 			info.fields += {.PPid}
 			info.fields += {.PPid}
@@ -313,14 +347,16 @@ _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime
 			info.priority = int(entry.pcPriClassBase)
 			info.priority = int(entry.pcPriClassBase)
 		}
 		}
 	}
 	}
-	if .Executable_Path in selection {
+	module_filename: if .Executable_Path in selection {
 		exe_filename_w: [256]u16
 		exe_filename_w: [256]u16
 		path_len := win32.GetModuleFileNameW(nil, raw_data(exe_filename_w[:]), len(exe_filename_w))
 		path_len := win32.GetModuleFileNameW(nil, raw_data(exe_filename_w[:]), len(exe_filename_w))
+		assert(path_len > 0)
 		info.executable_path = win32_utf16_to_utf8(exe_filename_w[:path_len], allocator) or_return
 		info.executable_path = win32_utf16_to_utf8(exe_filename_w[:path_len], allocator) or_return
 		info.fields += {.Executable_Path}
 		info.fields += {.Executable_Path}
 	}
 	}
-	if selection >= {.Command_Line,  .Command_Args} {
+	command_line: if selection >= {.Command_Line,  .Command_Args} {
 		command_line_w := win32.GetCommandLineW()
 		command_line_w := win32.GetCommandLineW()
+		assert(command_line_w != nil)
 		if .Command_Line in selection {
 		if .Command_Line in selection {
 			info.command_line = win32_wstring_to_utf8(command_line_w, allocator) or_return
 			info.command_line = win32_wstring_to_utf8(command_line_w, allocator) or_return
 			info.fields += {.Command_Line}
 			info.fields += {.Command_Line}
@@ -330,14 +366,22 @@ _current_process_info :: proc(selection: Process_Info_Fields, allocator: runtime
 			info.fields += {.Command_Args}
 			info.fields += {.Command_Args}
 		}
 		}
 	}
 	}
-	if .Environment in selection {
+	read_environment: if .Environment in selection {
 		env_block := win32.GetEnvironmentStringsW()
 		env_block := win32.GetEnvironmentStringsW()
+		assert(env_block != nil)
 		info.environment = _parse_environment_block(env_block, allocator) or_return
 		info.environment = _parse_environment_block(env_block, allocator) or_return
 		info.fields += {.Environment}
 		info.fields += {.Environment}
 	}
 	}
-	if .Username in selection {
+	read_username: if .Username in selection {
 		process_handle := win32.GetCurrentProcess()
 		process_handle := win32.GetCurrentProcess()
-		info.username = _get_process_user(process_handle, allocator) or_return
+		username: string
+		username, err = _get_process_user(process_handle, allocator)
+		if _, ok := err.(runtime.Allocator_Error); ok {
+			return
+		} else if err != nil {
+			break read_username
+		}
+		info.username = username
 		info.fields += {.Username}
 		info.fields += {.Username}
 	}
 	}
 	if .Working_Dir in selection {
 	if .Working_Dir in selection {

+ 3 - 3
core/os/os_linux.odin

@@ -398,9 +398,9 @@ SIOCGIFFLAG :: enum c.int {
 	PORTSEL        = 13, /* Can set media type.  */
 	PORTSEL        = 13, /* Can set media type.  */
 	AUTOMEDIA      = 14, /* Auto media select active.  */
 	AUTOMEDIA      = 14, /* Auto media select active.  */
 	DYNAMIC        = 15, /* Dialup device with changing addresses.  */
 	DYNAMIC        = 15, /* Dialup device with changing addresses.  */
-        LOWER_UP       = 16,
-        DORMANT        = 17,
-        ECHO           = 18,
+	LOWER_UP       = 16,
+	DORMANT        = 17,
+	ECHO           = 18,
 }
 }
 SIOCGIFFLAGS :: bit_set[SIOCGIFFLAG; c.int]
 SIOCGIFFLAGS :: bit_set[SIOCGIFFLAG; c.int]
 
 

+ 6 - 1
core/reflect/iterator.odin

@@ -19,6 +19,7 @@ iterate_array :: proc(val: any, it: ^int) -> (elem: any, index: int, ok: bool) {
 			elem.data = rawptr(uintptr(val.data) + uintptr(it^ * info.elem_size))
 			elem.data = rawptr(uintptr(val.data) + uintptr(it^ * info.elem_size))
 			elem.id = info.elem.id
 			elem.id = info.elem.id
 			ok = true
 			ok = true
+			index = it^
 			it^ += 1
 			it^ += 1
 		}
 		}
 	case Type_Info_Slice:
 	case Type_Info_Slice:
@@ -27,6 +28,7 @@ iterate_array :: proc(val: any, it: ^int) -> (elem: any, index: int, ok: bool) {
 			elem.data = rawptr(uintptr(array.data) + uintptr(it^ * info.elem_size))
 			elem.data = rawptr(uintptr(array.data) + uintptr(it^ * info.elem_size))
 			elem.id = info.elem.id
 			elem.id = info.elem.id
 			ok = true
 			ok = true
+			index = it^
 			it^ += 1
 			it^ += 1
 		}
 		}
 	case Type_Info_Dynamic_Array:
 	case Type_Info_Dynamic_Array:
@@ -35,6 +37,7 @@ iterate_array :: proc(val: any, it: ^int) -> (elem: any, index: int, ok: bool) {
 			elem.data = rawptr(uintptr(array.data) + uintptr(it^ * info.elem_size))
 			elem.data = rawptr(uintptr(array.data) + uintptr(it^ * info.elem_size))
 			elem.id = info.elem.id
 			elem.id = info.elem.id
 			ok = true
 			ok = true
+			index = it^
 			it^ += 1
 			it^ += 1
 		}
 		}
 	}
 	}
@@ -69,10 +72,12 @@ iterate_map :: proc(val: any, it: ^int) -> (key, value: any, ok: bool) {
 				key.id     = info.key.id
 				key.id     = info.key.id
 				value.id   = info.value.id
 				value.id   = info.value.id
 				ok = true
 				ok = true
+				it^ += 1
 				break
 				break
 			}
 			}
 
 
 		}
 		}
 	}
 	}
 	return
 	return
-}
+}
+

+ 145 - 152
core/sys/darwin/CoreFoundation/CFString.odin

@@ -9,157 +9,157 @@ String :: distinct TypeRef // same as CFStringRef
 StringEncoding :: distinct u32
 StringEncoding :: distinct u32
 
 
 StringBuiltInEncodings :: enum StringEncoding {
 StringBuiltInEncodings :: enum StringEncoding {
-	MacRoman = 0,
+	MacRoman      = 0,
 	WindowsLatin1 = 0x0500,
 	WindowsLatin1 = 0x0500,
-	ISOLatin1 = 0x0201,
+	ISOLatin1     = 0x0201,
 	NextStepLatin = 0x0B01,
 	NextStepLatin = 0x0B01,
-	ASCII = 0x0600,
-	Unicode = 0x0100,
-	UTF8 = 0x08000100,
+	ASCII         = 0x0600,
+	Unicode       = 0x0100,
+	UTF8          = 0x08000100,
 	NonLossyASCII = 0x0BFF,
 	NonLossyASCII = 0x0BFF,
 
 
-	UTF16 = 0x0100,
+	UTF16   = 0x0100,
 	UTF16BE = 0x10000100,
 	UTF16BE = 0x10000100,
 	UTF16LE = 0x14000100,
 	UTF16LE = 0x14000100,
 
 
-	UTF32 = 0x0c000100,
-	UTF32BE = 0x18000100,
-	UTF32LE = 0x1c000100,
+	UTF32         = 0x0c000100,
+	UTF32BE       = 0x18000100,
+	UTF32LE       = 0x1c000100,
 }
 }
 
 
 StringEncodings :: enum Index {
 StringEncodings :: enum Index {
-    MacJapanese = 1,
-    MacChineseTrad = 2,
-    MacKorean = 3,
-    MacArabic = 4,
-    MacHebrew = 5,
-    MacGreek = 6,
-    MacCyrillic = 7,
-    MacDevanagari = 9,
-    MacGurmukhi = 10,
-    MacGujarati = 11,
-    MacOriya = 12,
-    MacBengali = 13,
-    MacTamil = 14,
-    MacTelugu = 15,
-    MacKannada = 16,
-    MacMalayalam = 17,
-    MacSinhalese = 18,
-    MacBurmese = 19,
-    MacKhmer = 20,
-    MacThai = 21,
-    MacLaotian = 22,
-    MacGeorgian = 23,
-    MacArmenian = 24,
-    MacChineseSimp = 25,
-    MacTibetan = 26,
-    MacMongolian = 27,
-    MacEthiopic = 28,
-    MacCentralEurRoman = 29,
-    MacVietnamese = 30,
-    MacExtArabic = 31,
-    MacSymbol = 33,
-    MacDingbats = 34,
-    MacTurkish = 35,
-    MacCroatian = 36,
-    MacIcelandic = 37,
-    MacRomanian = 38,
-    MacCeltic = 39,
-    MacGaelic = 40,
-    MacFarsi = 0x8C,
-    MacUkrainian = 0x98,
-    MacInuit = 0xEC,
-    MacVT100 = 0xFC,
-    MacHFS = 0xFF,
-    ISOLatin2 = 0x0202,
-    ISOLatin3 = 0x0203,
-    ISOLatin4 = 0x0204,
-    ISOLatinCyrillic = 0x0205,
-    ISOLatinArabic = 0x0206,
-    ISOLatinGreek = 0x0207,
-    ISOLatinHebrew = 0x0208,
-    ISOLatin5 = 0x0209,
-    ISOLatin6 = 0x020A,
-    ISOLatinThai = 0x020B,
-    ISOLatin7 = 0x020D,
-    ISOLatin8 = 0x020E,
-    ISOLatin9 = 0x020F,
-    ISOLatin10 = 0x0210,
-    DOSLatinUS = 0x0400,
-    DOSGreek = 0x0405,
-    DOSBalticRim = 0x0406,
-    DOSLatin1 = 0x0410,
-    DOSGreek1 = 0x0411,
-    DOSLatin2 = 0x0412,
-    DOSCyrillic = 0x0413,
-    DOSTurkish = 0x0414,
-    DOSPortuguese = 0x0415,
-    DOSIcelandic = 0x0416,
-    DOSHebrew = 0x0417,
-    DOSCanadianFrench = 0x0418,
-    DOSArabic = 0x0419,
-    DOSNordic = 0x041A,
-    DOSRussian = 0x041B,
-    DOSGreek2 = 0x041C,
-    DOSThai = 0x041D,
-    DOSJapanese = 0x0420,
-    DOSChineseSimplif = 0x0421,
-    DOSKorean = 0x0422,
-    DOSChineseTrad = 0x0423,
-    WindowsLatin2 = 0x0501,
-    WindowsCyrillic = 0x0502,
-    WindowsGreek = 0x0503,
-    WindowsLatin5 = 0x0504,
-    WindowsHebrew = 0x0505,
-    WindowsArabic = 0x0506,
-    WindowsBalticRim = 0x0507,
-    WindowsVietnamese = 0x0508,
-    WindowsKoreanJohab = 0x0510,
-    ANSEL = 0x0601,
-    JIS_X0201_76 = 0x0620,
-    JIS_X0208_83 = 0x0621,
-    JIS_X0208_90 = 0x0622,
-    JIS_X0212_90 = 0x0623,
-    JIS_C6226_78 = 0x0624,
-    ShiftJIS_X0213 = 0x0628,
-    ShiftJIS_X0213_MenKuTen = 0x0629,
-    GB_2312_80 = 0x0630,
-    GBK_95 = 0x0631,
-    GB_18030_2000 = 0x0632,
-    KSC_5601_87 = 0x0640,
-    KSC_5601_92_Johab = 0x0641,
-    CNS_11643_92_P1 = 0x0651,
-    CNS_11643_92_P2 = 0x0652,
-    CNS_11643_92_P3 = 0x0653,
-    ISO_2022_JP = 0x0820,
-    ISO_2022_JP_2 = 0x0821,
-    ISO_2022_JP_1 = 0x0822,
-    ISO_2022_JP_3 = 0x0823,
-    ISO_2022_CN = 0x0830,
-    ISO_2022_CN_EXT = 0x0831,
-    ISO_2022_KR = 0x0840,
-    EUC_JP = 0x0920,
-    EUC_CN = 0x0930,
-    EUC_TW = 0x0931,
-    EUC_KR = 0x0940,
-    ShiftJIS = 0x0A01,
-    KOI8_R = 0x0A02,
-    Big5 = 0x0A03,
-    MacRomanLatin1 = 0x0A04,
-    HZ_GB_2312 = 0x0A05,
-    Big5_HKSCS_1999 = 0x0A06,
-    VISCII = 0x0A07,
-    KOI8_U = 0x0A08,
-    Big5_E = 0x0A09,
-    NextStepJapanese = 0x0B02,
-    EBCDIC_US = 0x0C01,
-    EBCDIC_CP037 = 0x0C02,
-    UTF7 = 0x04000100,
-    UTF7_IMAP = 0x0A10,
-    ShiftJIS_X0213_00 = 0x0628, // Deprecated. Use `ShiftJIS_X0213` instead.
+	MacJapanese        = 1,
+	MacChineseTrad     = 2,
+	MacKorean          = 3,
+	MacArabic          = 4,
+	MacHebrew          = 5,
+	MacGreek           = 6,
+	MacCyrillic        = 7,
+	MacDevanagari      = 9,
+	MacGurmukhi        = 10,
+	MacGujarati        = 11,
+	MacOriya           = 12,
+	MacBengali         = 13,
+	MacTamil           = 14,
+	MacTelugu          = 15,
+	MacKannada         = 16,
+	MacMalayalam       = 17,
+	MacSinhalese       = 18,
+	MacBurmese         = 19,
+	MacKhmer           = 20,
+	MacThai            = 21,
+	MacLaotian         = 22,
+	MacGeorgian        = 23,
+	MacArmenian        = 24,
+	MacChineseSimp     = 25,
+	MacTibetan         = 26,
+	MacMongolian       = 27,
+	MacEthiopic        = 28,
+	MacCentralEurRoman = 29,
+	MacVietnamese      = 30,
+	MacExtArabic       = 31,
+	MacSymbol          = 33,
+	MacDingbats        = 34,
+	MacTurkish         = 35,
+	MacCroatian        = 36,
+	MacIcelandic       = 37,
+	MacRomanian        = 38,
+	MacCeltic          = 39,
+	MacGaelic          = 40,
+	MacFarsi           = 0x8C,
+	MacUkrainian       = 0x98,
+	MacInuit           = 0xEC,
+	MacVT100           = 0xFC,
+	MacHFS             = 0xFF,
+	ISOLatin2               = 0x0202,
+	ISOLatin3               = 0x0203,
+	ISOLatin4               = 0x0204,
+	ISOLatinCyrillic        = 0x0205,
+	ISOLatinArabic          = 0x0206,
+	ISOLatinGreek           = 0x0207,
+	ISOLatinHebrew          = 0x0208,
+	ISOLatin5               = 0x0209,
+	ISOLatin6               = 0x020A,
+	ISOLatinThai            = 0x020B,
+	ISOLatin7               = 0x020D,
+	ISOLatin8               = 0x020E,
+	ISOLatin9               = 0x020F,
+	ISOLatin10              = 0x0210,
+	DOSLatinUS              = 0x0400,
+	DOSGreek                = 0x0405,
+	DOSBalticRim            = 0x0406,
+	DOSLatin1               = 0x0410,
+	DOSGreek1               = 0x0411,
+	DOSLatin2               = 0x0412,
+	DOSCyrillic             = 0x0413,
+	DOSTurkish              = 0x0414,
+	DOSPortuguese           = 0x0415,
+	DOSIcelandic            = 0x0416,
+	DOSHebrew               = 0x0417,
+	DOSCanadianFrench       = 0x0418,
+	DOSArabic               = 0x0419,
+	DOSNordic               = 0x041A,
+	DOSRussian              = 0x041B,
+	DOSGreek2               = 0x041C,
+	DOSThai                 = 0x041D,
+	DOSJapanese             = 0x0420,
+	DOSChineseSimplif       = 0x0421,
+	DOSKorean               = 0x0422,
+	DOSChineseTrad          = 0x0423,
+	WindowsLatin2           = 0x0501,
+	WindowsCyrillic         = 0x0502,
+	WindowsGreek            = 0x0503,
+	WindowsLatin5           = 0x0504,
+	WindowsHebrew           = 0x0505,
+	WindowsArabic           = 0x0506,
+	WindowsBalticRim        = 0x0507,
+	WindowsVietnamese       = 0x0508,
+	WindowsKoreanJohab      = 0x0510,
+	ANSEL                   = 0x0601,
+	JIS_X0201_76            = 0x0620,
+	JIS_X0208_83            = 0x0621,
+	JIS_X0208_90            = 0x0622,
+	JIS_X0212_90            = 0x0623,
+	JIS_C6226_78            = 0x0624,
+	ShiftJIS_X0213          = 0x0628,
+	ShiftJIS_X0213_MenKuTen = 0x0629,
+	GB_2312_80              = 0x0630,
+	GBK_95                  = 0x0631,
+	GB_18030_2000           = 0x0632,
+	KSC_5601_87             = 0x0640,
+	KSC_5601_92_Johab       = 0x0641,
+	CNS_11643_92_P1         = 0x0651,
+	CNS_11643_92_P2         = 0x0652,
+	CNS_11643_92_P3         = 0x0653,
+	ISO_2022_JP             = 0x0820,
+	ISO_2022_JP_2           = 0x0821,
+	ISO_2022_JP_1           = 0x0822,
+	ISO_2022_JP_3           = 0x0823,
+	ISO_2022_CN             = 0x0830,
+	ISO_2022_CN_EXT         = 0x0831,
+	ISO_2022_KR             = 0x0840,
+	EUC_JP                  = 0x0920,
+	EUC_CN                  = 0x0930,
+	EUC_TW                  = 0x0931,
+	EUC_KR                  = 0x0940,
+	ShiftJIS                = 0x0A01,
+	KOI8_R                  = 0x0A02,
+	Big5                    = 0x0A03,
+	MacRomanLatin1          = 0x0A04,
+	HZ_GB_2312              = 0x0A05,
+	Big5_HKSCS_1999         = 0x0A06,
+	VISCII                  = 0x0A07,
+	KOI8_U                  = 0x0A08,
+	Big5_E                  = 0x0A09,
+	NextStepJapanese        = 0x0B02,
+	EBCDIC_US               = 0x0C01,
+	EBCDIC_CP037            = 0x0C02,
+	UTF7                    = 0x04000100,
+	UTF7_IMAP               = 0x0A10,
+	ShiftJIS_X0213_00       = 0x0628, // Deprecated. Use `ShiftJIS_X0213` instead.
 }
 }
 
 
-@(link_prefix = "CF", default_calling_convention = "c")
+@(link_prefix="CF", default_calling_convention="c")
 foreign CoreFoundation {
 foreign CoreFoundation {
 	// Copies the character contents of a string to a local C string buffer after converting the characters to a given encoding.
 	// Copies the character contents of a string to a local C string buffer after converting the characters to a given encoding.
 	StringGetCString :: proc(theString: String, buffer: [^]byte, bufferSize: Index, encoding: StringEncoding) -> b8 ---
 	StringGetCString :: proc(theString: String, buffer: [^]byte, bufferSize: Index, encoding: StringEncoding) -> b8 ---
@@ -181,23 +181,16 @@ foreign CoreFoundation {
 
 
 STR :: StringMakeConstantString
 STR :: StringMakeConstantString
 
 
-StringCopyToOdinString :: proc(
-	theString: String,
-	allocator := context.allocator,
-) -> (
-	str: string,
-	ok: bool,
-) #optional_ok {
+StringCopyToOdinString :: proc(theString: String, allocator := context.allocator) -> (str: string, ok: bool) #optional_ok {
 	length := StringGetLength(theString)
 	length := StringGetLength(theString)
 	max := StringGetMaximumSizeForEncoding(length, StringEncoding(StringBuiltInEncodings.UTF8))
 	max := StringGetMaximumSizeForEncoding(length, StringEncoding(StringBuiltInEncodings.UTF8))
 
 
 	buf, err := make([]byte, max, allocator)
 	buf, err := make([]byte, max, allocator)
-	if err != nil { return }
-
-	raw_str := runtime.Raw_String {
-		data = raw_data(buf),
+	if err != nil {
+		return
 	}
 	}
-	StringGetBytes(theString, {0, length}, StringEncoding(StringBuiltInEncodings.UTF8), 0, false, raw_data(buf), max, (^Index)(&raw_str.len))
 
 
-	return transmute(string)raw_str, true
+	n: Index
+	StringGetBytes(theString, {0, length}, StringEncoding(StringBuiltInEncodings.UTF8), 0, false, raw_data(buf), Index(len(buf)), &n)
+	return string(buf[:n]), true
 }
 }

+ 3 - 3
core/sys/darwin/xnu_system_call_helpers.odin

@@ -15,9 +15,9 @@ sys_write_string ::  proc (fd: c.int, message: string) -> bool {
 Offset_From :: enum c.int {
 Offset_From :: enum c.int {
 	SEEK_SET  = 0,  // the offset is set to offset bytes.
 	SEEK_SET  = 0,  // the offset is set to offset bytes.
 	SEEK_CUR  = 1,  // the offset is set to its current location plus offset bytes.
 	SEEK_CUR  = 1,  // the offset is set to its current location plus offset bytes.
-   	SEEK_END  = 2,  // the offset is set to the size of the file plus offset bytes.
-   	SEEK_HOLE = 3,  //  the offset is set to the start of the next hole greater than or equal to the supplied offset.
- 	SEEK_DATA = 4,  //  the offset is set to the start of the next non-hole file region greater than or equal to the supplied offset.
+	SEEK_END  = 2,  // the offset is set to the size of the file plus offset bytes.
+	SEEK_HOLE = 3,  //  the offset is set to the start of the next hole greater than or equal to the supplied offset.
+	SEEK_DATA = 4,  //  the offset is set to the start of the next non-hole file region greater than or equal to the supplied offset.
 }
 }
 
 
 Open_Flags_Enum :: enum u8 {
 Open_Flags_Enum :: enum u8 {

+ 29 - 29
core/sys/darwin/xnu_system_call_wrappers.odin

@@ -192,43 +192,43 @@ _STRUCT_TIMEVAL :: struct {
 
 
 /* pwd.h */
 /* pwd.h */
 _Password_Entry :: struct {
 _Password_Entry :: struct {
-    pw_name: cstring, /* username */
-    pw_passwd: cstring, /* user password */
-    pw_uid: i32,   /* user ID */
-    pw_gid: i32,   /* group ID */
+	pw_name: cstring, /* username */
+	pw_passwd: cstring, /* user password */
+	pw_uid: i32,   /* user ID */
+	pw_gid: i32,   /* group ID */
 	pw_change: u64,     /* password change time */
 	pw_change: u64,     /* password change time */
 	pw_class: cstring, /* user access class */
 	pw_class: cstring, /* user access class */
-    pw_gecos: cstring, /* full user name */
-    pw_dir: cstring, /* home directory */
-    pw_shell: cstring, /* shell program */
+	pw_gecos: cstring, /* full user name */
+	pw_dir: cstring, /* home directory */
+	pw_shell: cstring, /* shell program */
 	pw_expire: u64,     /* account expiration */
 	pw_expire: u64,     /* account expiration */
 	pw_fields: i32,     /* filled fields */
 	pw_fields: i32,     /* filled fields */
 }
 }
 
 
 /* processinfo.h */
 /* processinfo.h */
 _Proc_Bsdinfo :: struct {
 _Proc_Bsdinfo :: struct {
-  pbi_flags: u32, /* if is 64bit; emulated etc */
-  pbi_status: u32,
-  pbi_xstatus: u32,
-  pbi_pid: u32,
-  pbi_ppid: u32,
-  pbi_uid: u32,
-  pbi_gid: u32,
-  pbi_ruid: u32,
-  pbi_rgid: u32,
-  pbi_svuid: u32,
-  pbi_svgid: u32,
-  res: u32,
-  pbi_comm: [DARWIN_MAXCOMLEN]u8,
-  pbi_name: [2 * DARWIN_MAXCOMLEN]u8,	/* empty if no name is registered */
-  pbi_nfiles: u32,
-  pbi_pgid: u32,
-  pbi_pjobc: u32,
-  e_tdev: u32, /* controlling tty dev */
-  e_tpgid: u32,	/* tty process group id */
-  pbi_nice: i32,
-  pbi_start_tvsec: u64,
-  pbi_start_tvusec: u64,
+	pbi_flags: u32, /* if is 64bit; emulated etc */
+	pbi_status: u32,
+	pbi_xstatus: u32,
+	pbi_pid: u32,
+	pbi_ppid: u32,
+	pbi_uid: u32,
+	pbi_gid: u32,
+	pbi_ruid: u32,
+	pbi_rgid: u32,
+	pbi_svuid: u32,
+	pbi_svgid: u32,
+	res: u32,
+	pbi_comm: [DARWIN_MAXCOMLEN]u8,
+	pbi_name: [2 * DARWIN_MAXCOMLEN]u8,	/* empty if no name is registered */
+	pbi_nfiles: u32,
+	pbi_pgid: u32,
+	pbi_pjobc: u32,
+	e_tdev: u32, /* controlling tty dev */
+	e_tpgid: u32,	/* tty process group id */
+	pbi_nice: i32,
+	pbi_start_tvsec: u64,
+	pbi_start_tvusec: u64,
 }
 }
 
 
 /*--==========================================================================--*/
 /*--==========================================================================--*/

+ 6 - 6
core/sys/freebsd/types.odin

@@ -695,12 +695,12 @@ Record_Lock_Flag :: enum c.int {
 
 
 // struct flock
 // struct flock
 File_Lock :: struct {
 File_Lock :: struct {
-	 start:  off_t,            /* starting offset */
-	 len:    off_t,            /* len = 0 means until end of file */
-	 pid:    pid_t,            /* lock owner */
-	 type:   Record_Lock_Flag, /* lock type: read/write, etc. */
-	 whence: c.short,          /* type of l_start */
-	 sysid:  c.int,            /* remote system id or zero for local */
+	start:  off_t,            /* starting offset */
+	len:    off_t,            /* len = 0 means until end of file */
+	pid:    pid_t,            /* lock owner */
+	type:   Record_Lock_Flag, /* lock type: read/write, etc. */
+	whence: c.short,          /* type of l_start */
+	sysid:  c.int,            /* remote system id or zero for local */
 }
 }
 
 
 /*
 /*

+ 2 - 2
core/sys/windows/dwmapi.odin

@@ -4,7 +4,7 @@ package sys_windows
 foreign import dwmapi "system:Dwmapi.lib"
 foreign import dwmapi "system:Dwmapi.lib"
 
 
 DWMWINDOWATTRIBUTE :: enum {
 DWMWINDOWATTRIBUTE :: enum {
-	DWMWA_NCRENDERING_ENABLED,
+	DWMWA_NCRENDERING_ENABLED = 1,
 	DWMWA_NCRENDERING_POLICY,
 	DWMWA_NCRENDERING_POLICY,
 	DWMWA_TRANSITIONS_FORCEDISABLED,
 	DWMWA_TRANSITIONS_FORCEDISABLED,
 	DWMWA_ALLOW_NCPAINT,
 	DWMWA_ALLOW_NCPAINT,
@@ -28,7 +28,7 @@ DWMWINDOWATTRIBUTE :: enum {
 	DWMWA_TEXT_COLOR,
 	DWMWA_TEXT_COLOR,
 	DWMWA_VISIBLE_FRAME_BORDER_THICKNESS,
 	DWMWA_VISIBLE_FRAME_BORDER_THICKNESS,
 	DWMWA_SYSTEMBACKDROP_TYPE,
 	DWMWA_SYSTEMBACKDROP_TYPE,
-  	DWMWA_LAST,
+	DWMWA_LAST,
 }
 }
 
 
 DWMNCRENDERINGPOLICY :: enum {
 DWMNCRENDERINGPOLICY :: enum {

+ 8 - 8
core/sys/windows/kernel32.odin

@@ -1175,17 +1175,17 @@ SYSTEM_POWER_STATUS :: struct {
 }
 }
 
 
 AC_Line_Status :: enum BYTE {
 AC_Line_Status :: enum BYTE {
-   Offline = 0,
-   Online  = 1,
-   Unknown = 255,
+	Offline = 0,
+	Online  = 1,
+	Unknown = 255,
 }
 }
 
 
 Battery_Flag :: enum BYTE {
 Battery_Flag :: enum BYTE {
-    High     = 0,
-    Low      = 1,
-    Critical = 2,
-    Charging = 3,
-    No_Battery = 7,
+	High     = 0,
+	Low      = 1,
+	Critical = 2,
+	Charging = 3,
+	No_Battery = 7,
 }
 }
 Battery_Flags :: bit_set[Battery_Flag; BYTE]
 Battery_Flags :: bit_set[Battery_Flag; BYTE]
 
 

+ 26 - 26
core/sys/windows/types.odin

@@ -3546,11 +3546,11 @@ SIGDN :: enum c_int {
 }
 }
 
 
 SIATTRIBFLAGS :: enum c_int {
 SIATTRIBFLAGS :: enum c_int {
-  AND	= 0x1,
-  OR	= 0x2,
-  APPCOMPAT	= 0x3,
-  MASK	= 0x3,
-  ALLITEMS	= 0x4000,
+	AND       = 0x1,
+	OR        = 0x2,
+	APPCOMPAT = 0x3,
+	MASK      = 0x3,
+	ALLITEMS  = 0x4000,
 }
 }
 
 
 FDAP :: enum c_int {
 FDAP :: enum c_int {
@@ -4503,35 +4503,35 @@ DNS_INFO_NO_RECORDS :: 9501
 DNS_QUERY_NO_RECURSION :: 0x00000004
 DNS_QUERY_NO_RECURSION :: 0x00000004
 
 
 DNS_RECORD :: struct { // aka DNS_RECORDA
 DNS_RECORD :: struct { // aka DNS_RECORDA
-    pNext: ^DNS_RECORD,
-    pName: cstring,
-    wType: WORD,
-    wDataLength: USHORT,
-    Flags: DWORD,
-    dwTtl: DWORD,
-    _: DWORD,
-    Data: struct #raw_union {
-        CNAME: DNS_PTR_DATAA,
-        A:     u32be,  // Ipv4 Address
-        AAAA:  u128be, // Ipv6 Address
-        TXT:   DNS_TXT_DATAA,
-        NS:    DNS_PTR_DATAA,
-        MX:    DNS_MX_DATAA,
-        SRV:   DNS_SRV_DATAA,
-    },
+	pNext: ^DNS_RECORD,
+	pName: cstring,
+	wType: WORD,
+	wDataLength: USHORT,
+	Flags: DWORD,
+	dwTtl: DWORD,
+	_: DWORD,
+	Data: struct #raw_union {
+		CNAME: DNS_PTR_DATAA,
+		A:     u32be,  // Ipv4 Address
+		AAAA:  u128be, // Ipv6 Address
+		TXT:   DNS_TXT_DATAA,
+		NS:    DNS_PTR_DATAA,
+		MX:    DNS_MX_DATAA,
+		SRV:   DNS_SRV_DATAA,
+	},
 }
 }
 
 
 DNS_TXT_DATAA :: struct {
 DNS_TXT_DATAA :: struct {
-    dwStringCount: DWORD,
-    pStringArray:  cstring,
+	dwStringCount: DWORD,
+	pStringArray:  cstring,
 }
 }
 
 
 DNS_PTR_DATAA :: cstring
 DNS_PTR_DATAA :: cstring
 
 
 DNS_MX_DATAA :: struct {
 DNS_MX_DATAA :: struct {
-    pNameExchange: cstring, // the hostname
-    wPreference: WORD,      // lower values preferred
-    _: WORD,                // padding.
+	pNameExchange: cstring, // the hostname
+	wPreference: WORD,      // lower values preferred
+	_: WORD,                // padding.
 }
 }
 DNS_SRV_DATAA :: struct {
 DNS_SRV_DATAA :: struct {
 	pNameTarget: cstring,
 	pNameTarget: cstring,

+ 1 - 1
core/text/table/table.odin

@@ -56,7 +56,7 @@ Decorations :: struct {
 
 
 	// Connecting decorations:
 	// Connecting decorations:
 	nw, n, ne,
 	nw, n, ne,
-	 w, x,  e,
+	w,  x,  e,
 	sw, s, se: string,
 	sw, s, se: string,
 
 
 	// Straight lines:
 	// Straight lines:

+ 6 - 2
core/thread/thread_pool.odin

@@ -175,10 +175,12 @@ pool_stop_task :: proc(pool: ^Pool, user_index: int, exit_code: int = 1) -> bool
 			intrinsics.atomic_sub(&pool.num_outstanding, 1)
 			intrinsics.atomic_sub(&pool.num_outstanding, 1)
 			intrinsics.atomic_sub(&pool.num_in_processing, 1)
 			intrinsics.atomic_sub(&pool.num_in_processing, 1)
 
 
+			old_thread_user_index := t.user_index
+
 			destroy(t)
 			destroy(t)
 
 
 			replacement := create(pool_thread_runner)
 			replacement := create(pool_thread_runner)
-			replacement.user_index = t.user_index
+			replacement.user_index = old_thread_user_index
 			replacement.data = data
 			replacement.data = data
 			data.task = {}
 			data.task = {}
 			pool.threads[i] = replacement
 			pool.threads[i] = replacement
@@ -207,10 +209,12 @@ pool_stop_all_tasks :: proc(pool: ^Pool, exit_code: int = 1) {
 			intrinsics.atomic_sub(&pool.num_outstanding, 1)
 			intrinsics.atomic_sub(&pool.num_outstanding, 1)
 			intrinsics.atomic_sub(&pool.num_in_processing, 1)
 			intrinsics.atomic_sub(&pool.num_in_processing, 1)
 
 
+			old_thread_user_index := t.user_index
+
 			destroy(t)
 			destroy(t)
 
 
 			replacement := create(pool_thread_runner)
 			replacement := create(pool_thread_runner)
-			replacement.user_index = t.user_index
+			replacement.user_index = old_thread_user_index
 			replacement.data = data
 			replacement.data = data
 			data.task = {}
 			data.task = {}
 			pool.threads[i] = replacement
 			pool.threads[i] = replacement

+ 5 - 1
core/thread/thread_unix.odin

@@ -2,6 +2,7 @@
 // +private
 // +private
 package thread
 package thread
 
 
+import "base:runtime"
 import "core:sync"
 import "core:sync"
 import "core:sys/unix"
 import "core:sys/unix"
 import "core:time"
 import "core:time"
@@ -55,7 +56,10 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread {
 			// Here on Unix, we start the OS thread in a running state, and so we manually have it wait on a condition
 			// Here on Unix, we start the OS thread in a running state, and so we manually have it wait on a condition
 			// variable above. We must perform that waiting BEFORE we select the context!
 			// variable above. We must perform that waiting BEFORE we select the context!
 			context = _select_context_for_thread(init_context)
 			context = _select_context_for_thread(init_context)
-			defer _maybe_destroy_default_temp_allocator(init_context)
+			defer {
+				_maybe_destroy_default_temp_allocator(init_context)
+				runtime.run_thread_local_cleaners()
+			}
 
 
 			t.procedure(t)
 			t.procedure(t)
 		}
 		}

+ 5 - 1
core/thread/thread_windows.odin

@@ -3,6 +3,7 @@
 package thread
 package thread
 
 
 import "base:intrinsics"
 import "base:intrinsics"
+import "base:runtime"
 import "core:sync"
 import "core:sync"
 import win32 "core:sys/windows"
 import win32 "core:sys/windows"
 
 
@@ -39,7 +40,10 @@ _create :: proc(procedure: Thread_Proc, priority: Thread_Priority) -> ^Thread {
 			// Here on Windows, the thread is created in a suspended state, and so we can select the context anywhere before the call
 			// Here on Windows, the thread is created in a suspended state, and so we can select the context anywhere before the call
 			// to t.procedure().
 			// to t.procedure().
 			context = _select_context_for_thread(init_context)
 			context = _select_context_for_thread(init_context)
-			defer _maybe_destroy_default_temp_allocator(init_context)
+			defer {
+				_maybe_destroy_default_temp_allocator(init_context)
+				runtime.run_thread_local_cleaners()
+			}
 
 
 			t.procedure(t)
 			t.procedure(t)
 		}
 		}

+ 61 - 0
src/check_builtin.cpp

@@ -2048,6 +2048,14 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
 		return ok;
 		return ok;
 	}
 	}
 
 
+	if (BuiltinProc__atomic_begin < id && id < BuiltinProc__atomic_end) {
+		if (build_context.metrics.arch == TargetArch_riscv64) {
+			if (!check_target_feature_is_enabled(str_lit("a"), nullptr)) {
+				error(call, "missing required target feature \"a\" for atomics, enable it by setting a different -microarch or explicitly adding it through -target-features");
+			}
+		}
+	}
+
 	switch (id) {
 	switch (id) {
 	default:
 	default:
 		GB_PANIC("Implement built-in procedure: %.*s", LIT(builtin_name));
 		GB_PANIC("Implement built-in procedure: %.*s", LIT(builtin_name));
@@ -5665,6 +5673,59 @@ gb_internal bool check_builtin_procedure(CheckerContext *c, Operand *operand, As
 			break;
 			break;
 		}
 		}
 		break;
 		break;
+
+	case BuiltinProc_type_has_shared_fields:
+		{
+			Type *u = check_type(c, ce->args[0]);
+			Type *ut = base_type(u);
+			if (ut == nullptr || ut == t_invalid) {
+				error(ce->args[0], "Expected a type for '%.*s'", LIT(builtin_name));
+				return false;
+			}
+			if (ut->kind != Type_Struct || ut->Struct.soa_kind != StructSoa_None) {
+				gbString t = type_to_string(ut);
+				error(ce->args[0], "Expected a struct type for '%.*s', got %s", LIT(builtin_name), t);
+				gb_string_free(t);
+				return false;
+			}
+
+			Type *v = check_type(c, ce->args[1]);
+			Type *vt = base_type(v);
+			if (vt == nullptr || vt == t_invalid) {
+				error(ce->args[1], "Expected a type for '%.*s'", LIT(builtin_name));
+				return false;
+			}
+			if (vt->kind != Type_Struct || vt->Struct.soa_kind != StructSoa_None) {
+				gbString t = type_to_string(vt);
+				error(ce->args[1], "Expected a struct type for '%.*s', got %s", LIT(builtin_name), t);
+				gb_string_free(t);
+				return false;
+			}
+
+			bool is_shared = true;
+
+			for (Entity *v_field : vt->Struct.fields) {
+				bool found = false;
+				for (Entity *u_field : ut->Struct.fields) {
+					if (v_field->token.string == u_field->token.string &&
+					    are_types_identical(v_field->type, u_field->type)) {
+						found = true;
+						break;
+					}
+				}
+
+				if (!found) {
+					is_shared = false;
+					break;
+				}
+			}
+
+			operand->mode = Addressing_Constant;
+			operand->value = exact_value_bool(is_shared);
+			operand->type = t_untyped_bool;
+			break;
+		}
+
 	case BuiltinProc_type_field_type:
 	case BuiltinProc_type_field_type:
 		{
 		{
 			Operand op = {};
 			Operand op = {};

+ 32 - 9
src/check_expr.cpp

@@ -1180,11 +1180,15 @@ gb_internal void check_assignment(CheckerContext *c, Operand *operand, Type *typ
 				      LIT(article),
 				      LIT(article),
 				      LIT(context_name));
 				      LIT(context_name));
 			} else {
 			} else {
+				ERROR_BLOCK();
 				error(operand->expr,
 				error(operand->expr,
 				      "Cannot assign '%s', a type, to %.*s%.*s",
 				      "Cannot assign '%s', a type, to %.*s%.*s",
 				      op_type_str,
 				      op_type_str,
 				      LIT(article),
 				      LIT(article),
 				      LIT(context_name));
 				      LIT(context_name));
+				if (type && are_types_identical(type, t_any)) {
+					error_line("\tSuggestion: 'typeid_of(%s)'", expr_str);
+				}
 			}
 			}
 			break;
 			break;
 		default:
 		default:
@@ -3782,10 +3786,10 @@ gb_internal void check_binary_expr(CheckerContext *c, Operand *x, Ast *node, Typ
 		// NOTE(bill): Allow comparisons between types
 		// NOTE(bill): Allow comparisons between types
 		if (is_ise_expr(be->left)) {
 		if (is_ise_expr(be->left)) {
 			// Evalute the right before the left for an '.X' expression
 			// Evalute the right before the left for an '.X' expression
-			check_expr_or_type(c, y, be->right, type_hint);
+			check_expr_or_type(c, y, be->right, nullptr /* ignore type hint */);
 			check_expr_or_type(c, x, be->left, y->type);
 			check_expr_or_type(c, x, be->left, y->type);
 		} else {
 		} else {
-			check_expr_or_type(c, x, be->left, type_hint);
+			check_expr_or_type(c, x, be->left, nullptr /* ignore type hint */);
 			check_expr_or_type(c, y, be->right, x->type);
 			check_expr_or_type(c, y, be->right, x->type);
 		}
 		}
 		bool xt = x->mode == Addressing_Type;
 		bool xt = x->mode == Addressing_Type;
@@ -4658,7 +4662,8 @@ gb_internal bool check_index_value(CheckerContext *c, Type *main_type, bool open
 	check_expr_with_type_hint(c, &operand, index_value, type_hint);
 	check_expr_with_type_hint(c, &operand, index_value, type_hint);
 	if (operand.mode == Addressing_Invalid) {
 	if (operand.mode == Addressing_Invalid) {
 		if (value) *value = 0;
 		if (value) *value = 0;
-		return false;
+		// NOTE(bill): return true here to propagate the errors better
+		return true;
 	}
 	}
 
 
 	Type *index_type = t_int;
 	Type *index_type = t_int;
@@ -4879,7 +4884,7 @@ gb_internal ExactValue get_constant_field_single(CheckerContext *c, ExactValue v
 							TypeAndValue tav = fv->value->tav;
 							TypeAndValue tav = fv->value->tav;
 							if (success_) *success_ = true;
 							if (success_) *success_ = true;
 							if (finish_) *finish_ = false;
 							if (finish_) *finish_ = false;
-							return tav.value;;
+							return tav.value;
 						}
 						}
 					}
 					}
 
 
@@ -4954,7 +4959,6 @@ gb_internal ExactValue get_constant_field(CheckerContext *c, Operand const *oper
 				return value;
 				return value;
 			}
 			}
 		}
 		}
-
 		if (success_) *success_ = true;
 		if (success_) *success_ = true;
 		return value;
 		return value;
 	} else if (value.kind == ExactValue_Quaternion) {
 	} else if (value.kind == ExactValue_Quaternion) {
@@ -7625,7 +7629,7 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O
 			gbString s = gb_string_make_reserve(heap_allocator(), e->token.string.len+3);
 			gbString s = gb_string_make_reserve(heap_allocator(), e->token.string.len+3);
 			s = gb_string_append_fmt(s, "%.*s(", LIT(e->token.string));
 			s = gb_string_append_fmt(s, "%.*s(", LIT(e->token.string));
 
 
-			TypeTuple *tuple = get_record_polymorphic_params(e->type);
+			TypeTuple *tuple = get_record_polymorphic_params(bt);
 			if (tuple != nullptr) for_array(i, tuple->variables) {
 			if (tuple != nullptr) for_array(i, tuple->variables) {
 				Entity *v = tuple->variables[i];
 				Entity *v = tuple->variables[i];
 				String name = v->token.string;
 				String name = v->token.string;
@@ -7640,8 +7644,10 @@ gb_internal CallArgumentError check_polymorphic_record_type(CheckerContext *c, O
 						s = write_type_to_string(s, v->type, false);
 						s = write_type_to_string(s, v->type, false);
 					}
 					}
 				} else if (v->kind == Entity_Constant) {
 				} else if (v->kind == Entity_Constant) {
-					s = gb_string_append_fmt(s, "=");
-					s = write_exact_value_to_string(s, v->Constant.value);
+					if (v->Constant.value.kind != ExactValue_Invalid) {
+						s = gb_string_append_fmt(s, "=");
+						s = write_exact_value_to_string(s, v->Constant.value);
+					}
 				}
 				}
 			}
 			}
 			s = gb_string_append_fmt(s, ")");
 			s = gb_string_append_fmt(s, ")");
@@ -10055,6 +10061,22 @@ gb_internal ExprKind check_compound_literal(CheckerContext *c, Operand *o, Ast *
 					is_constant = o->mode == Addressing_Constant;
 					is_constant = o->mode == Addressing_Constant;
 				}
 				}
 
 
+				if (elem->kind == Ast_BinaryExpr) {
+					switch (elem->BinaryExpr.op.kind) {
+					case Token_Or:
+						{
+							gbString x = expr_to_string(elem->BinaryExpr.left);
+							gbString y = expr_to_string(elem->BinaryExpr.right);
+							gbString e = expr_to_string(elem);
+							error(elem, "Was the following intended? '%s, %s'; if not, surround the expression with parentheses '(%s)'", x, y, e);
+							gb_string_free(e);
+							gb_string_free(y);
+							gb_string_free(x);
+						}
+						break;
+					}
+				}
+
 				check_assignment(c, o, t->BitSet.elem, str_lit("bit_set literal"));
 				check_assignment(c, o, t->BitSet.elem, str_lit("bit_set literal"));
 				if (o->mode == Addressing_Constant) {
 				if (o->mode == Addressing_Constant) {
 					i64 lower = t->BitSet.lower;
 					i64 lower = t->BitSet.lower;
@@ -10544,7 +10566,8 @@ gb_internal ExprKind check_index_expr(CheckerContext *c, Operand *o, Ast *node,
 			o->expr = node;
 			o->expr = node;
 			return kind;
 			return kind;
 		} else if (ok && !is_type_matrix(t)) {
 		} else if (ok && !is_type_matrix(t)) {
-			ExactValue value = type_and_value_of_expr(ie->expr).value;
+			TypeAndValue tav = type_and_value_of_expr(ie->expr);
+			ExactValue value = tav.value;
 			o->mode = Addressing_Constant;
 			o->mode = Addressing_Constant;
 			bool success = false;
 			bool success = false;
 			bool finish = false;
 			bool finish = false;

+ 10 - 1
src/check_stmt.cpp

@@ -199,6 +199,9 @@ gb_internal bool check_has_break(Ast *stmt, String const &label, bool implicit)
 		}
 		}
 		break;
 		break;
 
 
+	case Ast_DeferStmt:
+		return check_has_break(stmt->DeferStmt.stmt, label, implicit);
+
 	case Ast_BlockStmt:
 	case Ast_BlockStmt:
 		return check_has_break_list(stmt->BlockStmt.stmts, label, implicit);
 		return check_has_break_list(stmt->BlockStmt.stmts, label, implicit);
 
 
@@ -1695,7 +1698,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags)
 					}
 					}
 				}
 				}
 			}
 			}
-			bool is_ptr = type_deref(operand.type);
+			bool is_ptr = is_type_pointer(type_deref(operand.type));
 			Type *t = base_type(type_deref(operand.type));
 			Type *t = base_type(type_deref(operand.type));
 
 
 			switch (t->kind) {
 			switch (t->kind) {
@@ -1735,6 +1738,7 @@ gb_internal void check_range_stmt(CheckerContext *ctx, Ast *node, u32 mod_flags)
 				break;
 				break;
 
 
 			case Type_EnumeratedArray:
 			case Type_EnumeratedArray:
+				is_possibly_addressable = operand.mode == Addressing_Variable || is_ptr;
 				array_add(&vals, t->EnumeratedArray.elem);
 				array_add(&vals, t->EnumeratedArray.elem);
 				array_add(&vals, t->EnumeratedArray.index);
 				array_add(&vals, t->EnumeratedArray.index);
 				break;
 				break;
@@ -2706,6 +2710,7 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags)
 				error(bs->label, "A branch statement's label name must be an identifier");
 				error(bs->label, "A branch statement's label name must be an identifier");
 				return;
 				return;
 			}
 			}
+
 			Ast *ident = bs->label;
 			Ast *ident = bs->label;
 			String name = ident->Ident.token.string;
 			String name = ident->Ident.token.string;
 			Operand o = {};
 			Operand o = {};
@@ -2737,6 +2742,10 @@ gb_internal void check_stmt_internal(CheckerContext *ctx, Ast *node, u32 flags)
 				break;
 				break;
 
 
 			}
 			}
+
+			if (ctx->in_defer) {
+				error(bs->label, "A labelled '%.*s' cannot be used within a 'defer'", LIT(token.string));
+			}
 		}
 		}
 
 
 	case_end;
 	case_end;

+ 29 - 9
src/checker.cpp

@@ -3174,8 +3174,8 @@ gb_internal DECL_ATTRIBUTE_PROC(foreign_block_decl_attribute) {
 		return true;
 		return true;
 	} else if (name == "link_prefix") {
 	} else if (name == "link_prefix") {
 		if (ev.kind == ExactValue_String) {
 		if (ev.kind == ExactValue_String) {
-			String link_prefix = ev.value_string;
-			if (!is_foreign_name_valid(link_prefix)) {
+			String link_prefix = string_trim_whitespace(ev.value_string);
+			if (link_prefix.len != 0 && !is_foreign_name_valid(link_prefix)) {
 				error(elem, "Invalid link prefix: '%.*s'", LIT(link_prefix));
 				error(elem, "Invalid link prefix: '%.*s'", LIT(link_prefix));
 			} else {
 			} else {
 				c->foreign_context.link_prefix = link_prefix;
 				c->foreign_context.link_prefix = link_prefix;
@@ -3186,8 +3186,8 @@ gb_internal DECL_ATTRIBUTE_PROC(foreign_block_decl_attribute) {
 		return true;
 		return true;
 	} else if (name == "link_suffix") {
 	} else if (name == "link_suffix") {
 		if (ev.kind == ExactValue_String) {
 		if (ev.kind == ExactValue_String) {
-			String link_suffix = ev.value_string;
-			if (!is_foreign_name_valid(link_suffix)) {
+			String link_suffix = string_trim_whitespace(ev.value_string);
+			if (link_suffix.len != 0 && !is_foreign_name_valid(link_suffix)) {
 				error(elem, "Invalid link suffix: '%.*s'", LIT(link_suffix));
 				error(elem, "Invalid link suffix: '%.*s'", LIT(link_suffix));
 			} else {
 			} else {
 				c->foreign_context.link_suffix = link_suffix;
 				c->foreign_context.link_suffix = link_suffix;
@@ -3489,7 +3489,7 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
 
 
 		if (ev.kind == ExactValue_String) {
 		if (ev.kind == ExactValue_String) {
 			ac->link_prefix = ev.value_string;
 			ac->link_prefix = ev.value_string;
-			if (!is_foreign_name_valid(ac->link_prefix)) {
+			if (ac->link_prefix.len != 0 && !is_foreign_name_valid(ac->link_prefix)) {
 				error(elem, "Invalid link prefix: %.*s", LIT(ac->link_prefix));
 				error(elem, "Invalid link prefix: %.*s", LIT(ac->link_prefix));
 			}
 			}
 		} else {
 		} else {
@@ -3501,7 +3501,7 @@ gb_internal DECL_ATTRIBUTE_PROC(proc_decl_attribute) {
 
 
 		if (ev.kind == ExactValue_String) {
 		if (ev.kind == ExactValue_String) {
 			ac->link_suffix = ev.value_string;
 			ac->link_suffix = ev.value_string;
-			if (!is_foreign_name_valid(ac->link_suffix)) {
+			if (ac->link_suffix.len != 0 && !is_foreign_name_valid(ac->link_suffix)) {
 				error(elem, "Invalid link suffix: %.*s", LIT(ac->link_suffix));
 				error(elem, "Invalid link suffix: %.*s", LIT(ac->link_suffix));
 			}
 			}
 		} else {
 		} else {
@@ -3774,7 +3774,7 @@ gb_internal DECL_ATTRIBUTE_PROC(var_decl_attribute) {
 		ExactValue ev = check_decl_attribute_value(c, value);
 		ExactValue ev = check_decl_attribute_value(c, value);
 		if (ev.kind == ExactValue_String) {
 		if (ev.kind == ExactValue_String) {
 			ac->link_prefix = ev.value_string;
 			ac->link_prefix = ev.value_string;
-			if (!is_foreign_name_valid(ac->link_prefix)) {
+			if (ac->link_prefix.len != 0 && !is_foreign_name_valid(ac->link_prefix)) {
 				error(elem, "Invalid link prefix: %.*s", LIT(ac->link_prefix));
 				error(elem, "Invalid link prefix: %.*s", LIT(ac->link_prefix));
 			}
 			}
 		} else {
 		} else {
@@ -3785,7 +3785,7 @@ gb_internal DECL_ATTRIBUTE_PROC(var_decl_attribute) {
 		ExactValue ev = check_decl_attribute_value(c, value);
 		ExactValue ev = check_decl_attribute_value(c, value);
 		if (ev.kind == ExactValue_String) {
 		if (ev.kind == ExactValue_String) {
 			ac->link_suffix = ev.value_string;
 			ac->link_suffix = ev.value_string;
-			if (!is_foreign_name_valid(ac->link_suffix)) {
+			if (ac->link_suffix.len != 0 && !is_foreign_name_valid(ac->link_suffix)) {
 				error(elem, "Invalid link suffix: %.*s", LIT(ac->link_suffix));
 				error(elem, "Invalid link suffix: %.*s", LIT(ac->link_suffix));
 			}
 			}
 		} else {
 		} else {
@@ -4532,7 +4532,9 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice<Ast *> const &n
 		case_end;
 		case_end;
 
 
 		case_ast_node(fb, ForeignBlockDecl, decl);
 		case_ast_node(fb, ForeignBlockDecl, decl);
-			check_add_foreign_block_decl(c, decl);
+			if (curr_file != nullptr) {
+				array_add(&curr_file->delayed_decls_queues[AstDelayQueue_ForeignBlock], decl);
+			}
 		case_end;
 		case_end;
 
 
 		default:
 		default:
@@ -4548,6 +4550,14 @@ gb_internal void check_collect_entities(CheckerContext *c, Slice<Ast *> const &n
 	// NOTE(bill): 'when' stmts need to be handled after the other as the condition may refer to something
 	// NOTE(bill): 'when' stmts need to be handled after the other as the condition may refer to something
 	// declared after this stmt in source
 	// declared after this stmt in source
 	if (curr_file == nullptr) {
 	if (curr_file == nullptr) {
+		// For 'foreign' block statements that are not in file scope.
+		for_array(decl_index, nodes) {
+			Ast *decl = nodes[decl_index];
+			if (decl->kind == Ast_ForeignBlockDecl) {
+				check_add_foreign_block_decl(c, decl);
+			}
+		}
+
 		for_array(decl_index, nodes) {
 		for_array(decl_index, nodes) {
 			Ast *decl = nodes[decl_index];
 			Ast *decl = nodes[decl_index];
 			if (decl->kind == Ast_WhenStmt) {
 			if (decl->kind == Ast_WhenStmt) {
@@ -5508,6 +5518,16 @@ gb_internal void check_import_entities(Checker *c) {
 			correct_type_aliases_in_scope(&ctx, pkg->scope);
 			correct_type_aliases_in_scope(&ctx, pkg->scope);
 		}
 		}
 
 
+		for_array(i, pkg->files) {
+			AstFile *f = pkg->files[i];
+			reset_checker_context(&ctx, f, &untyped);
+
+			for (Ast *decl : f->delayed_decls_queues[AstDelayQueue_ForeignBlock]) {
+				check_add_foreign_block_decl(&ctx, decl);
+			}
+			array_clear(&f->delayed_decls_queues[AstDelayQueue_ForeignBlock]);
+		}
+
 		for_array(i, pkg->files) {
 		for_array(i, pkg->files) {
 			AstFile *f = pkg->files[i];
 			AstFile *f = pkg->files[i];
 			reset_checker_context(&ctx, f, &untyped);
 			reset_checker_context(&ctx, f, &untyped);

+ 7 - 0
src/checker_builtin_procs.hpp

@@ -99,6 +99,7 @@ enum BuiltinProcId {
 	BuiltinProc_prefetch_write_instruction,
 	BuiltinProc_prefetch_write_instruction,
 	BuiltinProc_prefetch_write_data,
 	BuiltinProc_prefetch_write_data,
 
 
+BuiltinProc__atomic_begin,
 	BuiltinProc_atomic_type_is_lock_free,
 	BuiltinProc_atomic_type_is_lock_free,
 	BuiltinProc_atomic_thread_fence,
 	BuiltinProc_atomic_thread_fence,
 	BuiltinProc_atomic_signal_fence,
 	BuiltinProc_atomic_signal_fence,
@@ -124,6 +125,7 @@ enum BuiltinProcId {
 	BuiltinProc_atomic_compare_exchange_strong_explicit,
 	BuiltinProc_atomic_compare_exchange_strong_explicit,
 	BuiltinProc_atomic_compare_exchange_weak,
 	BuiltinProc_atomic_compare_exchange_weak,
 	BuiltinProc_atomic_compare_exchange_weak_explicit,
 	BuiltinProc_atomic_compare_exchange_weak_explicit,
+BuiltinProc__atomic_end,
 
 
 	BuiltinProc_fixed_point_mul,
 	BuiltinProc_fixed_point_mul,
 	BuiltinProc_fixed_point_div,
 	BuiltinProc_fixed_point_div,
@@ -313,6 +315,8 @@ BuiltinProc__type_simple_boolean_end,
 	BuiltinProc_type_map_info,
 	BuiltinProc_type_map_info,
 	BuiltinProc_type_map_cell_info,
 	BuiltinProc_type_map_cell_info,
 
 
+	BuiltinProc_type_has_shared_fields,
+
 BuiltinProc__type_end,
 BuiltinProc__type_end,
 
 
 	BuiltinProc_procedure_of,
 	BuiltinProc_procedure_of,
@@ -436,6 +440,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 	{STR_LIT("prefetch_write_instruction"), 2, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("prefetch_write_instruction"), 2, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("prefetch_write_data"),        2, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("prefetch_write_data"),        2, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 
 
+	{STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("atomic_type_is_lock_free"),                1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("atomic_type_is_lock_free"),                1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("atomic_thread_fence"),                     1, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("atomic_thread_fence"),                     1, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("atomic_signal_fence"),                     1, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT("atomic_signal_fence"),                     1, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
@@ -461,6 +466,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 	{STR_LIT("atomic_compare_exchange_strong_explicit"), 5, false, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
 	{STR_LIT("atomic_compare_exchange_strong_explicit"), 5, false, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
 	{STR_LIT("atomic_compare_exchange_weak"),            3, false, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
 	{STR_LIT("atomic_compare_exchange_weak"),            3, false, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
 	{STR_LIT("atomic_compare_exchange_weak_explicit"),   5, false, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
 	{STR_LIT("atomic_compare_exchange_weak_explicit"),   5, false, Expr_Expr, BuiltinProcPkg_intrinsics, false, true},
+	{STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 
 
 	{STR_LIT("fixed_point_mul"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("fixed_point_mul"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("fixed_point_div"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("fixed_point_div"), 3, false, Expr_Expr, BuiltinProcPkg_intrinsics},
@@ -647,6 +653,7 @@ gb_global BuiltinProc builtin_procs[BuiltinProc_COUNT] = {
 	{STR_LIT("type_map_info"),      1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("type_map_info"),      1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("type_map_cell_info"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 	{STR_LIT("type_map_cell_info"), 1, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 
 
+	{STR_LIT("type_has_shared_fields"), 2, false, Expr_Expr, BuiltinProcPkg_intrinsics},
 
 
 	{STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 	{STR_LIT(""), 0, false, Expr_Stmt, BuiltinProcPkg_intrinsics},
 
 

+ 13 - 3
src/llvm_backend_debug.cpp

@@ -55,6 +55,16 @@ gb_internal void lb_debug_file_line(lbModule *m, Ast *node, LLVMMetadataRef *fil
 	}
 	}
 }
 }
 
 
+gb_internal LLVMMetadataRef lb_debug_procedure_parameters(lbModule *m, Type *type) {
+	if (is_type_proc(type)) {
+		return lb_debug_type(m, t_rawptr);
+	}
+	if (type->kind == Type_Tuple && type->Tuple.variables.count == 1) {
+		return lb_debug_procedure_parameters(m, type->Tuple.variables[0]->type);
+	}
+	return lb_debug_type(m, type);
+}
+
 gb_internal LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type) {
 gb_internal LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type) {
 	i64 size = type_size_of(type); // Check size
 	i64 size = type_size_of(type); // Check size
 	gb_unused(size);
 	gb_unused(size);
@@ -78,7 +88,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type)
 	if (type->Proc.result_count == 0) {
 	if (type->Proc.result_count == 0) {
 		parameters[param_index++] = nullptr;
 		parameters[param_index++] = nullptr;
 	} else {
 	} else {
-		parameters[param_index++] = lb_debug_type(m, type->Proc.results);
+		parameters[param_index++] = lb_debug_procedure_parameters(m, type->Proc.results);
 	}
 	}
 
 
 	LLVMMetadataRef file = nullptr;
 	LLVMMetadataRef file = nullptr;
@@ -88,7 +98,7 @@ gb_internal LLVMMetadataRef lb_debug_type_internal_proc(lbModule *m, Type *type)
 		if (e->kind != Entity_Variable) {
 		if (e->kind != Entity_Variable) {
 			continue;
 			continue;
 		}
 		}
-		parameters[param_index] = lb_debug_type(m, e->type);
+		parameters[param_index] = lb_debug_procedure_parameters(m, e->type);
 		param_index += 1;
 		param_index += 1;
 	}
 	}
 
 
@@ -969,7 +979,7 @@ gb_internal LLVMMetadataRef lb_debug_type(lbModule *m, Type *type) {
 			return lb_debug_struct(m, type, bt, name, scope, file, line);
 			return lb_debug_struct(m, type, bt, name, scope, file, line);
 		}
 		}
 
 
-		case Type_Struct:       return lb_debug_struct(m, type, base_type(type), name, scope, file, line);
+		case Type_Struct:       return lb_debug_struct(m, type, bt, name, scope, file, line);
 		case Type_Slice:        return lb_debug_slice(m, type, name, scope, file, line);
 		case Type_Slice:        return lb_debug_slice(m, type, name, scope, file, line);
 		case Type_DynamicArray: return lb_debug_dynamic_array(m, type, name, scope, file, line);
 		case Type_DynamicArray: return lb_debug_dynamic_array(m, type, name, scope, file, line);
 		case Type_Union:        return lb_debug_union(m, type, name, scope, file, line);
 		case Type_Union:        return lb_debug_union(m, type, name, scope, file, line);

+ 1 - 1
src/llvm_backend_utility.cpp

@@ -263,7 +263,7 @@ gb_internal lbValue lb_emit_transmute(lbProcedure *p, lbValue value, Type *t) {
 	if (is_type_simd_vector(src) && is_type_simd_vector(dst)) {
 	if (is_type_simd_vector(src) && is_type_simd_vector(dst)) {
 		res.value = LLVMBuildBitCast(p->builder, value.value, lb_type(p->module, t), "");
 		res.value = LLVMBuildBitCast(p->builder, value.value, lb_type(p->module, t), "");
 		return res;
 		return res;
-	} else if (is_type_array_like(src) && is_type_simd_vector(dst)) {
+	} else if (is_type_array_like(src) && (is_type_simd_vector(dst) || is_type_integer_128bit(dst))) {
 		unsigned align = cast(unsigned)gb_max(type_align_of(src), type_align_of(dst));
 		unsigned align = cast(unsigned)gb_max(type_align_of(src), type_align_of(dst));
 		lbValue ptr = lb_address_from_load_or_generate_local(p, value);
 		lbValue ptr = lb_address_from_load_or_generate_local(p, value);
 		if (lb_try_update_alignment(ptr, align)) {
 		if (lb_try_update_alignment(ptr, align)) {

+ 39 - 9
src/parser.cpp

@@ -1921,6 +1921,9 @@ gb_internal Array<Ast *> parse_enum_field_list(AstFile *f) {
 	       f->curr_token.kind != Token_EOF) {
 	       f->curr_token.kind != Token_EOF) {
 		CommentGroup *docs = f->lead_comment;
 		CommentGroup *docs = f->lead_comment;
 		CommentGroup *comment = nullptr;
 		CommentGroup *comment = nullptr;
+
+		parse_enforce_tabs(f);
+
 		Ast *name = parse_value(f);
 		Ast *name = parse_value(f);
 		Ast *value = nullptr;
 		Ast *value = nullptr;
 		if (f->curr_token.kind == Token_Eq) {
 		if (f->curr_token.kind == Token_Eq) {
@@ -2259,6 +2262,7 @@ gb_internal Array<Ast *> parse_union_variant_list(AstFile *f) {
 	auto variants = array_make<Ast *>(ast_allocator(f));
 	auto variants = array_make<Ast *>(ast_allocator(f));
 	while (f->curr_token.kind != Token_CloseBrace &&
 	while (f->curr_token.kind != Token_CloseBrace &&
 	       f->curr_token.kind != Token_EOF) {
 	       f->curr_token.kind != Token_EOF) {
+		parse_enforce_tabs(f);
 		Ast *type = parse_type(f);
 		Ast *type = parse_type(f);
 		if (type->kind != Ast_BadExpr) {
 		if (type->kind != Ast_BadExpr) {
 			array_add(&variants, type);
 			array_add(&variants, type);
@@ -4274,6 +4278,7 @@ gb_internal Ast *parse_field_list(AstFile *f, isize *name_count_, u32 allowed_fl
 	while (f->curr_token.kind != follow &&
 	while (f->curr_token.kind != follow &&
 	       f->curr_token.kind != Token_Colon &&
 	       f->curr_token.kind != Token_Colon &&
 	       f->curr_token.kind != Token_EOF) {
 	       f->curr_token.kind != Token_EOF) {
+		if (!is_signature) parse_enforce_tabs(f);
 		u32 flags = parse_field_prefixes(f);
 		u32 flags = parse_field_prefixes(f);
 		Ast *param = parse_var_type(f, allow_ellipsis, allow_typeid_token);
 		Ast *param = parse_var_type(f, allow_ellipsis, allow_typeid_token);
 		if (param->kind == Ast_Ellipsis) {
 		if (param->kind == Ast_Ellipsis) {
@@ -4363,6 +4368,8 @@ gb_internal Ast *parse_field_list(AstFile *f, isize *name_count_, u32 allowed_fl
 		       f->curr_token.kind != Token_EOF &&
 		       f->curr_token.kind != Token_EOF &&
 		       f->curr_token.kind != Token_Semicolon) {
 		       f->curr_token.kind != Token_Semicolon) {
 			CommentGroup *docs = f->lead_comment;
 			CommentGroup *docs = f->lead_comment;
+
+			if (!is_signature) parse_enforce_tabs(f);
 			u32 set_flags = parse_field_prefixes(f);
 			u32 set_flags = parse_field_prefixes(f);
 			Token tag = {};
 			Token tag = {};
 			Array<Ast *> names = parse_ident_list(f, allow_poly_names);
 			Array<Ast *> names = parse_ident_list(f, allow_poly_names);
@@ -4532,6 +4539,10 @@ gb_internal Ast *parse_if_stmt(AstFile *f) {
 		return ast_bad_stmt(f, f->curr_token, f->curr_token);
 		return ast_bad_stmt(f, f->curr_token, f->curr_token);
 	}
 	}
 
 
+	Ast *top_if_stmt = nullptr;
+
+	Ast *prev_if_stmt = nullptr;
+if_else_chain:;
 	Token token = expect_token(f, Token_if);
 	Token token = expect_token(f, Token_if);
 	Ast *init = nullptr;
 	Ast *init = nullptr;
 	Ast *cond = nullptr;
 	Ast *cond = nullptr;
@@ -4573,12 +4584,24 @@ gb_internal Ast *parse_if_stmt(AstFile *f) {
 		ignore_strict_style = true;
 		ignore_strict_style = true;
 	}
 	}
 	skip_possible_newline_for_literal(f, ignore_strict_style);
 	skip_possible_newline_for_literal(f, ignore_strict_style);
+
+	Ast *curr_if_stmt = ast_if_stmt(f, token, init, cond, body, nullptr);
+	if (top_if_stmt == nullptr) {
+		top_if_stmt = curr_if_stmt;
+	}
+	if (prev_if_stmt != nullptr) {
+		prev_if_stmt->IfStmt.else_stmt = curr_if_stmt;
+	}
+
 	if (f->curr_token.kind == Token_else) {
 	if (f->curr_token.kind == Token_else) {
 		Token else_token = expect_token(f, Token_else);
 		Token else_token = expect_token(f, Token_else);
 		switch (f->curr_token.kind) {
 		switch (f->curr_token.kind) {
 		case Token_if:
 		case Token_if:
-			else_stmt = parse_if_stmt(f);
-			break;
+			// NOTE(bill): Instead of relying on recursive descent for an if-else chain
+			// we can just inline the tail-recursion manually with a simple loop like
+			// construct using a `goto`
+			prev_if_stmt = curr_if_stmt;
+			goto if_else_chain;
 		case Token_OpenBrace:
 		case Token_OpenBrace:
 			else_stmt = parse_block_stmt(f, false);
 			else_stmt = parse_block_stmt(f, false);
 			break;
 			break;
@@ -4593,7 +4616,9 @@ gb_internal Ast *parse_if_stmt(AstFile *f) {
 		}
 		}
 	}
 	}
 
 
-	return ast_if_stmt(f, token, init, cond, body, else_stmt);
+	curr_if_stmt->IfStmt.else_stmt = else_stmt;
+
+	return top_if_stmt;
 }
 }
 
 
 gb_internal Ast *parse_when_stmt(AstFile *f) {
 gb_internal Ast *parse_when_stmt(AstFile *f) {
@@ -5357,6 +5382,11 @@ gb_internal u64 check_vet_flags(AstFile *file) {
 
 
 
 
 gb_internal void parse_enforce_tabs(AstFile *f) {
 gb_internal void parse_enforce_tabs(AstFile *f) {
+	// Checks to see if tabs have been used for indentation
+	if ((check_vet_flags(f) & VetFlag_Tabs) == 0) {
+		return;
+	}
+
        	Token prev = f->prev_token;
        	Token prev = f->prev_token;
 	Token curr = f->curr_token;
 	Token curr = f->curr_token;
 	if (prev.pos.line < curr.pos.line) {
 	if (prev.pos.line < curr.pos.line) {
@@ -5373,6 +5403,10 @@ gb_internal void parse_enforce_tabs(AstFile *f) {
 
 
 		isize len = end-it;
 		isize len = end-it;
 		for (isize i = 0; i < len; i++) {
 		for (isize i = 0; i < len; i++) {
+			if (it[i] == '/') {
+				// ignore comments
+				break;
+			}
 			if (it[i] == ' ') {
 			if (it[i] == ' ') {
 				syntax_error(curr, "With '-vet-tabs', tabs must be used for indentation");
 				syntax_error(curr, "With '-vet-tabs', tabs must be used for indentation");
 				break;
 				break;
@@ -5387,11 +5421,7 @@ gb_internal Array<Ast *> parse_stmt_list(AstFile *f) {
 	while (f->curr_token.kind != Token_case &&
 	while (f->curr_token.kind != Token_case &&
 	       f->curr_token.kind != Token_CloseBrace &&
 	       f->curr_token.kind != Token_CloseBrace &&
 	       f->curr_token.kind != Token_EOF) {
 	       f->curr_token.kind != Token_EOF) {
-
-		// Checks to see if tabs have been used for indentation
-	       	if (check_vet_flags(f) & VetFlag_Tabs) {
-		       parse_enforce_tabs(f);
-		}
+		parse_enforce_tabs(f);
 
 
 		Ast *stmt = parse_stmt(f);
 		Ast *stmt = parse_stmt(f);
 		if (stmt && stmt->kind != Ast_EmptyStmt) {
 		if (stmt && stmt->kind != Ast_EmptyStmt) {
@@ -6416,7 +6446,7 @@ gb_internal bool parse_file(Parser *p, AstFile *f) {
 				}
 				}
 
 
 				f->total_file_decl_count += calc_decl_count(stmt);
 				f->total_file_decl_count += calc_decl_count(stmt);
-				if (stmt->kind == Ast_WhenStmt || stmt->kind == Ast_ExprStmt || stmt->kind == Ast_ImportDecl) {
+				if (stmt->kind == Ast_WhenStmt || stmt->kind == Ast_ExprStmt || stmt->kind == Ast_ImportDecl || stmt->kind == Ast_ForeignBlockDecl) {
 					f->delayed_decl_count += 1;
 					f->delayed_decl_count += 1;
 				}
 				}
 			}
 			}

+ 5 - 1
src/parser.hpp

@@ -82,6 +82,7 @@ enum AstFileFlag : u32 {
 enum AstDelayQueueKind {
 enum AstDelayQueueKind {
 	AstDelayQueue_Import,
 	AstDelayQueue_Import,
 	AstDelayQueue_Expr,
 	AstDelayQueue_Expr,
+	AstDelayQueue_ForeignBlock,
 	AstDelayQueue_COUNT,
 	AstDelayQueue_COUNT,
 };
 };
 
 
@@ -885,4 +886,7 @@ gb_internal gb_inline gbAllocator ast_allocator(AstFile *f) {
 gb_internal Ast *alloc_ast_node(AstFile *f, AstKind kind);
 gb_internal Ast *alloc_ast_node(AstFile *f, AstKind kind);
 
 
 gb_internal gbString expr_to_string(Ast *expression);
 gb_internal gbString expr_to_string(Ast *expression);
-gb_internal bool allow_field_separator(AstFile *f);
+gb_internal bool allow_field_separator(AstFile *f);
+
+
+gb_internal void parse_enforce_tabs(AstFile *f);

+ 12 - 12
tests/core/c/libc/test_core_libc_complex_pow.odin

@@ -69,18 +69,18 @@ test_libc_pow_binding :: proc(t: ^testing.T, $LIBC_COMPLEX:typeid, $F:typeid, po
 			complex_power := LIBC_COMPLEX(complex(F(n), F(0.)))
 			complex_power := LIBC_COMPLEX(complex(F(n), F(0.)))
 			result := pow(complex_base, complex_power) 
 			result := pow(complex_base, complex_power) 
 			switch n%%4 {
 			switch n%%4 {
-				case 0:
-					expected_real = value
-					expected_imag = 0.
-				case 1:
-					expected_real = 0.
-					expected_imag = value
-				case 2:
-					expected_real = -value
-					expected_imag = 0.
-				case 3:
-					expected_real = 0.
-					expected_imag = -value
+			case 0:
+				expected_real = value
+				expected_imag = 0.
+			case 1:
+				expected_real = 0.
+				expected_imag = value
+			case 2:
+				expected_real = -value
+				expected_imag = 0.
+			case 3:
+				expected_real = 0.
+				expected_imag = -value
 			}
 			}
 			testing.expectf(t, isclose(t, expected_real, F(real(result)), rtol, atol), "ftype:%T, n:%v reldiff(%v, re(%v)) is greater than specified rtol:%e", F{}, n, expected_real, result, rtol)
 			testing.expectf(t, isclose(t, expected_real, F(real(result)), rtol, atol), "ftype:%T, n:%v reldiff(%v, re(%v)) is greater than specified rtol:%e", F{}, n, expected_real, result, rtol)
 			testing.expectf(t, isclose(t, expected_imag, F(imag(result)), rtol, atol), "ftype:%T, n:%v reldiff(%v, im(%v)) is greater than specified rtol:%e", F{}, n, expected_imag, result, rtol)
 			testing.expectf(t, isclose(t, expected_imag, F(imag(result)), rtol, atol), "ftype:%T, n:%v reldiff(%v, im(%v)) is greater than specified rtol:%e", F{}, n, expected_imag, result, rtol)

+ 1 - 1
tests/core/container/test_core_rbtree.odin

@@ -187,7 +187,7 @@ validate_rbtree :: proc(t: ^testing.T, tree: ^$T/rb.Tree($Key, $Value)) {
 }
 }
 
 
 verify_rbtree_propery_1 :: proc(t: ^testing.T, n: ^$N/rb.Node($Key, $Value)) {
 verify_rbtree_propery_1 :: proc(t: ^testing.T, n: ^$N/rb.Node($Key, $Value)) {
-        testing.expect(t, rb.node_color(n) == .Black || rb.node_color(n) == .Red, "Property #1: Each node is either red or black.")
+	testing.expect(t, rb.node_color(n) == .Black || rb.node_color(n) == .Red, "Property #1: Each node is either red or black.")
 	if n == nil {
 	if n == nil {
 		return
 		return
 	}
 	}

+ 1 - 1
tests/core/encoding/json/test_core_json.odin

@@ -429,7 +429,7 @@ map_with_integer_keys :: proc(t: ^testing.T) {
 	defer delete_map(my_map2)
 	defer delete_map(my_map2)
 
 
 	unmarshal_err := json.unmarshal(marshaled_data, &my_map2)
 	unmarshal_err := json.unmarshal(marshaled_data, &my_map2)
-	defer for key, item in my_map2 {
+	defer for _, item in my_map2 {
 		runtime.delete_string(item)
 		runtime.delete_string(item)
 	}
 	}
 	testing.expectf(t, unmarshal_err == nil, "Expected `json.unmarshal` to return nil, got %v", unmarshal_err)
 	testing.expectf(t, unmarshal_err == nil, "Expected `json.unmarshal` to return nil, got %v", unmarshal_err)

+ 5 - 5
tests/core/encoding/xml/test_core_xml.odin

@@ -241,7 +241,7 @@ doc_to_string :: proc(doc: ^xml.Document) -> (result: string) {
 			written += fmt.wprintf(writer, "[DOCTYPE]  %v\n", doc.doctype.ident)
 			written += fmt.wprintf(writer, "[DOCTYPE]  %v\n", doc.doctype.ident)
 
 
 			if len(doc.doctype.rest) > 0 {
 			if len(doc.doctype.rest) > 0 {
-			 	fmt.wprintf(writer, "\t%v\n", doc.doctype.rest)
+				fmt.wprintf(writer, "\t%v\n", doc.doctype.rest)
 			}
 			}
 		}
 		}
 
 
@@ -250,10 +250,10 @@ doc_to_string :: proc(doc: ^xml.Document) -> (result: string) {
 		}
 		}
 
 
 		if doc.element_count > 0 {
 		if doc.element_count > 0 {
-		 	fmt.wprintln(writer, " --- ")
-		 	print_element(writer, doc, 0)
-		 	fmt.wprintln(writer, " --- ")
-		 }
+			fmt.wprintln(writer, " --- ")
+			print_element(writer, doc, 0)
+			fmt.wprintln(writer, " --- ")
+		}
 
 
 		return written, .None
 		return written, .None
 	}
 	}

+ 3 - 0
tests/core/runtime/test_core_runtime.odin

@@ -11,6 +11,7 @@ import "core:testing"
 test_temp_allocator_alignment_boundary :: proc(t: ^testing.T) {
 test_temp_allocator_alignment_boundary :: proc(t: ^testing.T) {
 	arena: runtime.Arena
 	arena: runtime.Arena
 	context.allocator = runtime.arena_allocator(&arena)
 	context.allocator = runtime.arena_allocator(&arena)
+	defer runtime.arena_destroy(&arena)
 
 
 	_, _ = mem.alloc(int(runtime.DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE)-120)
 	_, _ = mem.alloc(int(runtime.DEFAULT_ARENA_GROWING_MINIMUM_BLOCK_SIZE)-120)
 	_, err := mem.alloc(112, 32)
 	_, err := mem.alloc(112, 32)
@@ -22,6 +23,7 @@ test_temp_allocator_alignment_boundary :: proc(t: ^testing.T) {
 test_temp_allocator_big_alloc_and_alignment :: proc(t: ^testing.T) {
 test_temp_allocator_big_alloc_and_alignment :: proc(t: ^testing.T) {
 	arena: runtime.Arena
 	arena: runtime.Arena
 	context.allocator = runtime.arena_allocator(&arena)
 	context.allocator = runtime.arena_allocator(&arena)
+	defer runtime.arena_destroy(&arena)
 
 
 	mappy: map[[8]int]int
 	mappy: map[[8]int]int
 	err := reserve(&mappy, 50000)
 	err := reserve(&mappy, 50000)
@@ -32,6 +34,7 @@ test_temp_allocator_big_alloc_and_alignment :: proc(t: ^testing.T) {
 test_temp_allocator_returns_correct_size :: proc(t: ^testing.T) {
 test_temp_allocator_returns_correct_size :: proc(t: ^testing.T) {
 	arena: runtime.Arena
 	arena: runtime.Arena
 	context.allocator = runtime.arena_allocator(&arena)
 	context.allocator = runtime.arena_allocator(&arena)
+	defer runtime.arena_destroy(&arena)
 
 
 	bytes, err := mem.alloc_bytes(10, 16)
 	bytes, err := mem.alloc_bytes(10, 16)
 	testing.expect(t, err == nil)
 	testing.expect(t, err == nil)

+ 1 - 2
tests/core/unicode/test_core_unicode.odin

@@ -16,8 +16,7 @@ run_test_cases :: proc(t: ^testing.T, test_cases: []Test_Case, loc := #caller_lo
 		result, _, _ := utf8.grapheme_count(c.str)
 		result, _, _ := utf8.grapheme_count(c.str)
 		if !testing.expectf(t, result == c.expected_clusters,
 		if !testing.expectf(t, result == c.expected_clusters,
 			"(#% 4i) graphemes: %i != %i, %q %s", i, result, c.expected_clusters, c.str, c.str,
 			"(#% 4i) graphemes: %i != %i, %q %s", i, result, c.expected_clusters, c.str, c.str,
-			loc = loc)
-		{
+			loc = loc) {
 			failed += 1
 			failed += 1
 		}
 		}
 	}
 	}

+ 1 - 1
vendor/commonmark/cmark.odin

@@ -338,7 +338,7 @@ foreign lib {
 	node_set_list_tight :: proc(node: ^Node, tight: b32) -> (success: b32) ---
 	node_set_list_tight :: proc(node: ^Node, tight: b32) -> (success: b32) ---
 
 
 	// Returns the info string from a fenced code block.
 	// Returns the info string from a fenced code block.
-	get_fence_info :: proc(node: ^Node) -> (fence_info: cstring) ---
+	node_get_fence_info :: proc(node: ^Node) -> (fence_info: cstring) ---
 
 
 	// Sets the info string in a fenced code block, returning `true` on success and `false` on failure.
 	// Sets the info string in a fenced code block, returning `true` on success and `false` on failure.
 	node_set_fence_info :: proc(node: ^Node, fence_info: cstring) -> (success: b32) ---
 	node_set_fence_info :: proc(node: ^Node, fence_info: cstring) -> (success: b32) ---

+ 4 - 4
vendor/directx/d3d12/d3d12.odin

@@ -3459,10 +3459,10 @@ DRED_DEVICE_STATE :: enum i32 {
 }
 }
 
 
 DRED_PAGE_FAULT_OUTPUT2 :: struct {
 DRED_PAGE_FAULT_OUTPUT2 :: struct {
-    PageFaultVA:                    GPU_VIRTUAL_ADDRESS,
-    pHeadExistingAllocationNode:    ^DRED_ALLOCATION_NODE1,
-    pHeadRecentFreedAllocationNode: ^DRED_ALLOCATION_NODE1,
-    PageFaultFlags:                 DRED_PAGE_FAULT_FLAGS,
+	PageFaultVA:                    GPU_VIRTUAL_ADDRESS,
+	pHeadExistingAllocationNode:    ^DRED_ALLOCATION_NODE1,
+	pHeadRecentFreedAllocationNode: ^DRED_ALLOCATION_NODE1,
+	PageFaultFlags:                 DRED_PAGE_FAULT_FLAGS,
 }
 }
 
 
 DEVICE_REMOVED_EXTENDED_DATA1 :: struct {
 DEVICE_REMOVED_EXTENDED_DATA1 :: struct {

+ 2 - 2
vendor/directx/dxc/dxcapi.odin

@@ -476,8 +476,8 @@ IVersionInfo3_VTable :: struct {
 }
 }
 
 
 ArgPair :: struct {
 ArgPair :: struct {
-  pName:  wstring,
-  pValue: wstring,
+	pName:  wstring,
+	pValue: wstring,
 }
 }
 
 
 IPdbUtils_UUID_STRING :: "E6C9647E-9D6A-4C3B-B94C-524B5A6C343D"
 IPdbUtils_UUID_STRING :: "E6C9647E-9D6A-4C3B-B94C-524B5A6C343D"

+ 1 - 1
vendor/lua/5.4/lua.odin

@@ -575,7 +575,7 @@ PRELOAD_TABLE :: "_PRELOAD"
 
 
 L_Reg :: struct {
 L_Reg :: struct {
 	name: cstring,
 	name: cstring,
-  	func: CFunction,
+	func: CFunction,
 }
 }
 
 
 L_NUMSIZES :: size_of(Integer)*16 + size_of(Number)
 L_NUMSIZES :: size_of(Integer)*16 + size_of(Number)

+ 3 - 3
vendor/miniaudio/decoding.odin

@@ -69,9 +69,9 @@ decoder :: struct  {
 	outputSampleRate:       u32,
 	outputSampleRate:       u32,
 	converter:              data_converter,    /* <-- Data conversion is achieved by running frames through this. */
 	converter:              data_converter,    /* <-- Data conversion is achieved by running frames through this. */
 	pInputCache:            rawptr,            /* In input format. Can be null if it's not needed. */
 	pInputCache:            rawptr,            /* In input format. Can be null if it's not needed. */
-  inputCacheCap:          u64,               /* The capacity of the input cache. */
-  inputCacheConsumed:     u64,               /* The number of frames that have been consumed in the cache. Used for determining the next valid frame. */
-  inputCacheRemaining:    u64,               /* The number of valid frames remaining in the cahce. */
+	inputCacheCap:          u64,               /* The capacity of the input cache. */
+	inputCacheConsumed:     u64,               /* The number of frames that have been consumed in the cache. Used for determining the next valid frame. */
+	inputCacheRemaining:    u64,               /* The number of valid frames remaining in the cahce. */
 	allocationCallbacks:    allocation_callbacks,
 	allocationCallbacks:    allocation_callbacks,
 	data: struct #raw_union {
 	data: struct #raw_union {
 		vfs: struct {
 		vfs: struct {

+ 3 - 3
vendor/miniaudio/device_io_types.odin

@@ -381,7 +381,7 @@ device_config :: struct {
 	noPreSilencedOutputBuffer:  b8,   /* When set to true, the contents of the output buffer passed into the data callback will be left undefined rather than initialized to zero. */
 	noPreSilencedOutputBuffer:  b8,   /* When set to true, the contents of the output buffer passed into the data callback will be left undefined rather than initialized to zero. */
 	noClip:                     b8,   /* When set to true, the contents of the output buffer passed into the data callback will not be clipped after returning. Only applies when the playback sample format is f32. */
 	noClip:                     b8,   /* When set to true, the contents of the output buffer passed into the data callback will not be clipped after returning. Only applies when the playback sample format is f32. */
 	noDisableDenormals:         b8,   /* Do not disable denormals when firing the data callback. */
 	noDisableDenormals:         b8,   /* Do not disable denormals when firing the data callback. */
-  	noFixedSizedCallback:       b8,   /* Disables strict fixed-sized data callbacks. Setting this to true will result in the period size being treated only as a hint to the backend. This is an optimization for those who don't need fixed sized callbacks. */
+	noFixedSizedCallback:       b8,   /* Disables strict fixed-sized data callbacks. Setting this to true will result in the period size being treated only as a hint to the backend. This is an optimization for those who don't need fixed sized callbacks. */
 	dataCallback:               device_data_proc,
 	dataCallback:               device_data_proc,
 	notificationCallback:       device_notification_proc,
 	notificationCallback:       device_notification_proc,
 	stopCallback:               stop_proc,
 	stopCallback:               stop_proc,
@@ -813,7 +813,7 @@ context_type :: struct {
 			/*pa_mainloop**/ pMainLoop:     rawptr,
 			/*pa_mainloop**/ pMainLoop:     rawptr,
 			/*pa_context**/  pPulseContext: rawptr,
 			/*pa_context**/  pPulseContext: rawptr,
 			pApplicationName:               cstring, /* Set when the context is initialized. Used by devices for their local pa_context objects. */
 			pApplicationName:               cstring, /* Set when the context is initialized. Used by devices for their local pa_context objects. */
-      pServerName:                    cstring, /* Set when the context is initialized. Used by devices for their local pa_context objects. */
+			pServerName:                    cstring, /* Set when the context is initialized. Used by devices for their local pa_context objects. */
 		} when SUPPORT_PULSEAUDIO else struct {}),
 		} when SUPPORT_PULSEAUDIO else struct {}),
 		
 		
 		jack: (struct {
 		jack: (struct {
@@ -1140,7 +1140,7 @@ device :: struct {
 
 
 		pulse: (struct {
 		pulse: (struct {
 			/*pa_mainloop**/ pMainLoop: rawptr,
 			/*pa_mainloop**/ pMainLoop: rawptr,
-    	/*pa_context**/ pPulseContext: rawptr,
+			/*pa_context**/ pPulseContext: rawptr,
 			/*pa_stream**/ pStreamPlayback: rawptr,
 			/*pa_stream**/ pStreamPlayback: rawptr,
 			/*pa_stream**/ pStreamCapture: rawptr,
 			/*pa_stream**/ pStreamCapture: rawptr,
 		} when SUPPORT_PULSEAUDIO else struct {}),
 		} when SUPPORT_PULSEAUDIO else struct {}),

+ 23 - 8
vendor/raylib/raylib.odin

@@ -84,7 +84,6 @@ package raylib
 import "core:c"
 import "core:c"
 import "core:fmt"
 import "core:fmt"
 import "core:mem"
 import "core:mem"
-import "core:strings"
 
 
 import "core:math/linalg"
 import "core:math/linalg"
 _ :: linalg
 _ :: linalg
@@ -447,9 +446,9 @@ VrStereoConfig :: struct #align(4) {
 
 
 // File path list
 // File path list
 FilePathList :: struct {
 FilePathList :: struct {
-    capacity: c.uint,                     // Filepaths max entries
-    count:    c.uint,                     // Filepaths entries count
-    paths:    [^]cstring,                 // Filepaths entries
+	capacity: c.uint,                     // Filepaths max entries
+	count:    c.uint,                     // Filepaths entries count
+	paths:    [^]cstring,                 // Filepaths entries
 }
 }
 
 
 // Automation event
 // Automation event
@@ -1029,7 +1028,6 @@ foreign lib {
 	SetTraceLogLevel :: proc(logLevel: TraceLogLevel) ---                                       // Set the current threshold (minimum) log level
 	SetTraceLogLevel :: proc(logLevel: TraceLogLevel) ---                                       // Set the current threshold (minimum) log level
 	MemAlloc         :: proc(size: c.uint) -> rawptr ---                                        // Internal memory allocator
 	MemAlloc         :: proc(size: c.uint) -> rawptr ---                                        // Internal memory allocator
 	MemRealloc       :: proc(ptr: rawptr, size: c.uint) -> rawptr ---                           // Internal memory reallocator
 	MemRealloc       :: proc(ptr: rawptr, size: c.uint) -> rawptr ---                           // Internal memory reallocator
-	MemFree          :: proc(ptr: rawptr) ---                                                   // Internal memory free
 
 
 	// Set custom callbacks
 	// Set custom callbacks
 	// WARNING: Callbacks setup is intended for advance users
 	// WARNING: Callbacks setup is intended for advance users
@@ -1256,7 +1254,7 @@ foreign lib {
 	LoadImage            :: proc(fileName: cstring) -> Image ---                                                               // Load image from file into CPU memory (RAM)
 	LoadImage            :: proc(fileName: cstring) -> Image ---                                                               // Load image from file into CPU memory (RAM)
 	LoadImageRaw         :: proc(fileName: cstring, width, height: c.int, format: PixelFormat, headerSize: c.int) -> Image --- // Load image from RAW file data
 	LoadImageRaw         :: proc(fileName: cstring, width, height: c.int, format: PixelFormat, headerSize: c.int) -> Image --- // Load image from RAW file data
 	LoadImageSvg         :: proc(fileNameOrString: cstring, width, height: c.int) -> Image ---                                 // Load image from SVG file data or string with specified size
 	LoadImageSvg         :: proc(fileNameOrString: cstring, width, height: c.int) -> Image ---                                 // Load image from SVG file data or string with specified size
-	LoadImageAnim        :: proc(fileName: cstring, frames: [^]c.int) -> Image ---                                             // Load image sequence from file (frames appended to image.data)
+	LoadImageAnim        :: proc(fileName: cstring, frames: ^c.int) -> Image ---                                               // Load image sequence from file (frames appended to image.data)
 	LoadImageFromMemory  :: proc(fileType: cstring, fileData: rawptr, dataSize: c.int) -> Image ---                            // Load image from memory buffer, fileType refers to extension: i.e. '.png'
 	LoadImageFromMemory  :: proc(fileType: cstring, fileData: rawptr, dataSize: c.int) -> Image ---                            // Load image from memory buffer, fileType refers to extension: i.e. '.png'
 	LoadImageFromTexture :: proc(texture: Texture2D) -> Image ---                                                              // Load image from GPU texture data
 	LoadImageFromTexture :: proc(texture: Texture2D) -> Image ---                                                              // Load image from GPU texture data
 	LoadImageFromScreen  :: proc() -> Image ---                                                                                // Load image from screen buffer and (screenshot)
 	LoadImageFromScreen  :: proc() -> Image ---                                                                                // Load image from screen buffer and (screenshot)
@@ -1684,8 +1682,25 @@ TextFormat :: proc(text: cstring, args: ..any) -> cstring {
 
 
 // Text formatting with variables (sprintf style) and allocates (must be freed with 'MemFree')
 // Text formatting with variables (sprintf style) and allocates (must be freed with 'MemFree')
 TextFormatAlloc :: proc(text: cstring, args: ..any) -> cstring {
 TextFormatAlloc :: proc(text: cstring, args: ..any) -> cstring {
-	str := fmt.tprintf(string(text), ..args)
-	return strings.clone_to_cstring(str, MemAllocator())
+	return fmt.caprintf(string(text), ..args, allocator=MemAllocator())
+}
+
+
+// Internal memory free
+MemFree :: proc{
+	MemFreePtr,
+	MemFreeCstring,
+}
+
+
+@(default_calling_convention="c")
+foreign lib {
+	@(link_name="MemFree")
+	MemFreePtr :: proc(ptr: rawptr) ---
+}
+
+MemFreeCstring :: proc "c" (s: cstring) {
+	MemFreePtr(rawptr(s))
 }
 }
 
 
 
 

+ 6 - 0
vendor/sdl2/sdl2.odin

@@ -41,6 +41,12 @@ MAJOR_VERSION   :: 2
 MINOR_VERSION   :: 0
 MINOR_VERSION   :: 0
 PATCHLEVEL      :: 16
 PATCHLEVEL      :: 16
 
 
+VERSION :: proc "contextless" (ver: ^version) {
+	ver.major = MAJOR_VERSION
+	ver.minor = MINOR_VERSION
+	ver.patch = PATCHLEVEL
+}
+
 @(default_calling_convention="c", link_prefix="SDL_")
 @(default_calling_convention="c", link_prefix="SDL_")
 foreign lib {
 foreign lib {
 	GetVersion  :: proc(ver: ^version) ---
 	GetVersion  :: proc(ver: ^version) ---

+ 4 - 4
vendor/sdl2/sdl_events.odin

@@ -171,9 +171,9 @@ KeyboardEvent :: struct {
 TEXTEDITINGEVENT_TEXT_SIZE :: 32
 TEXTEDITINGEVENT_TEXT_SIZE :: 32
 TextEditingEvent :: struct {
 TextEditingEvent :: struct {
 	type: EventType,                                /**< ::SDL_TEXTEDITING */
 	type: EventType,                                /**< ::SDL_TEXTEDITING */
-    	timestamp: u32,                           /**< In milliseconds, populated using SDL_GetTicks() */
-    	windowID: u32,                            /**< The window with keyboard focus, if any */
-    	text: [TEXTEDITINGEVENT_TEXT_SIZE]u8,  /**< The editing text */
+	timestamp: u32,                           /**< In milliseconds, populated using SDL_GetTicks() */
+	windowID: u32,                            /**< The window with keyboard focus, if any */
+	text: [TEXTEDITINGEVENT_TEXT_SIZE]u8,  /**< The editing text */
 	start: i32,                               /**< The start cursor of selected editing text */
 	start: i32,                               /**< The start cursor of selected editing text */
 	length: i32,                              /**< The length of selected editing text */
 	length: i32,                              /**< The length of selected editing text */
 }
 }
@@ -184,7 +184,7 @@ TextInputEvent :: struct {
 	type: EventType,                              /**< ::SDL_TEXTINPUT */
 	type: EventType,                              /**< ::SDL_TEXTINPUT */
 	timestamp: u32,                         /**< In milliseconds, populated using SDL_GetTicks() */
 	timestamp: u32,                         /**< In milliseconds, populated using SDL_GetTicks() */
 	windowID: u32,                          /**< The window with keyboard focus, if any */
 	windowID: u32,                          /**< The window with keyboard focus, if any */
-    	text: [TEXTINPUTEVENT_TEXT_SIZE]u8,  /**< The input text */
+	text: [TEXTINPUTEVENT_TEXT_SIZE]u8,  /**< The input text */
 }
 }
 
 
 MouseMotionEvent :: struct {
 MouseMotionEvent :: struct {

+ 23 - 23
vendor/sdl2/sdl_gamecontroller.odin

@@ -54,29 +54,29 @@ GameControllerAxis :: enum c.int {
 }
 }
 
 
 GameControllerButton :: enum c.int {
 GameControllerButton :: enum c.int {
-    	INVALID = -1,
-    	A,
-    	B,
-    	X,
-    	Y,
-    	BACK,
-    	GUIDE,
-    	START,
-    	LEFTSTICK,
-    	RIGHTSTICK,
-    	LEFTSHOULDER,
-    	RIGHTSHOULDER,
-    	DPAD_UP,
-    	DPAD_DOWN,
-    	DPAD_LEFT,
-    	DPAD_RIGHT,
-    	MISC1,    /* Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button */
-    	PADDLE1,  /* Xbox Elite paddle P1 */
-    	PADDLE2,  /* Xbox Elite paddle P3 */
-    	PADDLE3,  /* Xbox Elite paddle P2 */
-    	PADDLE4,  /* Xbox Elite paddle P4 */
-    	TOUCHPAD, /* PS4/PS5 touchpad button */
-    	MAX,
+	INVALID = -1,
+	A,
+	B,
+	X,
+	Y,
+	BACK,
+	GUIDE,
+	START,
+	LEFTSTICK,
+	RIGHTSTICK,
+	LEFTSHOULDER,
+	RIGHTSHOULDER,
+	DPAD_UP,
+	DPAD_DOWN,
+	DPAD_LEFT,
+	DPAD_RIGHT,
+	MISC1,    /* Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button */
+	PADDLE1,  /* Xbox Elite paddle P1 */
+	PADDLE2,  /* Xbox Elite paddle P3 */
+	PADDLE3,  /* Xbox Elite paddle P2 */
+	PADDLE4,  /* Xbox Elite paddle P4 */
+	TOUCHPAD, /* PS4/PS5 touchpad button */
+	MAX,
 }
 }
 
 
 
 

+ 4 - 4
vendor/sdl2/sdl_touch.odin

@@ -19,10 +19,10 @@ TouchDeviceType :: enum c.int {
 }
 }
 
 
 Finger :: struct {
 Finger :: struct {
-    id: FingerID,
-    x:        f32,
-    y:        f32,
-    pressure: f32,
+	id: FingerID,
+	x:        f32,
+	y:        f32,
+	pressure: f32,
 }
 }
 
 
 TOUCH_MOUSEID  :: ~u32(0)
 TOUCH_MOUSEID  :: ~u32(0)

+ 1 - 1
vendor/stb/image/stb_image_resize.odin

@@ -166,7 +166,7 @@ datatype :: enum c.int {
 	UINT32,
 	UINT32,
 	FLOAT,
 	FLOAT,
 
 
-    	MAX_TYPES,
+	MAX_TYPES,
 }
 }
 
 
 @(default_calling_convention="c", link_prefix="stbir_")
 @(default_calling_convention="c", link_prefix="stbir_")

+ 2 - 2
vendor/wgpu/README.md

@@ -11,8 +11,8 @@ Have a look at the `example/` directory for the rendering of a basic triangle.
 ## Getting the wgpu-native libraries
 ## Getting the wgpu-native libraries
 
 
 For native support (not the browser), some libraries are required. Fortunately this is
 For native support (not the browser), some libraries are required. Fortunately this is
-extremely easy, just download them from the [releases on GitHub](https://github.com/gfx-rs/wgpu-native/releases/tag/v0.19.4.1),
-the bindings are for v0.19.4.1 at the moment.
+extremely easy, just download them from the [releases on GitHub](https://github.com/gfx-rs/wgpu-native/releases/tag/v22.1.0.1),
+the bindings are for v22.1.0.1 at the moment.
 
 
 These are expected in the `lib` folder under the same name as they are released (just unzipped).
 These are expected in the `lib` folder under the same name as they are released (just unzipped).
 By default it will look for a static release version (`wgpu-OS-ARCH-release.a|lib`),
 By default it will look for a static release version (`wgpu-OS-ARCH-release.a|lib`),

+ 3 - 1
vendor/wgpu/examples/glfw/main.odin

@@ -158,15 +158,17 @@ frame :: proc "c" (dt: f32) {
 				view       = frame,
 				view       = frame,
 				loadOp     = .Clear,
 				loadOp     = .Clear,
 				storeOp    = .Store,
 				storeOp    = .Store,
+				depthSlice = wgpu.DEPTH_SLICE_UNDEFINED,
 				clearValue = { 0, 1, 0, 1 },
 				clearValue = { 0, 1, 0, 1 },
 			},
 			},
 		},
 		},
 	)
 	)
-	defer wgpu.RenderPassEncoderRelease(render_pass_encoder)
 
 
 	wgpu.RenderPassEncoderSetPipeline(render_pass_encoder, state.pipeline)
 	wgpu.RenderPassEncoderSetPipeline(render_pass_encoder, state.pipeline)
 	wgpu.RenderPassEncoderDraw(render_pass_encoder, vertexCount=3, instanceCount=1, firstVertex=0, firstInstance=0)
 	wgpu.RenderPassEncoderDraw(render_pass_encoder, vertexCount=3, instanceCount=1, firstVertex=0, firstInstance=0)
+
 	wgpu.RenderPassEncoderEnd(render_pass_encoder)
 	wgpu.RenderPassEncoderEnd(render_pass_encoder)
+	wgpu.RenderPassEncoderRelease(render_pass_encoder)
 
 
 	command_buffer := wgpu.CommandEncoderFinish(command_encoder, nil)
 	command_buffer := wgpu.CommandEncoderFinish(command_encoder, nil)
 	defer wgpu.CommandBufferRelease(command_buffer)
 	defer wgpu.CommandBufferRelease(command_buffer)

+ 3 - 1
vendor/wgpu/examples/sdl2/main.odin

@@ -158,15 +158,17 @@ frame :: proc "c" (dt: f32) {
 				view       = frame,
 				view       = frame,
 				loadOp     = .Clear,
 				loadOp     = .Clear,
 				storeOp    = .Store,
 				storeOp    = .Store,
+				depthSlice = wgpu.DEPTH_SLICE_UNDEFINED,
 				clearValue = { 0, 1, 0, 1 },
 				clearValue = { 0, 1, 0, 1 },
 			},
 			},
 		},
 		},
 	)
 	)
-	defer wgpu.RenderPassEncoderRelease(render_pass_encoder)
 
 
 	wgpu.RenderPassEncoderSetPipeline(render_pass_encoder, state.pipeline)
 	wgpu.RenderPassEncoderSetPipeline(render_pass_encoder, state.pipeline)
 	wgpu.RenderPassEncoderDraw(render_pass_encoder, vertexCount=3, instanceCount=1, firstVertex=0, firstInstance=0)
 	wgpu.RenderPassEncoderDraw(render_pass_encoder, vertexCount=3, instanceCount=1, firstVertex=0, firstInstance=0)
+
 	wgpu.RenderPassEncoderEnd(render_pass_encoder)
 	wgpu.RenderPassEncoderEnd(render_pass_encoder)
+	wgpu.RenderPassEncoderRelease(render_pass_encoder)
 
 
 	command_buffer := wgpu.CommandEncoderFinish(command_encoder, nil)
 	command_buffer := wgpu.CommandEncoderFinish(command_encoder, nil)
 	defer wgpu.CommandBufferRelease(command_buffer)
 	defer wgpu.CommandBufferRelease(command_buffer)

BIN
vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.dll


BIN
vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.dll.lib


BIN
vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.lib


BIN
vendor/wgpu/lib/wgpu-windows-x86_64-release/wgpu_native.pdb


+ 2 - 0
vendor/wgpu/sdl2glue/glue_linux.odin

@@ -5,7 +5,9 @@ import "vendor:wgpu"
 
 
 GetSurface :: proc(instance: wgpu.Instance, window: ^sdl2.Window) -> wgpu.Surface {
 GetSurface :: proc(instance: wgpu.Instance, window: ^sdl2.Window) -> wgpu.Surface {
 	window_info: sdl2.SysWMinfo 
 	window_info: sdl2.SysWMinfo 
+	sdl2.VERSION(&window_info.version)
 	sdl2.GetWindowWMInfo(window, &window_info)
 	sdl2.GetWindowWMInfo(window, &window_info)
+
 	if window_info.subsystem == .WAYLAND {
 	if window_info.subsystem == .WAYLAND {
 		display := window_info.info.wl.display
 		display := window_info.info.wl.display
 		surface := window_info.info.wl.surface
 		surface := window_info.info.wl.surface

+ 91 - 96
vendor/wgpu/wgpu.js

@@ -44,6 +44,7 @@ class WebGPUInterface {
 			BlendFactor: ["zero", "one", "src", "one-minus-src", "src-alpha", "one-minus-src-alpha", "dst", "one-minus-dst", "dst-alpha", "one-minus-dst-alpha", "src-alpha-saturated", "constant", "one-minus-constant", ],
 			BlendFactor: ["zero", "one", "src", "one-minus-src", "src-alpha", "one-minus-src-alpha", "dst", "one-minus-dst", "dst-alpha", "one-minus-dst-alpha", "src-alpha-saturated", "constant", "one-minus-constant", ],
 			PresentMode: ["fifo", "fifo-relaxed", "immediate", "mailbox", ],
 			PresentMode: ["fifo", "fifo-relaxed", "immediate", "mailbox", ],
 			TextureAspect: ["all", "stencil-only", "depth-only"],
 			TextureAspect: ["all", "stencil-only", "depth-only"],
+			DeviceLostReason: [undefined, "unknown", "destroyed"],
 		};
 		};
 
 
 		/** @type {WebGPUObjectManager<{}>} */
 		/** @type {WebGPUObjectManager<{}>} */
@@ -382,13 +383,19 @@ class WebGPUInterface {
 	 */
 	 */
 	RenderPassColorAttachment(start) {
 	RenderPassColorAttachment(start) {
 		const viewIdx = this.mem.loadPtr(start + 4);
 		const viewIdx = this.mem.loadPtr(start + 4);
-		const resolveTargetIdx = this.mem.loadPtr(start + 8);
+		const resolveTargetIdx = this.mem.loadPtr(start + 12);
+
+		let depthSlice = this.mem.loadU32(start + 8);
+		if (depthSlice == 0xFFFFFFFF) { // DEPTH_SLICE_UNDEFINED.
+			depthSlice = undefined;
+		}
 
 
 		return {
 		return {
 			view: viewIdx > 0 ? this.textureViews.get(viewIdx) : undefined,
 			view: viewIdx > 0 ? this.textureViews.get(viewIdx) : undefined,
 			resolveTarget: resolveTargetIdx > 0 ? this.textureViews.get(resolveTargetIdx) : undefined,
 			resolveTarget: resolveTargetIdx > 0 ? this.textureViews.get(resolveTargetIdx) : undefined,
-			loadOp: this.enumeration("LoadOp", start + 12),
-			storeOp: this.enumeration("StoreOp", start + 16),
+			depthSlice: depthSlice,
+			loadOp: this.enumeration("LoadOp", start + 16),
+			storeOp: this.enumeration("StoreOp", start + 20),
 			clearValue: this.Color(start + 24),
 			clearValue: this.Color(start + 24),
 		};
 		};
 	}
 	}
@@ -950,14 +957,25 @@ class WebGPUInterface {
 
 
 			/**
 			/**
 			 * @param {number} adapterIdx
 			 * @param {number} adapterIdx
-			 * @param {number} propertiesPtr
+			 * @param {number} infoPtr
 			 */
 			 */
-			wgpuAdapterGetProperties: (adapterIdx, propertiesPtr) => {
-				this.assert(propertiesPtr != 0);
- 				// Unknown adapter.
-				this.mem.storeI32(propertiesPtr + 28, 3);
+			wgpuAdapterGetInfo: (adapterIdx, infoPtr) => {
+				this.assert(infoPtr != 0);
+
 				// WebGPU backend.
 				// WebGPU backend.
-				this.mem.storeI32(propertiesPtr + 32, 2);
+				this.mem.storeI32(infoPtr + 20, 2);
+ 				// Unknown adapter.
+				this.mem.storeI32(infoPtr + 24, 3);
+
+				// NOTE: I don't think getting the other fields in this struct is possible.
+				// `adapter.requestAdapterInfo` is deprecated.
+			},
+
+			/**
+			 * @param {number} infoPtr
+			 */
+			wgpuAdapterInfoFreeMembers: (infoPtr) => {
+				// NOTE: nothing to free.
 			},
 			},
 
 
 			/**
 			/**
@@ -970,50 +988,6 @@ class WebGPUInterface {
 				return adapter.features.has(this.enums.FeatureName[featureInt]);
 				return adapter.features.has(this.enums.FeatureName[featureInt]);
 			},
 			},
 
 
-			/**
-			 * @param {number} adapterIdx
-			 * @param {number} callbackPtr
-			 * @param {0|number} userdata
-			 */
-			wgpuAdapterRequestAdapterInfo: async (adapterIdx, callbackPtr, userdata) => {
-				const adapter  = this.adapters.get(adapterIdx);
-				const callback = this.mem.exports.__indirect_function_table.get(callbackPtr);
-
-				const info = await adapter.requestAdapterInfo();
-
-				const addr = this.mem.exports.wgpu_alloc(16);
-
-				const vendorLength = new TextEncoder().encode(info.vendor).length;
-				const vendorAddr = this.mem.exports.wgpu_alloc(vendorLength);
-				this.mem.storeString(vendorAddr, info.vendor);
-				this.mem.storeI32(addr + 0, vendorAddr);
-
-				const architectureLength = new TextEncoder().encode(info.architecture).length;
-				const architectureAddr = this.mem.exports.wgpu_alloc(architectureLength);
-				this.mem.storeString(architectureAddr, info.architecture);
-				this.mem.storeI32(addr + 4, architectureAddr);
-
-
-				const deviceLength = new TextEncoder().encode(info.device).length;
-				const deviceAddr = this.mem.exports.wgpu_alloc(deviceLength);
-				this.mem.storeString(deviceAddr, info.device);
-				this.mem.storeI32(addr + 8, deviceAddr);
-
-
-				const descriptionLength = new TextEncoder().encode(info.description).length;
-				const descriptionAddr = this.mem.exports.wgpu_alloc(descriptionLength);
-				this.mem.storeString(descriptionAddr, info.description);
-				this.mem.storeI32(addr + 12, descriptionAddr);
-
-				callback(addr, userdata);
-
-				this.mem.exports.wgpu_free(descriptionAddr);
-				this.mem.exports.wgpu_free(deviceAddr);
-				this.mem.exports.wgpu_free(architectureAddr);
-				this.mem.exports.wgpu_free(vendorAddr);
-				this.mem.exports.wgpu_free(addr);
-			},
-
 			/**
 			/**
 			 * @param {number} adapterIdx
 			 * @param {number} adapterIdx
 			 * @param {0|number} descriptorPtr
 			 * @param {0|number} descriptorPtr
@@ -1040,14 +1014,69 @@ class WebGPUInterface {
 					};
 					};
 				}
 				}
 
 
+				let device;
 				let deviceIdx;
 				let deviceIdx;
 				try {
 				try {
-					const device = await adapter.requestDevice(descriptor);
+					device = await adapter.requestDevice(descriptor);
 					deviceIdx = this.devices.create(device);
 					deviceIdx = this.devices.create(device);
 					// NOTE: don't callback here, any errors that happen later will then be caught by the catch here.
 					// NOTE: don't callback here, any errors that happen later will then be caught by the catch here.
 				} catch (e) {
 				} catch (e) {
-					console.warn(e);
-					callback(1, null, null, userdata);
+					const messageLength = new TextEncoder().encode(e.message).length;
+					const messageAddr = this.mem.exports.wgpu_alloc(messageLength + 1);
+					this.mem.storeString(messageAddr, e.message);
+
+					callback(1, null, messageAddr, userdata);
+
+					this.mem.exports.wgpu_free(messageAddr);
+				}
+
+				let callbacksPtr = descriptorPtr + 24 + this.mem.intSize;
+
+				const deviceLostCallbackPtr = this.mem.loadPtr(callbacksPtr);
+				if (deviceLostCallbackPtr != 0) {
+					const deviceLostUserData = this.mem.loadPtr(callbacksPtr) + 4;
+					const deviceLostCallback = this.mem.exports.__indirect_function_table.get(deviceLostCallbackPtr);
+
+					device.lost.then((info) => {
+						const reason = this.enums.DeviceLostReason.indexOf(info.reason);
+
+						const messageLength = new TextEncoder().encode(info.message).length;
+						const messageAddr = this.mem.exports.wgpu_alloc(messageLength + 1);
+						this.mem.storeString(messageAddr, info.message);
+
+						deviceLostCallback(reason, messageAddr, deviceLostUserData);
+
+						this.mem.exports.wgpu_free(messageAddr);
+					});
+				}
+				callbacksPtr += 8;
+
+				// Skip over `nextInChain`.
+				callbacksPtr += 4;
+
+				const uncapturedErrorCallbackPtr = this.mem.loadPtr(callbacksPtr);
+				if (uncapturedErrorCallbackPtr != 0) {
+					const uncapturedErrorUserData = this.mem.loadPtr(callbacksPtr + 4);
+					const uncapturedErrorCallback = this.mem.exports.__indirect_function_table.get(uncapturedErrorCallbackPtr);
+
+					device.onuncapturederror = (ev) => {
+						let status = 4; // Unknown
+						if (ev.error instanceof GPUValidationError) {
+							status = 1; // Validation
+						} else if (ev.error instanceof GPUOutOfMemoryError) {
+							status = 2; // OutOfMemory
+						} else if (ev.error instanceof GPUInternalError) {
+							status = 3; // Internal
+						}
+
+						const messageLength = new TextEncoder().encode(ev.error.message).length;
+						const messageAddr = this.mem.exports.wgpu_alloc(messageLength + 1);
+						this.mem.storeString(messageAddr, ev.error.message);
+
+						uncapturedErrorCallback(status, messageAddr, uncapturedErrorUserData);
+
+						this.mem.exports.wgpu_free(messageAddr);
+					};
 				}
 				}
 
 
 				callback(0, deviceIdx, null, userdata);
 				callback(0, deviceIdx, null, userdata);
@@ -1918,29 +1947,6 @@ class WebGPUInterface {
 				device.pushErrorScope(this.enums.ErrorFilter[filterInt]);
 				device.pushErrorScope(this.enums.ErrorFilter[filterInt]);
 			},
 			},
 
 
-			/**
-			 * @param {number} deviceIdx
-			 * @param {number} callbackPtr
-			 * @param {number} userdata
-			 */
-			wgpuDeviceSetUncapturedErrorCallback: (deviceIdx, callbackPtr, userdata) => {
-				const device = this.devices.get(deviceIdx);
-				const callback = this.mem.exports.__indirect_function_table.get(callbackPtr);
-
-				device.onuncapturederror = (ev) => {
-					console.warn(ev.error);
-					let status = 4;
-					if (error instanceof GPUValidationError) {
-						status = 1;
-					} else if (error instanceof GPUOutOfMemoryError) {
-						status = 2;
-					} else if (error instanceof GPUInternalError) {
-						status = 3;
-					}
-					callback(status, null, userdata);
-				};
-			},
-
 			...this.devices.interface(true),
 			...this.devices.interface(true),
 
 
 			/* ---------------------- Instance ---------------------- */
 			/* ---------------------- Instance ---------------------- */
@@ -2646,23 +2652,23 @@ class WebGPUInterface {
 				const formatStr = navigator.gpu.getPreferredCanvasFormat();
 				const formatStr = navigator.gpu.getPreferredCanvasFormat();
 				const format = this.enums.TextureFormat.indexOf(formatStr);
 				const format = this.enums.TextureFormat.indexOf(formatStr);
 
 
-				this.mem.storeUint(capabilitiesPtr + this.mem.intSize, 1);
+				this.mem.storeUint(capabilitiesPtr + 8, 1);
 				const formatAddr = this.mem.exports.wgpu_alloc(4);
 				const formatAddr = this.mem.exports.wgpu_alloc(4);
 				this.mem.storeI32(formatAddr, format);
 				this.mem.storeI32(formatAddr, format);
-				this.mem.storeI32(capabilitiesPtr + this.mem.intSize*2, formatAddr);
+				this.mem.storeI32(capabilitiesPtr + 8 + this.mem.intSize, formatAddr);
 
 
 				// NOTE: present modes don't seem to actually do anything in JS, we can just give back a default FIFO though.
 				// NOTE: present modes don't seem to actually do anything in JS, we can just give back a default FIFO though.
-				this.mem.storeUint(capabilitiesPtr + this.mem.intSize*3, 1);
+				this.mem.storeUint(capabilitiesPtr + 8 + this.mem.intSize*2, 1);
 				const presentModesAddr = this.mem.exports.wgpu_alloc(4);
 				const presentModesAddr = this.mem.exports.wgpu_alloc(4);
 				this.mem.storeI32(presentModesAddr, 0);
 				this.mem.storeI32(presentModesAddr, 0);
-				this.mem.storeI32(capabilitiesPtr + this.mem.intSize*4, presentModesAddr);
+				this.mem.storeI32(capabilitiesPtr + 8 + this.mem.intSize*3, presentModesAddr);
 
 
 				// Browser seems to support opaque (1) and premultiplied (2).
 				// Browser seems to support opaque (1) and premultiplied (2).
-				this.mem.storeUint(capabilitiesPtr + this.mem.intSize*5, 2);
+				this.mem.storeUint(capabilitiesPtr + 8 + this.mem.intSize*4, 2);
 				const alphaModesAddr = this.mem.exports.wgpu_alloc(8);
 				const alphaModesAddr = this.mem.exports.wgpu_alloc(8);
 				this.mem.storeI32(alphaModesAddr + 0, 1); // Opaque.
 				this.mem.storeI32(alphaModesAddr + 0, 1); // Opaque.
 				this.mem.storeI32(alphaModesAddr + 4, 2); // premultiplied.
 				this.mem.storeI32(alphaModesAddr + 4, 2); // premultiplied.
-				this.mem.storeI32(capabilitiesPtr + this.mem.intSize*6, alphaModesAddr);
+				this.mem.storeI32(capabilitiesPtr + 8 + this.mem.intSize*5, alphaModesAddr);
 			},
 			},
 
 
 			/**
 			/**
@@ -2680,17 +2686,6 @@ class WebGPUInterface {
 				// TODO: determine suboptimal and/or status.
 				// TODO: determine suboptimal and/or status.
 			},
 			},
 
 
-			/**
-			 * @param {number} surfaceIdx
-			 * @param {number} texturePtr
-			 * @returns {number}
-			 */
-			wgpuSurfaceGetPreferredFormat: (surfaceIdx, adapterIdx) => {
-				const formatStr = navigator.gpu.getPreferredCanvasFormat();
-				const format = this.enums.TextureFormat.indexOf(formatStr);
-				return format;
-			},
-
 			/**
 			/**
 			 * @param {number} surfaceIdx
 			 * @param {number} surfaceIdx
 			 */
 			 */

+ 111 - 53
vendor/wgpu/wgpu.odin

@@ -13,7 +13,7 @@ when ODIN_OS == .Windows {
 	@(private) LIB  :: "lib/wgpu-windows-" + ARCH + "-" + TYPE + "/wgpu_native" + EXT
 	@(private) LIB  :: "lib/wgpu-windows-" + ARCH + "-" + TYPE + "/wgpu_native" + EXT
 
 
 	when !#exists(LIB) {
 	when !#exists(LIB) {
-		#panic("Could not find the compiled WGPU Native library at '" + #directory + LIB + "', these can be downloaded from https://github.com/gfx-rs/wgpu-native/releases/tag/v0.19.4.1, make sure to read the README at '" + #directory + "vendor/wgpu/README.md'")
+		#panic("Could not find the compiled WGPU Native library at '" + #directory + LIB + "', these can be downloaded from https://github.com/gfx-rs/wgpu-native/releases/tag/v22.1.0.1, make sure to read the README at '" + #directory + "vendor/wgpu/README.md'")
 	}
 	}
 
 
 	foreign import libwgpu {
 	foreign import libwgpu {
@@ -34,7 +34,7 @@ when ODIN_OS == .Windows {
 	@(private) LIB  :: "lib/wgpu-macos-" + ARCH + "-" + TYPE + "/libwgpu_native" + EXT
 	@(private) LIB  :: "lib/wgpu-macos-" + ARCH + "-" + TYPE + "/libwgpu_native" + EXT
 
 
 	when !#exists(LIB) {
 	when !#exists(LIB) {
-		#panic("Could not find the compiled WGPU Native library at '" + #directory + LIB + "', these can be downloaded from https://github.com/gfx-rs/wgpu-native/releases/tag/v0.19.4.1, make sure to read the README at '" + #directory + "vendor/wgpu/README.md'")
+		#panic("Could not find the compiled WGPU Native library at '" + #directory + LIB + "', these can be downloaded from https://github.com/gfx-rs/wgpu-native/releases/tag/v22.1.0.1, make sure to read the README at '" + #directory + "vendor/wgpu/README.md'")
 	}
 	}
 
 
 	foreign import libwgpu {
 	foreign import libwgpu {
@@ -49,7 +49,7 @@ when ODIN_OS == .Windows {
 	@(private) LIB  :: "lib/wgpu-linux-" + ARCH + "-" + TYPE + "/libwgpu_native" + EXT
 	@(private) LIB  :: "lib/wgpu-linux-" + ARCH + "-" + TYPE + "/libwgpu_native" + EXT
 
 
 	when !#exists(LIB) {
 	when !#exists(LIB) {
-		#panic("Could not find the compiled WGPU Native library at '" + #directory + LIB + "', these can be downloaded from https://github.com/gfx-rs/wgpu-native/releases/tag/v0.19.4.1, make sure to read the README at '" + #directory + "vendor/wgpu/README.md'")
+		#panic("Could not find the compiled WGPU Native library at '" + #directory + LIB + "', these can be downloaded from https://github.com/gfx-rs/wgpu-native/releases/tag/v22.1.0.1, make sure to read the README at '" + #directory + "vendor/wgpu/README.md'")
 	}
 	}
 
 
 	foreign import libwgpu {
 	foreign import libwgpu {
@@ -220,7 +220,8 @@ CullMode :: enum i32 {
 
 
 DeviceLostReason :: enum i32 {
 DeviceLostReason :: enum i32 {
 	Undefined = 0x00000000,
 	Undefined = 0x00000000,
-	Destroyed = 0x00000001,
+	Unknown   = 0x00000001,
+	Destroyed = 0x00000002,
 }
 }
 
 
 ErrorFilter :: enum i32 {
 ErrorFilter :: enum i32 {
@@ -264,6 +265,30 @@ FeatureName :: enum i32 {
 	PipelineStatisticsQuery,
 	PipelineStatisticsQuery,
 	StorageResourceBindingArray,
 	StorageResourceBindingArray,
 	PartiallyBoundBindingArray,
 	PartiallyBoundBindingArray,
+	TextureFormat16bitNorm,
+	TextureCompressionAstcHdr,
+	// TODO: requires wgpu.h api change
+	// TimestampQueryInsidePasses,
+	MappablePrimaryBuffers = 0x0003000E,
+	BufferBindingArray,
+	UniformBufferAndStorageTextureArrayNonUniformIndexing,
+	// TODO: requires wgpu.h api change
+	// AddressModeClampToZero,
+	// AddressModeClampToBorder,
+	// PolygonModeLine,
+	// PolygonModePoint,
+	// ConservativeRasterization,
+	// ClearTexture,
+	// SprivShaderPassThrough,
+	// MultiView,
+	VertexAttribute64bit = 0x00030019,
+	TextureFormatNv12,
+	RayTracingAccelarationStructure,
+	RayQuery,
+	ShaderF64,
+	ShaderI16,
+	ShaderPrimitiveIndex,
+	ShaderEarlyDepthTest,
 }
 }
 
 
 FilterMode :: enum i32 {
 FilterMode :: enum i32 {
@@ -520,6 +545,18 @@ TextureFormat :: enum i32 {
 	ASTC12x10UnormSrgb = 0x0000005D,
 	ASTC12x10UnormSrgb = 0x0000005D,
 	ASTC12x12Unorm = 0x0000005E,
 	ASTC12x12Unorm = 0x0000005E,
 	ASTC12x12UnormSrgb = 0x0000005F,
 	ASTC12x12UnormSrgb = 0x0000005F,
+
+	// Native.
+
+	// From FeatureName.TextureFormat16bitNorm
+	R16Unorm = 0x00030001,
+	R16Snorm,
+	Rg16Unorm,
+	Rg16Snorm,
+	Rgba16Unorm,
+	Rgba16Snorm,
+	// From FeatureName.TextureFormatNv12
+	NV12,
 }
 }
 
 
 TextureSampleType :: enum i32 {
 TextureSampleType :: enum i32 {
@@ -581,13 +618,13 @@ VertexStepMode :: enum i32 {
 	VertexBufferNotUsed = 0x00000002,
 	VertexBufferNotUsed = 0x00000002,
 }
 }
 
 
-// WGSLFeatureName :: enum i32 {
-//     Undefined = 0x00000000,
-//     ReadonlyAndReadwriteStorageTextures = 0x00000001,
-//     Packed4x8IntegerDotProduct = 0x00000002,
-//     UnrestrictedPointerParameters = 0x00000003,
-//     PointerCompositeAccess = 0x00000004,
-// }
+WGSLFeatureName :: enum i32 {
+	Undefined = 0x00000000,
+	ReadonlyAndReadwriteStorageTextures = 0x00000001,
+	Packed4x8IntegerDotProduct = 0x00000002,
+	UnrestrictedPointerParameters = 0x00000003,
+	PointerCompositeAccess = 0x00000004,
+}
 
 
 BufferUsage :: enum i32 {
 BufferUsage :: enum i32 {
 	MapRead = 0x00000000,
 	MapRead = 0x00000000,
@@ -634,22 +671,18 @@ TextureUsage :: enum i32 {
 }
 }
 TextureUsageFlags :: bit_set[TextureUsage; Flags]
 TextureUsageFlags :: bit_set[TextureUsage; Flags]
 
 
-
-BufferMapAsyncCallback :: #type proc "c" (status: BufferMapAsyncStatus, /* NULLABLE */ userdata: rawptr)
-ShaderModuleGetCompilationInfoCallback :: #type proc "c" (status: CompilationInfoRequestStatus, compilationInfo: ^CompilationInfo, /* NULLABLE */ userdata: rawptr)
-DeviceCreateComputePipelineAsyncCallback :: #type proc "c" (status: CreatePipelineAsyncStatus, pipeline: ComputePipeline, message: cstring, /* NULLABLE */ userdata: rawptr)
-DeviceCreateRenderPipelineAsyncCallback :: #type proc "c" (status: CreatePipelineAsyncStatus, pipeline: RenderPipeline, message: cstring, /* NULLABLE */ userdata: rawptr)
+Proc :: distinct rawptr
 
 
 DeviceLostCallback :: #type proc "c" (reason: DeviceLostReason, message: cstring, userdata: rawptr)
 DeviceLostCallback :: #type proc "c" (reason: DeviceLostReason, message: cstring, userdata: rawptr)
 ErrorCallback :: #type proc "c" (type: ErrorType, message: cstring, userdata: rawptr)
 ErrorCallback :: #type proc "c" (type: ErrorType, message: cstring, userdata: rawptr)
 
 
-Proc :: distinct rawptr
-
-QueueOnSubmittedWorkDoneCallback :: #type proc "c" (status: QueueWorkDoneStatus, /* NULLABLE */ userdata: rawptr)
-InstanceRequestAdapterCallback :: #type proc "c" (status: RequestAdapterStatus, adapter: Adapter, message: cstring, /* NULLABLE */ userdata: rawptr)
 AdapterRequestDeviceCallback :: #type proc "c" (status: RequestDeviceStatus, device: Device, message: cstring, /* NULLABLE */ userdata: rawptr)
 AdapterRequestDeviceCallback :: #type proc "c" (status: RequestDeviceStatus, device: Device, message: cstring, /* NULLABLE */ userdata: rawptr)
-
-// AdapterRequestAdapterInfoCallback :: #type proc "c" (adapterInfo: AdapterInfo, /* NULLABLE */ userdata: rawptr)
+BufferMapAsyncCallback :: #type proc "c" (status: BufferMapAsyncStatus, /* NULLABLE */ userdata: rawptr)
+DeviceCreateComputePipelineAsyncCallback :: #type proc "c" (status: CreatePipelineAsyncStatus, pipeline: ComputePipeline, message: cstring, /* NULLABLE */ userdata: rawptr)
+DeviceCreateRenderPipelineAsyncCallback :: #type proc "c" (status: CreatePipelineAsyncStatus, pipeline: RenderPipeline, message: cstring, /* NULLABLE */ userdata: rawptr)
+InstanceRequestAdapterCallback :: #type proc "c" (status: RequestAdapterStatus, adapter: Adapter, message: cstring, /* NULLABLE */ userdata: rawptr)
+QueueOnSubmittedWorkDoneCallback :: #type proc "c" (status: QueueWorkDoneStatus, /* NULLABLE */ userdata: rawptr)
+ShaderModuleGetCompilationInfoCallback :: #type proc "c" (status: CompilationInfoRequestStatus, compilationInfo: ^CompilationInfo, /* NULLABLE */ userdata: rawptr)
 
 
 ChainedStruct :: struct {
 ChainedStruct :: struct {
 	next:  ^ChainedStruct,
 	next:  ^ChainedStruct,
@@ -661,28 +694,23 @@ ChainedStructOut :: struct {
 	sType: SType,
 	sType: SType,
 }
 }
 
 
-// AdapterInfo :: struct {
-// 	next: ^ChainedStructOut,
-//     vendor: cstring,
-//     architecture: cstring,
-//     device: cstring,
-//     description: cstring,
-// 	backendType: BackendType,
-// 	adapterType: AdapterType,
-// 	vendorID: u32,
-// 	deviceID: u32,
-// }
-
-AdapterProperties :: struct {
+AdapterInfo :: struct {
 	nextInChain: ^ChainedStructOut,
 	nextInChain: ^ChainedStructOut,
-	vendorID: u32,
-	vendorName: cstring,
+	vendor: cstring,
 	architecture: cstring,
 	architecture: cstring,
-	deviceID: u32,
-	name: cstring,
-	driverDescription: cstring,
-	adapterType: AdapterType,
+	device: cstring,
+	description: cstring,
 	backendType: BackendType,
 	backendType: BackendType,
+	adapterType: AdapterType,
+	vendorID: u32,
+	deviceID: u32,
+}
+when ODIN_OS == .JS {
+	#assert(int(BackendType.WebGPU) == 2)
+	#assert(offset_of(AdapterInfo, backendType) == 20)
+
+	#assert(int(AdapterType.Unknown) == 3)
+	#assert(offset_of(AdapterInfo, adapterType) == 24)
 }
 }
 
 
 BindGroupEntry :: struct {
 BindGroupEntry :: struct {
@@ -943,6 +971,7 @@ StorageTextureBindingLayout :: struct {
 
 
 SurfaceCapabilities :: struct {
 SurfaceCapabilities :: struct {
 	nextInChain: ^ChainedStructOut,
 	nextInChain: ^ChainedStructOut,
+	usages: TextureUsageFlags,
 	formatCount: uint,
 	formatCount: uint,
 	formats: /* const */ [^]TextureFormat `fmt:"v,formatCount"`,
 	formats: /* const */ [^]TextureFormat `fmt:"v,formatCount"`,
 	presentModeCount: uint,
 	presentModeCount: uint,
@@ -950,6 +979,16 @@ SurfaceCapabilities :: struct {
 	alphaModeCount: uint,
 	alphaModeCount: uint,
 	alphaModes: /* const */ [^]CompositeAlphaMode `fmt:"v,alphaModeCount"`,
 	alphaModes: /* const */ [^]CompositeAlphaMode `fmt:"v,alphaModeCount"`,
 }
 }
+when ODIN_OS == .JS {
+	#assert(offset_of(SurfaceCapabilities, formatCount) == 8)
+	#assert(offset_of(SurfaceCapabilities, formats) == 8 + 1*size_of(int))
+
+	#assert(offset_of(SurfaceCapabilities, presentModeCount) == 8 + 2*size_of(int))
+	#assert(offset_of(SurfaceCapabilities, presentModes) == 8 + 3*size_of(int))
+
+	#assert(offset_of(SurfaceCapabilities, alphaModeCount) == 8 + 4*size_of(int))
+	#assert(offset_of(SurfaceCapabilities, alphaModes) == 8 + 5*size_of(int))
+}
 
 
 SurfaceConfiguration :: struct {
 SurfaceConfiguration :: struct {
 	nextInChain: ^ChainedStruct,
 	nextInChain: ^ChainedStruct,
@@ -1040,6 +1079,12 @@ TextureViewDescriptor :: struct {
 	aspect: TextureAspect,
 	aspect: TextureAspect,
 }
 }
 
 
+UncapturedErrorCallbackInfo :: struct {
+	nextInChain: ^ChainedStruct,
+	callback: ErrorCallback,
+	userdata: rawptr,
+}
+
 VertexAttribute :: struct {
 VertexAttribute :: struct {
 	format: VertexFormat,
 	format: VertexFormat,
 	offset: u64,
 	offset: u64,
@@ -1120,12 +1165,21 @@ ProgrammableStageDescriptor :: struct {
 RenderPassColorAttachment :: struct {
 RenderPassColorAttachment :: struct {
 	nextInChain: ^ChainedStruct,
 	nextInChain: ^ChainedStruct,
 	/* NULLABLE */ view: TextureView,
 	/* NULLABLE */ view: TextureView,
-	// depthSlice: u32,
+	depthSlice: u32,
 	/* NULLABLE */ resolveTarget: TextureView,
 	/* NULLABLE */ resolveTarget: TextureView,
 	loadOp: LoadOp,
 	loadOp: LoadOp,
 	storeOp: StoreOp,
 	storeOp: StoreOp,
 	clearValue: Color,
 	clearValue: Color,
 }
 }
+when ODIN_OS == .JS {
+	#assert(size_of(RenderPassColorAttachment) == 56)
+	#assert(offset_of(RenderPassColorAttachment, view) == 4)
+	#assert(offset_of(RenderPassColorAttachment, depthSlice) == 8)
+	#assert(offset_of(RenderPassColorAttachment, resolveTarget) == 12)
+	#assert(offset_of(RenderPassColorAttachment, loadOp) == 16)
+	#assert(offset_of(RenderPassColorAttachment, storeOp) == 20)
+	#assert(offset_of(RenderPassColorAttachment, clearValue) == 24)
+}
 
 
 RequiredLimits :: struct {
 RequiredLimits :: struct {
 	nextInChain: ^ChainedStruct,
 	nextInChain: ^ChainedStruct,
@@ -1194,6 +1248,10 @@ DeviceDescriptor :: struct {
 	defaultQueue: QueueDescriptor,
 	defaultQueue: QueueDescriptor,
 	deviceLostCallback: DeviceLostCallback,
 	deviceLostCallback: DeviceLostCallback,
 	deviceLostUserdata: rawptr,
 	deviceLostUserdata: rawptr,
+	uncapturedErrorCallbackInfo: UncapturedErrorCallbackInfo,
+}
+when ODIN_OS == .JS {
+	#assert(offset_of(DeviceDescriptor, deviceLostCallback) == 24 + size_of(int))
 }
 }
 
 
 RenderPassDescriptor :: struct {
 RenderPassDescriptor :: struct {
@@ -1245,16 +1303,18 @@ foreign libwgpu {
 	// Methods of Adapter
 	// Methods of Adapter
 	@(link_name="wgpuAdapterEnumerateFeatures")
 	@(link_name="wgpuAdapterEnumerateFeatures")
 	RawAdapterEnumerateFeatures :: proc(adapter: Adapter, features: [^]FeatureName) -> uint ---
 	RawAdapterEnumerateFeatures :: proc(adapter: Adapter, features: [^]FeatureName) -> uint ---
+	@(link_name="wgpuAdapterGetInfo")
+	RawAdapterGetInfo :: proc(adapter: Adapter, info: ^AdapterInfo) ---
 	@(link_name="wgpuAdapterGetLimits")
 	@(link_name="wgpuAdapterGetLimits")
 	RawAdapterGetLimits :: proc(adapter: Adapter, limits: ^SupportedLimits) -> b32 ---
 	RawAdapterGetLimits :: proc(adapter: Adapter, limits: ^SupportedLimits) -> b32 ---
-	@(link_name="wgpuAdapterGetProperties")
-	RawAdapterGetProperties :: proc(adapter: Adapter, properties: ^AdapterProperties) ---
 	AdapterHasFeature :: proc(adapter: Adapter, feature: FeatureName) -> b32 ---
 	AdapterHasFeature :: proc(adapter: Adapter, feature: FeatureName) -> b32 ---
-	// AdapterRequestAdapterInfo :: proc(adapter: Adapter, callback: AdapterRequestAdapterInfoCallback, /* NULLABLE */ userdata: rawptr) ---
 	AdapterRequestDevice :: proc(adapter: Adapter, /* NULLABLE */ descriptor: /* const */ ^DeviceDescriptor, callback: AdapterRequestDeviceCallback, /* NULLABLE */ userdata: rawptr = nil) ---
 	AdapterRequestDevice :: proc(adapter: Adapter, /* NULLABLE */ descriptor: /* const */ ^DeviceDescriptor, callback: AdapterRequestDeviceCallback, /* NULLABLE */ userdata: rawptr = nil) ---
 	AdapterReference :: proc(adapter: Adapter) ---
 	AdapterReference :: proc(adapter: Adapter) ---
 	AdapterRelease :: proc(adapter: Adapter) ---
 	AdapterRelease :: proc(adapter: Adapter) ---
 
 
+	// Procs of AdapterInfo
+	AdapterInfoFreeMembers :: proc(adapterInfo: AdapterInfo) ---
+
 	// Methods of BindGroup
 	// Methods of BindGroup
 	BindGroupSetLabel :: proc(bindGroup: BindGroup, label: cstring) ---
 	BindGroupSetLabel :: proc(bindGroup: BindGroup, label: cstring) ---
 	BindGroupReference :: proc(bindGroup: BindGroup) ---
 	BindGroupReference :: proc(bindGroup: BindGroup) ---
@@ -1348,13 +1408,12 @@ foreign libwgpu {
 	DevicePopErrorScope :: proc(device: Device, callback: ErrorCallback, userdata: rawptr) ---
 	DevicePopErrorScope :: proc(device: Device, callback: ErrorCallback, userdata: rawptr) ---
 	DevicePushErrorScope :: proc(device: Device, filter: ErrorFilter) ---
 	DevicePushErrorScope :: proc(device: Device, filter: ErrorFilter) ---
 	DeviceSetLabel :: proc(device: Device, label: cstring) ---
 	DeviceSetLabel :: proc(device: Device, label: cstring) ---
-	DeviceSetUncapturedErrorCallback :: proc(device: Device, callback: ErrorCallback, userdata: rawptr) ---
 	DeviceReference :: proc(device: Device) ---
 	DeviceReference :: proc(device: Device) ---
 	DeviceRelease :: proc(device: Device) ---
 	DeviceRelease :: proc(device: Device) ---
 
 
 	// Methods of Instance
 	// Methods of Instance
 	InstanceCreateSurface :: proc(instance: Instance, descriptor: /* const */ ^SurfaceDescriptor) -> Surface ---
 	InstanceCreateSurface :: proc(instance: Instance, descriptor: /* const */ ^SurfaceDescriptor) -> Surface ---
-	// InstanceHasWGSLLanguageFeature :: proc(instance: Instance, feature: WGSLFeatureName) -> b32 ---
+	InstanceHasWGSLLanguageFeature :: proc(instance: Instance, feature: WGSLFeatureName) -> b32 ---
 	InstanceProcessEvents :: proc(instance: Instance) ---
 	InstanceProcessEvents :: proc(instance: Instance) ---
 	InstanceRequestAdapter :: proc(instance: Instance, /* NULLABLE */ options: /* const */ ^RequestAdapterOptions, callback: InstanceRequestAdapterCallback, /* NULLABLE */ userdata: rawptr = nil) ---
 	InstanceRequestAdapter :: proc(instance: Instance, /* NULLABLE */ options: /* const */ ^RequestAdapterOptions, callback: InstanceRequestAdapterCallback, /* NULLABLE */ userdata: rawptr = nil) ---
 	InstanceReference :: proc(instance: Instance) ---
 	InstanceReference :: proc(instance: Instance) ---
@@ -1455,9 +1514,8 @@ foreign libwgpu {
 	RawSurfaceGetCapabilities :: proc(surface: Surface, adapter: Adapter, capabilities: ^SurfaceCapabilities) ---
 	RawSurfaceGetCapabilities :: proc(surface: Surface, adapter: Adapter, capabilities: ^SurfaceCapabilities) ---
 	@(link_name="wgpuSurfaceGetCurrentTexture")
 	@(link_name="wgpuSurfaceGetCurrentTexture")
 	RawSurfaceGetCurrentTexture :: proc(surface: Surface, surfaceTexture: ^SurfaceTexture) ---
 	RawSurfaceGetCurrentTexture :: proc(surface: Surface, surfaceTexture: ^SurfaceTexture) ---
-	SurfaceGetPreferredFormat :: proc(surface: Surface, adapter: Adapter) -> TextureFormat ---
 	SurfacePresent :: proc(surface: Surface) ---
 	SurfacePresent :: proc(surface: Surface) ---
-	// SurfaceSetLabel :: proc(surface: Surface, label: cstring) ---
+	SurfaceSetLabel :: proc(surface: Surface, label: cstring) ---
 	SurfaceUnconfigure :: proc(surface: Surface) ---
 	SurfaceUnconfigure :: proc(surface: Surface) ---
 	SurfaceReference :: proc(surface: Surface) ---
 	SurfaceReference :: proc(surface: Surface) ---
 	SurfaceRelease :: proc(surface: Surface) ---
 	SurfaceRelease :: proc(surface: Surface) ---
@@ -1500,8 +1558,8 @@ AdapterGetLimits :: proc(adapter: Adapter) -> (limits: SupportedLimits, ok: bool
 	return
 	return
 }
 }
 
 
-AdapterGetProperties :: proc(adapter: Adapter) -> (properties: AdapterProperties) {
-	RawAdapterGetProperties(adapter, &properties)
+AdapterGetInfo :: proc(adapter: Adapter) -> (info: AdapterInfo) {
+	RawAdapterGetInfo(adapter, &info)
 	return
 	return
 }
 }
 
 
@@ -1634,8 +1692,8 @@ SurfaceGetCurrentTexture :: proc(surface: Surface) -> (surface_texture: SurfaceT
 
 
 // WGPU Native bindings
 // WGPU Native bindings
 
 
-BINDINGS_VERSION        :: [4]u8{0, 19, 4, 1}
-BINDINGS_VERSION_STRING :: "0.19.4.1"
+BINDINGS_VERSION        :: [4]u8{22, 1, 0, 1}
+BINDINGS_VERSION_STRING :: "22.1.0.1"
 
 
 when ODIN_OS != .JS {
 when ODIN_OS != .JS {
 	@(private="file", init)
 	@(private="file", init)

+ 1675 - 1675
vendor/x11/xlib/xlib_keysym.odin

@@ -2,1680 +2,1680 @@
 package xlib
 package xlib
 
 
 KeySym :: enum u32 {
 KeySym :: enum u32 {
-    XK_BackSpace                     = 0xff08,  /* Back space, back char */
-    XK_Tab                           = 0xff09,
-    XK_Linefeed                      = 0xff0a,  /* Linefeed, LF */
-    XK_Clear                         = 0xff0b,
-    XK_Return                        = 0xff0d,  /* Return, enter */
-    XK_Pause                         = 0xff13,  /* Pause, hold */
-    XK_Scroll_Lock                   = 0xff14,
-    XK_Sys_Req                       = 0xff15,
-    XK_Escape                        = 0xff1b,
-    XK_Delete                        = 0xffff,  /* Delete, rubout */
-    XK_Multi_key                     = 0xff20,  /* Multi-key character compose */
-    XK_Codeinput                     = 0xff37,
-    XK_SingleCandidate               = 0xff3c,
-    XK_MultipleCandidate             = 0xff3d,
-    XK_PreviousCandidate             = 0xff3e,
-    XK_Kanji                         = 0xff21,  /* Kanji, Kanji convert */
-    XK_Muhenkan                      = 0xff22,  /* Cancel Conversion */
-    XK_Henkan_Mode                   = 0xff23,  /* Start/Stop Conversion */
-    XK_Henkan                        = 0xff23,  /* Alias for Henkan_Mode */
-    XK_Romaji                        = 0xff24,  /* to Romaji */
-    XK_Hiragana                      = 0xff25,  /* to Hiragana */
-    XK_Katakana                      = 0xff26,  /* to Katakana */
-    XK_Hiragana_Katakana             = 0xff27,  /* Hiragana/Katakana toggle */
-    XK_Zenkaku                       = 0xff28,  /* to Zenkaku */
-    XK_Hankaku                       = 0xff29,  /* to Hankaku */
-    XK_Zenkaku_Hankaku               = 0xff2a,  /* Zenkaku/Hankaku toggle */
-    XK_Touroku                       = 0xff2b,  /* Add to Dictionary */
-    XK_Massyo                        = 0xff2c,  /* Delete from Dictionary */
-    XK_Kana_Lock                     = 0xff2d,  /* Kana Lock */
-    XK_Kana_Shift                    = 0xff2e,  /* Kana Shift */
-    XK_Eisu_Shift                    = 0xff2f,  /* Alphanumeric Shift */
-    XK_Eisu_toggle                   = 0xff30,  /* Alphanumeric toggle */
-    XK_Kanji_Bangou                  = 0xff37,  /* Codeinput */
-    XK_Zen_Koho                      = 0xff3d,  /* Multiple/All Candidate(s) */
-    XK_Mae_Koho                      = 0xff3e,  /* Previous Candidate */
-    XK_Home                          = 0xff50,
-    XK_Left                          = 0xff51,  /* Move left, left arrow */
-    XK_Up                            = 0xff52,  /* Move up, up arrow */
-    XK_Right                         = 0xff53,  /* Move right, right arrow */
-    XK_Down                          = 0xff54,  /* Move down, down arrow */
-    XK_Prior                         = 0xff55,  /* Prior, previous */
-    XK_Page_Up                       = 0xff55,
-    XK_Next                          = 0xff56,  /* Next */
-    XK_Page_Down                     = 0xff56,
-    XK_End                           = 0xff57,  /* EOL */
-    XK_Begin                         = 0xff58,  /* BOL */
-    XK_Select                        = 0xff60,  /* Select, mark */
-    XK_Print                         = 0xff61,
-    XK_Execute                       = 0xff62,  /* Execute, run, do */
-    XK_Insert                        = 0xff63,  /* Insert, insert here */
-    XK_Undo                          = 0xff65,
-    XK_Redo                          = 0xff66,  /* Redo, again */
-    XK_Menu                          = 0xff67,
-    XK_Find                          = 0xff68,  /* Find, search */
-    XK_Cancel                        = 0xff69,  /* Cancel, stop, abort, exit */
-    XK_Help                          = 0xff6a,  /* Help */
-    XK_Break                         = 0xff6b,
-    XK_Mode_switch                   = 0xff7e,  /* Character set switch */
-    XK_script_switch                 = 0xff7e,  /* Alias for mode_switch */
-    XK_Num_Lock                      = 0xff7f,
-    XK_KP_Space                      = 0xff80,  /* Space */
-    XK_KP_Tab                        = 0xff89,
-    XK_KP_Enter                      = 0xff8d,  /* Enter */
-    XK_KP_F1                         = 0xff91,  /* PF1, KP_A, ... */
-    XK_KP_F2                         = 0xff92,
-    XK_KP_F3                         = 0xff93,
-    XK_KP_F4                         = 0xff94,
-    XK_KP_Home                       = 0xff95,
-    XK_KP_Left                       = 0xff96,
-    XK_KP_Up                         = 0xff97,
-    XK_KP_Right                      = 0xff98,
-    XK_KP_Down                       = 0xff99,
-    XK_KP_Prior                      = 0xff9a,
-    XK_KP_Page_Up                    = 0xff9a,
-    XK_KP_Next                       = 0xff9b,
-    XK_KP_Page_Down                  = 0xff9b,
-    XK_KP_End                        = 0xff9c,
-    XK_KP_Begin                      = 0xff9d,
-    XK_KP_Insert                     = 0xff9e,
-    XK_KP_Delete                     = 0xff9f,
-    XK_KP_Equal                      = 0xffbd,  /* Equals */
-    XK_KP_Multiply                   = 0xffaa,
-    XK_KP_Add                        = 0xffab,
-    XK_KP_Separator                  = 0xffac,  /* Separator, often comma */
-    XK_KP_Subtract                   = 0xffad,
-    XK_KP_Decimal                    = 0xffae,
-    XK_KP_Divide                     = 0xffaf,
-    XK_KP_0                          = 0xffb0,
-    XK_KP_1                          = 0xffb1,
-    XK_KP_2                          = 0xffb2,
-    XK_KP_3                          = 0xffb3,
-    XK_KP_4                          = 0xffb4,
-    XK_KP_5                          = 0xffb5,
-    XK_KP_6                          = 0xffb6,
-    XK_KP_7                          = 0xffb7,
-    XK_KP_8                          = 0xffb8,
-    XK_KP_9                          = 0xffb9,
-    XK_F1                            = 0xffbe,
-    XK_F2                            = 0xffbf,
-    XK_F3                            = 0xffc0,
-    XK_F4                            = 0xffc1,
-    XK_F5                            = 0xffc2,
-    XK_F6                            = 0xffc3,
-    XK_F7                            = 0xffc4,
-    XK_F8                            = 0xffc5,
-    XK_F9                            = 0xffc6,
-    XK_F10                           = 0xffc7,
-    XK_F11                           = 0xffc8,
-    XK_L1                            = 0xffc8,
-    XK_F12                           = 0xffc9,
-    XK_L2                            = 0xffc9,
-    XK_F13                           = 0xffca,
-    XK_L3                            = 0xffca,
-    XK_F14                           = 0xffcb,
-    XK_L4                            = 0xffcb,
-    XK_F15                           = 0xffcc,
-    XK_L5                            = 0xffcc,
-    XK_F16                           = 0xffcd,
-    XK_L6                            = 0xffcd,
-    XK_F17                           = 0xffce,
-    XK_L7                            = 0xffce,
-    XK_F18                           = 0xffcf,
-    XK_L8                            = 0xffcf,
-    XK_F19                           = 0xffd0,
-    XK_L9                            = 0xffd0,
-    XK_F20                           = 0xffd1,
-    XK_L10                           = 0xffd1,
-    XK_F21                           = 0xffd2,
-    XK_R1                            = 0xffd2,
-    XK_F22                           = 0xffd3,
-    XK_R2                            = 0xffd3,
-    XK_F23                           = 0xffd4,
-    XK_R3                            = 0xffd4,
-    XK_F24                           = 0xffd5,
-    XK_R4                            = 0xffd5,
-    XK_F25                           = 0xffd6,
-    XK_R5                            = 0xffd6,
-    XK_F26                           = 0xffd7,
-    XK_R6                            = 0xffd7,
-    XK_F27                           = 0xffd8,
-    XK_R7                            = 0xffd8,
-    XK_F28                           = 0xffd9,
-    XK_R8                            = 0xffd9,
-    XK_F29                           = 0xffda,
-    XK_R9                            = 0xffda,
-    XK_F30                           = 0xffdb,
-    XK_R10                           = 0xffdb,
-    XK_F31                           = 0xffdc,
-    XK_R11                           = 0xffdc,
-    XK_F32                           = 0xffdd,
-    XK_R12                           = 0xffdd,
-    XK_F33                           = 0xffde,
-    XK_R13                           = 0xffde,
-    XK_F34                           = 0xffdf,
-    XK_R14                           = 0xffdf,
-    XK_F35                           = 0xffe0,
-    XK_R15                           = 0xffe0,
-    XK_Shift_L                       = 0xffe1,  /* Left shift */
-    XK_Shift_R                       = 0xffe2,  /* Right shift */
-    XK_Control_L                     = 0xffe3,  /* Left control */
-    XK_Control_R                     = 0xffe4,  /* Right control */
-    XK_Caps_Lock                     = 0xffe5,  /* Caps lock */
-    XK_Shift_Lock                    = 0xffe6,  /* Shift lock */
-    XK_Meta_L                        = 0xffe7,  /* Left meta */
-    XK_Meta_R                        = 0xffe8,  /* Right meta */
-    XK_Alt_L                         = 0xffe9,  /* Left alt */
-    XK_Alt_R                         = 0xffea,  /* Right alt */
-    XK_Super_L                       = 0xffeb,  /* Left super */
-    XK_Super_R                       = 0xffec,  /* Right super */
-    XK_Hyper_L                       = 0xffed,  /* Left hyper */
-    XK_Hyper_R                       = 0xffee,  /* Right hyper */
-    XK_ISO_Lock                      = 0xfe01,
-    XK_ISO_Level2_Latch              = 0xfe02,
-    XK_ISO_Level3_Shift              = 0xfe03,
-    XK_ISO_Level3_Latch              = 0xfe04,
-    XK_ISO_Level3_Lock               = 0xfe05,
-    XK_ISO_Group_Shift               = 0xff7e,  /* Alias for mode_switch */
-    XK_ISO_Group_Latch               = 0xfe06,
-    XK_ISO_Group_Lock                = 0xfe07,
-    XK_ISO_Next_Group                = 0xfe08,
-    XK_ISO_Next_Group_Lock           = 0xfe09,
-    XK_ISO_Prev_Group                = 0xfe0a,
-    XK_ISO_Prev_Group_Lock           = 0xfe0b,
-    XK_ISO_First_Group               = 0xfe0c,
-    XK_ISO_First_Group_Lock          = 0xfe0d,
-    XK_ISO_Last_Group                = 0xfe0e,
-    XK_ISO_Last_Group_Lock           = 0xfe0f,
-    XK_ISO_Left_Tab                  = 0xfe20,
-    XK_ISO_Move_Line_Up              = 0xfe21,
-    XK_ISO_Move_Line_Down            = 0xfe22,
-    XK_ISO_Partial_Line_Up           = 0xfe23,
-    XK_ISO_Partial_Line_Down         = 0xfe24,
-    XK_ISO_Partial_Space_Left        = 0xfe25,
-    XK_ISO_Partial_Space_Right       = 0xfe26,
-    XK_ISO_Set_Margin_Left           = 0xfe27,
-    XK_ISO_Set_Margin_Right          = 0xfe28,
-    XK_ISO_Release_Margin_Left       = 0xfe29,
-    XK_ISO_Release_Margin_Right      = 0xfe2a,
-    XK_ISO_Release_Both_Margins      = 0xfe2b,
-    XK_ISO_Fast_Cursor_Left          = 0xfe2c,
-    XK_ISO_Fast_Cursor_Right         = 0xfe2d,
-    XK_ISO_Fast_Cursor_Up            = 0xfe2e,
-    XK_ISO_Fast_Cursor_Down          = 0xfe2f,
-    XK_ISO_Continuous_Underline      = 0xfe30,
-    XK_ISO_Discontinuous_Underline   = 0xfe31,
-    XK_ISO_Emphasize                 = 0xfe32,
-    XK_ISO_Center_Object             = 0xfe33,
-    XK_ISO_Enter                     = 0xfe34,
-    XK_dead_grave                    = 0xfe50,
-    XK_dead_acute                    = 0xfe51,
-    XK_dead_circumflex               = 0xfe52,
-    XK_dead_tilde                    = 0xfe53,
-    XK_dead_macron                   = 0xfe54,
-    XK_dead_breve                    = 0xfe55,
-    XK_dead_abovedot                 = 0xfe56,
-    XK_dead_diaeresis                = 0xfe57,
-    XK_dead_abovering                = 0xfe58,
-    XK_dead_doubleacute              = 0xfe59,
-    XK_dead_caron                    = 0xfe5a,
-    XK_dead_cedilla                  = 0xfe5b,
-    XK_dead_ogonek                   = 0xfe5c,
-    XK_dead_iota                     = 0xfe5d,
-    XK_dead_voiced_sound             = 0xfe5e,
-    XK_dead_semivoiced_sound         = 0xfe5f,
-    XK_dead_belowdot                 = 0xfe60,
-    XK_dead_hook                     = 0xfe61,
-    XK_dead_horn                     = 0xfe62,
-    XK_First_Virtual_Screen          = 0xfed0,
-    XK_Prev_Virtual_Screen           = 0xfed1,
-    XK_Next_Virtual_Screen           = 0xfed2,
-    XK_Last_Virtual_Screen           = 0xfed4,
-    XK_Terminate_Server              = 0xfed5,
-    XK_AccessX_Enable                = 0xfe70,
-    XK_AccessX_Feedback_Enable       = 0xfe71,
-    XK_RepeatKeys_Enable             = 0xfe72,
-    XK_SlowKeys_Enable               = 0xfe73,
-    XK_BounceKeys_Enable             = 0xfe74,
-    XK_StickyKeys_Enable             = 0xfe75,
-    XK_MouseKeys_Enable              = 0xfe76,
-    XK_MouseKeys_Accel_Enable        = 0xfe77,
-    XK_Overlay1_Enable               = 0xfe78,
-    XK_Overlay2_Enable               = 0xfe79,
-    XK_AudibleBell_Enable            = 0xfe7a,
-    XK_Pointer_Left                  = 0xfee0,
-    XK_Pointer_Right                 = 0xfee1,
-    XK_Pointer_Up                    = 0xfee2,
-    XK_Pointer_Down                  = 0xfee3,
-    XK_Pointer_UpLeft                = 0xfee4,
-    XK_Pointer_UpRight               = 0xfee5,
-    XK_Pointer_DownLeft              = 0xfee6,
-    XK_Pointer_DownRight             = 0xfee7,
-    XK_Pointer_Button_Dflt           = 0xfee8,
-    XK_Pointer_Button1               = 0xfee9,
-    XK_Pointer_Button2               = 0xfeea,
-    XK_Pointer_Button3               = 0xfeeb,
-    XK_Pointer_Button4               = 0xfeec,
-    XK_Pointer_Button5               = 0xfeed,
-    XK_Pointer_DblClick_Dflt         = 0xfeee,
-    XK_Pointer_DblClick1             = 0xfeef,
-    XK_Pointer_DblClick2             = 0xfef0,
-    XK_Pointer_DblClick3             = 0xfef1,
-    XK_Pointer_DblClick4             = 0xfef2,
-    XK_Pointer_DblClick5             = 0xfef3,
-    XK_Pointer_Drag_Dflt             = 0xfef4,
-    XK_Pointer_Drag1                 = 0xfef5,
-    XK_Pointer_Drag2                 = 0xfef6,
-    XK_Pointer_Drag3                 = 0xfef7,
-    XK_Pointer_Drag4                 = 0xfef8,
-    XK_Pointer_Drag5                 = 0xfefd,
-    XK_Pointer_EnableKeys            = 0xfef9,
-    XK_Pointer_Accelerate            = 0xfefa,
-    XK_Pointer_DfltBtnNext           = 0xfefb,
-    XK_Pointer_DfltBtnPrev           = 0xfefc,
-    XK_3270_Duplicate                = 0xfd01,
-    XK_3270_FieldMark                = 0xfd02,
-    XK_3270_Right2                   = 0xfd03,
-    XK_3270_Left2                    = 0xfd04,
-    XK_3270_BackTab                  = 0xfd05,
-    XK_3270_EraseEOF                 = 0xfd06,
-    XK_3270_EraseInput               = 0xfd07,
-    XK_3270_Reset                    = 0xfd08,
-    XK_3270_Quit                     = 0xfd09,
-    XK_3270_PA1                      = 0xfd0a,
-    XK_3270_PA2                      = 0xfd0b,
-    XK_3270_PA3                      = 0xfd0c,
-    XK_3270_Test                     = 0xfd0d,
-    XK_3270_Attn                     = 0xfd0e,
-    XK_3270_CursorBlink              = 0xfd0f,
-    XK_3270_AltCursor                = 0xfd10,
-    XK_3270_KeyClick                 = 0xfd11,
-    XK_3270_Jump                     = 0xfd12,
-    XK_3270_Ident                    = 0xfd13,
-    XK_3270_Rule                     = 0xfd14,
-    XK_3270_Copy                     = 0xfd15,
-    XK_3270_Play                     = 0xfd16,
-    XK_3270_Setup                    = 0xfd17,
-    XK_3270_Record                   = 0xfd18,
-    XK_3270_ChangeScreen             = 0xfd19,
-    XK_3270_DeleteWord               = 0xfd1a,
-    XK_3270_ExSelect                 = 0xfd1b,
-    XK_3270_CursorSelect             = 0xfd1c,
-    XK_3270_PrintScreen              = 0xfd1d,
-    XK_3270_Enter                    = 0xfd1e,
-    XK_space                         = 0x0020,  /* U+0020 SPACE */
-    XK_exclam                        = 0x0021,  /* U+0021 EXCLAMATION MARK */
-    XK_quotedbl                      = 0x0022,  /* U+0022 QUOTATION MARK */
-    XK_numbersign                    = 0x0023,  /* U+0023 NUMBER SIGN */
-    XK_dollar                        = 0x0024,  /* U+0024 DOLLAR SIGN */
-    XK_percent                       = 0x0025,  /* U+0025 PERCENT SIGN */
-    XK_ampersand                     = 0x0026,  /* U+0026 AMPERSAND */
-    XK_apostrophe                    = 0x0027,  /* U+0027 APOSTROPHE */
-    XK_quoteright                    = 0x0027,  /* deprecated */
-    XK_parenleft                     = 0x0028,  /* U+0028 LEFT PARENTHESIS */
-    XK_parenright                    = 0x0029,  /* U+0029 RIGHT PARENTHESIS */
-    XK_asterisk                      = 0x002a,  /* U+002A ASTERISK */
-    XK_plus                          = 0x002b,  /* U+002B PLUS SIGN */
-    XK_comma                         = 0x002c,  /* U+002C COMMA */
-    XK_minus                         = 0x002d,  /* U+002D HYPHEN-MINUS */
-    XK_period                        = 0x002e,  /* U+002E FULL STOP */
-    XK_slash                         = 0x002f,  /* U+002F SOLIDUS */
-    XK_0                             = 0x0030,  /* U+0030 DIGIT ZERO */
-    XK_1                             = 0x0031,  /* U+0031 DIGIT ONE */
-    XK_2                             = 0x0032,  /* U+0032 DIGIT TWO */
-    XK_3                             = 0x0033,  /* U+0033 DIGIT THREE */
-    XK_4                             = 0x0034,  /* U+0034 DIGIT FOUR */
-    XK_5                             = 0x0035,  /* U+0035 DIGIT FIVE */
-    XK_6                             = 0x0036,  /* U+0036 DIGIT SIX */
-    XK_7                             = 0x0037,  /* U+0037 DIGIT SEVEN */
-    XK_8                             = 0x0038,  /* U+0038 DIGIT EIGHT */
-    XK_9                             = 0x0039,  /* U+0039 DIGIT NINE */
-    XK_colon                         = 0x003a,  /* U+003A COLON */
-    XK_semicolon                     = 0x003b,  /* U+003B SEMICOLON */
-    XK_less                          = 0x003c,  /* U+003C LESS-THAN SIGN */
-    XK_equal                         = 0x003d,  /* U+003D EQUALS SIGN */
-    XK_greater                       = 0x003e,  /* U+003E GREATER-THAN SIGN */
-    XK_question                      = 0x003f,  /* U+003F QUESTION MARK */
-    XK_at                            = 0x0040,  /* U+0040 COMMERCIAL AT */
-    XK_A                             = 0x0041,  /* U+0041 LATIN CAPITAL LETTER A */
-    XK_B                             = 0x0042,  /* U+0042 LATIN CAPITAL LETTER B */
-    XK_C                             = 0x0043,  /* U+0043 LATIN CAPITAL LETTER C */
-    XK_D                             = 0x0044,  /* U+0044 LATIN CAPITAL LETTER D */
-    XK_E                             = 0x0045,  /* U+0045 LATIN CAPITAL LETTER E */
-    XK_F                             = 0x0046,  /* U+0046 LATIN CAPITAL LETTER F */
-    XK_G                             = 0x0047,  /* U+0047 LATIN CAPITAL LETTER G */
-    XK_H                             = 0x0048,  /* U+0048 LATIN CAPITAL LETTER H */
-    XK_I                             = 0x0049,  /* U+0049 LATIN CAPITAL LETTER I */
-    XK_J                             = 0x004a,  /* U+004A LATIN CAPITAL LETTER J */
-    XK_K                             = 0x004b,  /* U+004B LATIN CAPITAL LETTER K */
-    XK_L                             = 0x004c,  /* U+004C LATIN CAPITAL LETTER L */
-    XK_M                             = 0x004d,  /* U+004D LATIN CAPITAL LETTER M */
-    XK_N                             = 0x004e,  /* U+004E LATIN CAPITAL LETTER N */
-    XK_O                             = 0x004f,  /* U+004F LATIN CAPITAL LETTER O */
-    XK_P                             = 0x0050,  /* U+0050 LATIN CAPITAL LETTER P */
-    XK_Q                             = 0x0051,  /* U+0051 LATIN CAPITAL LETTER Q */
-    XK_R                             = 0x0052,  /* U+0052 LATIN CAPITAL LETTER R */
-    XK_S                             = 0x0053,  /* U+0053 LATIN CAPITAL LETTER S */
-    XK_T                             = 0x0054,  /* U+0054 LATIN CAPITAL LETTER T */
-    XK_U                             = 0x0055,  /* U+0055 LATIN CAPITAL LETTER U */
-    XK_V                             = 0x0056,  /* U+0056 LATIN CAPITAL LETTER V */
-    XK_W                             = 0x0057,  /* U+0057 LATIN CAPITAL LETTER W */
-    XK_X                             = 0x0058,  /* U+0058 LATIN CAPITAL LETTER X */
-    XK_Y                             = 0x0059,  /* U+0059 LATIN CAPITAL LETTER Y */
-    XK_Z                             = 0x005a,  /* U+005A LATIN CAPITAL LETTER Z */
-    XK_bracketleft                   = 0x005b,  /* U+005B LEFT SQUARE BRACKET */
-    XK_backslash                     = 0x005c,  /* U+005C REVERSE SOLIDUS */
-    XK_bracketright                  = 0x005d,  /* U+005D RIGHT SQUARE BRACKET */
-    XK_asciicircum                   = 0x005e,  /* U+005E CIRCUMFLEX ACCENT */
-    XK_underscore                    = 0x005f,  /* U+005F LOW LINE */
-    XK_grave                         = 0x0060,  /* U+0060 GRAVE ACCENT */
-    XK_quoteleft                     = 0x0060,  /* deprecated */
-    XK_a                             = 0x0061,  /* U+0061 LATIN SMALL LETTER A */
-    XK_b                             = 0x0062,  /* U+0062 LATIN SMALL LETTER B */
-    XK_c                             = 0x0063,  /* U+0063 LATIN SMALL LETTER C */
-    XK_d                             = 0x0064,  /* U+0064 LATIN SMALL LETTER D */
-    XK_e                             = 0x0065,  /* U+0065 LATIN SMALL LETTER E */
-    XK_f                             = 0x0066,  /* U+0066 LATIN SMALL LETTER F */
-    XK_g                             = 0x0067,  /* U+0067 LATIN SMALL LETTER G */
-    XK_h                             = 0x0068,  /* U+0068 LATIN SMALL LETTER H */
-    XK_i                             = 0x0069,  /* U+0069 LATIN SMALL LETTER I */
-    XK_j                             = 0x006a,  /* U+006A LATIN SMALL LETTER J */
-    XK_k                             = 0x006b,  /* U+006B LATIN SMALL LETTER K */
-    XK_l                             = 0x006c,  /* U+006C LATIN SMALL LETTER L */
-    XK_m                             = 0x006d,  /* U+006D LATIN SMALL LETTER M */
-    XK_n                             = 0x006e,  /* U+006E LATIN SMALL LETTER N */
-    XK_o                             = 0x006f,  /* U+006F LATIN SMALL LETTER O */
-    XK_p                             = 0x0070,  /* U+0070 LATIN SMALL LETTER P */
-    XK_q                             = 0x0071,  /* U+0071 LATIN SMALL LETTER Q */
-    XK_r                             = 0x0072,  /* U+0072 LATIN SMALL LETTER R */
-    XK_s                             = 0x0073,  /* U+0073 LATIN SMALL LETTER S */
-    XK_t                             = 0x0074,  /* U+0074 LATIN SMALL LETTER T */
-    XK_u                             = 0x0075,  /* U+0075 LATIN SMALL LETTER U */
-    XK_v                             = 0x0076,  /* U+0076 LATIN SMALL LETTER V */
-    XK_w                             = 0x0077,  /* U+0077 LATIN SMALL LETTER W */
-    XK_x                             = 0x0078,  /* U+0078 LATIN SMALL LETTER X */
-    XK_y                             = 0x0079,  /* U+0079 LATIN SMALL LETTER Y */
-    XK_z                             = 0x007a,  /* U+007A LATIN SMALL LETTER Z */
-    XK_braceleft                     = 0x007b,  /* U+007B LEFT CURLY BRACKET */
-    XK_bar                           = 0x007c,  /* U+007C VERTICAL LINE */
-    XK_braceright                    = 0x007d,  /* U+007D RIGHT CURLY BRACKET */
-    XK_asciitilde                    = 0x007e,  /* U+007E TILDE */
-    XK_nobreakspace                  = 0x00a0,  /* U+00A0 NO-BREAK SPACE */
-    XK_exclamdown                    = 0x00a1,  /* U+00A1 INVERTED EXCLAMATION MARK */
-    XK_cent                          = 0x00a2,  /* U+00A2 CENT SIGN */
-    XK_sterling                      = 0x00a3,  /* U+00A3 POUND SIGN */
-    XK_currency                      = 0x00a4,  /* U+00A4 CURRENCY SIGN */
-    XK_yen                           = 0x00a5,  /* U+00A5 YEN SIGN */
-    XK_brokenbar                     = 0x00a6,  /* U+00A6 BROKEN BAR */
-    XK_section                       = 0x00a7,  /* U+00A7 SECTION SIGN */
-    XK_diaeresis                     = 0x00a8,  /* U+00A8 DIAERESIS */
-    XK_copyright                     = 0x00a9,  /* U+00A9 COPYRIGHT SIGN */
-    XK_ordfeminine                   = 0x00aa,  /* U+00AA FEMININE ORDINAL INDICATOR */
-    XK_guillemotleft                 = 0x00ab,  /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
-    XK_notsign                       = 0x00ac,  /* U+00AC NOT SIGN */
-    XK_hyphen                        = 0x00ad,  /* U+00AD SOFT HYPHEN */
-    XK_registered                    = 0x00ae,  /* U+00AE REGISTERED SIGN */
-    XK_macron                        = 0x00af,  /* U+00AF MACRON */
-    XK_degree                        = 0x00b0,  /* U+00B0 DEGREE SIGN */
-    XK_plusminus                     = 0x00b1,  /* U+00B1 PLUS-MINUS SIGN */
-    XK_twosuperior                   = 0x00b2,  /* U+00B2 SUPERSCRIPT TWO */
-    XK_threesuperior                 = 0x00b3,  /* U+00B3 SUPERSCRIPT THREE */
-    XK_acute                         = 0x00b4,  /* U+00B4 ACUTE ACCENT */
-    XK_mu                            = 0x00b5,  /* U+00B5 MICRO SIGN */
-    XK_paragraph                     = 0x00b6,  /* U+00B6 PILCROW SIGN */
-    XK_periodcentered                = 0x00b7,  /* U+00B7 MIDDLE DOT */
-    XK_cedilla                       = 0x00b8,  /* U+00B8 CEDILLA */
-    XK_onesuperior                   = 0x00b9,  /* U+00B9 SUPERSCRIPT ONE */
-    XK_masculine                     = 0x00ba,  /* U+00BA MASCULINE ORDINAL INDICATOR */
-    XK_guillemotright                = 0x00bb,  /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
-    XK_onequarter                    = 0x00bc,  /* U+00BC VULGAR FRACTION ONE QUARTER */
-    XK_onehalf                       = 0x00bd,  /* U+00BD VULGAR FRACTION ONE HALF */
-    XK_threequarters                 = 0x00be,  /* U+00BE VULGAR FRACTION THREE QUARTERS */
-    XK_questiondown                  = 0x00bf,  /* U+00BF INVERTED QUESTION MARK */
-    XK_Agrave                        = 0x00c0,  /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */
-    XK_Aacute                        = 0x00c1,  /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */
-    XK_Acircumflex                   = 0x00c2,  /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
-    XK_Atilde                        = 0x00c3,  /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */
-    XK_Adiaeresis                    = 0x00c4,  /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */
-    XK_Aring                         = 0x00c5,  /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */
-    XK_AE                            = 0x00c6,  /* U+00C6 LATIN CAPITAL LETTER AE */
-    XK_Ccedilla                      = 0x00c7,  /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */
-    XK_Egrave                        = 0x00c8,  /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */
-    XK_Eacute                        = 0x00c9,  /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
-    XK_Ecircumflex                   = 0x00ca,  /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
-    XK_Ediaeresis                    = 0x00cb,  /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */
-    XK_Igrave                        = 0x00cc,  /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */
-    XK_Iacute                        = 0x00cd,  /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */
-    XK_Icircumflex                   = 0x00ce,  /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
-    XK_Idiaeresis                    = 0x00cf,  /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */
-    XK_ETH                           = 0x00d0,  /* U+00D0 LATIN CAPITAL LETTER ETH */
-    XK_Eth                           = 0x00d0,  /* deprecated */
-    XK_Ntilde                        = 0x00d1,  /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */
-    XK_Ograve                        = 0x00d2,  /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */
-    XK_Oacute                        = 0x00d3,  /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */
-    XK_Ocircumflex                   = 0x00d4,  /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
-    XK_Otilde                        = 0x00d5,  /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */
-    XK_Odiaeresis                    = 0x00d6,  /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */
-    XK_multiply                      = 0x00d7,  /* U+00D7 MULTIPLICATION SIGN */
-    XK_Oslash                        = 0x00d8,  /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
-    XK_Ooblique                      = 0x00d8,  /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
-    XK_Ugrave                        = 0x00d9,  /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */
-    XK_Uacute                        = 0x00da,  /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */
-    XK_Ucircumflex                   = 0x00db,  /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
-    XK_Udiaeresis                    = 0x00dc,  /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */
-    XK_Yacute                        = 0x00dd,  /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */
-    XK_THORN                         = 0x00de,  /* U+00DE LATIN CAPITAL LETTER THORN */
-    XK_Thorn                         = 0x00de,  /* deprecated */
-    XK_ssharp                        = 0x00df,  /* U+00DF LATIN SMALL LETTER SHARP S */
-    XK_agrave                        = 0x00e0,  /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */
-    XK_aacute                        = 0x00e1,  /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */
-    XK_acircumflex                   = 0x00e2,  /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */
-    XK_atilde                        = 0x00e3,  /* U+00E3 LATIN SMALL LETTER A WITH TILDE */
-    XK_adiaeresis                    = 0x00e4,  /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */
-    XK_aring                         = 0x00e5,  /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */
-    XK_ae                            = 0x00e6,  /* U+00E6 LATIN SMALL LETTER AE */
-    XK_ccedilla                      = 0x00e7,  /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */
-    XK_egrave                        = 0x00e8,  /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */
-    XK_eacute                        = 0x00e9,  /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
-    XK_ecircumflex                   = 0x00ea,  /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */
-    XK_ediaeresis                    = 0x00eb,  /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */
-    XK_igrave                        = 0x00ec,  /* U+00EC LATIN SMALL LETTER I WITH GRAVE */
-    XK_iacute                        = 0x00ed,  /* U+00ED LATIN SMALL LETTER I WITH ACUTE */
-    XK_icircumflex                   = 0x00ee,  /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */
-    XK_idiaeresis                    = 0x00ef,  /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */
-    XK_eth                           = 0x00f0,  /* U+00F0 LATIN SMALL LETTER ETH */
-    XK_ntilde                        = 0x00f1,  /* U+00F1 LATIN SMALL LETTER N WITH TILDE */
-    XK_ograve                        = 0x00f2,  /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */
-    XK_oacute                        = 0x00f3,  /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */
-    XK_ocircumflex                   = 0x00f4,  /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */
-    XK_otilde                        = 0x00f5,  /* U+00F5 LATIN SMALL LETTER O WITH TILDE */
-    XK_odiaeresis                    = 0x00f6,  /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */
-    XK_division                      = 0x00f7,  /* U+00F7 DIVISION SIGN */
-    XK_oslash                        = 0x00f8,  /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
-    XK_ooblique                      = 0x00f8,  /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
-    XK_ugrave                        = 0x00f9,  /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */
-    XK_uacute                        = 0x00fa,  /* U+00FA LATIN SMALL LETTER U WITH ACUTE */
-    XK_ucircumflex                   = 0x00fb,  /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */
-    XK_udiaeresis                    = 0x00fc,  /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */
-    XK_yacute                        = 0x00fd,  /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */
-    XK_thorn                         = 0x00fe,  /* U+00FE LATIN SMALL LETTER THORN */
-    XK_ydiaeresis                    = 0x00ff,  /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
-    XK_Aogonek                       = 0x01a1,  /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */
-    XK_breve                         = 0x01a2,  /* U+02D8 BREVE */
-    XK_Lstroke                       = 0x01a3,  /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
-    XK_Lcaron                        = 0x01a5,  /* U+013D LATIN CAPITAL LETTER L WITH CARON */
-    XK_Sacute                        = 0x01a6,  /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */
-    XK_Scaron                        = 0x01a9,  /* U+0160 LATIN CAPITAL LETTER S WITH CARON */
-    XK_Scedilla                      = 0x01aa,  /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */
-    XK_Tcaron                        = 0x01ab,  /* U+0164 LATIN CAPITAL LETTER T WITH CARON */
-    XK_Zacute                        = 0x01ac,  /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */
-    XK_Zcaron                        = 0x01ae,  /* U+017D LATIN CAPITAL LETTER Z WITH CARON */
-    XK_Zabovedot                     = 0x01af,  /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */
-    XK_aogonek                       = 0x01b1,  /* U+0105 LATIN SMALL LETTER A WITH OGONEK */
-    XK_ogonek                        = 0x01b2,  /* U+02DB OGONEK */
-    XK_lstroke                       = 0x01b3,  /* U+0142 LATIN SMALL LETTER L WITH STROKE */
-    XK_lcaron                        = 0x01b5,  /* U+013E LATIN SMALL LETTER L WITH CARON */
-    XK_sacute                        = 0x01b6,  /* U+015B LATIN SMALL LETTER S WITH ACUTE */
-    XK_caron                         = 0x01b7,  /* U+02C7 CARON */
-    XK_scaron                        = 0x01b9,  /* U+0161 LATIN SMALL LETTER S WITH CARON */
-    XK_scedilla                      = 0x01ba,  /* U+015F LATIN SMALL LETTER S WITH CEDILLA */
-    XK_tcaron                        = 0x01bb,  /* U+0165 LATIN SMALL LETTER T WITH CARON */
-    XK_zacute                        = 0x01bc,  /* U+017A LATIN SMALL LETTER Z WITH ACUTE */
-    XK_doubleacute                   = 0x01bd,  /* U+02DD DOUBLE ACUTE ACCENT */
-    XK_zcaron                        = 0x01be,  /* U+017E LATIN SMALL LETTER Z WITH CARON */
-    XK_zabovedot                     = 0x01bf,  /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */
-    XK_Racute                        = 0x01c0,  /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */
-    XK_Abreve                        = 0x01c3,  /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */
-    XK_Lacute                        = 0x01c5,  /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */
-    XK_Cacute                        = 0x01c6,  /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */
-    XK_Ccaron                        = 0x01c8,  /* U+010C LATIN CAPITAL LETTER C WITH CARON */
-    XK_Eogonek                       = 0x01ca,  /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */
-    XK_Ecaron                        = 0x01cc,  /* U+011A LATIN CAPITAL LETTER E WITH CARON */
-    XK_Dcaron                        = 0x01cf,  /* U+010E LATIN CAPITAL LETTER D WITH CARON */
-    XK_Dstroke                       = 0x01d0,  /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */
-    XK_Nacute                        = 0x01d1,  /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */
-    XK_Ncaron                        = 0x01d2,  /* U+0147 LATIN CAPITAL LETTER N WITH CARON */
-    XK_Odoubleacute                  = 0x01d5,  /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
-    XK_Rcaron                        = 0x01d8,  /* U+0158 LATIN CAPITAL LETTER R WITH CARON */
-    XK_Uring                         = 0x01d9,  /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */
-    XK_Udoubleacute                  = 0x01db,  /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
-    XK_Tcedilla                      = 0x01de,  /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */
-    XK_racute                        = 0x01e0,  /* U+0155 LATIN SMALL LETTER R WITH ACUTE */
-    XK_abreve                        = 0x01e3,  /* U+0103 LATIN SMALL LETTER A WITH BREVE */
-    XK_lacute                        = 0x01e5,  /* U+013A LATIN SMALL LETTER L WITH ACUTE */
-    XK_cacute                        = 0x01e6,  /* U+0107 LATIN SMALL LETTER C WITH ACUTE */
-    XK_ccaron                        = 0x01e8,  /* U+010D LATIN SMALL LETTER C WITH CARON */
-    XK_eogonek                       = 0x01ea,  /* U+0119 LATIN SMALL LETTER E WITH OGONEK */
-    XK_ecaron                        = 0x01ec,  /* U+011B LATIN SMALL LETTER E WITH CARON */
-    XK_dcaron                        = 0x01ef,  /* U+010F LATIN SMALL LETTER D WITH CARON */
-    XK_dstroke                       = 0x01f0,  /* U+0111 LATIN SMALL LETTER D WITH STROKE */
-    XK_nacute                        = 0x01f1,  /* U+0144 LATIN SMALL LETTER N WITH ACUTE */
-    XK_ncaron                        = 0x01f2,  /* U+0148 LATIN SMALL LETTER N WITH CARON */
-    XK_odoubleacute                  = 0x01f5,  /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */
-    XK_udoubleacute                  = 0x01fb,  /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */
-    XK_rcaron                        = 0x01f8,  /* U+0159 LATIN SMALL LETTER R WITH CARON */
-    XK_uring                         = 0x01f9,  /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */
-    XK_tcedilla                      = 0x01fe,  /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */
-    XK_abovedot                      = 0x01ff,  /* U+02D9 DOT ABOVE */
-    XK_Hstroke                       = 0x02a1,  /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */
-    XK_Hcircumflex                   = 0x02a6,  /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
-    XK_Iabovedot                     = 0x02a9,  /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */
-    XK_Gbreve                        = 0x02ab,  /* U+011E LATIN CAPITAL LETTER G WITH BREVE */
-    XK_Jcircumflex                   = 0x02ac,  /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
-    XK_hstroke                       = 0x02b1,  /* U+0127 LATIN SMALL LETTER H WITH STROKE */
-    XK_hcircumflex                   = 0x02b6,  /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */
-    XK_idotless                      = 0x02b9,  /* U+0131 LATIN SMALL LETTER DOTLESS I */
-    XK_gbreve                        = 0x02bb,  /* U+011F LATIN SMALL LETTER G WITH BREVE */
-    XK_jcircumflex                   = 0x02bc,  /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */
-    XK_Cabovedot                     = 0x02c5,  /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */
-    XK_Ccircumflex                   = 0x02c6,  /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
-    XK_Gabovedot                     = 0x02d5,  /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */
-    XK_Gcircumflex                   = 0x02d8,  /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
-    XK_Ubreve                        = 0x02dd,  /* U+016C LATIN CAPITAL LETTER U WITH BREVE */
-    XK_Scircumflex                   = 0x02de,  /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
-    XK_cabovedot                     = 0x02e5,  /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */
-    XK_ccircumflex                   = 0x02e6,  /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */
-    XK_gabovedot                     = 0x02f5,  /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */
-    XK_gcircumflex                   = 0x02f8,  /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */
-    XK_ubreve                        = 0x02fd,  /* U+016D LATIN SMALL LETTER U WITH BREVE */
-    XK_scircumflex                   = 0x02fe,  /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */
-    XK_kra                           = 0x03a2,  /* U+0138 LATIN SMALL LETTER KRA */
-    XK_kappa                         = 0x03a2,  /* deprecated */
-    XK_Rcedilla                      = 0x03a3,  /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */
-    XK_Itilde                        = 0x03a5,  /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */
-    XK_Lcedilla                      = 0x03a6,  /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */
-    XK_Emacron                       = 0x03aa,  /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */
-    XK_Gcedilla                      = 0x03ab,  /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */
-    XK_Tslash                        = 0x03ac,  /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */
-    XK_rcedilla                      = 0x03b3,  /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */
-    XK_itilde                        = 0x03b5,  /* U+0129 LATIN SMALL LETTER I WITH TILDE */
-    XK_lcedilla                      = 0x03b6,  /* U+013C LATIN SMALL LETTER L WITH CEDILLA */
-    XK_emacron                       = 0x03ba,  /* U+0113 LATIN SMALL LETTER E WITH MACRON */
-    XK_gcedilla                      = 0x03bb,  /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */
-    XK_tslash                        = 0x03bc,  /* U+0167 LATIN SMALL LETTER T WITH STROKE */
-    XK_ENG                           = 0x03bd,  /* U+014A LATIN CAPITAL LETTER ENG */
-    XK_eng                           = 0x03bf,  /* U+014B LATIN SMALL LETTER ENG */
-    XK_Amacron                       = 0x03c0,  /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */
-    XK_Iogonek                       = 0x03c7,  /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */
-    XK_Eabovedot                     = 0x03cc,  /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */
-    XK_Imacron                       = 0x03cf,  /* U+012A LATIN CAPITAL LETTER I WITH MACRON */
-    XK_Ncedilla                      = 0x03d1,  /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */
-    XK_Omacron                       = 0x03d2,  /* U+014C LATIN CAPITAL LETTER O WITH MACRON */
-    XK_Kcedilla                      = 0x03d3,  /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */
-    XK_Uogonek                       = 0x03d9,  /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */
-    XK_Utilde                        = 0x03dd,  /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */
-    XK_Umacron                       = 0x03de,  /* U+016A LATIN CAPITAL LETTER U WITH MACRON */
-    XK_amacron                       = 0x03e0,  /* U+0101 LATIN SMALL LETTER A WITH MACRON */
-    XK_iogonek                       = 0x03e7,  /* U+012F LATIN SMALL LETTER I WITH OGONEK */
-    XK_eabovedot                     = 0x03ec,  /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */
-    XK_imacron                       = 0x03ef,  /* U+012B LATIN SMALL LETTER I WITH MACRON */
-    XK_ncedilla                      = 0x03f1,  /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */
-    XK_omacron                       = 0x03f2,  /* U+014D LATIN SMALL LETTER O WITH MACRON */
-    XK_kcedilla                      = 0x03f3,  /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */
-    XK_uogonek                       = 0x03f9,  /* U+0173 LATIN SMALL LETTER U WITH OGONEK */
-    XK_utilde                        = 0x03fd,  /* U+0169 LATIN SMALL LETTER U WITH TILDE */
-    XK_umacron                       = 0x03fe,  /* U+016B LATIN SMALL LETTER U WITH MACRON */
-    XK_Babovedot                  = 0x1001e02,  /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */
-    XK_babovedot                  = 0x1001e03,  /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */
-    XK_Dabovedot                  = 0x1001e0a,  /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */
-    XK_Wgrave                     = 0x1001e80,  /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */
-    XK_Wacute                     = 0x1001e82,  /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */
-    XK_dabovedot                  = 0x1001e0b,  /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */
-    XK_Ygrave                     = 0x1001ef2,  /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */
-    XK_Fabovedot                  = 0x1001e1e,  /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */
-    XK_fabovedot                  = 0x1001e1f,  /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */
-    XK_Mabovedot                  = 0x1001e40,  /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */
-    XK_mabovedot                  = 0x1001e41,  /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */
-    XK_Pabovedot                  = 0x1001e56,  /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */
-    XK_wgrave                     = 0x1001e81,  /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */
-    XK_pabovedot                  = 0x1001e57,  /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */
-    XK_wacute                     = 0x1001e83,  /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */
-    XK_Sabovedot                  = 0x1001e60,  /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */
-    XK_ygrave                     = 0x1001ef3,  /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */
-    XK_Wdiaeresis                 = 0x1001e84,  /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */
-    XK_wdiaeresis                 = 0x1001e85,  /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */
-    XK_sabovedot                  = 0x1001e61,  /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */
-    XK_Wcircumflex                = 0x1000174,  /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
-    XK_Tabovedot                  = 0x1001e6a,  /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */
-    XK_Ycircumflex                = 0x1000176,  /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
-    XK_wcircumflex                = 0x1000175,  /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */
-    XK_tabovedot                  = 0x1001e6b,  /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */
-    XK_ycircumflex                = 0x1000177,  /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */
-    XK_OE                            = 0x13bc,  /* U+0152 LATIN CAPITAL LIGATURE OE */
-    XK_oe                            = 0x13bd,  /* U+0153 LATIN SMALL LIGATURE OE */
-    XK_Ydiaeresis                    = 0x13be,  /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */
-    XK_overline                      = 0x047e,  /* U+203E OVERLINE */
-    XK_kana_fullstop                 = 0x04a1,  /* U+3002 IDEOGRAPHIC FULL STOP */
-    XK_kana_openingbracket           = 0x04a2,  /* U+300C LEFT CORNER BRACKET */
-    XK_kana_closingbracket           = 0x04a3,  /* U+300D RIGHT CORNER BRACKET */
-    XK_kana_comma                    = 0x04a4,  /* U+3001 IDEOGRAPHIC COMMA */
-    XK_kana_conjunctive              = 0x04a5,  /* U+30FB KATAKANA MIDDLE DOT */
-    XK_kana_middledot                = 0x04a5,  /* deprecated */
-    XK_kana_WO                       = 0x04a6,  /* U+30F2 KATAKANA LETTER WO */
-    XK_kana_a                        = 0x04a7,  /* U+30A1 KATAKANA LETTER SMALL A */
-    XK_kana_i                        = 0x04a8,  /* U+30A3 KATAKANA LETTER SMALL I */
-    XK_kana_u                        = 0x04a9,  /* U+30A5 KATAKANA LETTER SMALL U */
-    XK_kana_e                        = 0x04aa,  /* U+30A7 KATAKANA LETTER SMALL E */
-    XK_kana_o                        = 0x04ab,  /* U+30A9 KATAKANA LETTER SMALL O */
-    XK_kana_ya                       = 0x04ac,  /* U+30E3 KATAKANA LETTER SMALL YA */
-    XK_kana_yu                       = 0x04ad,  /* U+30E5 KATAKANA LETTER SMALL YU */
-    XK_kana_yo                       = 0x04ae,  /* U+30E7 KATAKANA LETTER SMALL YO */
-    XK_kana_tsu                      = 0x04af,  /* U+30C3 KATAKANA LETTER SMALL TU */
-    XK_kana_tu                       = 0x04af,  /* deprecated */
-    XK_prolongedsound                = 0x04b0,  /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */
-    XK_kana_A                        = 0x04b1,  /* U+30A2 KATAKANA LETTER A */
-    XK_kana_I                        = 0x04b2,  /* U+30A4 KATAKANA LETTER I */
-    XK_kana_U                        = 0x04b3,  /* U+30A6 KATAKANA LETTER U */
-    XK_kana_E                        = 0x04b4,  /* U+30A8 KATAKANA LETTER E */
-    XK_kana_O                        = 0x04b5,  /* U+30AA KATAKANA LETTER O */
-    XK_kana_KA                       = 0x04b6,  /* U+30AB KATAKANA LETTER KA */
-    XK_kana_KI                       = 0x04b7,  /* U+30AD KATAKANA LETTER KI */
-    XK_kana_KU                       = 0x04b8,  /* U+30AF KATAKANA LETTER KU */
-    XK_kana_KE                       = 0x04b9,  /* U+30B1 KATAKANA LETTER KE */
-    XK_kana_KO                       = 0x04ba,  /* U+30B3 KATAKANA LETTER KO */
-    XK_kana_SA                       = 0x04bb,  /* U+30B5 KATAKANA LETTER SA */
-    XK_kana_SHI                      = 0x04bc,  /* U+30B7 KATAKANA LETTER SI */
-    XK_kana_SU                       = 0x04bd,  /* U+30B9 KATAKANA LETTER SU */
-    XK_kana_SE                       = 0x04be,  /* U+30BB KATAKANA LETTER SE */
-    XK_kana_SO                       = 0x04bf,  /* U+30BD KATAKANA LETTER SO */
-    XK_kana_TA                       = 0x04c0,  /* U+30BF KATAKANA LETTER TA */
-    XK_kana_CHI                      = 0x04c1,  /* U+30C1 KATAKANA LETTER TI */
-    XK_kana_TI                       = 0x04c1,  /* deprecated */
-    XK_kana_TSU                      = 0x04c2,  /* U+30C4 KATAKANA LETTER TU */
-    XK_kana_TU                       = 0x04c2,  /* deprecated */
-    XK_kana_TE                       = 0x04c3,  /* U+30C6 KATAKANA LETTER TE */
-    XK_kana_TO                       = 0x04c4,  /* U+30C8 KATAKANA LETTER TO */
-    XK_kana_NA                       = 0x04c5,  /* U+30CA KATAKANA LETTER NA */
-    XK_kana_NI                       = 0x04c6,  /* U+30CB KATAKANA LETTER NI */
-    XK_kana_NU                       = 0x04c7,  /* U+30CC KATAKANA LETTER NU */
-    XK_kana_NE                       = 0x04c8,  /* U+30CD KATAKANA LETTER NE */
-    XK_kana_NO                       = 0x04c9,  /* U+30CE KATAKANA LETTER NO */
-    XK_kana_HA                       = 0x04ca,  /* U+30CF KATAKANA LETTER HA */
-    XK_kana_HI                       = 0x04cb,  /* U+30D2 KATAKANA LETTER HI */
-    XK_kana_FU                       = 0x04cc,  /* U+30D5 KATAKANA LETTER HU */
-    XK_kana_HU                       = 0x04cc,  /* deprecated */
-    XK_kana_HE                       = 0x04cd,  /* U+30D8 KATAKANA LETTER HE */
-    XK_kana_HO                       = 0x04ce,  /* U+30DB KATAKANA LETTER HO */
-    XK_kana_MA                       = 0x04cf,  /* U+30DE KATAKANA LETTER MA */
-    XK_kana_MI                       = 0x04d0,  /* U+30DF KATAKANA LETTER MI */
-    XK_kana_MU                       = 0x04d1,  /* U+30E0 KATAKANA LETTER MU */
-    XK_kana_ME                       = 0x04d2,  /* U+30E1 KATAKANA LETTER ME */
-    XK_kana_MO                       = 0x04d3,  /* U+30E2 KATAKANA LETTER MO */
-    XK_kana_YA                       = 0x04d4,  /* U+30E4 KATAKANA LETTER YA */
-    XK_kana_YU                       = 0x04d5,  /* U+30E6 KATAKANA LETTER YU */
-    XK_kana_YO                       = 0x04d6,  /* U+30E8 KATAKANA LETTER YO */
-    XK_kana_RA                       = 0x04d7,  /* U+30E9 KATAKANA LETTER RA */
-    XK_kana_RI                       = 0x04d8,  /* U+30EA KATAKANA LETTER RI */
-    XK_kana_RU                       = 0x04d9,  /* U+30EB KATAKANA LETTER RU */
-    XK_kana_RE                       = 0x04da,  /* U+30EC KATAKANA LETTER RE */
-    XK_kana_RO                       = 0x04db,  /* U+30ED KATAKANA LETTER RO */
-    XK_kana_WA                       = 0x04dc,  /* U+30EF KATAKANA LETTER WA */
-    XK_kana_N                        = 0x04dd,  /* U+30F3 KATAKANA LETTER N */
-    XK_voicedsound                   = 0x04de,  /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */
-    XK_semivoicedsound               = 0x04df,  /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
-    XK_kana_switch                   = 0xff7e,  /* Alias for mode_switch */
-    XK_Farsi_0                    = 0x10006f0,  /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */
-    XK_Farsi_1                    = 0x10006f1,  /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */
-    XK_Farsi_2                    = 0x10006f2,  /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */
-    XK_Farsi_3                    = 0x10006f3,  /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */
-    XK_Farsi_4                    = 0x10006f4,  /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */
-    XK_Farsi_5                    = 0x10006f5,  /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */
-    XK_Farsi_6                    = 0x10006f6,  /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */
-    XK_Farsi_7                    = 0x10006f7,  /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */
-    XK_Farsi_8                    = 0x10006f8,  /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */
-    XK_Farsi_9                    = 0x10006f9,  /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */
-    XK_Arabic_percent             = 0x100066a,  /* U+066A ARABIC PERCENT SIGN */
-    XK_Arabic_superscript_alef    = 0x1000670,  /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */
-    XK_Arabic_tteh                = 0x1000679,  /* U+0679 ARABIC LETTER TTEH */
-    XK_Arabic_peh                 = 0x100067e,  /* U+067E ARABIC LETTER PEH */
-    XK_Arabic_tcheh               = 0x1000686,  /* U+0686 ARABIC LETTER TCHEH */
-    XK_Arabic_ddal                = 0x1000688,  /* U+0688 ARABIC LETTER DDAL */
-    XK_Arabic_rreh                = 0x1000691,  /* U+0691 ARABIC LETTER RREH */
-    XK_Arabic_comma                  = 0x05ac,  /* U+060C ARABIC COMMA */
-    XK_Arabic_fullstop            = 0x10006d4,  /* U+06D4 ARABIC FULL STOP */
-    XK_Arabic_0                   = 0x1000660,  /* U+0660 ARABIC-INDIC DIGIT ZERO */
-    XK_Arabic_1                   = 0x1000661,  /* U+0661 ARABIC-INDIC DIGIT ONE */
-    XK_Arabic_2                   = 0x1000662,  /* U+0662 ARABIC-INDIC DIGIT TWO */
-    XK_Arabic_3                   = 0x1000663,  /* U+0663 ARABIC-INDIC DIGIT THREE */
-    XK_Arabic_4                   = 0x1000664,  /* U+0664 ARABIC-INDIC DIGIT FOUR */
-    XK_Arabic_5                   = 0x1000665,  /* U+0665 ARABIC-INDIC DIGIT FIVE */
-    XK_Arabic_6                   = 0x1000666,  /* U+0666 ARABIC-INDIC DIGIT SIX */
-    XK_Arabic_7                   = 0x1000667,  /* U+0667 ARABIC-INDIC DIGIT SEVEN */
-    XK_Arabic_8                   = 0x1000668,  /* U+0668 ARABIC-INDIC DIGIT EIGHT */
-    XK_Arabic_9                   = 0x1000669,  /* U+0669 ARABIC-INDIC DIGIT NINE */
-    XK_Arabic_semicolon              = 0x05bb,  /* U+061B ARABIC SEMICOLON */
-    XK_Arabic_question_mark          = 0x05bf,  /* U+061F ARABIC QUESTION MARK */
-    XK_Arabic_hamza                  = 0x05c1,  /* U+0621 ARABIC LETTER HAMZA */
-    XK_Arabic_maddaonalef            = 0x05c2,  /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */
-    XK_Arabic_hamzaonalef            = 0x05c3,  /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */
-    XK_Arabic_hamzaonwaw             = 0x05c4,  /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */
-    XK_Arabic_hamzaunderalef         = 0x05c5,  /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */
-    XK_Arabic_hamzaonyeh             = 0x05c6,  /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */
-    XK_Arabic_alef                   = 0x05c7,  /* U+0627 ARABIC LETTER ALEF */
-    XK_Arabic_beh                    = 0x05c8,  /* U+0628 ARABIC LETTER BEH */
-    XK_Arabic_tehmarbuta             = 0x05c9,  /* U+0629 ARABIC LETTER TEH MARBUTA */
-    XK_Arabic_teh                    = 0x05ca,  /* U+062A ARABIC LETTER TEH */
-    XK_Arabic_theh                   = 0x05cb,  /* U+062B ARABIC LETTER THEH */
-    XK_Arabic_jeem                   = 0x05cc,  /* U+062C ARABIC LETTER JEEM */
-    XK_Arabic_hah                    = 0x05cd,  /* U+062D ARABIC LETTER HAH */
-    XK_Arabic_khah                   = 0x05ce,  /* U+062E ARABIC LETTER KHAH */
-    XK_Arabic_dal                    = 0x05cf,  /* U+062F ARABIC LETTER DAL */
-    XK_Arabic_thal                   = 0x05d0,  /* U+0630 ARABIC LETTER THAL */
-    XK_Arabic_ra                     = 0x05d1,  /* U+0631 ARABIC LETTER REH */
-    XK_Arabic_zain                   = 0x05d2,  /* U+0632 ARABIC LETTER ZAIN */
-    XK_Arabic_seen                   = 0x05d3,  /* U+0633 ARABIC LETTER SEEN */
-    XK_Arabic_sheen                  = 0x05d4,  /* U+0634 ARABIC LETTER SHEEN */
-    XK_Arabic_sad                    = 0x05d5,  /* U+0635 ARABIC LETTER SAD */
-    XK_Arabic_dad                    = 0x05d6,  /* U+0636 ARABIC LETTER DAD */
-    XK_Arabic_tah                    = 0x05d7,  /* U+0637 ARABIC LETTER TAH */
-    XK_Arabic_zah                    = 0x05d8,  /* U+0638 ARABIC LETTER ZAH */
-    XK_Arabic_ain                    = 0x05d9,  /* U+0639 ARABIC LETTER AIN */
-    XK_Arabic_ghain                  = 0x05da,  /* U+063A ARABIC LETTER GHAIN */
-    XK_Arabic_tatweel                = 0x05e0,  /* U+0640 ARABIC TATWEEL */
-    XK_Arabic_feh                    = 0x05e1,  /* U+0641 ARABIC LETTER FEH */
-    XK_Arabic_qaf                    = 0x05e2,  /* U+0642 ARABIC LETTER QAF */
-    XK_Arabic_kaf                    = 0x05e3,  /* U+0643 ARABIC LETTER KAF */
-    XK_Arabic_lam                    = 0x05e4,  /* U+0644 ARABIC LETTER LAM */
-    XK_Arabic_meem                   = 0x05e5,  /* U+0645 ARABIC LETTER MEEM */
-    XK_Arabic_noon                   = 0x05e6,  /* U+0646 ARABIC LETTER NOON */
-    XK_Arabic_ha                     = 0x05e7,  /* U+0647 ARABIC LETTER HEH */
-    XK_Arabic_heh                    = 0x05e7,  /* deprecated */
-    XK_Arabic_waw                    = 0x05e8,  /* U+0648 ARABIC LETTER WAW */
-    XK_Arabic_alefmaksura            = 0x05e9,  /* U+0649 ARABIC LETTER ALEF MAKSURA */
-    XK_Arabic_yeh                    = 0x05ea,  /* U+064A ARABIC LETTER YEH */
-    XK_Arabic_fathatan               = 0x05eb,  /* U+064B ARABIC FATHATAN */
-    XK_Arabic_dammatan               = 0x05ec,  /* U+064C ARABIC DAMMATAN */
-    XK_Arabic_kasratan               = 0x05ed,  /* U+064D ARABIC KASRATAN */
-    XK_Arabic_fatha                  = 0x05ee,  /* U+064E ARABIC FATHA */
-    XK_Arabic_damma                  = 0x05ef,  /* U+064F ARABIC DAMMA */
-    XK_Arabic_kasra                  = 0x05f0,  /* U+0650 ARABIC KASRA */
-    XK_Arabic_shadda                 = 0x05f1,  /* U+0651 ARABIC SHADDA */
-    XK_Arabic_sukun                  = 0x05f2,  /* U+0652 ARABIC SUKUN */
-    XK_Arabic_madda_above         = 0x1000653,  /* U+0653 ARABIC MADDAH ABOVE */
-    XK_Arabic_hamza_above         = 0x1000654,  /* U+0654 ARABIC HAMZA ABOVE */
-    XK_Arabic_hamza_below         = 0x1000655,  /* U+0655 ARABIC HAMZA BELOW */
-    XK_Arabic_jeh                 = 0x1000698,  /* U+0698 ARABIC LETTER JEH */
-    XK_Arabic_veh                 = 0x10006a4,  /* U+06A4 ARABIC LETTER VEH */
-    XK_Arabic_keheh               = 0x10006a9,  /* U+06A9 ARABIC LETTER KEHEH */
-    XK_Arabic_gaf                 = 0x10006af,  /* U+06AF ARABIC LETTER GAF */
-    XK_Arabic_noon_ghunna         = 0x10006ba,  /* U+06BA ARABIC LETTER NOON GHUNNA */
-    XK_Arabic_heh_doachashmee     = 0x10006be,  /* U+06BE ARABIC LETTER HEH DOACHASHMEE */
-    XK_Farsi_yeh                  = 0x10006cc,  /* U+06CC ARABIC LETTER FARSI YEH */
-    XK_Arabic_farsi_yeh           = 0x10006cc,  /* U+06CC ARABIC LETTER FARSI YEH */
-    XK_Arabic_yeh_baree           = 0x10006d2,  /* U+06D2 ARABIC LETTER YEH BARREE */
-    XK_Arabic_heh_goal            = 0x10006c1,  /* U+06C1 ARABIC LETTER HEH GOAL */
-    XK_Arabic_switch                 = 0xff7e,  /* Alias for mode_switch */
-    XK_Cyrillic_GHE_bar           = 0x1000492,  /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */
-    XK_Cyrillic_ghe_bar           = 0x1000493,  /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */
-    XK_Cyrillic_ZHE_descender     = 0x1000496,  /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */
-    XK_Cyrillic_zhe_descender     = 0x1000497,  /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */
-    XK_Cyrillic_KA_descender      = 0x100049a,  /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */
-    XK_Cyrillic_ka_descender      = 0x100049b,  /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */
-    XK_Cyrillic_KA_vertstroke     = 0x100049c,  /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */
-    XK_Cyrillic_ka_vertstroke     = 0x100049d,  /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */
-    XK_Cyrillic_EN_descender      = 0x10004a2,  /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */
-    XK_Cyrillic_en_descender      = 0x10004a3,  /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */
-    XK_Cyrillic_U_straight        = 0x10004ae,  /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */
-    XK_Cyrillic_u_straight        = 0x10004af,  /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */
-    XK_Cyrillic_U_straight_bar    = 0x10004b0,  /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */
-    XK_Cyrillic_u_straight_bar    = 0x10004b1,  /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */
-    XK_Cyrillic_HA_descender      = 0x10004b2,  /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */
-    XK_Cyrillic_ha_descender      = 0x10004b3,  /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */
-    XK_Cyrillic_CHE_descender     = 0x10004b6,  /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */
-    XK_Cyrillic_che_descender     = 0x10004b7,  /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */
-    XK_Cyrillic_CHE_vertstroke    = 0x10004b8,  /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */
-    XK_Cyrillic_che_vertstroke    = 0x10004b9,  /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */
-    XK_Cyrillic_SHHA              = 0x10004ba,  /* U+04BA CYRILLIC CAPITAL LETTER SHHA */
-    XK_Cyrillic_shha              = 0x10004bb,  /* U+04BB CYRILLIC SMALL LETTER SHHA */
-    XK_Cyrillic_SCHWA             = 0x10004d8,  /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */
-    XK_Cyrillic_schwa             = 0x10004d9,  /* U+04D9 CYRILLIC SMALL LETTER SCHWA */
-    XK_Cyrillic_I_macron          = 0x10004e2,  /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */
-    XK_Cyrillic_i_macron          = 0x10004e3,  /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */
-    XK_Cyrillic_O_bar             = 0x10004e8,  /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */
-    XK_Cyrillic_o_bar             = 0x10004e9,  /* U+04E9 CYRILLIC SMALL LETTER BARRED O */
-    XK_Cyrillic_U_macron          = 0x10004ee,  /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */
-    XK_Cyrillic_u_macron          = 0x10004ef,  /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */
-    XK_Serbian_dje                   = 0x06a1,  /* U+0452 CYRILLIC SMALL LETTER DJE */
-    XK_Macedonia_gje                 = 0x06a2,  /* U+0453 CYRILLIC SMALL LETTER GJE */
-    XK_Cyrillic_io                   = 0x06a3,  /* U+0451 CYRILLIC SMALL LETTER IO */
-    XK_Ukrainian_ie                  = 0x06a4,  /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */
-    XK_Ukranian_je                   = 0x06a4,  /* deprecated */
-    XK_Macedonia_dse                 = 0x06a5,  /* U+0455 CYRILLIC SMALL LETTER DZE */
-    XK_Ukrainian_i                   = 0x06a6,  /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
-    XK_Ukranian_i                    = 0x06a6,  /* deprecated */
-    XK_Ukrainian_yi                  = 0x06a7,  /* U+0457 CYRILLIC SMALL LETTER YI */
-    XK_Ukranian_yi                   = 0x06a7,  /* deprecated */
-    XK_Cyrillic_je                   = 0x06a8,  /* U+0458 CYRILLIC SMALL LETTER JE */
-    XK_Serbian_je                    = 0x06a8,  /* deprecated */
-    XK_Cyrillic_lje                  = 0x06a9,  /* U+0459 CYRILLIC SMALL LETTER LJE */
-    XK_Serbian_lje                   = 0x06a9,  /* deprecated */
-    XK_Cyrillic_nje                  = 0x06aa,  /* U+045A CYRILLIC SMALL LETTER NJE */
-    XK_Serbian_nje                   = 0x06aa,  /* deprecated */
-    XK_Serbian_tshe                  = 0x06ab,  /* U+045B CYRILLIC SMALL LETTER TSHE */
-    XK_Macedonia_kje                 = 0x06ac,  /* U+045C CYRILLIC SMALL LETTER KJE */
-    XK_Ukrainian_ghe_with_upturn     = 0x06ad,  /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */
-    XK_Byelorussian_shortu           = 0x06ae,  /* U+045E CYRILLIC SMALL LETTER SHORT U */
-    XK_Cyrillic_dzhe                 = 0x06af,  /* U+045F CYRILLIC SMALL LETTER DZHE */
-    XK_Serbian_dze                   = 0x06af,  /* deprecated */
-    XK_numerosign                    = 0x06b0,  /* U+2116 NUMERO SIGN */
-    XK_Serbian_DJE                   = 0x06b1,  /* U+0402 CYRILLIC CAPITAL LETTER DJE */
-    XK_Macedonia_GJE                 = 0x06b2,  /* U+0403 CYRILLIC CAPITAL LETTER GJE */
-    XK_Cyrillic_IO                   = 0x06b3,  /* U+0401 CYRILLIC CAPITAL LETTER IO */
-    XK_Ukrainian_IE                  = 0x06b4,  /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */
-    XK_Ukranian_JE                   = 0x06b4,  /* deprecated */
-    XK_Macedonia_DSE                 = 0x06b5,  /* U+0405 CYRILLIC CAPITAL LETTER DZE */
-    XK_Ukrainian_I                   = 0x06b6,  /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
-    XK_Ukranian_I                    = 0x06b6,  /* deprecated */
-    XK_Ukrainian_YI                  = 0x06b7,  /* U+0407 CYRILLIC CAPITAL LETTER YI */
-    XK_Ukranian_YI                   = 0x06b7,  /* deprecated */
-    XK_Cyrillic_JE                   = 0x06b8,  /* U+0408 CYRILLIC CAPITAL LETTER JE */
-    XK_Serbian_JE                    = 0x06b8,  /* deprecated */
-    XK_Cyrillic_LJE                  = 0x06b9,  /* U+0409 CYRILLIC CAPITAL LETTER LJE */
-    XK_Serbian_LJE                   = 0x06b9,  /* deprecated */
-    XK_Cyrillic_NJE                  = 0x06ba,  /* U+040A CYRILLIC CAPITAL LETTER NJE */
-    XK_Serbian_NJE                   = 0x06ba,  /* deprecated */
-    XK_Serbian_TSHE                  = 0x06bb,  /* U+040B CYRILLIC CAPITAL LETTER TSHE */
-    XK_Macedonia_KJE                 = 0x06bc,  /* U+040C CYRILLIC CAPITAL LETTER KJE */
-    XK_Ukrainian_GHE_WITH_UPTURN     = 0x06bd,  /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
-    XK_Byelorussian_SHORTU           = 0x06be,  /* U+040E CYRILLIC CAPITAL LETTER SHORT U */
-    XK_Cyrillic_DZHE                 = 0x06bf,  /* U+040F CYRILLIC CAPITAL LETTER DZHE */
-    XK_Serbian_DZE                   = 0x06bf,  /* deprecated */
-    XK_Cyrillic_yu                   = 0x06c0,  /* U+044E CYRILLIC SMALL LETTER YU */
-    XK_Cyrillic_a                    = 0x06c1,  /* U+0430 CYRILLIC SMALL LETTER A */
-    XK_Cyrillic_be                   = 0x06c2,  /* U+0431 CYRILLIC SMALL LETTER BE */
-    XK_Cyrillic_tse                  = 0x06c3,  /* U+0446 CYRILLIC SMALL LETTER TSE */
-    XK_Cyrillic_de                   = 0x06c4,  /* U+0434 CYRILLIC SMALL LETTER DE */
-    XK_Cyrillic_ie                   = 0x06c5,  /* U+0435 CYRILLIC SMALL LETTER IE */
-    XK_Cyrillic_ef                   = 0x06c6,  /* U+0444 CYRILLIC SMALL LETTER EF */
-    XK_Cyrillic_ghe                  = 0x06c7,  /* U+0433 CYRILLIC SMALL LETTER GHE */
-    XK_Cyrillic_ha                   = 0x06c8,  /* U+0445 CYRILLIC SMALL LETTER HA */
-    XK_Cyrillic_i                    = 0x06c9,  /* U+0438 CYRILLIC SMALL LETTER I */
-    XK_Cyrillic_shorti               = 0x06ca,  /* U+0439 CYRILLIC SMALL LETTER SHORT I */
-    XK_Cyrillic_ka                   = 0x06cb,  /* U+043A CYRILLIC SMALL LETTER KA */
-    XK_Cyrillic_el                   = 0x06cc,  /* U+043B CYRILLIC SMALL LETTER EL */
-    XK_Cyrillic_em                   = 0x06cd,  /* U+043C CYRILLIC SMALL LETTER EM */
-    XK_Cyrillic_en                   = 0x06ce,  /* U+043D CYRILLIC SMALL LETTER EN */
-    XK_Cyrillic_o                    = 0x06cf,  /* U+043E CYRILLIC SMALL LETTER O */
-    XK_Cyrillic_pe                   = 0x06d0,  /* U+043F CYRILLIC SMALL LETTER PE */
-    XK_Cyrillic_ya                   = 0x06d1,  /* U+044F CYRILLIC SMALL LETTER YA */
-    XK_Cyrillic_er                   = 0x06d2,  /* U+0440 CYRILLIC SMALL LETTER ER */
-    XK_Cyrillic_es                   = 0x06d3,  /* U+0441 CYRILLIC SMALL LETTER ES */
-    XK_Cyrillic_te                   = 0x06d4,  /* U+0442 CYRILLIC SMALL LETTER TE */
-    XK_Cyrillic_u                    = 0x06d5,  /* U+0443 CYRILLIC SMALL LETTER U */
-    XK_Cyrillic_zhe                  = 0x06d6,  /* U+0436 CYRILLIC SMALL LETTER ZHE */
-    XK_Cyrillic_ve                   = 0x06d7,  /* U+0432 CYRILLIC SMALL LETTER VE */
-    XK_Cyrillic_softsign             = 0x06d8,  /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */
-    XK_Cyrillic_yeru                 = 0x06d9,  /* U+044B CYRILLIC SMALL LETTER YERU */
-    XK_Cyrillic_ze                   = 0x06da,  /* U+0437 CYRILLIC SMALL LETTER ZE */
-    XK_Cyrillic_sha                  = 0x06db,  /* U+0448 CYRILLIC SMALL LETTER SHA */
-    XK_Cyrillic_e                    = 0x06dc,  /* U+044D CYRILLIC SMALL LETTER E */
-    XK_Cyrillic_shcha                = 0x06dd,  /* U+0449 CYRILLIC SMALL LETTER SHCHA */
-    XK_Cyrillic_che                  = 0x06de,  /* U+0447 CYRILLIC SMALL LETTER CHE */
-    XK_Cyrillic_hardsign             = 0x06df,  /* U+044A CYRILLIC SMALL LETTER HARD SIGN */
-    XK_Cyrillic_YU                   = 0x06e0,  /* U+042E CYRILLIC CAPITAL LETTER YU */
-    XK_Cyrillic_A                    = 0x06e1,  /* U+0410 CYRILLIC CAPITAL LETTER A */
-    XK_Cyrillic_BE                   = 0x06e2,  /* U+0411 CYRILLIC CAPITAL LETTER BE */
-    XK_Cyrillic_TSE                  = 0x06e3,  /* U+0426 CYRILLIC CAPITAL LETTER TSE */
-    XK_Cyrillic_DE                   = 0x06e4,  /* U+0414 CYRILLIC CAPITAL LETTER DE */
-    XK_Cyrillic_IE                   = 0x06e5,  /* U+0415 CYRILLIC CAPITAL LETTER IE */
-    XK_Cyrillic_EF                   = 0x06e6,  /* U+0424 CYRILLIC CAPITAL LETTER EF */
-    XK_Cyrillic_GHE                  = 0x06e7,  /* U+0413 CYRILLIC CAPITAL LETTER GHE */
-    XK_Cyrillic_HA                   = 0x06e8,  /* U+0425 CYRILLIC CAPITAL LETTER HA */
-    XK_Cyrillic_I                    = 0x06e9,  /* U+0418 CYRILLIC CAPITAL LETTER I */
-    XK_Cyrillic_SHORTI               = 0x06ea,  /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */
-    XK_Cyrillic_KA                   = 0x06eb,  /* U+041A CYRILLIC CAPITAL LETTER KA */
-    XK_Cyrillic_EL                   = 0x06ec,  /* U+041B CYRILLIC CAPITAL LETTER EL */
-    XK_Cyrillic_EM                   = 0x06ed,  /* U+041C CYRILLIC CAPITAL LETTER EM */
-    XK_Cyrillic_EN                   = 0x06ee,  /* U+041D CYRILLIC CAPITAL LETTER EN */
-    XK_Cyrillic_O                    = 0x06ef,  /* U+041E CYRILLIC CAPITAL LETTER O */
-    XK_Cyrillic_PE                   = 0x06f0,  /* U+041F CYRILLIC CAPITAL LETTER PE */
-    XK_Cyrillic_YA                   = 0x06f1,  /* U+042F CYRILLIC CAPITAL LETTER YA */
-    XK_Cyrillic_ER                   = 0x06f2,  /* U+0420 CYRILLIC CAPITAL LETTER ER */
-    XK_Cyrillic_ES                   = 0x06f3,  /* U+0421 CYRILLIC CAPITAL LETTER ES */
-    XK_Cyrillic_TE                   = 0x06f4,  /* U+0422 CYRILLIC CAPITAL LETTER TE */
-    XK_Cyrillic_U                    = 0x06f5,  /* U+0423 CYRILLIC CAPITAL LETTER U */
-    XK_Cyrillic_ZHE                  = 0x06f6,  /* U+0416 CYRILLIC CAPITAL LETTER ZHE */
-    XK_Cyrillic_VE                   = 0x06f7,  /* U+0412 CYRILLIC CAPITAL LETTER VE */
-    XK_Cyrillic_SOFTSIGN             = 0x06f8,  /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */
-    XK_Cyrillic_YERU                 = 0x06f9,  /* U+042B CYRILLIC CAPITAL LETTER YERU */
-    XK_Cyrillic_ZE                   = 0x06fa,  /* U+0417 CYRILLIC CAPITAL LETTER ZE */
-    XK_Cyrillic_SHA                  = 0x06fb,  /* U+0428 CYRILLIC CAPITAL LETTER SHA */
-    XK_Cyrillic_E                    = 0x06fc,  /* U+042D CYRILLIC CAPITAL LETTER E */
-    XK_Cyrillic_SHCHA                = 0x06fd,  /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
-    XK_Cyrillic_CHE                  = 0x06fe,  /* U+0427 CYRILLIC CAPITAL LETTER CHE */
-    XK_Cyrillic_HARDSIGN             = 0x06ff,  /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */
-    XK_Greek_ALPHAaccent             = 0x07a1,  /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */
-    XK_Greek_EPSILONaccent           = 0x07a2,  /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */
-    XK_Greek_ETAaccent               = 0x07a3,  /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */
-    XK_Greek_IOTAaccent              = 0x07a4,  /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */
-    XK_Greek_IOTAdieresis            = 0x07a5,  /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
-    XK_Greek_IOTAdiaeresis           = 0x07a5,  /* old typo */
-    XK_Greek_OMICRONaccent           = 0x07a7,  /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */
-    XK_Greek_UPSILONaccent           = 0x07a8,  /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */
-    XK_Greek_UPSILONdieresis         = 0x07a9,  /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
-    XK_Greek_OMEGAaccent             = 0x07ab,  /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */
-    XK_Greek_accentdieresis          = 0x07ae,  /* U+0385 GREEK DIALYTIKA TONOS */
-    XK_Greek_horizbar                = 0x07af,  /* U+2015 HORIZONTAL BAR */
-    XK_Greek_alphaaccent             = 0x07b1,  /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */
-    XK_Greek_epsilonaccent           = 0x07b2,  /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */
-    XK_Greek_etaaccent               = 0x07b3,  /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */
-    XK_Greek_iotaaccent              = 0x07b4,  /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */
-    XK_Greek_iotadieresis            = 0x07b5,  /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */
-    XK_Greek_iotaaccentdieresis      = 0x07b6,  /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
-    XK_Greek_omicronaccent           = 0x07b7,  /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */
-    XK_Greek_upsilonaccent           = 0x07b8,  /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */
-    XK_Greek_upsilondieresis         = 0x07b9,  /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
-    XK_Greek_upsilonaccentdieresis   = 0x07ba,  /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
-    XK_Greek_omegaaccent             = 0x07bb,  /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */
-    XK_Greek_ALPHA                   = 0x07c1,  /* U+0391 GREEK CAPITAL LETTER ALPHA */
-    XK_Greek_BETA                    = 0x07c2,  /* U+0392 GREEK CAPITAL LETTER BETA */
-    XK_Greek_GAMMA                   = 0x07c3,  /* U+0393 GREEK CAPITAL LETTER GAMMA */
-    XK_Greek_DELTA                   = 0x07c4,  /* U+0394 GREEK CAPITAL LETTER DELTA */
-    XK_Greek_EPSILON                 = 0x07c5,  /* U+0395 GREEK CAPITAL LETTER EPSILON */
-    XK_Greek_ZETA                    = 0x07c6,  /* U+0396 GREEK CAPITAL LETTER ZETA */
-    XK_Greek_ETA                     = 0x07c7,  /* U+0397 GREEK CAPITAL LETTER ETA */
-    XK_Greek_THETA                   = 0x07c8,  /* U+0398 GREEK CAPITAL LETTER THETA */
-    XK_Greek_IOTA                    = 0x07c9,  /* U+0399 GREEK CAPITAL LETTER IOTA */
-    XK_Greek_KAPPA                   = 0x07ca,  /* U+039A GREEK CAPITAL LETTER KAPPA */
-    XK_Greek_LAMDA                   = 0x07cb,  /* U+039B GREEK CAPITAL LETTER LAMDA */
-    XK_Greek_LAMBDA                  = 0x07cb,  /* U+039B GREEK CAPITAL LETTER LAMDA */
-    XK_Greek_MU                      = 0x07cc,  /* U+039C GREEK CAPITAL LETTER MU */
-    XK_Greek_NU                      = 0x07cd,  /* U+039D GREEK CAPITAL LETTER NU */
-    XK_Greek_XI                      = 0x07ce,  /* U+039E GREEK CAPITAL LETTER XI */
-    XK_Greek_OMICRON                 = 0x07cf,  /* U+039F GREEK CAPITAL LETTER OMICRON */
-    XK_Greek_PI                      = 0x07d0,  /* U+03A0 GREEK CAPITAL LETTER PI */
-    XK_Greek_RHO                     = 0x07d1,  /* U+03A1 GREEK CAPITAL LETTER RHO */
-    XK_Greek_SIGMA                   = 0x07d2,  /* U+03A3 GREEK CAPITAL LETTER SIGMA */
-    XK_Greek_TAU                     = 0x07d4,  /* U+03A4 GREEK CAPITAL LETTER TAU */
-    XK_Greek_UPSILON                 = 0x07d5,  /* U+03A5 GREEK CAPITAL LETTER UPSILON */
-    XK_Greek_PHI                     = 0x07d6,  /* U+03A6 GREEK CAPITAL LETTER PHI */
-    XK_Greek_CHI                     = 0x07d7,  /* U+03A7 GREEK CAPITAL LETTER CHI */
-    XK_Greek_PSI                     = 0x07d8,  /* U+03A8 GREEK CAPITAL LETTER PSI */
-    XK_Greek_OMEGA                   = 0x07d9,  /* U+03A9 GREEK CAPITAL LETTER OMEGA */
-    XK_Greek_alpha                   = 0x07e1,  /* U+03B1 GREEK SMALL LETTER ALPHA */
-    XK_Greek_beta                    = 0x07e2,  /* U+03B2 GREEK SMALL LETTER BETA */
-    XK_Greek_gamma                   = 0x07e3,  /* U+03B3 GREEK SMALL LETTER GAMMA */
-    XK_Greek_delta                   = 0x07e4,  /* U+03B4 GREEK SMALL LETTER DELTA */
-    XK_Greek_epsilon                 = 0x07e5,  /* U+03B5 GREEK SMALL LETTER EPSILON */
-    XK_Greek_zeta                    = 0x07e6,  /* U+03B6 GREEK SMALL LETTER ZETA */
-    XK_Greek_eta                     = 0x07e7,  /* U+03B7 GREEK SMALL LETTER ETA */
-    XK_Greek_theta                   = 0x07e8,  /* U+03B8 GREEK SMALL LETTER THETA */
-    XK_Greek_iota                    = 0x07e9,  /* U+03B9 GREEK SMALL LETTER IOTA */
-    XK_Greek_kappa                   = 0x07ea,  /* U+03BA GREEK SMALL LETTER KAPPA */
-    XK_Greek_lamda                   = 0x07eb,  /* U+03BB GREEK SMALL LETTER LAMDA */
-    XK_Greek_lambda                  = 0x07eb,  /* U+03BB GREEK SMALL LETTER LAMDA */
-    XK_Greek_mu                      = 0x07ec,  /* U+03BC GREEK SMALL LETTER MU */
-    XK_Greek_nu                      = 0x07ed,  /* U+03BD GREEK SMALL LETTER NU */
-    XK_Greek_xi                      = 0x07ee,  /* U+03BE GREEK SMALL LETTER XI */
-    XK_Greek_omicron                 = 0x07ef,  /* U+03BF GREEK SMALL LETTER OMICRON */
-    XK_Greek_pi                      = 0x07f0,  /* U+03C0 GREEK SMALL LETTER PI */
-    XK_Greek_rho                     = 0x07f1,  /* U+03C1 GREEK SMALL LETTER RHO */
-    XK_Greek_sigma                   = 0x07f2,  /* U+03C3 GREEK SMALL LETTER SIGMA */
-    XK_Greek_finalsmallsigma         = 0x07f3,  /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */
-    XK_Greek_tau                     = 0x07f4,  /* U+03C4 GREEK SMALL LETTER TAU */
-    XK_Greek_upsilon                 = 0x07f5,  /* U+03C5 GREEK SMALL LETTER UPSILON */
-    XK_Greek_phi                     = 0x07f6,  /* U+03C6 GREEK SMALL LETTER PHI */
-    XK_Greek_chi                     = 0x07f7,  /* U+03C7 GREEK SMALL LETTER CHI */
-    XK_Greek_psi                     = 0x07f8,  /* U+03C8 GREEK SMALL LETTER PSI */
-    XK_Greek_omega                   = 0x07f9,  /* U+03C9 GREEK SMALL LETTER OMEGA */
-    XK_Greek_switch                  = 0xff7e,  /* Alias for mode_switch */
-    XK_leftradical                   = 0x08a1,  /* U+23B7 RADICAL SYMBOL BOTTOM */
-    XK_topleftradical                = 0x08a2,  /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/
-    XK_horizconnector                = 0x08a3,  /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/
-    XK_topintegral                   = 0x08a4,  /* U+2320 TOP HALF INTEGRAL */
-    XK_botintegral                   = 0x08a5,  /* U+2321 BOTTOM HALF INTEGRAL */
-    XK_vertconnector                 = 0x08a6,  /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/
-    XK_topleftsqbracket              = 0x08a7,  /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */
-    XK_botleftsqbracket              = 0x08a8,  /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */
-    XK_toprightsqbracket             = 0x08a9,  /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */
-    XK_botrightsqbracket             = 0x08aa,  /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */
-    XK_topleftparens                 = 0x08ab,  /* U+239B LEFT PARENTHESIS UPPER HOOK */
-    XK_botleftparens                 = 0x08ac,  /* U+239D LEFT PARENTHESIS LOWER HOOK */
-    XK_toprightparens                = 0x08ad,  /* U+239E RIGHT PARENTHESIS UPPER HOOK */
-    XK_botrightparens                = 0x08ae,  /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */
-    XK_leftmiddlecurlybrace          = 0x08af,  /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */
-    XK_rightmiddlecurlybrace         = 0x08b0,  /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */
-    XK_topleftsummation              = 0x08b1,
-    XK_botleftsummation              = 0x08b2,
-    XK_topvertsummationconnector     = 0x08b3,
-    XK_botvertsummationconnector     = 0x08b4,
-    XK_toprightsummation             = 0x08b5,
-    XK_botrightsummation             = 0x08b6,
-    XK_rightmiddlesummation          = 0x08b7,
-    XK_lessthanequal                 = 0x08bc,  /* U+2264 LESS-THAN OR EQUAL TO */
-    XK_notequal                      = 0x08bd,  /* U+2260 NOT EQUAL TO */
-    XK_greaterthanequal              = 0x08be,  /* U+2265 GREATER-THAN OR EQUAL TO */
-    XK_integral                      = 0x08bf,  /* U+222B INTEGRAL */
-    XK_therefore                     = 0x08c0,  /* U+2234 THEREFORE */
-    XK_variation                     = 0x08c1,  /* U+221D PROPORTIONAL TO */
-    XK_infinity                      = 0x08c2,  /* U+221E INFINITY */
-    XK_nabla                         = 0x08c5,  /* U+2207 NABLA */
-    XK_approximate                   = 0x08c8,  /* U+223C TILDE OPERATOR */
-    XK_similarequal                  = 0x08c9,  /* U+2243 ASYMPTOTICALLY EQUAL TO */
-    XK_ifonlyif                      = 0x08cd,  /* U+21D4 LEFT RIGHT DOUBLE ARROW */
-    XK_implies                       = 0x08ce,  /* U+21D2 RIGHTWARDS DOUBLE ARROW */
-    XK_identical                     = 0x08cf,  /* U+2261 IDENTICAL TO */
-    XK_radical                       = 0x08d6,  /* U+221A SQUARE ROOT */
-    XK_includedin                    = 0x08da,  /* U+2282 SUBSET OF */
-    XK_includes                      = 0x08db,  /* U+2283 SUPERSET OF */
-    XK_intersection                  = 0x08dc,  /* U+2229 INTERSECTION */
-    XK_union                         = 0x08dd,  /* U+222A UNION */
-    XK_logicaland                    = 0x08de,  /* U+2227 LOGICAL AND */
-    XK_logicalor                     = 0x08df,  /* U+2228 LOGICAL OR */
-    XK_partialderivative             = 0x08ef,  /* U+2202 PARTIAL DIFFERENTIAL */
-    XK_function                      = 0x08f6,  /* U+0192 LATIN SMALL LETTER F WITH HOOK */
-    XK_leftarrow                     = 0x08fb,  /* U+2190 LEFTWARDS ARROW */
-    XK_uparrow                       = 0x08fc,  /* U+2191 UPWARDS ARROW */
-    XK_rightarrow                    = 0x08fd,  /* U+2192 RIGHTWARDS ARROW */
-    XK_downarrow                     = 0x08fe,  /* U+2193 DOWNWARDS ARROW */
-    XK_blank                         = 0x09df,
-    XK_soliddiamond                  = 0x09e0,  /* U+25C6 BLACK DIAMOND */
-    XK_checkerboard                  = 0x09e1,  /* U+2592 MEDIUM SHADE */
-    XK_ht                            = 0x09e2,  /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */
-    XK_ff                            = 0x09e3,  /* U+240C SYMBOL FOR FORM FEED */
-    XK_cr                            = 0x09e4,  /* U+240D SYMBOL FOR CARRIAGE RETURN */
-    XK_lf                            = 0x09e5,  /* U+240A SYMBOL FOR LINE FEED */
-    XK_nl                            = 0x09e8,  /* U+2424 SYMBOL FOR NEWLINE */
-    XK_vt                            = 0x09e9,  /* U+240B SYMBOL FOR VERTICAL TABULATION */
-    XK_lowrightcorner                = 0x09ea,  /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */
-    XK_uprightcorner                 = 0x09eb,  /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */
-    XK_upleftcorner                  = 0x09ec,  /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */
-    XK_lowleftcorner                 = 0x09ed,  /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */
-    XK_crossinglines                 = 0x09ee,  /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
-    XK_horizlinescan1                = 0x09ef,  /* U+23BA HORIZONTAL SCAN LINE-1 */
-    XK_horizlinescan3                = 0x09f0,  /* U+23BB HORIZONTAL SCAN LINE-3 */
-    XK_horizlinescan5                = 0x09f1,  /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */
-    XK_horizlinescan7                = 0x09f2,  /* U+23BC HORIZONTAL SCAN LINE-7 */
-    XK_horizlinescan9                = 0x09f3,  /* U+23BD HORIZONTAL SCAN LINE-9 */
-    XK_leftt                         = 0x09f4,  /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
-    XK_rightt                        = 0x09f5,  /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */
-    XK_bott                          = 0x09f6,  /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */
-    XK_topt                          = 0x09f7,  /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
-    XK_vertbar                       = 0x09f8,  /* U+2502 BOX DRAWINGS LIGHT VERTICAL */
-    XK_emspace                       = 0x0aa1,  /* U+2003 EM SPACE */
-    XK_enspace                       = 0x0aa2,  /* U+2002 EN SPACE */
-    XK_em3space                      = 0x0aa3,  /* U+2004 THREE-PER-EM SPACE */
-    XK_em4space                      = 0x0aa4,  /* U+2005 FOUR-PER-EM SPACE */
-    XK_digitspace                    = 0x0aa5,  /* U+2007 FIGURE SPACE */
-    XK_punctspace                    = 0x0aa6,  /* U+2008 PUNCTUATION SPACE */
-    XK_thinspace                     = 0x0aa7,  /* U+2009 THIN SPACE */
-    XK_hairspace                     = 0x0aa8,  /* U+200A HAIR SPACE */
-    XK_emdash                        = 0x0aa9,  /* U+2014 EM DASH */
-    XK_endash                        = 0x0aaa,  /* U+2013 EN DASH */
-    XK_signifblank                   = 0x0aac,  /*(U+2423 OPEN BOX)*/
-    XK_ellipsis                      = 0x0aae,  /* U+2026 HORIZONTAL ELLIPSIS */
-    XK_doubbaselinedot               = 0x0aaf,  /* U+2025 TWO DOT LEADER */
-    XK_onethird                      = 0x0ab0,  /* U+2153 VULGAR FRACTION ONE THIRD */
-    XK_twothirds                     = 0x0ab1,  /* U+2154 VULGAR FRACTION TWO THIRDS */
-    XK_onefifth                      = 0x0ab2,  /* U+2155 VULGAR FRACTION ONE FIFTH */
-    XK_twofifths                     = 0x0ab3,  /* U+2156 VULGAR FRACTION TWO FIFTHS */
-    XK_threefifths                   = 0x0ab4,  /* U+2157 VULGAR FRACTION THREE FIFTHS */
-    XK_fourfifths                    = 0x0ab5,  /* U+2158 VULGAR FRACTION FOUR FIFTHS */
-    XK_onesixth                      = 0x0ab6,  /* U+2159 VULGAR FRACTION ONE SIXTH */
-    XK_fivesixths                    = 0x0ab7,  /* U+215A VULGAR FRACTION FIVE SIXTHS */
-    XK_careof                        = 0x0ab8,  /* U+2105 CARE OF */
-    XK_figdash                       = 0x0abb,  /* U+2012 FIGURE DASH */
-    XK_leftanglebracket              = 0x0abc,  /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/
-    XK_decimalpoint                  = 0x0abd,  /*(U+002E FULL STOP)*/
-    XK_rightanglebracket             = 0x0abe,  /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/
-    XK_marker                        = 0x0abf,
-    XK_oneeighth                     = 0x0ac3,  /* U+215B VULGAR FRACTION ONE EIGHTH */
-    XK_threeeighths                  = 0x0ac4,  /* U+215C VULGAR FRACTION THREE EIGHTHS */
-    XK_fiveeighths                   = 0x0ac5,  /* U+215D VULGAR FRACTION FIVE EIGHTHS */
-    XK_seveneighths                  = 0x0ac6,  /* U+215E VULGAR FRACTION SEVEN EIGHTHS */
-    XK_trademark                     = 0x0ac9,  /* U+2122 TRADE MARK SIGN */
-    XK_signaturemark                 = 0x0aca,  /*(U+2613 SALTIRE)*/
-    XK_trademarkincircle             = 0x0acb,
-    XK_leftopentriangle              = 0x0acc,  /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/
-    XK_rightopentriangle             = 0x0acd,  /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/
-    XK_emopencircle                  = 0x0ace,  /*(U+25CB WHITE CIRCLE)*/
-    XK_emopenrectangle               = 0x0acf,  /*(U+25AF WHITE VERTICAL RECTANGLE)*/
-    XK_leftsinglequotemark           = 0x0ad0,  /* U+2018 LEFT SINGLE QUOTATION MARK */
-    XK_rightsinglequotemark          = 0x0ad1,  /* U+2019 RIGHT SINGLE QUOTATION MARK */
-    XK_leftdoublequotemark           = 0x0ad2,  /* U+201C LEFT DOUBLE QUOTATION MARK */
-    XK_rightdoublequotemark          = 0x0ad3,  /* U+201D RIGHT DOUBLE QUOTATION MARK */
-    XK_prescription                  = 0x0ad4,  /* U+211E PRESCRIPTION TAKE */
-    XK_minutes                       = 0x0ad6,  /* U+2032 PRIME */
-    XK_seconds                       = 0x0ad7,  /* U+2033 DOUBLE PRIME */
-    XK_latincross                    = 0x0ad9,  /* U+271D LATIN CROSS */
-    XK_hexagram                      = 0x0ada,
-    XK_filledrectbullet              = 0x0adb,  /*(U+25AC BLACK RECTANGLE)*/
-    XK_filledlefttribullet           = 0x0adc,  /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/
-    XK_filledrighttribullet          = 0x0add,  /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/
-    XK_emfilledcircle                = 0x0ade,  /*(U+25CF BLACK CIRCLE)*/
-    XK_emfilledrect                  = 0x0adf,  /*(U+25AE BLACK VERTICAL RECTANGLE)*/
-    XK_enopencircbullet              = 0x0ae0,  /*(U+25E6 WHITE BULLET)*/
-    XK_enopensquarebullet            = 0x0ae1,  /*(U+25AB WHITE SMALL SQUARE)*/
-    XK_openrectbullet                = 0x0ae2,  /*(U+25AD WHITE RECTANGLE)*/
-    XK_opentribulletup               = 0x0ae3,  /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/
-    XK_opentribulletdown             = 0x0ae4,  /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/
-    XK_openstar                      = 0x0ae5,  /*(U+2606 WHITE STAR)*/
-    XK_enfilledcircbullet            = 0x0ae6,  /*(U+2022 BULLET)*/
-    XK_enfilledsqbullet              = 0x0ae7,  /*(U+25AA BLACK SMALL SQUARE)*/
-    XK_filledtribulletup             = 0x0ae8,  /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/
-    XK_filledtribulletdown           = 0x0ae9,  /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/
-    XK_leftpointer                   = 0x0aea,  /*(U+261C WHITE LEFT POINTING INDEX)*/
-    XK_rightpointer                  = 0x0aeb,  /*(U+261E WHITE RIGHT POINTING INDEX)*/
-    XK_club                          = 0x0aec,  /* U+2663 BLACK CLUB SUIT */
-    XK_diamond                       = 0x0aed,  /* U+2666 BLACK DIAMOND SUIT */
-    XK_heart                         = 0x0aee,  /* U+2665 BLACK HEART SUIT */
-    XK_maltesecross                  = 0x0af0,  /* U+2720 MALTESE CROSS */
-    XK_dagger                        = 0x0af1,  /* U+2020 DAGGER */
-    XK_doubledagger                  = 0x0af2,  /* U+2021 DOUBLE DAGGER */
-    XK_checkmark                     = 0x0af3,  /* U+2713 CHECK MARK */
-    XK_ballotcross                   = 0x0af4,  /* U+2717 BALLOT X */
-    XK_musicalsharp                  = 0x0af5,  /* U+266F MUSIC SHARP SIGN */
-    XK_musicalflat                   = 0x0af6,  /* U+266D MUSIC FLAT SIGN */
-    XK_malesymbol                    = 0x0af7,  /* U+2642 MALE SIGN */
-    XK_femalesymbol                  = 0x0af8,  /* U+2640 FEMALE SIGN */
-    XK_telephone                     = 0x0af9,  /* U+260E BLACK TELEPHONE */
-    XK_telephonerecorder             = 0x0afa,  /* U+2315 TELEPHONE RECORDER */
-    XK_phonographcopyright           = 0x0afb,  /* U+2117 SOUND RECORDING COPYRIGHT */
-    XK_caret                         = 0x0afc,  /* U+2038 CARET */
-    XK_singlelowquotemark            = 0x0afd,  /* U+201A SINGLE LOW-9 QUOTATION MARK */
-    XK_doublelowquotemark            = 0x0afe,  /* U+201E DOUBLE LOW-9 QUOTATION MARK */
-    XK_cursor                        = 0x0aff,
-    XK_leftcaret                     = 0x0ba3,  /*(U+003C LESS-THAN SIGN)*/
-    XK_rightcaret                    = 0x0ba6,  /*(U+003E GREATER-THAN SIGN)*/
-    XK_downcaret                     = 0x0ba8,  /*(U+2228 LOGICAL OR)*/
-    XK_upcaret                       = 0x0ba9,  /*(U+2227 LOGICAL AND)*/
-    XK_overbar                       = 0x0bc0,  /*(U+00AF MACRON)*/
-    XK_downtack                      = 0x0bc2,  /* U+22A5 UP TACK */
-    XK_upshoe                        = 0x0bc3,  /*(U+2229 INTERSECTION)*/
-    XK_downstile                     = 0x0bc4,  /* U+230A LEFT FLOOR */
-    XK_underbar                      = 0x0bc6,  /*(U+005F LOW LINE)*/
-    XK_jot                           = 0x0bca,  /* U+2218 RING OPERATOR */
-    XK_quad                          = 0x0bcc,  /* U+2395 APL FUNCTIONAL SYMBOL QUAD */
-    XK_uptack                        = 0x0bce,  /* U+22A4 DOWN TACK */
-    XK_circle                        = 0x0bcf,  /* U+25CB WHITE CIRCLE */
-    XK_upstile                       = 0x0bd3,  /* U+2308 LEFT CEILING */
-    XK_downshoe                      = 0x0bd6,  /*(U+222A UNION)*/
-    XK_rightshoe                     = 0x0bd8,  /*(U+2283 SUPERSET OF)*/
-    XK_leftshoe                      = 0x0bda,  /*(U+2282 SUBSET OF)*/
-    XK_lefttack                      = 0x0bdc,  /* U+22A2 RIGHT TACK */
-    XK_righttack                     = 0x0bfc,  /* U+22A3 LEFT TACK */
-    XK_hebrew_doublelowline          = 0x0cdf,  /* U+2017 DOUBLE LOW LINE */
-    XK_hebrew_aleph                  = 0x0ce0,  /* U+05D0 HEBREW LETTER ALEF */
-    XK_hebrew_bet                    = 0x0ce1,  /* U+05D1 HEBREW LETTER BET */
-    XK_hebrew_beth                   = 0x0ce1,  /* deprecated */
-    XK_hebrew_gimel                  = 0x0ce2,  /* U+05D2 HEBREW LETTER GIMEL */
-    XK_hebrew_gimmel                 = 0x0ce2,  /* deprecated */
-    XK_hebrew_dalet                  = 0x0ce3,  /* U+05D3 HEBREW LETTER DALET */
-    XK_hebrew_daleth                 = 0x0ce3,  /* deprecated */
-    XK_hebrew_he                     = 0x0ce4,  /* U+05D4 HEBREW LETTER HE */
-    XK_hebrew_waw                    = 0x0ce5,  /* U+05D5 HEBREW LETTER VAV */
-    XK_hebrew_zain                   = 0x0ce6,  /* U+05D6 HEBREW LETTER ZAYIN */
-    XK_hebrew_zayin                  = 0x0ce6,  /* deprecated */
-    XK_hebrew_chet                   = 0x0ce7,  /* U+05D7 HEBREW LETTER HET */
-    XK_hebrew_het                    = 0x0ce7,  /* deprecated */
-    XK_hebrew_tet                    = 0x0ce8,  /* U+05D8 HEBREW LETTER TET */
-    XK_hebrew_teth                   = 0x0ce8,  /* deprecated */
-    XK_hebrew_yod                    = 0x0ce9,  /* U+05D9 HEBREW LETTER YOD */
-    XK_hebrew_finalkaph              = 0x0cea,  /* U+05DA HEBREW LETTER FINAL KAF */
-    XK_hebrew_kaph                   = 0x0ceb,  /* U+05DB HEBREW LETTER KAF */
-    XK_hebrew_lamed                  = 0x0cec,  /* U+05DC HEBREW LETTER LAMED */
-    XK_hebrew_finalmem               = 0x0ced,  /* U+05DD HEBREW LETTER FINAL MEM */
-    XK_hebrew_mem                    = 0x0cee,  /* U+05DE HEBREW LETTER MEM */
-    XK_hebrew_finalnun               = 0x0cef,  /* U+05DF HEBREW LETTER FINAL NUN */
-    XK_hebrew_nun                    = 0x0cf0,  /* U+05E0 HEBREW LETTER NUN */
-    XK_hebrew_samech                 = 0x0cf1,  /* U+05E1 HEBREW LETTER SAMEKH */
-    XK_hebrew_samekh                 = 0x0cf1,  /* deprecated */
-    XK_hebrew_ayin                   = 0x0cf2,  /* U+05E2 HEBREW LETTER AYIN */
-    XK_hebrew_finalpe                = 0x0cf3,  /* U+05E3 HEBREW LETTER FINAL PE */
-    XK_hebrew_pe                     = 0x0cf4,  /* U+05E4 HEBREW LETTER PE */
-    XK_hebrew_finalzade              = 0x0cf5,  /* U+05E5 HEBREW LETTER FINAL TSADI */
-    XK_hebrew_finalzadi              = 0x0cf5,  /* deprecated */
-    XK_hebrew_zade                   = 0x0cf6,  /* U+05E6 HEBREW LETTER TSADI */
-    XK_hebrew_zadi                   = 0x0cf6,  /* deprecated */
-    XK_hebrew_qoph                   = 0x0cf7,  /* U+05E7 HEBREW LETTER QOF */
-    XK_hebrew_kuf                    = 0x0cf7,  /* deprecated */
-    XK_hebrew_resh                   = 0x0cf8,  /* U+05E8 HEBREW LETTER RESH */
-    XK_hebrew_shin                   = 0x0cf9,  /* U+05E9 HEBREW LETTER SHIN */
-    XK_hebrew_taw                    = 0x0cfa,  /* U+05EA HEBREW LETTER TAV */
-    XK_hebrew_taf                    = 0x0cfa,  /* deprecated */
-    XK_Hebrew_switch                 = 0xff7e,  /* Alias for mode_switch */
-    XK_Thai_kokai                    = 0x0da1,  /* U+0E01 THAI CHARACTER KO KAI */
-    XK_Thai_khokhai                  = 0x0da2,  /* U+0E02 THAI CHARACTER KHO KHAI */
-    XK_Thai_khokhuat                 = 0x0da3,  /* U+0E03 THAI CHARACTER KHO KHUAT */
-    XK_Thai_khokhwai                 = 0x0da4,  /* U+0E04 THAI CHARACTER KHO KHWAI */
-    XK_Thai_khokhon                  = 0x0da5,  /* U+0E05 THAI CHARACTER KHO KHON */
-    XK_Thai_khorakhang               = 0x0da6,  /* U+0E06 THAI CHARACTER KHO RAKHANG */
-    XK_Thai_ngongu                   = 0x0da7,  /* U+0E07 THAI CHARACTER NGO NGU */
-    XK_Thai_chochan                  = 0x0da8,  /* U+0E08 THAI CHARACTER CHO CHAN */
-    XK_Thai_choching                 = 0x0da9,  /* U+0E09 THAI CHARACTER CHO CHING */
-    XK_Thai_chochang                 = 0x0daa,  /* U+0E0A THAI CHARACTER CHO CHANG */
-    XK_Thai_soso                     = 0x0dab,  /* U+0E0B THAI CHARACTER SO SO */
-    XK_Thai_chochoe                  = 0x0dac,  /* U+0E0C THAI CHARACTER CHO CHOE */
-    XK_Thai_yoying                   = 0x0dad,  /* U+0E0D THAI CHARACTER YO YING */
-    XK_Thai_dochada                  = 0x0dae,  /* U+0E0E THAI CHARACTER DO CHADA */
-    XK_Thai_topatak                  = 0x0daf,  /* U+0E0F THAI CHARACTER TO PATAK */
-    XK_Thai_thothan                  = 0x0db0,  /* U+0E10 THAI CHARACTER THO THAN */
-    XK_Thai_thonangmontho            = 0x0db1,  /* U+0E11 THAI CHARACTER THO NANGMONTHO */
-    XK_Thai_thophuthao               = 0x0db2,  /* U+0E12 THAI CHARACTER THO PHUTHAO */
-    XK_Thai_nonen                    = 0x0db3,  /* U+0E13 THAI CHARACTER NO NEN */
-    XK_Thai_dodek                    = 0x0db4,  /* U+0E14 THAI CHARACTER DO DEK */
-    XK_Thai_totao                    = 0x0db5,  /* U+0E15 THAI CHARACTER TO TAO */
-    XK_Thai_thothung                 = 0x0db6,  /* U+0E16 THAI CHARACTER THO THUNG */
-    XK_Thai_thothahan                = 0x0db7,  /* U+0E17 THAI CHARACTER THO THAHAN */
-    XK_Thai_thothong                 = 0x0db8,  /* U+0E18 THAI CHARACTER THO THONG */
-    XK_Thai_nonu                     = 0x0db9,  /* U+0E19 THAI CHARACTER NO NU */
-    XK_Thai_bobaimai                 = 0x0dba,  /* U+0E1A THAI CHARACTER BO BAIMAI */
-    XK_Thai_popla                    = 0x0dbb,  /* U+0E1B THAI CHARACTER PO PLA */
-    XK_Thai_phophung                 = 0x0dbc,  /* U+0E1C THAI CHARACTER PHO PHUNG */
-    XK_Thai_fofa                     = 0x0dbd,  /* U+0E1D THAI CHARACTER FO FA */
-    XK_Thai_phophan                  = 0x0dbe,  /* U+0E1E THAI CHARACTER PHO PHAN */
-    XK_Thai_fofan                    = 0x0dbf,  /* U+0E1F THAI CHARACTER FO FAN */
-    XK_Thai_phosamphao               = 0x0dc0,  /* U+0E20 THAI CHARACTER PHO SAMPHAO */
-    XK_Thai_moma                     = 0x0dc1,  /* U+0E21 THAI CHARACTER MO MA */
-    XK_Thai_yoyak                    = 0x0dc2,  /* U+0E22 THAI CHARACTER YO YAK */
-    XK_Thai_rorua                    = 0x0dc3,  /* U+0E23 THAI CHARACTER RO RUA */
-    XK_Thai_ru                       = 0x0dc4,  /* U+0E24 THAI CHARACTER RU */
-    XK_Thai_loling                   = 0x0dc5,  /* U+0E25 THAI CHARACTER LO LING */
-    XK_Thai_lu                       = 0x0dc6,  /* U+0E26 THAI CHARACTER LU */
-    XK_Thai_wowaen                   = 0x0dc7,  /* U+0E27 THAI CHARACTER WO WAEN */
-    XK_Thai_sosala                   = 0x0dc8,  /* U+0E28 THAI CHARACTER SO SALA */
-    XK_Thai_sorusi                   = 0x0dc9,  /* U+0E29 THAI CHARACTER SO RUSI */
-    XK_Thai_sosua                    = 0x0dca,  /* U+0E2A THAI CHARACTER SO SUA */
-    XK_Thai_hohip                    = 0x0dcb,  /* U+0E2B THAI CHARACTER HO HIP */
-    XK_Thai_lochula                  = 0x0dcc,  /* U+0E2C THAI CHARACTER LO CHULA */
-    XK_Thai_oang                     = 0x0dcd,  /* U+0E2D THAI CHARACTER O ANG */
-    XK_Thai_honokhuk                 = 0x0dce,  /* U+0E2E THAI CHARACTER HO NOKHUK */
-    XK_Thai_paiyannoi                = 0x0dcf,  /* U+0E2F THAI CHARACTER PAIYANNOI */
-    XK_Thai_saraa                    = 0x0dd0,  /* U+0E30 THAI CHARACTER SARA A */
-    XK_Thai_maihanakat               = 0x0dd1,  /* U+0E31 THAI CHARACTER MAI HAN-AKAT */
-    XK_Thai_saraaa                   = 0x0dd2,  /* U+0E32 THAI CHARACTER SARA AA */
-    XK_Thai_saraam                   = 0x0dd3,  /* U+0E33 THAI CHARACTER SARA AM */
-    XK_Thai_sarai                    = 0x0dd4,  /* U+0E34 THAI CHARACTER SARA I */
-    XK_Thai_saraii                   = 0x0dd5,  /* U+0E35 THAI CHARACTER SARA II */
-    XK_Thai_saraue                   = 0x0dd6,  /* U+0E36 THAI CHARACTER SARA UE */
-    XK_Thai_sarauee                  = 0x0dd7,  /* U+0E37 THAI CHARACTER SARA UEE */
-    XK_Thai_sarau                    = 0x0dd8,  /* U+0E38 THAI CHARACTER SARA U */
-    XK_Thai_sarauu                   = 0x0dd9,  /* U+0E39 THAI CHARACTER SARA UU */
-    XK_Thai_phinthu                  = 0x0dda,  /* U+0E3A THAI CHARACTER PHINTHU */
-    XK_Thai_maihanakat_maitho        = 0x0dde,
-    XK_Thai_baht                     = 0x0ddf,  /* U+0E3F THAI CURRENCY SYMBOL BAHT */
-    XK_Thai_sarae                    = 0x0de0,  /* U+0E40 THAI CHARACTER SARA E */
-    XK_Thai_saraae                   = 0x0de1,  /* U+0E41 THAI CHARACTER SARA AE */
-    XK_Thai_sarao                    = 0x0de2,  /* U+0E42 THAI CHARACTER SARA O */
-    XK_Thai_saraaimaimuan            = 0x0de3,  /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */
-    XK_Thai_saraaimaimalai           = 0x0de4,  /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */
-    XK_Thai_lakkhangyao              = 0x0de5,  /* U+0E45 THAI CHARACTER LAKKHANGYAO */
-    XK_Thai_maiyamok                 = 0x0de6,  /* U+0E46 THAI CHARACTER MAIYAMOK */
-    XK_Thai_maitaikhu                = 0x0de7,  /* U+0E47 THAI CHARACTER MAITAIKHU */
-    XK_Thai_maiek                    = 0x0de8,  /* U+0E48 THAI CHARACTER MAI EK */
-    XK_Thai_maitho                   = 0x0de9,  /* U+0E49 THAI CHARACTER MAI THO */
-    XK_Thai_maitri                   = 0x0dea,  /* U+0E4A THAI CHARACTER MAI TRI */
-    XK_Thai_maichattawa              = 0x0deb,  /* U+0E4B THAI CHARACTER MAI CHATTAWA */
-    XK_Thai_thanthakhat              = 0x0dec,  /* U+0E4C THAI CHARACTER THANTHAKHAT */
-    XK_Thai_nikhahit                 = 0x0ded,  /* U+0E4D THAI CHARACTER NIKHAHIT */
-    XK_Thai_leksun                   = 0x0df0,  /* U+0E50 THAI DIGIT ZERO */
-    XK_Thai_leknung                  = 0x0df1,  /* U+0E51 THAI DIGIT ONE */
-    XK_Thai_leksong                  = 0x0df2,  /* U+0E52 THAI DIGIT TWO */
-    XK_Thai_leksam                   = 0x0df3,  /* U+0E53 THAI DIGIT THREE */
-    XK_Thai_leksi                    = 0x0df4,  /* U+0E54 THAI DIGIT FOUR */
-    XK_Thai_lekha                    = 0x0df5,  /* U+0E55 THAI DIGIT FIVE */
-    XK_Thai_lekhok                   = 0x0df6,  /* U+0E56 THAI DIGIT SIX */
-    XK_Thai_lekchet                  = 0x0df7,  /* U+0E57 THAI DIGIT SEVEN */
-    XK_Thai_lekpaet                  = 0x0df8,  /* U+0E58 THAI DIGIT EIGHT */
-    XK_Thai_lekkao                   = 0x0df9,  /* U+0E59 THAI DIGIT NINE */
-    XK_Hangul                        = 0xff31,  /* Hangul start/stop(toggle) */
-    XK_Hangul_Start                  = 0xff32,  /* Hangul start */
-    XK_Hangul_End                    = 0xff33,  /* Hangul end, English start */
-    XK_Hangul_Hanja                  = 0xff34,  /* Start Hangul->Hanja Conversion */
-    XK_Hangul_Jamo                   = 0xff35,  /* Hangul Jamo mode */
-    XK_Hangul_Romaja                 = 0xff36,  /* Hangul Romaja mode */
-    XK_Hangul_Codeinput              = 0xff37,  /* Hangul code input mode */
-    XK_Hangul_Jeonja                 = 0xff38,  /* Jeonja mode */
-    XK_Hangul_Banja                  = 0xff39,  /* Banja mode */
-    XK_Hangul_PreHanja               = 0xff3a,  /* Pre Hanja conversion */
-    XK_Hangul_PostHanja              = 0xff3b,  /* Post Hanja conversion */
-    XK_Hangul_SingleCandidate        = 0xff3c,  /* Single candidate */
-    XK_Hangul_MultipleCandidate      = 0xff3d,  /* Multiple candidate */
-    XK_Hangul_PreviousCandidate      = 0xff3e,  /* Previous candidate */
-    XK_Hangul_Special                = 0xff3f,  /* Special symbols */
-    XK_Hangul_switch                 = 0xff7e,  /* Alias for mode_switch */
-    XK_Hangul_Kiyeog                 = 0x0ea1,
-    XK_Hangul_SsangKiyeog            = 0x0ea2,
-    XK_Hangul_KiyeogSios             = 0x0ea3,
-    XK_Hangul_Nieun                  = 0x0ea4,
-    XK_Hangul_NieunJieuj             = 0x0ea5,
-    XK_Hangul_NieunHieuh             = 0x0ea6,
-    XK_Hangul_Dikeud                 = 0x0ea7,
-    XK_Hangul_SsangDikeud            = 0x0ea8,
-    XK_Hangul_Rieul                  = 0x0ea9,
-    XK_Hangul_RieulKiyeog            = 0x0eaa,
-    XK_Hangul_RieulMieum             = 0x0eab,
-    XK_Hangul_RieulPieub             = 0x0eac,
-    XK_Hangul_RieulSios              = 0x0ead,
-    XK_Hangul_RieulTieut             = 0x0eae,
-    XK_Hangul_RieulPhieuf            = 0x0eaf,
-    XK_Hangul_RieulHieuh             = 0x0eb0,
-    XK_Hangul_Mieum                  = 0x0eb1,
-    XK_Hangul_Pieub                  = 0x0eb2,
-    XK_Hangul_SsangPieub             = 0x0eb3,
-    XK_Hangul_PieubSios              = 0x0eb4,
-    XK_Hangul_Sios                   = 0x0eb5,
-    XK_Hangul_SsangSios              = 0x0eb6,
-    XK_Hangul_Ieung                  = 0x0eb7,
-    XK_Hangul_Jieuj                  = 0x0eb8,
-    XK_Hangul_SsangJieuj             = 0x0eb9,
-    XK_Hangul_Cieuc                  = 0x0eba,
-    XK_Hangul_Khieuq                 = 0x0ebb,
-    XK_Hangul_Tieut                  = 0x0ebc,
-    XK_Hangul_Phieuf                 = 0x0ebd,
-    XK_Hangul_Hieuh                  = 0x0ebe,
-    XK_Hangul_A                      = 0x0ebf,
-    XK_Hangul_AE                     = 0x0ec0,
-    XK_Hangul_YA                     = 0x0ec1,
-    XK_Hangul_YAE                    = 0x0ec2,
-    XK_Hangul_EO                     = 0x0ec3,
-    XK_Hangul_E                      = 0x0ec4,
-    XK_Hangul_YEO                    = 0x0ec5,
-    XK_Hangul_YE                     = 0x0ec6,
-    XK_Hangul_O                      = 0x0ec7,
-    XK_Hangul_WA                     = 0x0ec8,
-    XK_Hangul_WAE                    = 0x0ec9,
-    XK_Hangul_OE                     = 0x0eca,
-    XK_Hangul_YO                     = 0x0ecb,
-    XK_Hangul_U                      = 0x0ecc,
-    XK_Hangul_WEO                    = 0x0ecd,
-    XK_Hangul_WE                     = 0x0ece,
-    XK_Hangul_WI                     = 0x0ecf,
-    XK_Hangul_YU                     = 0x0ed0,
-    XK_Hangul_EU                     = 0x0ed1,
-    XK_Hangul_YI                     = 0x0ed2,
-    XK_Hangul_I                      = 0x0ed3,
-    XK_Hangul_J_Kiyeog               = 0x0ed4,
-    XK_Hangul_J_SsangKiyeog          = 0x0ed5,
-    XK_Hangul_J_KiyeogSios           = 0x0ed6,
-    XK_Hangul_J_Nieun                = 0x0ed7,
-    XK_Hangul_J_NieunJieuj           = 0x0ed8,
-    XK_Hangul_J_NieunHieuh           = 0x0ed9,
-    XK_Hangul_J_Dikeud               = 0x0eda,
-    XK_Hangul_J_Rieul                = 0x0edb,
-    XK_Hangul_J_RieulKiyeog          = 0x0edc,
-    XK_Hangul_J_RieulMieum           = 0x0edd,
-    XK_Hangul_J_RieulPieub           = 0x0ede,
-    XK_Hangul_J_RieulSios            = 0x0edf,
-    XK_Hangul_J_RieulTieut           = 0x0ee0,
-    XK_Hangul_J_RieulPhieuf          = 0x0ee1,
-    XK_Hangul_J_RieulHieuh           = 0x0ee2,
-    XK_Hangul_J_Mieum                = 0x0ee3,
-    XK_Hangul_J_Pieub                = 0x0ee4,
-    XK_Hangul_J_PieubSios            = 0x0ee5,
-    XK_Hangul_J_Sios                 = 0x0ee6,
-    XK_Hangul_J_SsangSios            = 0x0ee7,
-    XK_Hangul_J_Ieung                = 0x0ee8,
-    XK_Hangul_J_Jieuj                = 0x0ee9,
-    XK_Hangul_J_Cieuc                = 0x0eea,
-    XK_Hangul_J_Khieuq               = 0x0eeb,
-    XK_Hangul_J_Tieut                = 0x0eec,
-    XK_Hangul_J_Phieuf               = 0x0eed,
-    XK_Hangul_J_Hieuh                = 0x0eee,
-    XK_Hangul_RieulYeorinHieuh       = 0x0eef,
-    XK_Hangul_SunkyeongeumMieum      = 0x0ef0,
-    XK_Hangul_SunkyeongeumPieub      = 0x0ef1,
-    XK_Hangul_PanSios                = 0x0ef2,
-    XK_Hangul_KkogjiDalrinIeung      = 0x0ef3,
-    XK_Hangul_SunkyeongeumPhieuf     = 0x0ef4,
-    XK_Hangul_YeorinHieuh            = 0x0ef5,
-    XK_Hangul_AraeA                  = 0x0ef6,
-    XK_Hangul_AraeAE                 = 0x0ef7,
-    XK_Hangul_J_PanSios              = 0x0ef8,
-    XK_Hangul_J_KkogjiDalrinIeung    = 0x0ef9,
-    XK_Hangul_J_YeorinHieuh          = 0x0efa,
-    XK_Korean_Won                    = 0x0eff,  /*(U+20A9 WON SIGN)*/
-    XK_Armenian_ligature_ew       = 0x1000587,  /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */
-    XK_Armenian_full_stop         = 0x1000589,  /* U+0589 ARMENIAN FULL STOP */
-    XK_Armenian_verjaket          = 0x1000589,  /* U+0589 ARMENIAN FULL STOP */
-    XK_Armenian_separation_mark   = 0x100055d,  /* U+055D ARMENIAN COMMA */
-    XK_Armenian_but               = 0x100055d,  /* U+055D ARMENIAN COMMA */
-    XK_Armenian_hyphen            = 0x100058a,  /* U+058A ARMENIAN HYPHEN */
-    XK_Armenian_yentamna          = 0x100058a,  /* U+058A ARMENIAN HYPHEN */
-    XK_Armenian_exclam            = 0x100055c,  /* U+055C ARMENIAN EXCLAMATION MARK */
-    XK_Armenian_amanak            = 0x100055c,  /* U+055C ARMENIAN EXCLAMATION MARK */
-    XK_Armenian_accent            = 0x100055b,  /* U+055B ARMENIAN EMPHASIS MARK */
-    XK_Armenian_shesht            = 0x100055b,  /* U+055B ARMENIAN EMPHASIS MARK */
-    XK_Armenian_question          = 0x100055e,  /* U+055E ARMENIAN QUESTION MARK */
-    XK_Armenian_paruyk            = 0x100055e,  /* U+055E ARMENIAN QUESTION MARK */
-    XK_Armenian_AYB               = 0x1000531,  /* U+0531 ARMENIAN CAPITAL LETTER AYB */
-    XK_Armenian_ayb               = 0x1000561,  /* U+0561 ARMENIAN SMALL LETTER AYB */
-    XK_Armenian_BEN               = 0x1000532,  /* U+0532 ARMENIAN CAPITAL LETTER BEN */
-    XK_Armenian_ben               = 0x1000562,  /* U+0562 ARMENIAN SMALL LETTER BEN */
-    XK_Armenian_GIM               = 0x1000533,  /* U+0533 ARMENIAN CAPITAL LETTER GIM */
-    XK_Armenian_gim               = 0x1000563,  /* U+0563 ARMENIAN SMALL LETTER GIM */
-    XK_Armenian_DA                = 0x1000534,  /* U+0534 ARMENIAN CAPITAL LETTER DA */
-    XK_Armenian_da                = 0x1000564,  /* U+0564 ARMENIAN SMALL LETTER DA */
-    XK_Armenian_YECH              = 0x1000535,  /* U+0535 ARMENIAN CAPITAL LETTER ECH */
-    XK_Armenian_yech              = 0x1000565,  /* U+0565 ARMENIAN SMALL LETTER ECH */
-    XK_Armenian_ZA                = 0x1000536,  /* U+0536 ARMENIAN CAPITAL LETTER ZA */
-    XK_Armenian_za                = 0x1000566,  /* U+0566 ARMENIAN SMALL LETTER ZA */
-    XK_Armenian_E                 = 0x1000537,  /* U+0537 ARMENIAN CAPITAL LETTER EH */
-    XK_Armenian_e                 = 0x1000567,  /* U+0567 ARMENIAN SMALL LETTER EH */
-    XK_Armenian_AT                = 0x1000538,  /* U+0538 ARMENIAN CAPITAL LETTER ET */
-    XK_Armenian_at                = 0x1000568,  /* U+0568 ARMENIAN SMALL LETTER ET */
-    XK_Armenian_TO                = 0x1000539,  /* U+0539 ARMENIAN CAPITAL LETTER TO */
-    XK_Armenian_to                = 0x1000569,  /* U+0569 ARMENIAN SMALL LETTER TO */
-    XK_Armenian_ZHE               = 0x100053a,  /* U+053A ARMENIAN CAPITAL LETTER ZHE */
-    XK_Armenian_zhe               = 0x100056a,  /* U+056A ARMENIAN SMALL LETTER ZHE */
-    XK_Armenian_INI               = 0x100053b,  /* U+053B ARMENIAN CAPITAL LETTER INI */
-    XK_Armenian_ini               = 0x100056b,  /* U+056B ARMENIAN SMALL LETTER INI */
-    XK_Armenian_LYUN              = 0x100053c,  /* U+053C ARMENIAN CAPITAL LETTER LIWN */
-    XK_Armenian_lyun              = 0x100056c,  /* U+056C ARMENIAN SMALL LETTER LIWN */
-    XK_Armenian_KHE               = 0x100053d,  /* U+053D ARMENIAN CAPITAL LETTER XEH */
-    XK_Armenian_khe               = 0x100056d,  /* U+056D ARMENIAN SMALL LETTER XEH */
-    XK_Armenian_TSA               = 0x100053e,  /* U+053E ARMENIAN CAPITAL LETTER CA */
-    XK_Armenian_tsa               = 0x100056e,  /* U+056E ARMENIAN SMALL LETTER CA */
-    XK_Armenian_KEN               = 0x100053f,  /* U+053F ARMENIAN CAPITAL LETTER KEN */
-    XK_Armenian_ken               = 0x100056f,  /* U+056F ARMENIAN SMALL LETTER KEN */
-    XK_Armenian_HO                = 0x1000540,  /* U+0540 ARMENIAN CAPITAL LETTER HO */
-    XK_Armenian_ho                = 0x1000570,  /* U+0570 ARMENIAN SMALL LETTER HO */
-    XK_Armenian_DZA               = 0x1000541,  /* U+0541 ARMENIAN CAPITAL LETTER JA */
-    XK_Armenian_dza               = 0x1000571,  /* U+0571 ARMENIAN SMALL LETTER JA */
-    XK_Armenian_GHAT              = 0x1000542,  /* U+0542 ARMENIAN CAPITAL LETTER GHAD */
-    XK_Armenian_ghat              = 0x1000572,  /* U+0572 ARMENIAN SMALL LETTER GHAD */
-    XK_Armenian_TCHE              = 0x1000543,  /* U+0543 ARMENIAN CAPITAL LETTER CHEH */
-    XK_Armenian_tche              = 0x1000573,  /* U+0573 ARMENIAN SMALL LETTER CHEH */
-    XK_Armenian_MEN               = 0x1000544,  /* U+0544 ARMENIAN CAPITAL LETTER MEN */
-    XK_Armenian_men               = 0x1000574,  /* U+0574 ARMENIAN SMALL LETTER MEN */
-    XK_Armenian_HI                = 0x1000545,  /* U+0545 ARMENIAN CAPITAL LETTER YI */
-    XK_Armenian_hi                = 0x1000575,  /* U+0575 ARMENIAN SMALL LETTER YI */
-    XK_Armenian_NU                = 0x1000546,  /* U+0546 ARMENIAN CAPITAL LETTER NOW */
-    XK_Armenian_nu                = 0x1000576,  /* U+0576 ARMENIAN SMALL LETTER NOW */
-    XK_Armenian_SHA               = 0x1000547,  /* U+0547 ARMENIAN CAPITAL LETTER SHA */
-    XK_Armenian_sha               = 0x1000577,  /* U+0577 ARMENIAN SMALL LETTER SHA */
-    XK_Armenian_VO                = 0x1000548,  /* U+0548 ARMENIAN CAPITAL LETTER VO */
-    XK_Armenian_vo                = 0x1000578,  /* U+0578 ARMENIAN SMALL LETTER VO */
-    XK_Armenian_CHA               = 0x1000549,  /* U+0549 ARMENIAN CAPITAL LETTER CHA */
-    XK_Armenian_cha               = 0x1000579,  /* U+0579 ARMENIAN SMALL LETTER CHA */
-    XK_Armenian_PE                = 0x100054a,  /* U+054A ARMENIAN CAPITAL LETTER PEH */
-    XK_Armenian_pe                = 0x100057a,  /* U+057A ARMENIAN SMALL LETTER PEH */
-    XK_Armenian_JE                = 0x100054b,  /* U+054B ARMENIAN CAPITAL LETTER JHEH */
-    XK_Armenian_je                = 0x100057b,  /* U+057B ARMENIAN SMALL LETTER JHEH */
-    XK_Armenian_RA                = 0x100054c,  /* U+054C ARMENIAN CAPITAL LETTER RA */
-    XK_Armenian_ra                = 0x100057c,  /* U+057C ARMENIAN SMALL LETTER RA */
-    XK_Armenian_SE                = 0x100054d,  /* U+054D ARMENIAN CAPITAL LETTER SEH */
-    XK_Armenian_se                = 0x100057d,  /* U+057D ARMENIAN SMALL LETTER SEH */
-    XK_Armenian_VEV               = 0x100054e,  /* U+054E ARMENIAN CAPITAL LETTER VEW */
-    XK_Armenian_vev               = 0x100057e,  /* U+057E ARMENIAN SMALL LETTER VEW */
-    XK_Armenian_TYUN              = 0x100054f,  /* U+054F ARMENIAN CAPITAL LETTER TIWN */
-    XK_Armenian_tyun              = 0x100057f,  /* U+057F ARMENIAN SMALL LETTER TIWN */
-    XK_Armenian_RE                = 0x1000550,  /* U+0550 ARMENIAN CAPITAL LETTER REH */
-    XK_Armenian_re                = 0x1000580,  /* U+0580 ARMENIAN SMALL LETTER REH */
-    XK_Armenian_TSO               = 0x1000551,  /* U+0551 ARMENIAN CAPITAL LETTER CO */
-    XK_Armenian_tso               = 0x1000581,  /* U+0581 ARMENIAN SMALL LETTER CO */
-    XK_Armenian_VYUN              = 0x1000552,  /* U+0552 ARMENIAN CAPITAL LETTER YIWN */
-    XK_Armenian_vyun              = 0x1000582,  /* U+0582 ARMENIAN SMALL LETTER YIWN */
-    XK_Armenian_PYUR              = 0x1000553,  /* U+0553 ARMENIAN CAPITAL LETTER PIWR */
-    XK_Armenian_pyur              = 0x1000583,  /* U+0583 ARMENIAN SMALL LETTER PIWR */
-    XK_Armenian_KE                = 0x1000554,  /* U+0554 ARMENIAN CAPITAL LETTER KEH */
-    XK_Armenian_ke                = 0x1000584,  /* U+0584 ARMENIAN SMALL LETTER KEH */
-    XK_Armenian_O                 = 0x1000555,  /* U+0555 ARMENIAN CAPITAL LETTER OH */
-    XK_Armenian_o                 = 0x1000585,  /* U+0585 ARMENIAN SMALL LETTER OH */
-    XK_Armenian_FE                = 0x1000556,  /* U+0556 ARMENIAN CAPITAL LETTER FEH */
-    XK_Armenian_fe                = 0x1000586,  /* U+0586 ARMENIAN SMALL LETTER FEH */
-    XK_Armenian_apostrophe        = 0x100055a,  /* U+055A ARMENIAN APOSTROPHE */
-    XK_Georgian_an                = 0x10010d0,  /* U+10D0 GEORGIAN LETTER AN */
-    XK_Georgian_ban               = 0x10010d1,  /* U+10D1 GEORGIAN LETTER BAN */
-    XK_Georgian_gan               = 0x10010d2,  /* U+10D2 GEORGIAN LETTER GAN */
-    XK_Georgian_don               = 0x10010d3,  /* U+10D3 GEORGIAN LETTER DON */
-    XK_Georgian_en                = 0x10010d4,  /* U+10D4 GEORGIAN LETTER EN */
-    XK_Georgian_vin               = 0x10010d5,  /* U+10D5 GEORGIAN LETTER VIN */
-    XK_Georgian_zen               = 0x10010d6,  /* U+10D6 GEORGIAN LETTER ZEN */
-    XK_Georgian_tan               = 0x10010d7,  /* U+10D7 GEORGIAN LETTER TAN */
-    XK_Georgian_in                = 0x10010d8,  /* U+10D8 GEORGIAN LETTER IN */
-    XK_Georgian_kan               = 0x10010d9,  /* U+10D9 GEORGIAN LETTER KAN */
-    XK_Georgian_las               = 0x10010da,  /* U+10DA GEORGIAN LETTER LAS */
-    XK_Georgian_man               = 0x10010db,  /* U+10DB GEORGIAN LETTER MAN */
-    XK_Georgian_nar               = 0x10010dc,  /* U+10DC GEORGIAN LETTER NAR */
-    XK_Georgian_on                = 0x10010dd,  /* U+10DD GEORGIAN LETTER ON */
-    XK_Georgian_par               = 0x10010de,  /* U+10DE GEORGIAN LETTER PAR */
-    XK_Georgian_zhar              = 0x10010df,  /* U+10DF GEORGIAN LETTER ZHAR */
-    XK_Georgian_rae               = 0x10010e0,  /* U+10E0 GEORGIAN LETTER RAE */
-    XK_Georgian_san               = 0x10010e1,  /* U+10E1 GEORGIAN LETTER SAN */
-    XK_Georgian_tar               = 0x10010e2,  /* U+10E2 GEORGIAN LETTER TAR */
-    XK_Georgian_un                = 0x10010e3,  /* U+10E3 GEORGIAN LETTER UN */
-    XK_Georgian_phar              = 0x10010e4,  /* U+10E4 GEORGIAN LETTER PHAR */
-    XK_Georgian_khar              = 0x10010e5,  /* U+10E5 GEORGIAN LETTER KHAR */
-    XK_Georgian_ghan              = 0x10010e6,  /* U+10E6 GEORGIAN LETTER GHAN */
-    XK_Georgian_qar               = 0x10010e7,  /* U+10E7 GEORGIAN LETTER QAR */
-    XK_Georgian_shin              = 0x10010e8,  /* U+10E8 GEORGIAN LETTER SHIN */
-    XK_Georgian_chin              = 0x10010e9,  /* U+10E9 GEORGIAN LETTER CHIN */
-    XK_Georgian_can               = 0x10010ea,  /* U+10EA GEORGIAN LETTER CAN */
-    XK_Georgian_jil               = 0x10010eb,  /* U+10EB GEORGIAN LETTER JIL */
-    XK_Georgian_cil               = 0x10010ec,  /* U+10EC GEORGIAN LETTER CIL */
-    XK_Georgian_char              = 0x10010ed,  /* U+10ED GEORGIAN LETTER CHAR */
-    XK_Georgian_xan               = 0x10010ee,  /* U+10EE GEORGIAN LETTER XAN */
-    XK_Georgian_jhan              = 0x10010ef,  /* U+10EF GEORGIAN LETTER JHAN */
-    XK_Georgian_hae               = 0x10010f0,  /* U+10F0 GEORGIAN LETTER HAE */
-    XK_Georgian_he                = 0x10010f1,  /* U+10F1 GEORGIAN LETTER HE */
-    XK_Georgian_hie               = 0x10010f2,  /* U+10F2 GEORGIAN LETTER HIE */
-    XK_Georgian_we                = 0x10010f3,  /* U+10F3 GEORGIAN LETTER WE */
-    XK_Georgian_har               = 0x10010f4,  /* U+10F4 GEORGIAN LETTER HAR */
-    XK_Georgian_hoe               = 0x10010f5,  /* U+10F5 GEORGIAN LETTER HOE */
-    XK_Georgian_fi                = 0x10010f6,  /* U+10F6 GEORGIAN LETTER FI */
-    XK_Xabovedot                  = 0x1001e8a,  /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */
-    XK_Ibreve                     = 0x100012c,  /* U+012C LATIN CAPITAL LETTER I WITH BREVE */
-    XK_Zstroke                    = 0x10001b5,  /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */
-    XK_Gcaron                     = 0x10001e6,  /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */
-    XK_Ocaron                     = 0x10001d1,  /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */
-    XK_Obarred                    = 0x100019f,  /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */
-    XK_xabovedot                  = 0x1001e8b,  /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */
-    XK_ibreve                     = 0x100012d,  /* U+012D LATIN SMALL LETTER I WITH BREVE */
-    XK_zstroke                    = 0x10001b6,  /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */
-    XK_gcaron                     = 0x10001e7,  /* U+01E7 LATIN SMALL LETTER G WITH CARON */
-    XK_ocaron                     = 0x10001d2,  /* U+01D2 LATIN SMALL LETTER O WITH CARON */
-    XK_obarred                    = 0x1000275,  /* U+0275 LATIN SMALL LETTER BARRED O */
-    XK_SCHWA                      = 0x100018f,  /* U+018F LATIN CAPITAL LETTER SCHWA */
-    XK_schwa                      = 0x1000259,  /* U+0259 LATIN SMALL LETTER SCHWA */
-    XK_Lbelowdot                  = 0x1001e36,  /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */
-    XK_lbelowdot                  = 0x1001e37,  /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */
-    XK_Abelowdot                  = 0x1001ea0,  /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */
-    XK_abelowdot                  = 0x1001ea1,  /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */
-    XK_Ahook                      = 0x1001ea2,  /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */
-    XK_ahook                      = 0x1001ea3,  /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */
-    XK_Acircumflexacute           = 0x1001ea4,  /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
-    XK_acircumflexacute           = 0x1001ea5,  /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */
-    XK_Acircumflexgrave           = 0x1001ea6,  /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
-    XK_acircumflexgrave           = 0x1001ea7,  /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */
-    XK_Acircumflexhook            = 0x1001ea8,  /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
-    XK_acircumflexhook            = 0x1001ea9,  /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
-    XK_Acircumflextilde           = 0x1001eaa,  /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
-    XK_acircumflextilde           = 0x1001eab,  /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */
-    XK_Acircumflexbelowdot        = 0x1001eac,  /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
-    XK_acircumflexbelowdot        = 0x1001ead,  /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
-    XK_Abreveacute                = 0x1001eae,  /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
-    XK_abreveacute                = 0x1001eaf,  /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */
-    XK_Abrevegrave                = 0x1001eb0,  /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
-    XK_abrevegrave                = 0x1001eb1,  /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */
-    XK_Abrevehook                 = 0x1001eb2,  /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
-    XK_abrevehook                 = 0x1001eb3,  /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */
-    XK_Abrevetilde                = 0x1001eb4,  /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
-    XK_abrevetilde                = 0x1001eb5,  /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */
-    XK_Abrevebelowdot             = 0x1001eb6,  /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
-    XK_abrevebelowdot             = 0x1001eb7,  /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */
-    XK_Ebelowdot                  = 0x1001eb8,  /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */
-    XK_ebelowdot                  = 0x1001eb9,  /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */
-    XK_Ehook                      = 0x1001eba,  /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */
-    XK_ehook                      = 0x1001ebb,  /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */
-    XK_Etilde                     = 0x1001ebc,  /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */
-    XK_etilde                     = 0x1001ebd,  /* U+1EBD LATIN SMALL LETTER E WITH TILDE */
-    XK_Ecircumflexacute           = 0x1001ebe,  /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
-    XK_ecircumflexacute           = 0x1001ebf,  /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */
-    XK_Ecircumflexgrave           = 0x1001ec0,  /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
-    XK_ecircumflexgrave           = 0x1001ec1,  /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */
-    XK_Ecircumflexhook            = 0x1001ec2,  /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
-    XK_ecircumflexhook            = 0x1001ec3,  /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
-    XK_Ecircumflextilde           = 0x1001ec4,  /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
-    XK_ecircumflextilde           = 0x1001ec5,  /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */
-    XK_Ecircumflexbelowdot        = 0x1001ec6,  /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
-    XK_ecircumflexbelowdot        = 0x1001ec7,  /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
-    XK_Ihook                      = 0x1001ec8,  /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */
-    XK_ihook                      = 0x1001ec9,  /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */
-    XK_Ibelowdot                  = 0x1001eca,  /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */
-    XK_ibelowdot                  = 0x1001ecb,  /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */
-    XK_Obelowdot                  = 0x1001ecc,  /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */
-    XK_obelowdot                  = 0x1001ecd,  /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */
-    XK_Ohook                      = 0x1001ece,  /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */
-    XK_ohook                      = 0x1001ecf,  /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */
-    XK_Ocircumflexacute           = 0x1001ed0,  /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
-    XK_ocircumflexacute           = 0x1001ed1,  /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */
-    XK_Ocircumflexgrave           = 0x1001ed2,  /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
-    XK_ocircumflexgrave           = 0x1001ed3,  /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */
-    XK_Ocircumflexhook            = 0x1001ed4,  /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
-    XK_ocircumflexhook            = 0x1001ed5,  /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
-    XK_Ocircumflextilde           = 0x1001ed6,  /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
-    XK_ocircumflextilde           = 0x1001ed7,  /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */
-    XK_Ocircumflexbelowdot        = 0x1001ed8,  /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
-    XK_ocircumflexbelowdot        = 0x1001ed9,  /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
-    XK_Ohornacute                 = 0x1001eda,  /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
-    XK_ohornacute                 = 0x1001edb,  /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */
-    XK_Ohorngrave                 = 0x1001edc,  /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
-    XK_ohorngrave                 = 0x1001edd,  /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */
-    XK_Ohornhook                  = 0x1001ede,  /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
-    XK_ohornhook                  = 0x1001edf,  /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */
-    XK_Ohorntilde                 = 0x1001ee0,  /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */
-    XK_ohorntilde                 = 0x1001ee1,  /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */
-    XK_Ohornbelowdot              = 0x1001ee2,  /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
-    XK_ohornbelowdot              = 0x1001ee3,  /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */
-    XK_Ubelowdot                  = 0x1001ee4,  /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */
-    XK_ubelowdot                  = 0x1001ee5,  /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */
-    XK_Uhook                      = 0x1001ee6,  /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */
-    XK_uhook                      = 0x1001ee7,  /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */
-    XK_Uhornacute                 = 0x1001ee8,  /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
-    XK_uhornacute                 = 0x1001ee9,  /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */
-    XK_Uhorngrave                 = 0x1001eea,  /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
-    XK_uhorngrave                 = 0x1001eeb,  /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */
-    XK_Uhornhook                  = 0x1001eec,  /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
-    XK_uhornhook                  = 0x1001eed,  /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */
-    XK_Uhorntilde                 = 0x1001eee,  /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */
-    XK_uhorntilde                 = 0x1001eef,  /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */
-    XK_Uhornbelowdot              = 0x1001ef0,  /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
-    XK_uhornbelowdot              = 0x1001ef1,  /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */
-    XK_Ybelowdot                  = 0x1001ef4,  /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */
-    XK_ybelowdot                  = 0x1001ef5,  /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */
-    XK_Yhook                      = 0x1001ef6,  /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
-    XK_yhook                      = 0x1001ef7,  /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */
-    XK_Ytilde                     = 0x1001ef8,  /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */
-    XK_ytilde                     = 0x1001ef9,  /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */
-    XK_Ohorn                      = 0x10001a0,  /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */
-    XK_ohorn                      = 0x10001a1,  /* U+01A1 LATIN SMALL LETTER O WITH HORN */
-    XK_Uhorn                      = 0x10001af,  /* U+01AF LATIN CAPITAL LETTER U WITH HORN */
-    XK_uhorn                      = 0x10001b0,  /* U+01B0 LATIN SMALL LETTER U WITH HORN */
-    XK_EcuSign                    = 0x10020a0,  /* U+20A0 EURO-CURRENCY SIGN */
-    XK_ColonSign                  = 0x10020a1,  /* U+20A1 COLON SIGN */
-    XK_CruzeiroSign               = 0x10020a2,  /* U+20A2 CRUZEIRO SIGN */
-    XK_FFrancSign                 = 0x10020a3,  /* U+20A3 FRENCH FRANC SIGN */
-    XK_LiraSign                   = 0x10020a4,  /* U+20A4 LIRA SIGN */
-    XK_MillSign                   = 0x10020a5,  /* U+20A5 MILL SIGN */
-    XK_NairaSign                  = 0x10020a6,  /* U+20A6 NAIRA SIGN */
-    XK_PesetaSign                 = 0x10020a7,  /* U+20A7 PESETA SIGN */
-    XK_RupeeSign                  = 0x10020a8,  /* U+20A8 RUPEE SIGN */
-    XK_WonSign                    = 0x10020a9,  /* U+20A9 WON SIGN */
-    XK_NewSheqelSign              = 0x10020aa,  /* U+20AA NEW SHEQEL SIGN */
-    XK_DongSign                   = 0x10020ab,  /* U+20AB DONG SIGN */
-    XK_EuroSign                   = 0x20ac,  /* U+20AC EURO SIGN */
+	XK_BackSpace                     = 0xff08,  /* Back space, back char */
+	XK_Tab                           = 0xff09,
+	XK_Linefeed                      = 0xff0a,  /* Linefeed, LF */
+	XK_Clear                         = 0xff0b,
+	XK_Return                        = 0xff0d,  /* Return, enter */
+	XK_Pause                         = 0xff13,  /* Pause, hold */
+	XK_Scroll_Lock                   = 0xff14,
+	XK_Sys_Req                       = 0xff15,
+	XK_Escape                        = 0xff1b,
+	XK_Delete                        = 0xffff,  /* Delete, rubout */
+	XK_Multi_key                     = 0xff20,  /* Multi-key character compose */
+	XK_Codeinput                     = 0xff37,
+	XK_SingleCandidate               = 0xff3c,
+	XK_MultipleCandidate             = 0xff3d,
+	XK_PreviousCandidate             = 0xff3e,
+	XK_Kanji                         = 0xff21,  /* Kanji, Kanji convert */
+	XK_Muhenkan                      = 0xff22,  /* Cancel Conversion */
+	XK_Henkan_Mode                   = 0xff23,  /* Start/Stop Conversion */
+	XK_Henkan                        = 0xff23,  /* Alias for Henkan_Mode */
+	XK_Romaji                        = 0xff24,  /* to Romaji */
+	XK_Hiragana                      = 0xff25,  /* to Hiragana */
+	XK_Katakana                      = 0xff26,  /* to Katakana */
+	XK_Hiragana_Katakana             = 0xff27,  /* Hiragana/Katakana toggle */
+	XK_Zenkaku                       = 0xff28,  /* to Zenkaku */
+	XK_Hankaku                       = 0xff29,  /* to Hankaku */
+	XK_Zenkaku_Hankaku               = 0xff2a,  /* Zenkaku/Hankaku toggle */
+	XK_Touroku                       = 0xff2b,  /* Add to Dictionary */
+	XK_Massyo                        = 0xff2c,  /* Delete from Dictionary */
+	XK_Kana_Lock                     = 0xff2d,  /* Kana Lock */
+	XK_Kana_Shift                    = 0xff2e,  /* Kana Shift */
+	XK_Eisu_Shift                    = 0xff2f,  /* Alphanumeric Shift */
+	XK_Eisu_toggle                   = 0xff30,  /* Alphanumeric toggle */
+	XK_Kanji_Bangou                  = 0xff37,  /* Codeinput */
+	XK_Zen_Koho                      = 0xff3d,  /* Multiple/All Candidate(s) */
+	XK_Mae_Koho                      = 0xff3e,  /* Previous Candidate */
+	XK_Home                          = 0xff50,
+	XK_Left                          = 0xff51,  /* Move left, left arrow */
+	XK_Up                            = 0xff52,  /* Move up, up arrow */
+	XK_Right                         = 0xff53,  /* Move right, right arrow */
+	XK_Down                          = 0xff54,  /* Move down, down arrow */
+	XK_Prior                         = 0xff55,  /* Prior, previous */
+	XK_Page_Up                       = 0xff55,
+	XK_Next                          = 0xff56,  /* Next */
+	XK_Page_Down                     = 0xff56,
+	XK_End                           = 0xff57,  /* EOL */
+	XK_Begin                         = 0xff58,  /* BOL */
+	XK_Select                        = 0xff60,  /* Select, mark */
+	XK_Print                         = 0xff61,
+	XK_Execute                       = 0xff62,  /* Execute, run, do */
+	XK_Insert                        = 0xff63,  /* Insert, insert here */
+	XK_Undo                          = 0xff65,
+	XK_Redo                          = 0xff66,  /* Redo, again */
+	XK_Menu                          = 0xff67,
+	XK_Find                          = 0xff68,  /* Find, search */
+	XK_Cancel                        = 0xff69,  /* Cancel, stop, abort, exit */
+	XK_Help                          = 0xff6a,  /* Help */
+	XK_Break                         = 0xff6b,
+	XK_Mode_switch                   = 0xff7e,  /* Character set switch */
+	XK_script_switch                 = 0xff7e,  /* Alias for mode_switch */
+	XK_Num_Lock                      = 0xff7f,
+	XK_KP_Space                      = 0xff80,  /* Space */
+	XK_KP_Tab                        = 0xff89,
+	XK_KP_Enter                      = 0xff8d,  /* Enter */
+	XK_KP_F1                         = 0xff91,  /* PF1, KP_A, ... */
+	XK_KP_F2                         = 0xff92,
+	XK_KP_F3                         = 0xff93,
+	XK_KP_F4                         = 0xff94,
+	XK_KP_Home                       = 0xff95,
+	XK_KP_Left                       = 0xff96,
+	XK_KP_Up                         = 0xff97,
+	XK_KP_Right                      = 0xff98,
+	XK_KP_Down                       = 0xff99,
+	XK_KP_Prior                      = 0xff9a,
+	XK_KP_Page_Up                    = 0xff9a,
+	XK_KP_Next                       = 0xff9b,
+	XK_KP_Page_Down                  = 0xff9b,
+	XK_KP_End                        = 0xff9c,
+	XK_KP_Begin                      = 0xff9d,
+	XK_KP_Insert                     = 0xff9e,
+	XK_KP_Delete                     = 0xff9f,
+	XK_KP_Equal                      = 0xffbd,  /* Equals */
+	XK_KP_Multiply                   = 0xffaa,
+	XK_KP_Add                        = 0xffab,
+	XK_KP_Separator                  = 0xffac,  /* Separator, often comma */
+	XK_KP_Subtract                   = 0xffad,
+	XK_KP_Decimal                    = 0xffae,
+	XK_KP_Divide                     = 0xffaf,
+	XK_KP_0                          = 0xffb0,
+	XK_KP_1                          = 0xffb1,
+	XK_KP_2                          = 0xffb2,
+	XK_KP_3                          = 0xffb3,
+	XK_KP_4                          = 0xffb4,
+	XK_KP_5                          = 0xffb5,
+	XK_KP_6                          = 0xffb6,
+	XK_KP_7                          = 0xffb7,
+	XK_KP_8                          = 0xffb8,
+	XK_KP_9                          = 0xffb9,
+	XK_F1                            = 0xffbe,
+	XK_F2                            = 0xffbf,
+	XK_F3                            = 0xffc0,
+	XK_F4                            = 0xffc1,
+	XK_F5                            = 0xffc2,
+	XK_F6                            = 0xffc3,
+	XK_F7                            = 0xffc4,
+	XK_F8                            = 0xffc5,
+	XK_F9                            = 0xffc6,
+	XK_F10                           = 0xffc7,
+	XK_F11                           = 0xffc8,
+	XK_L1                            = 0xffc8,
+	XK_F12                           = 0xffc9,
+	XK_L2                            = 0xffc9,
+	XK_F13                           = 0xffca,
+	XK_L3                            = 0xffca,
+	XK_F14                           = 0xffcb,
+	XK_L4                            = 0xffcb,
+	XK_F15                           = 0xffcc,
+	XK_L5                            = 0xffcc,
+	XK_F16                           = 0xffcd,
+	XK_L6                            = 0xffcd,
+	XK_F17                           = 0xffce,
+	XK_L7                            = 0xffce,
+	XK_F18                           = 0xffcf,
+	XK_L8                            = 0xffcf,
+	XK_F19                           = 0xffd0,
+	XK_L9                            = 0xffd0,
+	XK_F20                           = 0xffd1,
+	XK_L10                           = 0xffd1,
+	XK_F21                           = 0xffd2,
+	XK_R1                            = 0xffd2,
+	XK_F22                           = 0xffd3,
+	XK_R2                            = 0xffd3,
+	XK_F23                           = 0xffd4,
+	XK_R3                            = 0xffd4,
+	XK_F24                           = 0xffd5,
+	XK_R4                            = 0xffd5,
+	XK_F25                           = 0xffd6,
+	XK_R5                            = 0xffd6,
+	XK_F26                           = 0xffd7,
+	XK_R6                            = 0xffd7,
+	XK_F27                           = 0xffd8,
+	XK_R7                            = 0xffd8,
+	XK_F28                           = 0xffd9,
+	XK_R8                            = 0xffd9,
+	XK_F29                           = 0xffda,
+	XK_R9                            = 0xffda,
+	XK_F30                           = 0xffdb,
+	XK_R10                           = 0xffdb,
+	XK_F31                           = 0xffdc,
+	XK_R11                           = 0xffdc,
+	XK_F32                           = 0xffdd,
+	XK_R12                           = 0xffdd,
+	XK_F33                           = 0xffde,
+	XK_R13                           = 0xffde,
+	XK_F34                           = 0xffdf,
+	XK_R14                           = 0xffdf,
+	XK_F35                           = 0xffe0,
+	XK_R15                           = 0xffe0,
+	XK_Shift_L                       = 0xffe1,  /* Left shift */
+	XK_Shift_R                       = 0xffe2,  /* Right shift */
+	XK_Control_L                     = 0xffe3,  /* Left control */
+	XK_Control_R                     = 0xffe4,  /* Right control */
+	XK_Caps_Lock                     = 0xffe5,  /* Caps lock */
+	XK_Shift_Lock                    = 0xffe6,  /* Shift lock */
+	XK_Meta_L                        = 0xffe7,  /* Left meta */
+	XK_Meta_R                        = 0xffe8,  /* Right meta */
+	XK_Alt_L                         = 0xffe9,  /* Left alt */
+	XK_Alt_R                         = 0xffea,  /* Right alt */
+	XK_Super_L                       = 0xffeb,  /* Left super */
+	XK_Super_R                       = 0xffec,  /* Right super */
+	XK_Hyper_L                       = 0xffed,  /* Left hyper */
+	XK_Hyper_R                       = 0xffee,  /* Right hyper */
+	XK_ISO_Lock                      = 0xfe01,
+	XK_ISO_Level2_Latch              = 0xfe02,
+	XK_ISO_Level3_Shift              = 0xfe03,
+	XK_ISO_Level3_Latch              = 0xfe04,
+	XK_ISO_Level3_Lock               = 0xfe05,
+	XK_ISO_Group_Shift               = 0xff7e,  /* Alias for mode_switch */
+	XK_ISO_Group_Latch               = 0xfe06,
+	XK_ISO_Group_Lock                = 0xfe07,
+	XK_ISO_Next_Group                = 0xfe08,
+	XK_ISO_Next_Group_Lock           = 0xfe09,
+	XK_ISO_Prev_Group                = 0xfe0a,
+	XK_ISO_Prev_Group_Lock           = 0xfe0b,
+	XK_ISO_First_Group               = 0xfe0c,
+	XK_ISO_First_Group_Lock          = 0xfe0d,
+	XK_ISO_Last_Group                = 0xfe0e,
+	XK_ISO_Last_Group_Lock           = 0xfe0f,
+	XK_ISO_Left_Tab                  = 0xfe20,
+	XK_ISO_Move_Line_Up              = 0xfe21,
+	XK_ISO_Move_Line_Down            = 0xfe22,
+	XK_ISO_Partial_Line_Up           = 0xfe23,
+	XK_ISO_Partial_Line_Down         = 0xfe24,
+	XK_ISO_Partial_Space_Left        = 0xfe25,
+	XK_ISO_Partial_Space_Right       = 0xfe26,
+	XK_ISO_Set_Margin_Left           = 0xfe27,
+	XK_ISO_Set_Margin_Right          = 0xfe28,
+	XK_ISO_Release_Margin_Left       = 0xfe29,
+	XK_ISO_Release_Margin_Right      = 0xfe2a,
+	XK_ISO_Release_Both_Margins      = 0xfe2b,
+	XK_ISO_Fast_Cursor_Left          = 0xfe2c,
+	XK_ISO_Fast_Cursor_Right         = 0xfe2d,
+	XK_ISO_Fast_Cursor_Up            = 0xfe2e,
+	XK_ISO_Fast_Cursor_Down          = 0xfe2f,
+	XK_ISO_Continuous_Underline      = 0xfe30,
+	XK_ISO_Discontinuous_Underline   = 0xfe31,
+	XK_ISO_Emphasize                 = 0xfe32,
+	XK_ISO_Center_Object             = 0xfe33,
+	XK_ISO_Enter                     = 0xfe34,
+	XK_dead_grave                    = 0xfe50,
+	XK_dead_acute                    = 0xfe51,
+	XK_dead_circumflex               = 0xfe52,
+	XK_dead_tilde                    = 0xfe53,
+	XK_dead_macron                   = 0xfe54,
+	XK_dead_breve                    = 0xfe55,
+	XK_dead_abovedot                 = 0xfe56,
+	XK_dead_diaeresis                = 0xfe57,
+	XK_dead_abovering                = 0xfe58,
+	XK_dead_doubleacute              = 0xfe59,
+	XK_dead_caron                    = 0xfe5a,
+	XK_dead_cedilla                  = 0xfe5b,
+	XK_dead_ogonek                   = 0xfe5c,
+	XK_dead_iota                     = 0xfe5d,
+	XK_dead_voiced_sound             = 0xfe5e,
+	XK_dead_semivoiced_sound         = 0xfe5f,
+	XK_dead_belowdot                 = 0xfe60,
+	XK_dead_hook                     = 0xfe61,
+	XK_dead_horn                     = 0xfe62,
+	XK_First_Virtual_Screen          = 0xfed0,
+	XK_Prev_Virtual_Screen           = 0xfed1,
+	XK_Next_Virtual_Screen           = 0xfed2,
+	XK_Last_Virtual_Screen           = 0xfed4,
+	XK_Terminate_Server              = 0xfed5,
+	XK_AccessX_Enable                = 0xfe70,
+	XK_AccessX_Feedback_Enable       = 0xfe71,
+	XK_RepeatKeys_Enable             = 0xfe72,
+	XK_SlowKeys_Enable               = 0xfe73,
+	XK_BounceKeys_Enable             = 0xfe74,
+	XK_StickyKeys_Enable             = 0xfe75,
+	XK_MouseKeys_Enable              = 0xfe76,
+	XK_MouseKeys_Accel_Enable        = 0xfe77,
+	XK_Overlay1_Enable               = 0xfe78,
+	XK_Overlay2_Enable               = 0xfe79,
+	XK_AudibleBell_Enable            = 0xfe7a,
+	XK_Pointer_Left                  = 0xfee0,
+	XK_Pointer_Right                 = 0xfee1,
+	XK_Pointer_Up                    = 0xfee2,
+	XK_Pointer_Down                  = 0xfee3,
+	XK_Pointer_UpLeft                = 0xfee4,
+	XK_Pointer_UpRight               = 0xfee5,
+	XK_Pointer_DownLeft              = 0xfee6,
+	XK_Pointer_DownRight             = 0xfee7,
+	XK_Pointer_Button_Dflt           = 0xfee8,
+	XK_Pointer_Button1               = 0xfee9,
+	XK_Pointer_Button2               = 0xfeea,
+	XK_Pointer_Button3               = 0xfeeb,
+	XK_Pointer_Button4               = 0xfeec,
+	XK_Pointer_Button5               = 0xfeed,
+	XK_Pointer_DblClick_Dflt         = 0xfeee,
+	XK_Pointer_DblClick1             = 0xfeef,
+	XK_Pointer_DblClick2             = 0xfef0,
+	XK_Pointer_DblClick3             = 0xfef1,
+	XK_Pointer_DblClick4             = 0xfef2,
+	XK_Pointer_DblClick5             = 0xfef3,
+	XK_Pointer_Drag_Dflt             = 0xfef4,
+	XK_Pointer_Drag1                 = 0xfef5,
+	XK_Pointer_Drag2                 = 0xfef6,
+	XK_Pointer_Drag3                 = 0xfef7,
+	XK_Pointer_Drag4                 = 0xfef8,
+	XK_Pointer_Drag5                 = 0xfefd,
+	XK_Pointer_EnableKeys            = 0xfef9,
+	XK_Pointer_Accelerate            = 0xfefa,
+	XK_Pointer_DfltBtnNext           = 0xfefb,
+	XK_Pointer_DfltBtnPrev           = 0xfefc,
+	XK_3270_Duplicate                = 0xfd01,
+	XK_3270_FieldMark                = 0xfd02,
+	XK_3270_Right2                   = 0xfd03,
+	XK_3270_Left2                    = 0xfd04,
+	XK_3270_BackTab                  = 0xfd05,
+	XK_3270_EraseEOF                 = 0xfd06,
+	XK_3270_EraseInput               = 0xfd07,
+	XK_3270_Reset                    = 0xfd08,
+	XK_3270_Quit                     = 0xfd09,
+	XK_3270_PA1                      = 0xfd0a,
+	XK_3270_PA2                      = 0xfd0b,
+	XK_3270_PA3                      = 0xfd0c,
+	XK_3270_Test                     = 0xfd0d,
+	XK_3270_Attn                     = 0xfd0e,
+	XK_3270_CursorBlink              = 0xfd0f,
+	XK_3270_AltCursor                = 0xfd10,
+	XK_3270_KeyClick                 = 0xfd11,
+	XK_3270_Jump                     = 0xfd12,
+	XK_3270_Ident                    = 0xfd13,
+	XK_3270_Rule                     = 0xfd14,
+	XK_3270_Copy                     = 0xfd15,
+	XK_3270_Play                     = 0xfd16,
+	XK_3270_Setup                    = 0xfd17,
+	XK_3270_Record                   = 0xfd18,
+	XK_3270_ChangeScreen             = 0xfd19,
+	XK_3270_DeleteWord               = 0xfd1a,
+	XK_3270_ExSelect                 = 0xfd1b,
+	XK_3270_CursorSelect             = 0xfd1c,
+	XK_3270_PrintScreen              = 0xfd1d,
+	XK_3270_Enter                    = 0xfd1e,
+	XK_space                         = 0x0020,  /* U+0020 SPACE */
+	XK_exclam                        = 0x0021,  /* U+0021 EXCLAMATION MARK */
+	XK_quotedbl                      = 0x0022,  /* U+0022 QUOTATION MARK */
+	XK_numbersign                    = 0x0023,  /* U+0023 NUMBER SIGN */
+	XK_dollar                        = 0x0024,  /* U+0024 DOLLAR SIGN */
+	XK_percent                       = 0x0025,  /* U+0025 PERCENT SIGN */
+	XK_ampersand                     = 0x0026,  /* U+0026 AMPERSAND */
+	XK_apostrophe                    = 0x0027,  /* U+0027 APOSTROPHE */
+	XK_quoteright                    = 0x0027,  /* deprecated */
+	XK_parenleft                     = 0x0028,  /* U+0028 LEFT PARENTHESIS */
+	XK_parenright                    = 0x0029,  /* U+0029 RIGHT PARENTHESIS */
+	XK_asterisk                      = 0x002a,  /* U+002A ASTERISK */
+	XK_plus                          = 0x002b,  /* U+002B PLUS SIGN */
+	XK_comma                         = 0x002c,  /* U+002C COMMA */
+	XK_minus                         = 0x002d,  /* U+002D HYPHEN-MINUS */
+	XK_period                        = 0x002e,  /* U+002E FULL STOP */
+	XK_slash                         = 0x002f,  /* U+002F SOLIDUS */
+	XK_0                             = 0x0030,  /* U+0030 DIGIT ZERO */
+	XK_1                             = 0x0031,  /* U+0031 DIGIT ONE */
+	XK_2                             = 0x0032,  /* U+0032 DIGIT TWO */
+	XK_3                             = 0x0033,  /* U+0033 DIGIT THREE */
+	XK_4                             = 0x0034,  /* U+0034 DIGIT FOUR */
+	XK_5                             = 0x0035,  /* U+0035 DIGIT FIVE */
+	XK_6                             = 0x0036,  /* U+0036 DIGIT SIX */
+	XK_7                             = 0x0037,  /* U+0037 DIGIT SEVEN */
+	XK_8                             = 0x0038,  /* U+0038 DIGIT EIGHT */
+	XK_9                             = 0x0039,  /* U+0039 DIGIT NINE */
+	XK_colon                         = 0x003a,  /* U+003A COLON */
+	XK_semicolon                     = 0x003b,  /* U+003B SEMICOLON */
+	XK_less                          = 0x003c,  /* U+003C LESS-THAN SIGN */
+	XK_equal                         = 0x003d,  /* U+003D EQUALS SIGN */
+	XK_greater                       = 0x003e,  /* U+003E GREATER-THAN SIGN */
+	XK_question                      = 0x003f,  /* U+003F QUESTION MARK */
+	XK_at                            = 0x0040,  /* U+0040 COMMERCIAL AT */
+	XK_A                             = 0x0041,  /* U+0041 LATIN CAPITAL LETTER A */
+	XK_B                             = 0x0042,  /* U+0042 LATIN CAPITAL LETTER B */
+	XK_C                             = 0x0043,  /* U+0043 LATIN CAPITAL LETTER C */
+	XK_D                             = 0x0044,  /* U+0044 LATIN CAPITAL LETTER D */
+	XK_E                             = 0x0045,  /* U+0045 LATIN CAPITAL LETTER E */
+	XK_F                             = 0x0046,  /* U+0046 LATIN CAPITAL LETTER F */
+	XK_G                             = 0x0047,  /* U+0047 LATIN CAPITAL LETTER G */
+	XK_H                             = 0x0048,  /* U+0048 LATIN CAPITAL LETTER H */
+	XK_I                             = 0x0049,  /* U+0049 LATIN CAPITAL LETTER I */
+	XK_J                             = 0x004a,  /* U+004A LATIN CAPITAL LETTER J */
+	XK_K                             = 0x004b,  /* U+004B LATIN CAPITAL LETTER K */
+	XK_L                             = 0x004c,  /* U+004C LATIN CAPITAL LETTER L */
+	XK_M                             = 0x004d,  /* U+004D LATIN CAPITAL LETTER M */
+	XK_N                             = 0x004e,  /* U+004E LATIN CAPITAL LETTER N */
+	XK_O                             = 0x004f,  /* U+004F LATIN CAPITAL LETTER O */
+	XK_P                             = 0x0050,  /* U+0050 LATIN CAPITAL LETTER P */
+	XK_Q                             = 0x0051,  /* U+0051 LATIN CAPITAL LETTER Q */
+	XK_R                             = 0x0052,  /* U+0052 LATIN CAPITAL LETTER R */
+	XK_S                             = 0x0053,  /* U+0053 LATIN CAPITAL LETTER S */
+	XK_T                             = 0x0054,  /* U+0054 LATIN CAPITAL LETTER T */
+	XK_U                             = 0x0055,  /* U+0055 LATIN CAPITAL LETTER U */
+	XK_V                             = 0x0056,  /* U+0056 LATIN CAPITAL LETTER V */
+	XK_W                             = 0x0057,  /* U+0057 LATIN CAPITAL LETTER W */
+	XK_X                             = 0x0058,  /* U+0058 LATIN CAPITAL LETTER X */
+	XK_Y                             = 0x0059,  /* U+0059 LATIN CAPITAL LETTER Y */
+	XK_Z                             = 0x005a,  /* U+005A LATIN CAPITAL LETTER Z */
+	XK_bracketleft                   = 0x005b,  /* U+005B LEFT SQUARE BRACKET */
+	XK_backslash                     = 0x005c,  /* U+005C REVERSE SOLIDUS */
+	XK_bracketright                  = 0x005d,  /* U+005D RIGHT SQUARE BRACKET */
+	XK_asciicircum                   = 0x005e,  /* U+005E CIRCUMFLEX ACCENT */
+	XK_underscore                    = 0x005f,  /* U+005F LOW LINE */
+	XK_grave                         = 0x0060,  /* U+0060 GRAVE ACCENT */
+	XK_quoteleft                     = 0x0060,  /* deprecated */
+	XK_a                             = 0x0061,  /* U+0061 LATIN SMALL LETTER A */
+	XK_b                             = 0x0062,  /* U+0062 LATIN SMALL LETTER B */
+	XK_c                             = 0x0063,  /* U+0063 LATIN SMALL LETTER C */
+	XK_d                             = 0x0064,  /* U+0064 LATIN SMALL LETTER D */
+	XK_e                             = 0x0065,  /* U+0065 LATIN SMALL LETTER E */
+	XK_f                             = 0x0066,  /* U+0066 LATIN SMALL LETTER F */
+	XK_g                             = 0x0067,  /* U+0067 LATIN SMALL LETTER G */
+	XK_h                             = 0x0068,  /* U+0068 LATIN SMALL LETTER H */
+	XK_i                             = 0x0069,  /* U+0069 LATIN SMALL LETTER I */
+	XK_j                             = 0x006a,  /* U+006A LATIN SMALL LETTER J */
+	XK_k                             = 0x006b,  /* U+006B LATIN SMALL LETTER K */
+	XK_l                             = 0x006c,  /* U+006C LATIN SMALL LETTER L */
+	XK_m                             = 0x006d,  /* U+006D LATIN SMALL LETTER M */
+	XK_n                             = 0x006e,  /* U+006E LATIN SMALL LETTER N */
+	XK_o                             = 0x006f,  /* U+006F LATIN SMALL LETTER O */
+	XK_p                             = 0x0070,  /* U+0070 LATIN SMALL LETTER P */
+	XK_q                             = 0x0071,  /* U+0071 LATIN SMALL LETTER Q */
+	XK_r                             = 0x0072,  /* U+0072 LATIN SMALL LETTER R */
+	XK_s                             = 0x0073,  /* U+0073 LATIN SMALL LETTER S */
+	XK_t                             = 0x0074,  /* U+0074 LATIN SMALL LETTER T */
+	XK_u                             = 0x0075,  /* U+0075 LATIN SMALL LETTER U */
+	XK_v                             = 0x0076,  /* U+0076 LATIN SMALL LETTER V */
+	XK_w                             = 0x0077,  /* U+0077 LATIN SMALL LETTER W */
+	XK_x                             = 0x0078,  /* U+0078 LATIN SMALL LETTER X */
+	XK_y                             = 0x0079,  /* U+0079 LATIN SMALL LETTER Y */
+	XK_z                             = 0x007a,  /* U+007A LATIN SMALL LETTER Z */
+	XK_braceleft                     = 0x007b,  /* U+007B LEFT CURLY BRACKET */
+	XK_bar                           = 0x007c,  /* U+007C VERTICAL LINE */
+	XK_braceright                    = 0x007d,  /* U+007D RIGHT CURLY BRACKET */
+	XK_asciitilde                    = 0x007e,  /* U+007E TILDE */
+	XK_nobreakspace                  = 0x00a0,  /* U+00A0 NO-BREAK SPACE */
+	XK_exclamdown                    = 0x00a1,  /* U+00A1 INVERTED EXCLAMATION MARK */
+	XK_cent                          = 0x00a2,  /* U+00A2 CENT SIGN */
+	XK_sterling                      = 0x00a3,  /* U+00A3 POUND SIGN */
+	XK_currency                      = 0x00a4,  /* U+00A4 CURRENCY SIGN */
+	XK_yen                           = 0x00a5,  /* U+00A5 YEN SIGN */
+	XK_brokenbar                     = 0x00a6,  /* U+00A6 BROKEN BAR */
+	XK_section                       = 0x00a7,  /* U+00A7 SECTION SIGN */
+	XK_diaeresis                     = 0x00a8,  /* U+00A8 DIAERESIS */
+	XK_copyright                     = 0x00a9,  /* U+00A9 COPYRIGHT SIGN */
+	XK_ordfeminine                   = 0x00aa,  /* U+00AA FEMININE ORDINAL INDICATOR */
+	XK_guillemotleft                 = 0x00ab,  /* U+00AB LEFT-POINTING DOUBLE ANGLE QUOTATION MARK */
+	XK_notsign                       = 0x00ac,  /* U+00AC NOT SIGN */
+	XK_hyphen                        = 0x00ad,  /* U+00AD SOFT HYPHEN */
+	XK_registered                    = 0x00ae,  /* U+00AE REGISTERED SIGN */
+	XK_macron                        = 0x00af,  /* U+00AF MACRON */
+	XK_degree                        = 0x00b0,  /* U+00B0 DEGREE SIGN */
+	XK_plusminus                     = 0x00b1,  /* U+00B1 PLUS-MINUS SIGN */
+	XK_twosuperior                   = 0x00b2,  /* U+00B2 SUPERSCRIPT TWO */
+	XK_threesuperior                 = 0x00b3,  /* U+00B3 SUPERSCRIPT THREE */
+	XK_acute                         = 0x00b4,  /* U+00B4 ACUTE ACCENT */
+	XK_mu                            = 0x00b5,  /* U+00B5 MICRO SIGN */
+	XK_paragraph                     = 0x00b6,  /* U+00B6 PILCROW SIGN */
+	XK_periodcentered                = 0x00b7,  /* U+00B7 MIDDLE DOT */
+	XK_cedilla                       = 0x00b8,  /* U+00B8 CEDILLA */
+	XK_onesuperior                   = 0x00b9,  /* U+00B9 SUPERSCRIPT ONE */
+	XK_masculine                     = 0x00ba,  /* U+00BA MASCULINE ORDINAL INDICATOR */
+	XK_guillemotright                = 0x00bb,  /* U+00BB RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK */
+	XK_onequarter                    = 0x00bc,  /* U+00BC VULGAR FRACTION ONE QUARTER */
+	XK_onehalf                       = 0x00bd,  /* U+00BD VULGAR FRACTION ONE HALF */
+	XK_threequarters                 = 0x00be,  /* U+00BE VULGAR FRACTION THREE QUARTERS */
+	XK_questiondown                  = 0x00bf,  /* U+00BF INVERTED QUESTION MARK */
+	XK_Agrave                        = 0x00c0,  /* U+00C0 LATIN CAPITAL LETTER A WITH GRAVE */
+	XK_Aacute                        = 0x00c1,  /* U+00C1 LATIN CAPITAL LETTER A WITH ACUTE */
+	XK_Acircumflex                   = 0x00c2,  /* U+00C2 LATIN CAPITAL LETTER A WITH CIRCUMFLEX */
+	XK_Atilde                        = 0x00c3,  /* U+00C3 LATIN CAPITAL LETTER A WITH TILDE */
+	XK_Adiaeresis                    = 0x00c4,  /* U+00C4 LATIN CAPITAL LETTER A WITH DIAERESIS */
+	XK_Aring                         = 0x00c5,  /* U+00C5 LATIN CAPITAL LETTER A WITH RING ABOVE */
+	XK_AE                            = 0x00c6,  /* U+00C6 LATIN CAPITAL LETTER AE */
+	XK_Ccedilla                      = 0x00c7,  /* U+00C7 LATIN CAPITAL LETTER C WITH CEDILLA */
+	XK_Egrave                        = 0x00c8,  /* U+00C8 LATIN CAPITAL LETTER E WITH GRAVE */
+	XK_Eacute                        = 0x00c9,  /* U+00C9 LATIN CAPITAL LETTER E WITH ACUTE */
+	XK_Ecircumflex                   = 0x00ca,  /* U+00CA LATIN CAPITAL LETTER E WITH CIRCUMFLEX */
+	XK_Ediaeresis                    = 0x00cb,  /* U+00CB LATIN CAPITAL LETTER E WITH DIAERESIS */
+	XK_Igrave                        = 0x00cc,  /* U+00CC LATIN CAPITAL LETTER I WITH GRAVE */
+	XK_Iacute                        = 0x00cd,  /* U+00CD LATIN CAPITAL LETTER I WITH ACUTE */
+	XK_Icircumflex                   = 0x00ce,  /* U+00CE LATIN CAPITAL LETTER I WITH CIRCUMFLEX */
+	XK_Idiaeresis                    = 0x00cf,  /* U+00CF LATIN CAPITAL LETTER I WITH DIAERESIS */
+	XK_ETH                           = 0x00d0,  /* U+00D0 LATIN CAPITAL LETTER ETH */
+	XK_Eth                           = 0x00d0,  /* deprecated */
+	XK_Ntilde                        = 0x00d1,  /* U+00D1 LATIN CAPITAL LETTER N WITH TILDE */
+	XK_Ograve                        = 0x00d2,  /* U+00D2 LATIN CAPITAL LETTER O WITH GRAVE */
+	XK_Oacute                        = 0x00d3,  /* U+00D3 LATIN CAPITAL LETTER O WITH ACUTE */
+	XK_Ocircumflex                   = 0x00d4,  /* U+00D4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX */
+	XK_Otilde                        = 0x00d5,  /* U+00D5 LATIN CAPITAL LETTER O WITH TILDE */
+	XK_Odiaeresis                    = 0x00d6,  /* U+00D6 LATIN CAPITAL LETTER O WITH DIAERESIS */
+	XK_multiply                      = 0x00d7,  /* U+00D7 MULTIPLICATION SIGN */
+	XK_Oslash                        = 0x00d8,  /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
+	XK_Ooblique                      = 0x00d8,  /* U+00D8 LATIN CAPITAL LETTER O WITH STROKE */
+	XK_Ugrave                        = 0x00d9,  /* U+00D9 LATIN CAPITAL LETTER U WITH GRAVE */
+	XK_Uacute                        = 0x00da,  /* U+00DA LATIN CAPITAL LETTER U WITH ACUTE */
+	XK_Ucircumflex                   = 0x00db,  /* U+00DB LATIN CAPITAL LETTER U WITH CIRCUMFLEX */
+	XK_Udiaeresis                    = 0x00dc,  /* U+00DC LATIN CAPITAL LETTER U WITH DIAERESIS */
+	XK_Yacute                        = 0x00dd,  /* U+00DD LATIN CAPITAL LETTER Y WITH ACUTE */
+	XK_THORN                         = 0x00de,  /* U+00DE LATIN CAPITAL LETTER THORN */
+	XK_Thorn                         = 0x00de,  /* deprecated */
+	XK_ssharp                        = 0x00df,  /* U+00DF LATIN SMALL LETTER SHARP S */
+	XK_agrave                        = 0x00e0,  /* U+00E0 LATIN SMALL LETTER A WITH GRAVE */
+	XK_aacute                        = 0x00e1,  /* U+00E1 LATIN SMALL LETTER A WITH ACUTE */
+	XK_acircumflex                   = 0x00e2,  /* U+00E2 LATIN SMALL LETTER A WITH CIRCUMFLEX */
+	XK_atilde                        = 0x00e3,  /* U+00E3 LATIN SMALL LETTER A WITH TILDE */
+	XK_adiaeresis                    = 0x00e4,  /* U+00E4 LATIN SMALL LETTER A WITH DIAERESIS */
+	XK_aring                         = 0x00e5,  /* U+00E5 LATIN SMALL LETTER A WITH RING ABOVE */
+	XK_ae                            = 0x00e6,  /* U+00E6 LATIN SMALL LETTER AE */
+	XK_ccedilla                      = 0x00e7,  /* U+00E7 LATIN SMALL LETTER C WITH CEDILLA */
+	XK_egrave                        = 0x00e8,  /* U+00E8 LATIN SMALL LETTER E WITH GRAVE */
+	XK_eacute                        = 0x00e9,  /* U+00E9 LATIN SMALL LETTER E WITH ACUTE */
+	XK_ecircumflex                   = 0x00ea,  /* U+00EA LATIN SMALL LETTER E WITH CIRCUMFLEX */
+	XK_ediaeresis                    = 0x00eb,  /* U+00EB LATIN SMALL LETTER E WITH DIAERESIS */
+	XK_igrave                        = 0x00ec,  /* U+00EC LATIN SMALL LETTER I WITH GRAVE */
+	XK_iacute                        = 0x00ed,  /* U+00ED LATIN SMALL LETTER I WITH ACUTE */
+	XK_icircumflex                   = 0x00ee,  /* U+00EE LATIN SMALL LETTER I WITH CIRCUMFLEX */
+	XK_idiaeresis                    = 0x00ef,  /* U+00EF LATIN SMALL LETTER I WITH DIAERESIS */
+	XK_eth                           = 0x00f0,  /* U+00F0 LATIN SMALL LETTER ETH */
+	XK_ntilde                        = 0x00f1,  /* U+00F1 LATIN SMALL LETTER N WITH TILDE */
+	XK_ograve                        = 0x00f2,  /* U+00F2 LATIN SMALL LETTER O WITH GRAVE */
+	XK_oacute                        = 0x00f3,  /* U+00F3 LATIN SMALL LETTER O WITH ACUTE */
+	XK_ocircumflex                   = 0x00f4,  /* U+00F4 LATIN SMALL LETTER O WITH CIRCUMFLEX */
+	XK_otilde                        = 0x00f5,  /* U+00F5 LATIN SMALL LETTER O WITH TILDE */
+	XK_odiaeresis                    = 0x00f6,  /* U+00F6 LATIN SMALL LETTER O WITH DIAERESIS */
+	XK_division                      = 0x00f7,  /* U+00F7 DIVISION SIGN */
+	XK_oslash                        = 0x00f8,  /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
+	XK_ooblique                      = 0x00f8,  /* U+00F8 LATIN SMALL LETTER O WITH STROKE */
+	XK_ugrave                        = 0x00f9,  /* U+00F9 LATIN SMALL LETTER U WITH GRAVE */
+	XK_uacute                        = 0x00fa,  /* U+00FA LATIN SMALL LETTER U WITH ACUTE */
+	XK_ucircumflex                   = 0x00fb,  /* U+00FB LATIN SMALL LETTER U WITH CIRCUMFLEX */
+	XK_udiaeresis                    = 0x00fc,  /* U+00FC LATIN SMALL LETTER U WITH DIAERESIS */
+	XK_yacute                        = 0x00fd,  /* U+00FD LATIN SMALL LETTER Y WITH ACUTE */
+	XK_thorn                         = 0x00fe,  /* U+00FE LATIN SMALL LETTER THORN */
+	XK_ydiaeresis                    = 0x00ff,  /* U+00FF LATIN SMALL LETTER Y WITH DIAERESIS */
+	XK_Aogonek                       = 0x01a1,  /* U+0104 LATIN CAPITAL LETTER A WITH OGONEK */
+	XK_breve                         = 0x01a2,  /* U+02D8 BREVE */
+	XK_Lstroke                       = 0x01a3,  /* U+0141 LATIN CAPITAL LETTER L WITH STROKE */
+	XK_Lcaron                        = 0x01a5,  /* U+013D LATIN CAPITAL LETTER L WITH CARON */
+	XK_Sacute                        = 0x01a6,  /* U+015A LATIN CAPITAL LETTER S WITH ACUTE */
+	XK_Scaron                        = 0x01a9,  /* U+0160 LATIN CAPITAL LETTER S WITH CARON */
+	XK_Scedilla                      = 0x01aa,  /* U+015E LATIN CAPITAL LETTER S WITH CEDILLA */
+	XK_Tcaron                        = 0x01ab,  /* U+0164 LATIN CAPITAL LETTER T WITH CARON */
+	XK_Zacute                        = 0x01ac,  /* U+0179 LATIN CAPITAL LETTER Z WITH ACUTE */
+	XK_Zcaron                        = 0x01ae,  /* U+017D LATIN CAPITAL LETTER Z WITH CARON */
+	XK_Zabovedot                     = 0x01af,  /* U+017B LATIN CAPITAL LETTER Z WITH DOT ABOVE */
+	XK_aogonek                       = 0x01b1,  /* U+0105 LATIN SMALL LETTER A WITH OGONEK */
+	XK_ogonek                        = 0x01b2,  /* U+02DB OGONEK */
+	XK_lstroke                       = 0x01b3,  /* U+0142 LATIN SMALL LETTER L WITH STROKE */
+	XK_lcaron                        = 0x01b5,  /* U+013E LATIN SMALL LETTER L WITH CARON */
+	XK_sacute                        = 0x01b6,  /* U+015B LATIN SMALL LETTER S WITH ACUTE */
+	XK_caron                         = 0x01b7,  /* U+02C7 CARON */
+	XK_scaron                        = 0x01b9,  /* U+0161 LATIN SMALL LETTER S WITH CARON */
+	XK_scedilla                      = 0x01ba,  /* U+015F LATIN SMALL LETTER S WITH CEDILLA */
+	XK_tcaron                        = 0x01bb,  /* U+0165 LATIN SMALL LETTER T WITH CARON */
+	XK_zacute                        = 0x01bc,  /* U+017A LATIN SMALL LETTER Z WITH ACUTE */
+	XK_doubleacute                   = 0x01bd,  /* U+02DD DOUBLE ACUTE ACCENT */
+	XK_zcaron                        = 0x01be,  /* U+017E LATIN SMALL LETTER Z WITH CARON */
+	XK_zabovedot                     = 0x01bf,  /* U+017C LATIN SMALL LETTER Z WITH DOT ABOVE */
+	XK_Racute                        = 0x01c0,  /* U+0154 LATIN CAPITAL LETTER R WITH ACUTE */
+	XK_Abreve                        = 0x01c3,  /* U+0102 LATIN CAPITAL LETTER A WITH BREVE */
+	XK_Lacute                        = 0x01c5,  /* U+0139 LATIN CAPITAL LETTER L WITH ACUTE */
+	XK_Cacute                        = 0x01c6,  /* U+0106 LATIN CAPITAL LETTER C WITH ACUTE */
+	XK_Ccaron                        = 0x01c8,  /* U+010C LATIN CAPITAL LETTER C WITH CARON */
+	XK_Eogonek                       = 0x01ca,  /* U+0118 LATIN CAPITAL LETTER E WITH OGONEK */
+	XK_Ecaron                        = 0x01cc,  /* U+011A LATIN CAPITAL LETTER E WITH CARON */
+	XK_Dcaron                        = 0x01cf,  /* U+010E LATIN CAPITAL LETTER D WITH CARON */
+	XK_Dstroke                       = 0x01d0,  /* U+0110 LATIN CAPITAL LETTER D WITH STROKE */
+	XK_Nacute                        = 0x01d1,  /* U+0143 LATIN CAPITAL LETTER N WITH ACUTE */
+	XK_Ncaron                        = 0x01d2,  /* U+0147 LATIN CAPITAL LETTER N WITH CARON */
+	XK_Odoubleacute                  = 0x01d5,  /* U+0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE */
+	XK_Rcaron                        = 0x01d8,  /* U+0158 LATIN CAPITAL LETTER R WITH CARON */
+	XK_Uring                         = 0x01d9,  /* U+016E LATIN CAPITAL LETTER U WITH RING ABOVE */
+	XK_Udoubleacute                  = 0x01db,  /* U+0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE */
+	XK_Tcedilla                      = 0x01de,  /* U+0162 LATIN CAPITAL LETTER T WITH CEDILLA */
+	XK_racute                        = 0x01e0,  /* U+0155 LATIN SMALL LETTER R WITH ACUTE */
+	XK_abreve                        = 0x01e3,  /* U+0103 LATIN SMALL LETTER A WITH BREVE */
+	XK_lacute                        = 0x01e5,  /* U+013A LATIN SMALL LETTER L WITH ACUTE */
+	XK_cacute                        = 0x01e6,  /* U+0107 LATIN SMALL LETTER C WITH ACUTE */
+	XK_ccaron                        = 0x01e8,  /* U+010D LATIN SMALL LETTER C WITH CARON */
+	XK_eogonek                       = 0x01ea,  /* U+0119 LATIN SMALL LETTER E WITH OGONEK */
+	XK_ecaron                        = 0x01ec,  /* U+011B LATIN SMALL LETTER E WITH CARON */
+	XK_dcaron                        = 0x01ef,  /* U+010F LATIN SMALL LETTER D WITH CARON */
+	XK_dstroke                       = 0x01f0,  /* U+0111 LATIN SMALL LETTER D WITH STROKE */
+	XK_nacute                        = 0x01f1,  /* U+0144 LATIN SMALL LETTER N WITH ACUTE */
+	XK_ncaron                        = 0x01f2,  /* U+0148 LATIN SMALL LETTER N WITH CARON */
+	XK_odoubleacute                  = 0x01f5,  /* U+0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE */
+	XK_udoubleacute                  = 0x01fb,  /* U+0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE */
+	XK_rcaron                        = 0x01f8,  /* U+0159 LATIN SMALL LETTER R WITH CARON */
+	XK_uring                         = 0x01f9,  /* U+016F LATIN SMALL LETTER U WITH RING ABOVE */
+	XK_tcedilla                      = 0x01fe,  /* U+0163 LATIN SMALL LETTER T WITH CEDILLA */
+	XK_abovedot                      = 0x01ff,  /* U+02D9 DOT ABOVE */
+	XK_Hstroke                       = 0x02a1,  /* U+0126 LATIN CAPITAL LETTER H WITH STROKE */
+	XK_Hcircumflex                   = 0x02a6,  /* U+0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX */
+	XK_Iabovedot                     = 0x02a9,  /* U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE */
+	XK_Gbreve                        = 0x02ab,  /* U+011E LATIN CAPITAL LETTER G WITH BREVE */
+	XK_Jcircumflex                   = 0x02ac,  /* U+0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX */
+	XK_hstroke                       = 0x02b1,  /* U+0127 LATIN SMALL LETTER H WITH STROKE */
+	XK_hcircumflex                   = 0x02b6,  /* U+0125 LATIN SMALL LETTER H WITH CIRCUMFLEX */
+	XK_idotless                      = 0x02b9,  /* U+0131 LATIN SMALL LETTER DOTLESS I */
+	XK_gbreve                        = 0x02bb,  /* U+011F LATIN SMALL LETTER G WITH BREVE */
+	XK_jcircumflex                   = 0x02bc,  /* U+0135 LATIN SMALL LETTER J WITH CIRCUMFLEX */
+	XK_Cabovedot                     = 0x02c5,  /* U+010A LATIN CAPITAL LETTER C WITH DOT ABOVE */
+	XK_Ccircumflex                   = 0x02c6,  /* U+0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX */
+	XK_Gabovedot                     = 0x02d5,  /* U+0120 LATIN CAPITAL LETTER G WITH DOT ABOVE */
+	XK_Gcircumflex                   = 0x02d8,  /* U+011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX */
+	XK_Ubreve                        = 0x02dd,  /* U+016C LATIN CAPITAL LETTER U WITH BREVE */
+	XK_Scircumflex                   = 0x02de,  /* U+015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX */
+	XK_cabovedot                     = 0x02e5,  /* U+010B LATIN SMALL LETTER C WITH DOT ABOVE */
+	XK_ccircumflex                   = 0x02e6,  /* U+0109 LATIN SMALL LETTER C WITH CIRCUMFLEX */
+	XK_gabovedot                     = 0x02f5,  /* U+0121 LATIN SMALL LETTER G WITH DOT ABOVE */
+	XK_gcircumflex                   = 0x02f8,  /* U+011D LATIN SMALL LETTER G WITH CIRCUMFLEX */
+	XK_ubreve                        = 0x02fd,  /* U+016D LATIN SMALL LETTER U WITH BREVE */
+	XK_scircumflex                   = 0x02fe,  /* U+015D LATIN SMALL LETTER S WITH CIRCUMFLEX */
+	XK_kra                           = 0x03a2,  /* U+0138 LATIN SMALL LETTER KRA */
+	XK_kappa                         = 0x03a2,  /* deprecated */
+	XK_Rcedilla                      = 0x03a3,  /* U+0156 LATIN CAPITAL LETTER R WITH CEDILLA */
+	XK_Itilde                        = 0x03a5,  /* U+0128 LATIN CAPITAL LETTER I WITH TILDE */
+	XK_Lcedilla                      = 0x03a6,  /* U+013B LATIN CAPITAL LETTER L WITH CEDILLA */
+	XK_Emacron                       = 0x03aa,  /* U+0112 LATIN CAPITAL LETTER E WITH MACRON */
+	XK_Gcedilla                      = 0x03ab,  /* U+0122 LATIN CAPITAL LETTER G WITH CEDILLA */
+	XK_Tslash                        = 0x03ac,  /* U+0166 LATIN CAPITAL LETTER T WITH STROKE */
+	XK_rcedilla                      = 0x03b3,  /* U+0157 LATIN SMALL LETTER R WITH CEDILLA */
+	XK_itilde                        = 0x03b5,  /* U+0129 LATIN SMALL LETTER I WITH TILDE */
+	XK_lcedilla                      = 0x03b6,  /* U+013C LATIN SMALL LETTER L WITH CEDILLA */
+	XK_emacron                       = 0x03ba,  /* U+0113 LATIN SMALL LETTER E WITH MACRON */
+	XK_gcedilla                      = 0x03bb,  /* U+0123 LATIN SMALL LETTER G WITH CEDILLA */
+	XK_tslash                        = 0x03bc,  /* U+0167 LATIN SMALL LETTER T WITH STROKE */
+	XK_ENG                           = 0x03bd,  /* U+014A LATIN CAPITAL LETTER ENG */
+	XK_eng                           = 0x03bf,  /* U+014B LATIN SMALL LETTER ENG */
+	XK_Amacron                       = 0x03c0,  /* U+0100 LATIN CAPITAL LETTER A WITH MACRON */
+	XK_Iogonek                       = 0x03c7,  /* U+012E LATIN CAPITAL LETTER I WITH OGONEK */
+	XK_Eabovedot                     = 0x03cc,  /* U+0116 LATIN CAPITAL LETTER E WITH DOT ABOVE */
+	XK_Imacron                       = 0x03cf,  /* U+012A LATIN CAPITAL LETTER I WITH MACRON */
+	XK_Ncedilla                      = 0x03d1,  /* U+0145 LATIN CAPITAL LETTER N WITH CEDILLA */
+	XK_Omacron                       = 0x03d2,  /* U+014C LATIN CAPITAL LETTER O WITH MACRON */
+	XK_Kcedilla                      = 0x03d3,  /* U+0136 LATIN CAPITAL LETTER K WITH CEDILLA */
+	XK_Uogonek                       = 0x03d9,  /* U+0172 LATIN CAPITAL LETTER U WITH OGONEK */
+	XK_Utilde                        = 0x03dd,  /* U+0168 LATIN CAPITAL LETTER U WITH TILDE */
+	XK_Umacron                       = 0x03de,  /* U+016A LATIN CAPITAL LETTER U WITH MACRON */
+	XK_amacron                       = 0x03e0,  /* U+0101 LATIN SMALL LETTER A WITH MACRON */
+	XK_iogonek                       = 0x03e7,  /* U+012F LATIN SMALL LETTER I WITH OGONEK */
+	XK_eabovedot                     = 0x03ec,  /* U+0117 LATIN SMALL LETTER E WITH DOT ABOVE */
+	XK_imacron                       = 0x03ef,  /* U+012B LATIN SMALL LETTER I WITH MACRON */
+	XK_ncedilla                      = 0x03f1,  /* U+0146 LATIN SMALL LETTER N WITH CEDILLA */
+	XK_omacron                       = 0x03f2,  /* U+014D LATIN SMALL LETTER O WITH MACRON */
+	XK_kcedilla                      = 0x03f3,  /* U+0137 LATIN SMALL LETTER K WITH CEDILLA */
+	XK_uogonek                       = 0x03f9,  /* U+0173 LATIN SMALL LETTER U WITH OGONEK */
+	XK_utilde                        = 0x03fd,  /* U+0169 LATIN SMALL LETTER U WITH TILDE */
+	XK_umacron                       = 0x03fe,  /* U+016B LATIN SMALL LETTER U WITH MACRON */
+	XK_Babovedot                  = 0x1001e02,  /* U+1E02 LATIN CAPITAL LETTER B WITH DOT ABOVE */
+	XK_babovedot                  = 0x1001e03,  /* U+1E03 LATIN SMALL LETTER B WITH DOT ABOVE */
+	XK_Dabovedot                  = 0x1001e0a,  /* U+1E0A LATIN CAPITAL LETTER D WITH DOT ABOVE */
+	XK_Wgrave                     = 0x1001e80,  /* U+1E80 LATIN CAPITAL LETTER W WITH GRAVE */
+	XK_Wacute                     = 0x1001e82,  /* U+1E82 LATIN CAPITAL LETTER W WITH ACUTE */
+	XK_dabovedot                  = 0x1001e0b,  /* U+1E0B LATIN SMALL LETTER D WITH DOT ABOVE */
+	XK_Ygrave                     = 0x1001ef2,  /* U+1EF2 LATIN CAPITAL LETTER Y WITH GRAVE */
+	XK_Fabovedot                  = 0x1001e1e,  /* U+1E1E LATIN CAPITAL LETTER F WITH DOT ABOVE */
+	XK_fabovedot                  = 0x1001e1f,  /* U+1E1F LATIN SMALL LETTER F WITH DOT ABOVE */
+	XK_Mabovedot                  = 0x1001e40,  /* U+1E40 LATIN CAPITAL LETTER M WITH DOT ABOVE */
+	XK_mabovedot                  = 0x1001e41,  /* U+1E41 LATIN SMALL LETTER M WITH DOT ABOVE */
+	XK_Pabovedot                  = 0x1001e56,  /* U+1E56 LATIN CAPITAL LETTER P WITH DOT ABOVE */
+	XK_wgrave                     = 0x1001e81,  /* U+1E81 LATIN SMALL LETTER W WITH GRAVE */
+	XK_pabovedot                  = 0x1001e57,  /* U+1E57 LATIN SMALL LETTER P WITH DOT ABOVE */
+	XK_wacute                     = 0x1001e83,  /* U+1E83 LATIN SMALL LETTER W WITH ACUTE */
+	XK_Sabovedot                  = 0x1001e60,  /* U+1E60 LATIN CAPITAL LETTER S WITH DOT ABOVE */
+	XK_ygrave                     = 0x1001ef3,  /* U+1EF3 LATIN SMALL LETTER Y WITH GRAVE */
+	XK_Wdiaeresis                 = 0x1001e84,  /* U+1E84 LATIN CAPITAL LETTER W WITH DIAERESIS */
+	XK_wdiaeresis                 = 0x1001e85,  /* U+1E85 LATIN SMALL LETTER W WITH DIAERESIS */
+	XK_sabovedot                  = 0x1001e61,  /* U+1E61 LATIN SMALL LETTER S WITH DOT ABOVE */
+	XK_Wcircumflex                = 0x1000174,  /* U+0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX */
+	XK_Tabovedot                  = 0x1001e6a,  /* U+1E6A LATIN CAPITAL LETTER T WITH DOT ABOVE */
+	XK_Ycircumflex                = 0x1000176,  /* U+0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX */
+	XK_wcircumflex                = 0x1000175,  /* U+0175 LATIN SMALL LETTER W WITH CIRCUMFLEX */
+	XK_tabovedot                  = 0x1001e6b,  /* U+1E6B LATIN SMALL LETTER T WITH DOT ABOVE */
+	XK_ycircumflex                = 0x1000177,  /* U+0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX */
+	XK_OE                            = 0x13bc,  /* U+0152 LATIN CAPITAL LIGATURE OE */
+	XK_oe                            = 0x13bd,  /* U+0153 LATIN SMALL LIGATURE OE */
+	XK_Ydiaeresis                    = 0x13be,  /* U+0178 LATIN CAPITAL LETTER Y WITH DIAERESIS */
+	XK_overline                      = 0x047e,  /* U+203E OVERLINE */
+	XK_kana_fullstop                 = 0x04a1,  /* U+3002 IDEOGRAPHIC FULL STOP */
+	XK_kana_openingbracket           = 0x04a2,  /* U+300C LEFT CORNER BRACKET */
+	XK_kana_closingbracket           = 0x04a3,  /* U+300D RIGHT CORNER BRACKET */
+	XK_kana_comma                    = 0x04a4,  /* U+3001 IDEOGRAPHIC COMMA */
+	XK_kana_conjunctive              = 0x04a5,  /* U+30FB KATAKANA MIDDLE DOT */
+	XK_kana_middledot                = 0x04a5,  /* deprecated */
+	XK_kana_WO                       = 0x04a6,  /* U+30F2 KATAKANA LETTER WO */
+	XK_kana_a                        = 0x04a7,  /* U+30A1 KATAKANA LETTER SMALL A */
+	XK_kana_i                        = 0x04a8,  /* U+30A3 KATAKANA LETTER SMALL I */
+	XK_kana_u                        = 0x04a9,  /* U+30A5 KATAKANA LETTER SMALL U */
+	XK_kana_e                        = 0x04aa,  /* U+30A7 KATAKANA LETTER SMALL E */
+	XK_kana_o                        = 0x04ab,  /* U+30A9 KATAKANA LETTER SMALL O */
+	XK_kana_ya                       = 0x04ac,  /* U+30E3 KATAKANA LETTER SMALL YA */
+	XK_kana_yu                       = 0x04ad,  /* U+30E5 KATAKANA LETTER SMALL YU */
+	XK_kana_yo                       = 0x04ae,  /* U+30E7 KATAKANA LETTER SMALL YO */
+	XK_kana_tsu                      = 0x04af,  /* U+30C3 KATAKANA LETTER SMALL TU */
+	XK_kana_tu                       = 0x04af,  /* deprecated */
+	XK_prolongedsound                = 0x04b0,  /* U+30FC KATAKANA-HIRAGANA PROLONGED SOUND MARK */
+	XK_kana_A                        = 0x04b1,  /* U+30A2 KATAKANA LETTER A */
+	XK_kana_I                        = 0x04b2,  /* U+30A4 KATAKANA LETTER I */
+	XK_kana_U                        = 0x04b3,  /* U+30A6 KATAKANA LETTER U */
+	XK_kana_E                        = 0x04b4,  /* U+30A8 KATAKANA LETTER E */
+	XK_kana_O                        = 0x04b5,  /* U+30AA KATAKANA LETTER O */
+	XK_kana_KA                       = 0x04b6,  /* U+30AB KATAKANA LETTER KA */
+	XK_kana_KI                       = 0x04b7,  /* U+30AD KATAKANA LETTER KI */
+	XK_kana_KU                       = 0x04b8,  /* U+30AF KATAKANA LETTER KU */
+	XK_kana_KE                       = 0x04b9,  /* U+30B1 KATAKANA LETTER KE */
+	XK_kana_KO                       = 0x04ba,  /* U+30B3 KATAKANA LETTER KO */
+	XK_kana_SA                       = 0x04bb,  /* U+30B5 KATAKANA LETTER SA */
+	XK_kana_SHI                      = 0x04bc,  /* U+30B7 KATAKANA LETTER SI */
+	XK_kana_SU                       = 0x04bd,  /* U+30B9 KATAKANA LETTER SU */
+	XK_kana_SE                       = 0x04be,  /* U+30BB KATAKANA LETTER SE */
+	XK_kana_SO                       = 0x04bf,  /* U+30BD KATAKANA LETTER SO */
+	XK_kana_TA                       = 0x04c0,  /* U+30BF KATAKANA LETTER TA */
+	XK_kana_CHI                      = 0x04c1,  /* U+30C1 KATAKANA LETTER TI */
+	XK_kana_TI                       = 0x04c1,  /* deprecated */
+	XK_kana_TSU                      = 0x04c2,  /* U+30C4 KATAKANA LETTER TU */
+	XK_kana_TU                       = 0x04c2,  /* deprecated */
+	XK_kana_TE                       = 0x04c3,  /* U+30C6 KATAKANA LETTER TE */
+	XK_kana_TO                       = 0x04c4,  /* U+30C8 KATAKANA LETTER TO */
+	XK_kana_NA                       = 0x04c5,  /* U+30CA KATAKANA LETTER NA */
+	XK_kana_NI                       = 0x04c6,  /* U+30CB KATAKANA LETTER NI */
+	XK_kana_NU                       = 0x04c7,  /* U+30CC KATAKANA LETTER NU */
+	XK_kana_NE                       = 0x04c8,  /* U+30CD KATAKANA LETTER NE */
+	XK_kana_NO                       = 0x04c9,  /* U+30CE KATAKANA LETTER NO */
+	XK_kana_HA                       = 0x04ca,  /* U+30CF KATAKANA LETTER HA */
+	XK_kana_HI                       = 0x04cb,  /* U+30D2 KATAKANA LETTER HI */
+	XK_kana_FU                       = 0x04cc,  /* U+30D5 KATAKANA LETTER HU */
+	XK_kana_HU                       = 0x04cc,  /* deprecated */
+	XK_kana_HE                       = 0x04cd,  /* U+30D8 KATAKANA LETTER HE */
+	XK_kana_HO                       = 0x04ce,  /* U+30DB KATAKANA LETTER HO */
+	XK_kana_MA                       = 0x04cf,  /* U+30DE KATAKANA LETTER MA */
+	XK_kana_MI                       = 0x04d0,  /* U+30DF KATAKANA LETTER MI */
+	XK_kana_MU                       = 0x04d1,  /* U+30E0 KATAKANA LETTER MU */
+	XK_kana_ME                       = 0x04d2,  /* U+30E1 KATAKANA LETTER ME */
+	XK_kana_MO                       = 0x04d3,  /* U+30E2 KATAKANA LETTER MO */
+	XK_kana_YA                       = 0x04d4,  /* U+30E4 KATAKANA LETTER YA */
+	XK_kana_YU                       = 0x04d5,  /* U+30E6 KATAKANA LETTER YU */
+	XK_kana_YO                       = 0x04d6,  /* U+30E8 KATAKANA LETTER YO */
+	XK_kana_RA                       = 0x04d7,  /* U+30E9 KATAKANA LETTER RA */
+	XK_kana_RI                       = 0x04d8,  /* U+30EA KATAKANA LETTER RI */
+	XK_kana_RU                       = 0x04d9,  /* U+30EB KATAKANA LETTER RU */
+	XK_kana_RE                       = 0x04da,  /* U+30EC KATAKANA LETTER RE */
+	XK_kana_RO                       = 0x04db,  /* U+30ED KATAKANA LETTER RO */
+	XK_kana_WA                       = 0x04dc,  /* U+30EF KATAKANA LETTER WA */
+	XK_kana_N                        = 0x04dd,  /* U+30F3 KATAKANA LETTER N */
+	XK_voicedsound                   = 0x04de,  /* U+309B KATAKANA-HIRAGANA VOICED SOUND MARK */
+	XK_semivoicedsound               = 0x04df,  /* U+309C KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK */
+	XK_kana_switch                   = 0xff7e,  /* Alias for mode_switch */
+	XK_Farsi_0                    = 0x10006f0,  /* U+06F0 EXTENDED ARABIC-INDIC DIGIT ZERO */
+	XK_Farsi_1                    = 0x10006f1,  /* U+06F1 EXTENDED ARABIC-INDIC DIGIT ONE */
+	XK_Farsi_2                    = 0x10006f2,  /* U+06F2 EXTENDED ARABIC-INDIC DIGIT TWO */
+	XK_Farsi_3                    = 0x10006f3,  /* U+06F3 EXTENDED ARABIC-INDIC DIGIT THREE */
+	XK_Farsi_4                    = 0x10006f4,  /* U+06F4 EXTENDED ARABIC-INDIC DIGIT FOUR */
+	XK_Farsi_5                    = 0x10006f5,  /* U+06F5 EXTENDED ARABIC-INDIC DIGIT FIVE */
+	XK_Farsi_6                    = 0x10006f6,  /* U+06F6 EXTENDED ARABIC-INDIC DIGIT SIX */
+	XK_Farsi_7                    = 0x10006f7,  /* U+06F7 EXTENDED ARABIC-INDIC DIGIT SEVEN */
+	XK_Farsi_8                    = 0x10006f8,  /* U+06F8 EXTENDED ARABIC-INDIC DIGIT EIGHT */
+	XK_Farsi_9                    = 0x10006f9,  /* U+06F9 EXTENDED ARABIC-INDIC DIGIT NINE */
+	XK_Arabic_percent             = 0x100066a,  /* U+066A ARABIC PERCENT SIGN */
+	XK_Arabic_superscript_alef    = 0x1000670,  /* U+0670 ARABIC LETTER SUPERSCRIPT ALEF */
+	XK_Arabic_tteh                = 0x1000679,  /* U+0679 ARABIC LETTER TTEH */
+	XK_Arabic_peh                 = 0x100067e,  /* U+067E ARABIC LETTER PEH */
+	XK_Arabic_tcheh               = 0x1000686,  /* U+0686 ARABIC LETTER TCHEH */
+	XK_Arabic_ddal                = 0x1000688,  /* U+0688 ARABIC LETTER DDAL */
+	XK_Arabic_rreh                = 0x1000691,  /* U+0691 ARABIC LETTER RREH */
+	XK_Arabic_comma                  = 0x05ac,  /* U+060C ARABIC COMMA */
+	XK_Arabic_fullstop            = 0x10006d4,  /* U+06D4 ARABIC FULL STOP */
+	XK_Arabic_0                   = 0x1000660,  /* U+0660 ARABIC-INDIC DIGIT ZERO */
+	XK_Arabic_1                   = 0x1000661,  /* U+0661 ARABIC-INDIC DIGIT ONE */
+	XK_Arabic_2                   = 0x1000662,  /* U+0662 ARABIC-INDIC DIGIT TWO */
+	XK_Arabic_3                   = 0x1000663,  /* U+0663 ARABIC-INDIC DIGIT THREE */
+	XK_Arabic_4                   = 0x1000664,  /* U+0664 ARABIC-INDIC DIGIT FOUR */
+	XK_Arabic_5                   = 0x1000665,  /* U+0665 ARABIC-INDIC DIGIT FIVE */
+	XK_Arabic_6                   = 0x1000666,  /* U+0666 ARABIC-INDIC DIGIT SIX */
+	XK_Arabic_7                   = 0x1000667,  /* U+0667 ARABIC-INDIC DIGIT SEVEN */
+	XK_Arabic_8                   = 0x1000668,  /* U+0668 ARABIC-INDIC DIGIT EIGHT */
+	XK_Arabic_9                   = 0x1000669,  /* U+0669 ARABIC-INDIC DIGIT NINE */
+	XK_Arabic_semicolon              = 0x05bb,  /* U+061B ARABIC SEMICOLON */
+	XK_Arabic_question_mark          = 0x05bf,  /* U+061F ARABIC QUESTION MARK */
+	XK_Arabic_hamza                  = 0x05c1,  /* U+0621 ARABIC LETTER HAMZA */
+	XK_Arabic_maddaonalef            = 0x05c2,  /* U+0622 ARABIC LETTER ALEF WITH MADDA ABOVE */
+	XK_Arabic_hamzaonalef            = 0x05c3,  /* U+0623 ARABIC LETTER ALEF WITH HAMZA ABOVE */
+	XK_Arabic_hamzaonwaw             = 0x05c4,  /* U+0624 ARABIC LETTER WAW WITH HAMZA ABOVE */
+	XK_Arabic_hamzaunderalef         = 0x05c5,  /* U+0625 ARABIC LETTER ALEF WITH HAMZA BELOW */
+	XK_Arabic_hamzaonyeh             = 0x05c6,  /* U+0626 ARABIC LETTER YEH WITH HAMZA ABOVE */
+	XK_Arabic_alef                   = 0x05c7,  /* U+0627 ARABIC LETTER ALEF */
+	XK_Arabic_beh                    = 0x05c8,  /* U+0628 ARABIC LETTER BEH */
+	XK_Arabic_tehmarbuta             = 0x05c9,  /* U+0629 ARABIC LETTER TEH MARBUTA */
+	XK_Arabic_teh                    = 0x05ca,  /* U+062A ARABIC LETTER TEH */
+	XK_Arabic_theh                   = 0x05cb,  /* U+062B ARABIC LETTER THEH */
+	XK_Arabic_jeem                   = 0x05cc,  /* U+062C ARABIC LETTER JEEM */
+	XK_Arabic_hah                    = 0x05cd,  /* U+062D ARABIC LETTER HAH */
+	XK_Arabic_khah                   = 0x05ce,  /* U+062E ARABIC LETTER KHAH */
+	XK_Arabic_dal                    = 0x05cf,  /* U+062F ARABIC LETTER DAL */
+	XK_Arabic_thal                   = 0x05d0,  /* U+0630 ARABIC LETTER THAL */
+	XK_Arabic_ra                     = 0x05d1,  /* U+0631 ARABIC LETTER REH */
+	XK_Arabic_zain                   = 0x05d2,  /* U+0632 ARABIC LETTER ZAIN */
+	XK_Arabic_seen                   = 0x05d3,  /* U+0633 ARABIC LETTER SEEN */
+	XK_Arabic_sheen                  = 0x05d4,  /* U+0634 ARABIC LETTER SHEEN */
+	XK_Arabic_sad                    = 0x05d5,  /* U+0635 ARABIC LETTER SAD */
+	XK_Arabic_dad                    = 0x05d6,  /* U+0636 ARABIC LETTER DAD */
+	XK_Arabic_tah                    = 0x05d7,  /* U+0637 ARABIC LETTER TAH */
+	XK_Arabic_zah                    = 0x05d8,  /* U+0638 ARABIC LETTER ZAH */
+	XK_Arabic_ain                    = 0x05d9,  /* U+0639 ARABIC LETTER AIN */
+	XK_Arabic_ghain                  = 0x05da,  /* U+063A ARABIC LETTER GHAIN */
+	XK_Arabic_tatweel                = 0x05e0,  /* U+0640 ARABIC TATWEEL */
+	XK_Arabic_feh                    = 0x05e1,  /* U+0641 ARABIC LETTER FEH */
+	XK_Arabic_qaf                    = 0x05e2,  /* U+0642 ARABIC LETTER QAF */
+	XK_Arabic_kaf                    = 0x05e3,  /* U+0643 ARABIC LETTER KAF */
+	XK_Arabic_lam                    = 0x05e4,  /* U+0644 ARABIC LETTER LAM */
+	XK_Arabic_meem                   = 0x05e5,  /* U+0645 ARABIC LETTER MEEM */
+	XK_Arabic_noon                   = 0x05e6,  /* U+0646 ARABIC LETTER NOON */
+	XK_Arabic_ha                     = 0x05e7,  /* U+0647 ARABIC LETTER HEH */
+	XK_Arabic_heh                    = 0x05e7,  /* deprecated */
+	XK_Arabic_waw                    = 0x05e8,  /* U+0648 ARABIC LETTER WAW */
+	XK_Arabic_alefmaksura            = 0x05e9,  /* U+0649 ARABIC LETTER ALEF MAKSURA */
+	XK_Arabic_yeh                    = 0x05ea,  /* U+064A ARABIC LETTER YEH */
+	XK_Arabic_fathatan               = 0x05eb,  /* U+064B ARABIC FATHATAN */
+	XK_Arabic_dammatan               = 0x05ec,  /* U+064C ARABIC DAMMATAN */
+	XK_Arabic_kasratan               = 0x05ed,  /* U+064D ARABIC KASRATAN */
+	XK_Arabic_fatha                  = 0x05ee,  /* U+064E ARABIC FATHA */
+	XK_Arabic_damma                  = 0x05ef,  /* U+064F ARABIC DAMMA */
+	XK_Arabic_kasra                  = 0x05f0,  /* U+0650 ARABIC KASRA */
+	XK_Arabic_shadda                 = 0x05f1,  /* U+0651 ARABIC SHADDA */
+	XK_Arabic_sukun                  = 0x05f2,  /* U+0652 ARABIC SUKUN */
+	XK_Arabic_madda_above         = 0x1000653,  /* U+0653 ARABIC MADDAH ABOVE */
+	XK_Arabic_hamza_above         = 0x1000654,  /* U+0654 ARABIC HAMZA ABOVE */
+	XK_Arabic_hamza_below         = 0x1000655,  /* U+0655 ARABIC HAMZA BELOW */
+	XK_Arabic_jeh                 = 0x1000698,  /* U+0698 ARABIC LETTER JEH */
+	XK_Arabic_veh                 = 0x10006a4,  /* U+06A4 ARABIC LETTER VEH */
+	XK_Arabic_keheh               = 0x10006a9,  /* U+06A9 ARABIC LETTER KEHEH */
+	XK_Arabic_gaf                 = 0x10006af,  /* U+06AF ARABIC LETTER GAF */
+	XK_Arabic_noon_ghunna         = 0x10006ba,  /* U+06BA ARABIC LETTER NOON GHUNNA */
+	XK_Arabic_heh_doachashmee     = 0x10006be,  /* U+06BE ARABIC LETTER HEH DOACHASHMEE */
+	XK_Farsi_yeh                  = 0x10006cc,  /* U+06CC ARABIC LETTER FARSI YEH */
+	XK_Arabic_farsi_yeh           = 0x10006cc,  /* U+06CC ARABIC LETTER FARSI YEH */
+	XK_Arabic_yeh_baree           = 0x10006d2,  /* U+06D2 ARABIC LETTER YEH BARREE */
+	XK_Arabic_heh_goal            = 0x10006c1,  /* U+06C1 ARABIC LETTER HEH GOAL */
+	XK_Arabic_switch                 = 0xff7e,  /* Alias for mode_switch */
+	XK_Cyrillic_GHE_bar           = 0x1000492,  /* U+0492 CYRILLIC CAPITAL LETTER GHE WITH STROKE */
+	XK_Cyrillic_ghe_bar           = 0x1000493,  /* U+0493 CYRILLIC SMALL LETTER GHE WITH STROKE */
+	XK_Cyrillic_ZHE_descender     = 0x1000496,  /* U+0496 CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER */
+	XK_Cyrillic_zhe_descender     = 0x1000497,  /* U+0497 CYRILLIC SMALL LETTER ZHE WITH DESCENDER */
+	XK_Cyrillic_KA_descender      = 0x100049a,  /* U+049A CYRILLIC CAPITAL LETTER KA WITH DESCENDER */
+	XK_Cyrillic_ka_descender      = 0x100049b,  /* U+049B CYRILLIC SMALL LETTER KA WITH DESCENDER */
+	XK_Cyrillic_KA_vertstroke     = 0x100049c,  /* U+049C CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE */
+	XK_Cyrillic_ka_vertstroke     = 0x100049d,  /* U+049D CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE */
+	XK_Cyrillic_EN_descender      = 0x10004a2,  /* U+04A2 CYRILLIC CAPITAL LETTER EN WITH DESCENDER */
+	XK_Cyrillic_en_descender      = 0x10004a3,  /* U+04A3 CYRILLIC SMALL LETTER EN WITH DESCENDER */
+	XK_Cyrillic_U_straight        = 0x10004ae,  /* U+04AE CYRILLIC CAPITAL LETTER STRAIGHT U */
+	XK_Cyrillic_u_straight        = 0x10004af,  /* U+04AF CYRILLIC SMALL LETTER STRAIGHT U */
+	XK_Cyrillic_U_straight_bar    = 0x10004b0,  /* U+04B0 CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE */
+	XK_Cyrillic_u_straight_bar    = 0x10004b1,  /* U+04B1 CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE */
+	XK_Cyrillic_HA_descender      = 0x10004b2,  /* U+04B2 CYRILLIC CAPITAL LETTER HA WITH DESCENDER */
+	XK_Cyrillic_ha_descender      = 0x10004b3,  /* U+04B3 CYRILLIC SMALL LETTER HA WITH DESCENDER */
+	XK_Cyrillic_CHE_descender     = 0x10004b6,  /* U+04B6 CYRILLIC CAPITAL LETTER CHE WITH DESCENDER */
+	XK_Cyrillic_che_descender     = 0x10004b7,  /* U+04B7 CYRILLIC SMALL LETTER CHE WITH DESCENDER */
+	XK_Cyrillic_CHE_vertstroke    = 0x10004b8,  /* U+04B8 CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE */
+	XK_Cyrillic_che_vertstroke    = 0x10004b9,  /* U+04B9 CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE */
+	XK_Cyrillic_SHHA              = 0x10004ba,  /* U+04BA CYRILLIC CAPITAL LETTER SHHA */
+	XK_Cyrillic_shha              = 0x10004bb,  /* U+04BB CYRILLIC SMALL LETTER SHHA */
+	XK_Cyrillic_SCHWA             = 0x10004d8,  /* U+04D8 CYRILLIC CAPITAL LETTER SCHWA */
+	XK_Cyrillic_schwa             = 0x10004d9,  /* U+04D9 CYRILLIC SMALL LETTER SCHWA */
+	XK_Cyrillic_I_macron          = 0x10004e2,  /* U+04E2 CYRILLIC CAPITAL LETTER I WITH MACRON */
+	XK_Cyrillic_i_macron          = 0x10004e3,  /* U+04E3 CYRILLIC SMALL LETTER I WITH MACRON */
+	XK_Cyrillic_O_bar             = 0x10004e8,  /* U+04E8 CYRILLIC CAPITAL LETTER BARRED O */
+	XK_Cyrillic_o_bar             = 0x10004e9,  /* U+04E9 CYRILLIC SMALL LETTER BARRED O */
+	XK_Cyrillic_U_macron          = 0x10004ee,  /* U+04EE CYRILLIC CAPITAL LETTER U WITH MACRON */
+	XK_Cyrillic_u_macron          = 0x10004ef,  /* U+04EF CYRILLIC SMALL LETTER U WITH MACRON */
+	XK_Serbian_dje                   = 0x06a1,  /* U+0452 CYRILLIC SMALL LETTER DJE */
+	XK_Macedonia_gje                 = 0x06a2,  /* U+0453 CYRILLIC SMALL LETTER GJE */
+	XK_Cyrillic_io                   = 0x06a3,  /* U+0451 CYRILLIC SMALL LETTER IO */
+	XK_Ukrainian_ie                  = 0x06a4,  /* U+0454 CYRILLIC SMALL LETTER UKRAINIAN IE */
+	XK_Ukranian_je                   = 0x06a4,  /* deprecated */
+	XK_Macedonia_dse                 = 0x06a5,  /* U+0455 CYRILLIC SMALL LETTER DZE */
+	XK_Ukrainian_i                   = 0x06a6,  /* U+0456 CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I */
+	XK_Ukranian_i                    = 0x06a6,  /* deprecated */
+	XK_Ukrainian_yi                  = 0x06a7,  /* U+0457 CYRILLIC SMALL LETTER YI */
+	XK_Ukranian_yi                   = 0x06a7,  /* deprecated */
+	XK_Cyrillic_je                   = 0x06a8,  /* U+0458 CYRILLIC SMALL LETTER JE */
+	XK_Serbian_je                    = 0x06a8,  /* deprecated */
+	XK_Cyrillic_lje                  = 0x06a9,  /* U+0459 CYRILLIC SMALL LETTER LJE */
+	XK_Serbian_lje                   = 0x06a9,  /* deprecated */
+	XK_Cyrillic_nje                  = 0x06aa,  /* U+045A CYRILLIC SMALL LETTER NJE */
+	XK_Serbian_nje                   = 0x06aa,  /* deprecated */
+	XK_Serbian_tshe                  = 0x06ab,  /* U+045B CYRILLIC SMALL LETTER TSHE */
+	XK_Macedonia_kje                 = 0x06ac,  /* U+045C CYRILLIC SMALL LETTER KJE */
+	XK_Ukrainian_ghe_with_upturn     = 0x06ad,  /* U+0491 CYRILLIC SMALL LETTER GHE WITH UPTURN */
+	XK_Byelorussian_shortu           = 0x06ae,  /* U+045E CYRILLIC SMALL LETTER SHORT U */
+	XK_Cyrillic_dzhe                 = 0x06af,  /* U+045F CYRILLIC SMALL LETTER DZHE */
+	XK_Serbian_dze                   = 0x06af,  /* deprecated */
+	XK_numerosign                    = 0x06b0,  /* U+2116 NUMERO SIGN */
+	XK_Serbian_DJE                   = 0x06b1,  /* U+0402 CYRILLIC CAPITAL LETTER DJE */
+	XK_Macedonia_GJE                 = 0x06b2,  /* U+0403 CYRILLIC CAPITAL LETTER GJE */
+	XK_Cyrillic_IO                   = 0x06b3,  /* U+0401 CYRILLIC CAPITAL LETTER IO */
+	XK_Ukrainian_IE                  = 0x06b4,  /* U+0404 CYRILLIC CAPITAL LETTER UKRAINIAN IE */
+	XK_Ukranian_JE                   = 0x06b4,  /* deprecated */
+	XK_Macedonia_DSE                 = 0x06b5,  /* U+0405 CYRILLIC CAPITAL LETTER DZE */
+	XK_Ukrainian_I                   = 0x06b6,  /* U+0406 CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I */
+	XK_Ukranian_I                    = 0x06b6,  /* deprecated */
+	XK_Ukrainian_YI                  = 0x06b7,  /* U+0407 CYRILLIC CAPITAL LETTER YI */
+	XK_Ukranian_YI                   = 0x06b7,  /* deprecated */
+	XK_Cyrillic_JE                   = 0x06b8,  /* U+0408 CYRILLIC CAPITAL LETTER JE */
+	XK_Serbian_JE                    = 0x06b8,  /* deprecated */
+	XK_Cyrillic_LJE                  = 0x06b9,  /* U+0409 CYRILLIC CAPITAL LETTER LJE */
+	XK_Serbian_LJE                   = 0x06b9,  /* deprecated */
+	XK_Cyrillic_NJE                  = 0x06ba,  /* U+040A CYRILLIC CAPITAL LETTER NJE */
+	XK_Serbian_NJE                   = 0x06ba,  /* deprecated */
+	XK_Serbian_TSHE                  = 0x06bb,  /* U+040B CYRILLIC CAPITAL LETTER TSHE */
+	XK_Macedonia_KJE                 = 0x06bc,  /* U+040C CYRILLIC CAPITAL LETTER KJE */
+	XK_Ukrainian_GHE_WITH_UPTURN     = 0x06bd,  /* U+0490 CYRILLIC CAPITAL LETTER GHE WITH UPTURN */
+	XK_Byelorussian_SHORTU           = 0x06be,  /* U+040E CYRILLIC CAPITAL LETTER SHORT U */
+	XK_Cyrillic_DZHE                 = 0x06bf,  /* U+040F CYRILLIC CAPITAL LETTER DZHE */
+	XK_Serbian_DZE                   = 0x06bf,  /* deprecated */
+	XK_Cyrillic_yu                   = 0x06c0,  /* U+044E CYRILLIC SMALL LETTER YU */
+	XK_Cyrillic_a                    = 0x06c1,  /* U+0430 CYRILLIC SMALL LETTER A */
+	XK_Cyrillic_be                   = 0x06c2,  /* U+0431 CYRILLIC SMALL LETTER BE */
+	XK_Cyrillic_tse                  = 0x06c3,  /* U+0446 CYRILLIC SMALL LETTER TSE */
+	XK_Cyrillic_de                   = 0x06c4,  /* U+0434 CYRILLIC SMALL LETTER DE */
+	XK_Cyrillic_ie                   = 0x06c5,  /* U+0435 CYRILLIC SMALL LETTER IE */
+	XK_Cyrillic_ef                   = 0x06c6,  /* U+0444 CYRILLIC SMALL LETTER EF */
+	XK_Cyrillic_ghe                  = 0x06c7,  /* U+0433 CYRILLIC SMALL LETTER GHE */
+	XK_Cyrillic_ha                   = 0x06c8,  /* U+0445 CYRILLIC SMALL LETTER HA */
+	XK_Cyrillic_i                    = 0x06c9,  /* U+0438 CYRILLIC SMALL LETTER I */
+	XK_Cyrillic_shorti               = 0x06ca,  /* U+0439 CYRILLIC SMALL LETTER SHORT I */
+	XK_Cyrillic_ka                   = 0x06cb,  /* U+043A CYRILLIC SMALL LETTER KA */
+	XK_Cyrillic_el                   = 0x06cc,  /* U+043B CYRILLIC SMALL LETTER EL */
+	XK_Cyrillic_em                   = 0x06cd,  /* U+043C CYRILLIC SMALL LETTER EM */
+	XK_Cyrillic_en                   = 0x06ce,  /* U+043D CYRILLIC SMALL LETTER EN */
+	XK_Cyrillic_o                    = 0x06cf,  /* U+043E CYRILLIC SMALL LETTER O */
+	XK_Cyrillic_pe                   = 0x06d0,  /* U+043F CYRILLIC SMALL LETTER PE */
+	XK_Cyrillic_ya                   = 0x06d1,  /* U+044F CYRILLIC SMALL LETTER YA */
+	XK_Cyrillic_er                   = 0x06d2,  /* U+0440 CYRILLIC SMALL LETTER ER */
+	XK_Cyrillic_es                   = 0x06d3,  /* U+0441 CYRILLIC SMALL LETTER ES */
+	XK_Cyrillic_te                   = 0x06d4,  /* U+0442 CYRILLIC SMALL LETTER TE */
+	XK_Cyrillic_u                    = 0x06d5,  /* U+0443 CYRILLIC SMALL LETTER U */
+	XK_Cyrillic_zhe                  = 0x06d6,  /* U+0436 CYRILLIC SMALL LETTER ZHE */
+	XK_Cyrillic_ve                   = 0x06d7,  /* U+0432 CYRILLIC SMALL LETTER VE */
+	XK_Cyrillic_softsign             = 0x06d8,  /* U+044C CYRILLIC SMALL LETTER SOFT SIGN */
+	XK_Cyrillic_yeru                 = 0x06d9,  /* U+044B CYRILLIC SMALL LETTER YERU */
+	XK_Cyrillic_ze                   = 0x06da,  /* U+0437 CYRILLIC SMALL LETTER ZE */
+	XK_Cyrillic_sha                  = 0x06db,  /* U+0448 CYRILLIC SMALL LETTER SHA */
+	XK_Cyrillic_e                    = 0x06dc,  /* U+044D CYRILLIC SMALL LETTER E */
+	XK_Cyrillic_shcha                = 0x06dd,  /* U+0449 CYRILLIC SMALL LETTER SHCHA */
+	XK_Cyrillic_che                  = 0x06de,  /* U+0447 CYRILLIC SMALL LETTER CHE */
+	XK_Cyrillic_hardsign             = 0x06df,  /* U+044A CYRILLIC SMALL LETTER HARD SIGN */
+	XK_Cyrillic_YU                   = 0x06e0,  /* U+042E CYRILLIC CAPITAL LETTER YU */
+	XK_Cyrillic_A                    = 0x06e1,  /* U+0410 CYRILLIC CAPITAL LETTER A */
+	XK_Cyrillic_BE                   = 0x06e2,  /* U+0411 CYRILLIC CAPITAL LETTER BE */
+	XK_Cyrillic_TSE                  = 0x06e3,  /* U+0426 CYRILLIC CAPITAL LETTER TSE */
+	XK_Cyrillic_DE                   = 0x06e4,  /* U+0414 CYRILLIC CAPITAL LETTER DE */
+	XK_Cyrillic_IE                   = 0x06e5,  /* U+0415 CYRILLIC CAPITAL LETTER IE */
+	XK_Cyrillic_EF                   = 0x06e6,  /* U+0424 CYRILLIC CAPITAL LETTER EF */
+	XK_Cyrillic_GHE                  = 0x06e7,  /* U+0413 CYRILLIC CAPITAL LETTER GHE */
+	XK_Cyrillic_HA                   = 0x06e8,  /* U+0425 CYRILLIC CAPITAL LETTER HA */
+	XK_Cyrillic_I                    = 0x06e9,  /* U+0418 CYRILLIC CAPITAL LETTER I */
+	XK_Cyrillic_SHORTI               = 0x06ea,  /* U+0419 CYRILLIC CAPITAL LETTER SHORT I */
+	XK_Cyrillic_KA                   = 0x06eb,  /* U+041A CYRILLIC CAPITAL LETTER KA */
+	XK_Cyrillic_EL                   = 0x06ec,  /* U+041B CYRILLIC CAPITAL LETTER EL */
+	XK_Cyrillic_EM                   = 0x06ed,  /* U+041C CYRILLIC CAPITAL LETTER EM */
+	XK_Cyrillic_EN                   = 0x06ee,  /* U+041D CYRILLIC CAPITAL LETTER EN */
+	XK_Cyrillic_O                    = 0x06ef,  /* U+041E CYRILLIC CAPITAL LETTER O */
+	XK_Cyrillic_PE                   = 0x06f0,  /* U+041F CYRILLIC CAPITAL LETTER PE */
+	XK_Cyrillic_YA                   = 0x06f1,  /* U+042F CYRILLIC CAPITAL LETTER YA */
+	XK_Cyrillic_ER                   = 0x06f2,  /* U+0420 CYRILLIC CAPITAL LETTER ER */
+	XK_Cyrillic_ES                   = 0x06f3,  /* U+0421 CYRILLIC CAPITAL LETTER ES */
+	XK_Cyrillic_TE                   = 0x06f4,  /* U+0422 CYRILLIC CAPITAL LETTER TE */
+	XK_Cyrillic_U                    = 0x06f5,  /* U+0423 CYRILLIC CAPITAL LETTER U */
+	XK_Cyrillic_ZHE                  = 0x06f6,  /* U+0416 CYRILLIC CAPITAL LETTER ZHE */
+	XK_Cyrillic_VE                   = 0x06f7,  /* U+0412 CYRILLIC CAPITAL LETTER VE */
+	XK_Cyrillic_SOFTSIGN             = 0x06f8,  /* U+042C CYRILLIC CAPITAL LETTER SOFT SIGN */
+	XK_Cyrillic_YERU                 = 0x06f9,  /* U+042B CYRILLIC CAPITAL LETTER YERU */
+	XK_Cyrillic_ZE                   = 0x06fa,  /* U+0417 CYRILLIC CAPITAL LETTER ZE */
+	XK_Cyrillic_SHA                  = 0x06fb,  /* U+0428 CYRILLIC CAPITAL LETTER SHA */
+	XK_Cyrillic_E                    = 0x06fc,  /* U+042D CYRILLIC CAPITAL LETTER E */
+	XK_Cyrillic_SHCHA                = 0x06fd,  /* U+0429 CYRILLIC CAPITAL LETTER SHCHA */
+	XK_Cyrillic_CHE                  = 0x06fe,  /* U+0427 CYRILLIC CAPITAL LETTER CHE */
+	XK_Cyrillic_HARDSIGN             = 0x06ff,  /* U+042A CYRILLIC CAPITAL LETTER HARD SIGN */
+	XK_Greek_ALPHAaccent             = 0x07a1,  /* U+0386 GREEK CAPITAL LETTER ALPHA WITH TONOS */
+	XK_Greek_EPSILONaccent           = 0x07a2,  /* U+0388 GREEK CAPITAL LETTER EPSILON WITH TONOS */
+	XK_Greek_ETAaccent               = 0x07a3,  /* U+0389 GREEK CAPITAL LETTER ETA WITH TONOS */
+	XK_Greek_IOTAaccent              = 0x07a4,  /* U+038A GREEK CAPITAL LETTER IOTA WITH TONOS */
+	XK_Greek_IOTAdieresis            = 0x07a5,  /* U+03AA GREEK CAPITAL LETTER IOTA WITH DIALYTIKA */
+	XK_Greek_IOTAdiaeresis           = 0x07a5,  /* old typo */
+	XK_Greek_OMICRONaccent           = 0x07a7,  /* U+038C GREEK CAPITAL LETTER OMICRON WITH TONOS */
+	XK_Greek_UPSILONaccent           = 0x07a8,  /* U+038E GREEK CAPITAL LETTER UPSILON WITH TONOS */
+	XK_Greek_UPSILONdieresis         = 0x07a9,  /* U+03AB GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA */
+	XK_Greek_OMEGAaccent             = 0x07ab,  /* U+038F GREEK CAPITAL LETTER OMEGA WITH TONOS */
+	XK_Greek_accentdieresis          = 0x07ae,  /* U+0385 GREEK DIALYTIKA TONOS */
+	XK_Greek_horizbar                = 0x07af,  /* U+2015 HORIZONTAL BAR */
+	XK_Greek_alphaaccent             = 0x07b1,  /* U+03AC GREEK SMALL LETTER ALPHA WITH TONOS */
+	XK_Greek_epsilonaccent           = 0x07b2,  /* U+03AD GREEK SMALL LETTER EPSILON WITH TONOS */
+	XK_Greek_etaaccent               = 0x07b3,  /* U+03AE GREEK SMALL LETTER ETA WITH TONOS */
+	XK_Greek_iotaaccent              = 0x07b4,  /* U+03AF GREEK SMALL LETTER IOTA WITH TONOS */
+	XK_Greek_iotadieresis            = 0x07b5,  /* U+03CA GREEK SMALL LETTER IOTA WITH DIALYTIKA */
+	XK_Greek_iotaaccentdieresis      = 0x07b6,  /* U+0390 GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS */
+	XK_Greek_omicronaccent           = 0x07b7,  /* U+03CC GREEK SMALL LETTER OMICRON WITH TONOS */
+	XK_Greek_upsilonaccent           = 0x07b8,  /* U+03CD GREEK SMALL LETTER UPSILON WITH TONOS */
+	XK_Greek_upsilondieresis         = 0x07b9,  /* U+03CB GREEK SMALL LETTER UPSILON WITH DIALYTIKA */
+	XK_Greek_upsilonaccentdieresis   = 0x07ba,  /* U+03B0 GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS */
+	XK_Greek_omegaaccent             = 0x07bb,  /* U+03CE GREEK SMALL LETTER OMEGA WITH TONOS */
+	XK_Greek_ALPHA                   = 0x07c1,  /* U+0391 GREEK CAPITAL LETTER ALPHA */
+	XK_Greek_BETA                    = 0x07c2,  /* U+0392 GREEK CAPITAL LETTER BETA */
+	XK_Greek_GAMMA                   = 0x07c3,  /* U+0393 GREEK CAPITAL LETTER GAMMA */
+	XK_Greek_DELTA                   = 0x07c4,  /* U+0394 GREEK CAPITAL LETTER DELTA */
+	XK_Greek_EPSILON                 = 0x07c5,  /* U+0395 GREEK CAPITAL LETTER EPSILON */
+	XK_Greek_ZETA                    = 0x07c6,  /* U+0396 GREEK CAPITAL LETTER ZETA */
+	XK_Greek_ETA                     = 0x07c7,  /* U+0397 GREEK CAPITAL LETTER ETA */
+	XK_Greek_THETA                   = 0x07c8,  /* U+0398 GREEK CAPITAL LETTER THETA */
+	XK_Greek_IOTA                    = 0x07c9,  /* U+0399 GREEK CAPITAL LETTER IOTA */
+	XK_Greek_KAPPA                   = 0x07ca,  /* U+039A GREEK CAPITAL LETTER KAPPA */
+	XK_Greek_LAMDA                   = 0x07cb,  /* U+039B GREEK CAPITAL LETTER LAMDA */
+	XK_Greek_LAMBDA                  = 0x07cb,  /* U+039B GREEK CAPITAL LETTER LAMDA */
+	XK_Greek_MU                      = 0x07cc,  /* U+039C GREEK CAPITAL LETTER MU */
+	XK_Greek_NU                      = 0x07cd,  /* U+039D GREEK CAPITAL LETTER NU */
+	XK_Greek_XI                      = 0x07ce,  /* U+039E GREEK CAPITAL LETTER XI */
+	XK_Greek_OMICRON                 = 0x07cf,  /* U+039F GREEK CAPITAL LETTER OMICRON */
+	XK_Greek_PI                      = 0x07d0,  /* U+03A0 GREEK CAPITAL LETTER PI */
+	XK_Greek_RHO                     = 0x07d1,  /* U+03A1 GREEK CAPITAL LETTER RHO */
+	XK_Greek_SIGMA                   = 0x07d2,  /* U+03A3 GREEK CAPITAL LETTER SIGMA */
+	XK_Greek_TAU                     = 0x07d4,  /* U+03A4 GREEK CAPITAL LETTER TAU */
+	XK_Greek_UPSILON                 = 0x07d5,  /* U+03A5 GREEK CAPITAL LETTER UPSILON */
+	XK_Greek_PHI                     = 0x07d6,  /* U+03A6 GREEK CAPITAL LETTER PHI */
+	XK_Greek_CHI                     = 0x07d7,  /* U+03A7 GREEK CAPITAL LETTER CHI */
+	XK_Greek_PSI                     = 0x07d8,  /* U+03A8 GREEK CAPITAL LETTER PSI */
+	XK_Greek_OMEGA                   = 0x07d9,  /* U+03A9 GREEK CAPITAL LETTER OMEGA */
+	XK_Greek_alpha                   = 0x07e1,  /* U+03B1 GREEK SMALL LETTER ALPHA */
+	XK_Greek_beta                    = 0x07e2,  /* U+03B2 GREEK SMALL LETTER BETA */
+	XK_Greek_gamma                   = 0x07e3,  /* U+03B3 GREEK SMALL LETTER GAMMA */
+	XK_Greek_delta                   = 0x07e4,  /* U+03B4 GREEK SMALL LETTER DELTA */
+	XK_Greek_epsilon                 = 0x07e5,  /* U+03B5 GREEK SMALL LETTER EPSILON */
+	XK_Greek_zeta                    = 0x07e6,  /* U+03B6 GREEK SMALL LETTER ZETA */
+	XK_Greek_eta                     = 0x07e7,  /* U+03B7 GREEK SMALL LETTER ETA */
+	XK_Greek_theta                   = 0x07e8,  /* U+03B8 GREEK SMALL LETTER THETA */
+	XK_Greek_iota                    = 0x07e9,  /* U+03B9 GREEK SMALL LETTER IOTA */
+	XK_Greek_kappa                   = 0x07ea,  /* U+03BA GREEK SMALL LETTER KAPPA */
+	XK_Greek_lamda                   = 0x07eb,  /* U+03BB GREEK SMALL LETTER LAMDA */
+	XK_Greek_lambda                  = 0x07eb,  /* U+03BB GREEK SMALL LETTER LAMDA */
+	XK_Greek_mu                      = 0x07ec,  /* U+03BC GREEK SMALL LETTER MU */
+	XK_Greek_nu                      = 0x07ed,  /* U+03BD GREEK SMALL LETTER NU */
+	XK_Greek_xi                      = 0x07ee,  /* U+03BE GREEK SMALL LETTER XI */
+	XK_Greek_omicron                 = 0x07ef,  /* U+03BF GREEK SMALL LETTER OMICRON */
+	XK_Greek_pi                      = 0x07f0,  /* U+03C0 GREEK SMALL LETTER PI */
+	XK_Greek_rho                     = 0x07f1,  /* U+03C1 GREEK SMALL LETTER RHO */
+	XK_Greek_sigma                   = 0x07f2,  /* U+03C3 GREEK SMALL LETTER SIGMA */
+	XK_Greek_finalsmallsigma         = 0x07f3,  /* U+03C2 GREEK SMALL LETTER FINAL SIGMA */
+	XK_Greek_tau                     = 0x07f4,  /* U+03C4 GREEK SMALL LETTER TAU */
+	XK_Greek_upsilon                 = 0x07f5,  /* U+03C5 GREEK SMALL LETTER UPSILON */
+	XK_Greek_phi                     = 0x07f6,  /* U+03C6 GREEK SMALL LETTER PHI */
+	XK_Greek_chi                     = 0x07f7,  /* U+03C7 GREEK SMALL LETTER CHI */
+	XK_Greek_psi                     = 0x07f8,  /* U+03C8 GREEK SMALL LETTER PSI */
+	XK_Greek_omega                   = 0x07f9,  /* U+03C9 GREEK SMALL LETTER OMEGA */
+	XK_Greek_switch                  = 0xff7e,  /* Alias for mode_switch */
+	XK_leftradical                   = 0x08a1,  /* U+23B7 RADICAL SYMBOL BOTTOM */
+	XK_topleftradical                = 0x08a2,  /*(U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT)*/
+	XK_horizconnector                = 0x08a3,  /*(U+2500 BOX DRAWINGS LIGHT HORIZONTAL)*/
+	XK_topintegral                   = 0x08a4,  /* U+2320 TOP HALF INTEGRAL */
+	XK_botintegral                   = 0x08a5,  /* U+2321 BOTTOM HALF INTEGRAL */
+	XK_vertconnector                 = 0x08a6,  /*(U+2502 BOX DRAWINGS LIGHT VERTICAL)*/
+	XK_topleftsqbracket              = 0x08a7,  /* U+23A1 LEFT SQUARE BRACKET UPPER CORNER */
+	XK_botleftsqbracket              = 0x08a8,  /* U+23A3 LEFT SQUARE BRACKET LOWER CORNER */
+	XK_toprightsqbracket             = 0x08a9,  /* U+23A4 RIGHT SQUARE BRACKET UPPER CORNER */
+	XK_botrightsqbracket             = 0x08aa,  /* U+23A6 RIGHT SQUARE BRACKET LOWER CORNER */
+	XK_topleftparens                 = 0x08ab,  /* U+239B LEFT PARENTHESIS UPPER HOOK */
+	XK_botleftparens                 = 0x08ac,  /* U+239D LEFT PARENTHESIS LOWER HOOK */
+	XK_toprightparens                = 0x08ad,  /* U+239E RIGHT PARENTHESIS UPPER HOOK */
+	XK_botrightparens                = 0x08ae,  /* U+23A0 RIGHT PARENTHESIS LOWER HOOK */
+	XK_leftmiddlecurlybrace          = 0x08af,  /* U+23A8 LEFT CURLY BRACKET MIDDLE PIECE */
+	XK_rightmiddlecurlybrace         = 0x08b0,  /* U+23AC RIGHT CURLY BRACKET MIDDLE PIECE */
+	XK_topleftsummation              = 0x08b1,
+	XK_botleftsummation              = 0x08b2,
+	XK_topvertsummationconnector     = 0x08b3,
+	XK_botvertsummationconnector     = 0x08b4,
+	XK_toprightsummation             = 0x08b5,
+	XK_botrightsummation             = 0x08b6,
+	XK_rightmiddlesummation          = 0x08b7,
+	XK_lessthanequal                 = 0x08bc,  /* U+2264 LESS-THAN OR EQUAL TO */
+	XK_notequal                      = 0x08bd,  /* U+2260 NOT EQUAL TO */
+	XK_greaterthanequal              = 0x08be,  /* U+2265 GREATER-THAN OR EQUAL TO */
+	XK_integral                      = 0x08bf,  /* U+222B INTEGRAL */
+	XK_therefore                     = 0x08c0,  /* U+2234 THEREFORE */
+	XK_variation                     = 0x08c1,  /* U+221D PROPORTIONAL TO */
+	XK_infinity                      = 0x08c2,  /* U+221E INFINITY */
+	XK_nabla                         = 0x08c5,  /* U+2207 NABLA */
+	XK_approximate                   = 0x08c8,  /* U+223C TILDE OPERATOR */
+	XK_similarequal                  = 0x08c9,  /* U+2243 ASYMPTOTICALLY EQUAL TO */
+	XK_ifonlyif                      = 0x08cd,  /* U+21D4 LEFT RIGHT DOUBLE ARROW */
+	XK_implies                       = 0x08ce,  /* U+21D2 RIGHTWARDS DOUBLE ARROW */
+	XK_identical                     = 0x08cf,  /* U+2261 IDENTICAL TO */
+	XK_radical                       = 0x08d6,  /* U+221A SQUARE ROOT */
+	XK_includedin                    = 0x08da,  /* U+2282 SUBSET OF */
+	XK_includes                      = 0x08db,  /* U+2283 SUPERSET OF */
+	XK_intersection                  = 0x08dc,  /* U+2229 INTERSECTION */
+	XK_union                         = 0x08dd,  /* U+222A UNION */
+	XK_logicaland                    = 0x08de,  /* U+2227 LOGICAL AND */
+	XK_logicalor                     = 0x08df,  /* U+2228 LOGICAL OR */
+	XK_partialderivative             = 0x08ef,  /* U+2202 PARTIAL DIFFERENTIAL */
+	XK_function                      = 0x08f6,  /* U+0192 LATIN SMALL LETTER F WITH HOOK */
+	XK_leftarrow                     = 0x08fb,  /* U+2190 LEFTWARDS ARROW */
+	XK_uparrow                       = 0x08fc,  /* U+2191 UPWARDS ARROW */
+	XK_rightarrow                    = 0x08fd,  /* U+2192 RIGHTWARDS ARROW */
+	XK_downarrow                     = 0x08fe,  /* U+2193 DOWNWARDS ARROW */
+	XK_blank                         = 0x09df,
+	XK_soliddiamond                  = 0x09e0,  /* U+25C6 BLACK DIAMOND */
+	XK_checkerboard                  = 0x09e1,  /* U+2592 MEDIUM SHADE */
+	XK_ht                            = 0x09e2,  /* U+2409 SYMBOL FOR HORIZONTAL TABULATION */
+	XK_ff                            = 0x09e3,  /* U+240C SYMBOL FOR FORM FEED */
+	XK_cr                            = 0x09e4,  /* U+240D SYMBOL FOR CARRIAGE RETURN */
+	XK_lf                            = 0x09e5,  /* U+240A SYMBOL FOR LINE FEED */
+	XK_nl                            = 0x09e8,  /* U+2424 SYMBOL FOR NEWLINE */
+	XK_vt                            = 0x09e9,  /* U+240B SYMBOL FOR VERTICAL TABULATION */
+	XK_lowrightcorner                = 0x09ea,  /* U+2518 BOX DRAWINGS LIGHT UP AND LEFT */
+	XK_uprightcorner                 = 0x09eb,  /* U+2510 BOX DRAWINGS LIGHT DOWN AND LEFT */
+	XK_upleftcorner                  = 0x09ec,  /* U+250C BOX DRAWINGS LIGHT DOWN AND RIGHT */
+	XK_lowleftcorner                 = 0x09ed,  /* U+2514 BOX DRAWINGS LIGHT UP AND RIGHT */
+	XK_crossinglines                 = 0x09ee,  /* U+253C BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL */
+	XK_horizlinescan1                = 0x09ef,  /* U+23BA HORIZONTAL SCAN LINE-1 */
+	XK_horizlinescan3                = 0x09f0,  /* U+23BB HORIZONTAL SCAN LINE-3 */
+	XK_horizlinescan5                = 0x09f1,  /* U+2500 BOX DRAWINGS LIGHT HORIZONTAL */
+	XK_horizlinescan7                = 0x09f2,  /* U+23BC HORIZONTAL SCAN LINE-7 */
+	XK_horizlinescan9                = 0x09f3,  /* U+23BD HORIZONTAL SCAN LINE-9 */
+	XK_leftt                         = 0x09f4,  /* U+251C BOX DRAWINGS LIGHT VERTICAL AND RIGHT */
+	XK_rightt                        = 0x09f5,  /* U+2524 BOX DRAWINGS LIGHT VERTICAL AND LEFT */
+	XK_bott                          = 0x09f6,  /* U+2534 BOX DRAWINGS LIGHT UP AND HORIZONTAL */
+	XK_topt                          = 0x09f7,  /* U+252C BOX DRAWINGS LIGHT DOWN AND HORIZONTAL */
+	XK_vertbar                       = 0x09f8,  /* U+2502 BOX DRAWINGS LIGHT VERTICAL */
+	XK_emspace                       = 0x0aa1,  /* U+2003 EM SPACE */
+	XK_enspace                       = 0x0aa2,  /* U+2002 EN SPACE */
+	XK_em3space                      = 0x0aa3,  /* U+2004 THREE-PER-EM SPACE */
+	XK_em4space                      = 0x0aa4,  /* U+2005 FOUR-PER-EM SPACE */
+	XK_digitspace                    = 0x0aa5,  /* U+2007 FIGURE SPACE */
+	XK_punctspace                    = 0x0aa6,  /* U+2008 PUNCTUATION SPACE */
+	XK_thinspace                     = 0x0aa7,  /* U+2009 THIN SPACE */
+	XK_hairspace                     = 0x0aa8,  /* U+200A HAIR SPACE */
+	XK_emdash                        = 0x0aa9,  /* U+2014 EM DASH */
+	XK_endash                        = 0x0aaa,  /* U+2013 EN DASH */
+	XK_signifblank                   = 0x0aac,  /*(U+2423 OPEN BOX)*/
+	XK_ellipsis                      = 0x0aae,  /* U+2026 HORIZONTAL ELLIPSIS */
+	XK_doubbaselinedot               = 0x0aaf,  /* U+2025 TWO DOT LEADER */
+	XK_onethird                      = 0x0ab0,  /* U+2153 VULGAR FRACTION ONE THIRD */
+	XK_twothirds                     = 0x0ab1,  /* U+2154 VULGAR FRACTION TWO THIRDS */
+	XK_onefifth                      = 0x0ab2,  /* U+2155 VULGAR FRACTION ONE FIFTH */
+	XK_twofifths                     = 0x0ab3,  /* U+2156 VULGAR FRACTION TWO FIFTHS */
+	XK_threefifths                   = 0x0ab4,  /* U+2157 VULGAR FRACTION THREE FIFTHS */
+	XK_fourfifths                    = 0x0ab5,  /* U+2158 VULGAR FRACTION FOUR FIFTHS */
+	XK_onesixth                      = 0x0ab6,  /* U+2159 VULGAR FRACTION ONE SIXTH */
+	XK_fivesixths                    = 0x0ab7,  /* U+215A VULGAR FRACTION FIVE SIXTHS */
+	XK_careof                        = 0x0ab8,  /* U+2105 CARE OF */
+	XK_figdash                       = 0x0abb,  /* U+2012 FIGURE DASH */
+	XK_leftanglebracket              = 0x0abc,  /*(U+27E8 MATHEMATICAL LEFT ANGLE BRACKET)*/
+	XK_decimalpoint                  = 0x0abd,  /*(U+002E FULL STOP)*/
+	XK_rightanglebracket             = 0x0abe,  /*(U+27E9 MATHEMATICAL RIGHT ANGLE BRACKET)*/
+	XK_marker                        = 0x0abf,
+	XK_oneeighth                     = 0x0ac3,  /* U+215B VULGAR FRACTION ONE EIGHTH */
+	XK_threeeighths                  = 0x0ac4,  /* U+215C VULGAR FRACTION THREE EIGHTHS */
+	XK_fiveeighths                   = 0x0ac5,  /* U+215D VULGAR FRACTION FIVE EIGHTHS */
+	XK_seveneighths                  = 0x0ac6,  /* U+215E VULGAR FRACTION SEVEN EIGHTHS */
+	XK_trademark                     = 0x0ac9,  /* U+2122 TRADE MARK SIGN */
+	XK_signaturemark                 = 0x0aca,  /*(U+2613 SALTIRE)*/
+	XK_trademarkincircle             = 0x0acb,
+	XK_leftopentriangle              = 0x0acc,  /*(U+25C1 WHITE LEFT-POINTING TRIANGLE)*/
+	XK_rightopentriangle             = 0x0acd,  /*(U+25B7 WHITE RIGHT-POINTING TRIANGLE)*/
+	XK_emopencircle                  = 0x0ace,  /*(U+25CB WHITE CIRCLE)*/
+	XK_emopenrectangle               = 0x0acf,  /*(U+25AF WHITE VERTICAL RECTANGLE)*/
+	XK_leftsinglequotemark           = 0x0ad0,  /* U+2018 LEFT SINGLE QUOTATION MARK */
+	XK_rightsinglequotemark          = 0x0ad1,  /* U+2019 RIGHT SINGLE QUOTATION MARK */
+	XK_leftdoublequotemark           = 0x0ad2,  /* U+201C LEFT DOUBLE QUOTATION MARK */
+	XK_rightdoublequotemark          = 0x0ad3,  /* U+201D RIGHT DOUBLE QUOTATION MARK */
+	XK_prescription                  = 0x0ad4,  /* U+211E PRESCRIPTION TAKE */
+	XK_minutes                       = 0x0ad6,  /* U+2032 PRIME */
+	XK_seconds                       = 0x0ad7,  /* U+2033 DOUBLE PRIME */
+	XK_latincross                    = 0x0ad9,  /* U+271D LATIN CROSS */
+	XK_hexagram                      = 0x0ada,
+	XK_filledrectbullet              = 0x0adb,  /*(U+25AC BLACK RECTANGLE)*/
+	XK_filledlefttribullet           = 0x0adc,  /*(U+25C0 BLACK LEFT-POINTING TRIANGLE)*/
+	XK_filledrighttribullet          = 0x0add,  /*(U+25B6 BLACK RIGHT-POINTING TRIANGLE)*/
+	XK_emfilledcircle                = 0x0ade,  /*(U+25CF BLACK CIRCLE)*/
+	XK_emfilledrect                  = 0x0adf,  /*(U+25AE BLACK VERTICAL RECTANGLE)*/
+	XK_enopencircbullet              = 0x0ae0,  /*(U+25E6 WHITE BULLET)*/
+	XK_enopensquarebullet            = 0x0ae1,  /*(U+25AB WHITE SMALL SQUARE)*/
+	XK_openrectbullet                = 0x0ae2,  /*(U+25AD WHITE RECTANGLE)*/
+	XK_opentribulletup               = 0x0ae3,  /*(U+25B3 WHITE UP-POINTING TRIANGLE)*/
+	XK_opentribulletdown             = 0x0ae4,  /*(U+25BD WHITE DOWN-POINTING TRIANGLE)*/
+	XK_openstar                      = 0x0ae5,  /*(U+2606 WHITE STAR)*/
+	XK_enfilledcircbullet            = 0x0ae6,  /*(U+2022 BULLET)*/
+	XK_enfilledsqbullet              = 0x0ae7,  /*(U+25AA BLACK SMALL SQUARE)*/
+	XK_filledtribulletup             = 0x0ae8,  /*(U+25B2 BLACK UP-POINTING TRIANGLE)*/
+	XK_filledtribulletdown           = 0x0ae9,  /*(U+25BC BLACK DOWN-POINTING TRIANGLE)*/
+	XK_leftpointer                   = 0x0aea,  /*(U+261C WHITE LEFT POINTING INDEX)*/
+	XK_rightpointer                  = 0x0aeb,  /*(U+261E WHITE RIGHT POINTING INDEX)*/
+	XK_club                          = 0x0aec,  /* U+2663 BLACK CLUB SUIT */
+	XK_diamond                       = 0x0aed,  /* U+2666 BLACK DIAMOND SUIT */
+	XK_heart                         = 0x0aee,  /* U+2665 BLACK HEART SUIT */
+	XK_maltesecross                  = 0x0af0,  /* U+2720 MALTESE CROSS */
+	XK_dagger                        = 0x0af1,  /* U+2020 DAGGER */
+	XK_doubledagger                  = 0x0af2,  /* U+2021 DOUBLE DAGGER */
+	XK_checkmark                     = 0x0af3,  /* U+2713 CHECK MARK */
+	XK_ballotcross                   = 0x0af4,  /* U+2717 BALLOT X */
+	XK_musicalsharp                  = 0x0af5,  /* U+266F MUSIC SHARP SIGN */
+	XK_musicalflat                   = 0x0af6,  /* U+266D MUSIC FLAT SIGN */
+	XK_malesymbol                    = 0x0af7,  /* U+2642 MALE SIGN */
+	XK_femalesymbol                  = 0x0af8,  /* U+2640 FEMALE SIGN */
+	XK_telephone                     = 0x0af9,  /* U+260E BLACK TELEPHONE */
+	XK_telephonerecorder             = 0x0afa,  /* U+2315 TELEPHONE RECORDER */
+	XK_phonographcopyright           = 0x0afb,  /* U+2117 SOUND RECORDING COPYRIGHT */
+	XK_caret                         = 0x0afc,  /* U+2038 CARET */
+	XK_singlelowquotemark            = 0x0afd,  /* U+201A SINGLE LOW-9 QUOTATION MARK */
+	XK_doublelowquotemark            = 0x0afe,  /* U+201E DOUBLE LOW-9 QUOTATION MARK */
+	XK_cursor                        = 0x0aff,
+	XK_leftcaret                     = 0x0ba3,  /*(U+003C LESS-THAN SIGN)*/
+	XK_rightcaret                    = 0x0ba6,  /*(U+003E GREATER-THAN SIGN)*/
+	XK_downcaret                     = 0x0ba8,  /*(U+2228 LOGICAL OR)*/
+	XK_upcaret                       = 0x0ba9,  /*(U+2227 LOGICAL AND)*/
+	XK_overbar                       = 0x0bc0,  /*(U+00AF MACRON)*/
+	XK_downtack                      = 0x0bc2,  /* U+22A5 UP TACK */
+	XK_upshoe                        = 0x0bc3,  /*(U+2229 INTERSECTION)*/
+	XK_downstile                     = 0x0bc4,  /* U+230A LEFT FLOOR */
+	XK_underbar                      = 0x0bc6,  /*(U+005F LOW LINE)*/
+	XK_jot                           = 0x0bca,  /* U+2218 RING OPERATOR */
+	XK_quad                          = 0x0bcc,  /* U+2395 APL FUNCTIONAL SYMBOL QUAD */
+	XK_uptack                        = 0x0bce,  /* U+22A4 DOWN TACK */
+	XK_circle                        = 0x0bcf,  /* U+25CB WHITE CIRCLE */
+	XK_upstile                       = 0x0bd3,  /* U+2308 LEFT CEILING */
+	XK_downshoe                      = 0x0bd6,  /*(U+222A UNION)*/
+	XK_rightshoe                     = 0x0bd8,  /*(U+2283 SUPERSET OF)*/
+	XK_leftshoe                      = 0x0bda,  /*(U+2282 SUBSET OF)*/
+	XK_lefttack                      = 0x0bdc,  /* U+22A2 RIGHT TACK */
+	XK_righttack                     = 0x0bfc,  /* U+22A3 LEFT TACK */
+	XK_hebrew_doublelowline          = 0x0cdf,  /* U+2017 DOUBLE LOW LINE */
+	XK_hebrew_aleph                  = 0x0ce0,  /* U+05D0 HEBREW LETTER ALEF */
+	XK_hebrew_bet                    = 0x0ce1,  /* U+05D1 HEBREW LETTER BET */
+	XK_hebrew_beth                   = 0x0ce1,  /* deprecated */
+	XK_hebrew_gimel                  = 0x0ce2,  /* U+05D2 HEBREW LETTER GIMEL */
+	XK_hebrew_gimmel                 = 0x0ce2,  /* deprecated */
+	XK_hebrew_dalet                  = 0x0ce3,  /* U+05D3 HEBREW LETTER DALET */
+	XK_hebrew_daleth                 = 0x0ce3,  /* deprecated */
+	XK_hebrew_he                     = 0x0ce4,  /* U+05D4 HEBREW LETTER HE */
+	XK_hebrew_waw                    = 0x0ce5,  /* U+05D5 HEBREW LETTER VAV */
+	XK_hebrew_zain                   = 0x0ce6,  /* U+05D6 HEBREW LETTER ZAYIN */
+	XK_hebrew_zayin                  = 0x0ce6,  /* deprecated */
+	XK_hebrew_chet                   = 0x0ce7,  /* U+05D7 HEBREW LETTER HET */
+	XK_hebrew_het                    = 0x0ce7,  /* deprecated */
+	XK_hebrew_tet                    = 0x0ce8,  /* U+05D8 HEBREW LETTER TET */
+	XK_hebrew_teth                   = 0x0ce8,  /* deprecated */
+	XK_hebrew_yod                    = 0x0ce9,  /* U+05D9 HEBREW LETTER YOD */
+	XK_hebrew_finalkaph              = 0x0cea,  /* U+05DA HEBREW LETTER FINAL KAF */
+	XK_hebrew_kaph                   = 0x0ceb,  /* U+05DB HEBREW LETTER KAF */
+	XK_hebrew_lamed                  = 0x0cec,  /* U+05DC HEBREW LETTER LAMED */
+	XK_hebrew_finalmem               = 0x0ced,  /* U+05DD HEBREW LETTER FINAL MEM */
+	XK_hebrew_mem                    = 0x0cee,  /* U+05DE HEBREW LETTER MEM */
+	XK_hebrew_finalnun               = 0x0cef,  /* U+05DF HEBREW LETTER FINAL NUN */
+	XK_hebrew_nun                    = 0x0cf0,  /* U+05E0 HEBREW LETTER NUN */
+	XK_hebrew_samech                 = 0x0cf1,  /* U+05E1 HEBREW LETTER SAMEKH */
+	XK_hebrew_samekh                 = 0x0cf1,  /* deprecated */
+	XK_hebrew_ayin                   = 0x0cf2,  /* U+05E2 HEBREW LETTER AYIN */
+	XK_hebrew_finalpe                = 0x0cf3,  /* U+05E3 HEBREW LETTER FINAL PE */
+	XK_hebrew_pe                     = 0x0cf4,  /* U+05E4 HEBREW LETTER PE */
+	XK_hebrew_finalzade              = 0x0cf5,  /* U+05E5 HEBREW LETTER FINAL TSADI */
+	XK_hebrew_finalzadi              = 0x0cf5,  /* deprecated */
+	XK_hebrew_zade                   = 0x0cf6,  /* U+05E6 HEBREW LETTER TSADI */
+	XK_hebrew_zadi                   = 0x0cf6,  /* deprecated */
+	XK_hebrew_qoph                   = 0x0cf7,  /* U+05E7 HEBREW LETTER QOF */
+	XK_hebrew_kuf                    = 0x0cf7,  /* deprecated */
+	XK_hebrew_resh                   = 0x0cf8,  /* U+05E8 HEBREW LETTER RESH */
+	XK_hebrew_shin                   = 0x0cf9,  /* U+05E9 HEBREW LETTER SHIN */
+	XK_hebrew_taw                    = 0x0cfa,  /* U+05EA HEBREW LETTER TAV */
+	XK_hebrew_taf                    = 0x0cfa,  /* deprecated */
+	XK_Hebrew_switch                 = 0xff7e,  /* Alias for mode_switch */
+	XK_Thai_kokai                    = 0x0da1,  /* U+0E01 THAI CHARACTER KO KAI */
+	XK_Thai_khokhai                  = 0x0da2,  /* U+0E02 THAI CHARACTER KHO KHAI */
+	XK_Thai_khokhuat                 = 0x0da3,  /* U+0E03 THAI CHARACTER KHO KHUAT */
+	XK_Thai_khokhwai                 = 0x0da4,  /* U+0E04 THAI CHARACTER KHO KHWAI */
+	XK_Thai_khokhon                  = 0x0da5,  /* U+0E05 THAI CHARACTER KHO KHON */
+	XK_Thai_khorakhang               = 0x0da6,  /* U+0E06 THAI CHARACTER KHO RAKHANG */
+	XK_Thai_ngongu                   = 0x0da7,  /* U+0E07 THAI CHARACTER NGO NGU */
+	XK_Thai_chochan                  = 0x0da8,  /* U+0E08 THAI CHARACTER CHO CHAN */
+	XK_Thai_choching                 = 0x0da9,  /* U+0E09 THAI CHARACTER CHO CHING */
+	XK_Thai_chochang                 = 0x0daa,  /* U+0E0A THAI CHARACTER CHO CHANG */
+	XK_Thai_soso                     = 0x0dab,  /* U+0E0B THAI CHARACTER SO SO */
+	XK_Thai_chochoe                  = 0x0dac,  /* U+0E0C THAI CHARACTER CHO CHOE */
+	XK_Thai_yoying                   = 0x0dad,  /* U+0E0D THAI CHARACTER YO YING */
+	XK_Thai_dochada                  = 0x0dae,  /* U+0E0E THAI CHARACTER DO CHADA */
+	XK_Thai_topatak                  = 0x0daf,  /* U+0E0F THAI CHARACTER TO PATAK */
+	XK_Thai_thothan                  = 0x0db0,  /* U+0E10 THAI CHARACTER THO THAN */
+	XK_Thai_thonangmontho            = 0x0db1,  /* U+0E11 THAI CHARACTER THO NANGMONTHO */
+	XK_Thai_thophuthao               = 0x0db2,  /* U+0E12 THAI CHARACTER THO PHUTHAO */
+	XK_Thai_nonen                    = 0x0db3,  /* U+0E13 THAI CHARACTER NO NEN */
+	XK_Thai_dodek                    = 0x0db4,  /* U+0E14 THAI CHARACTER DO DEK */
+	XK_Thai_totao                    = 0x0db5,  /* U+0E15 THAI CHARACTER TO TAO */
+	XK_Thai_thothung                 = 0x0db6,  /* U+0E16 THAI CHARACTER THO THUNG */
+	XK_Thai_thothahan                = 0x0db7,  /* U+0E17 THAI CHARACTER THO THAHAN */
+	XK_Thai_thothong                 = 0x0db8,  /* U+0E18 THAI CHARACTER THO THONG */
+	XK_Thai_nonu                     = 0x0db9,  /* U+0E19 THAI CHARACTER NO NU */
+	XK_Thai_bobaimai                 = 0x0dba,  /* U+0E1A THAI CHARACTER BO BAIMAI */
+	XK_Thai_popla                    = 0x0dbb,  /* U+0E1B THAI CHARACTER PO PLA */
+	XK_Thai_phophung                 = 0x0dbc,  /* U+0E1C THAI CHARACTER PHO PHUNG */
+	XK_Thai_fofa                     = 0x0dbd,  /* U+0E1D THAI CHARACTER FO FA */
+	XK_Thai_phophan                  = 0x0dbe,  /* U+0E1E THAI CHARACTER PHO PHAN */
+	XK_Thai_fofan                    = 0x0dbf,  /* U+0E1F THAI CHARACTER FO FAN */
+	XK_Thai_phosamphao               = 0x0dc0,  /* U+0E20 THAI CHARACTER PHO SAMPHAO */
+	XK_Thai_moma                     = 0x0dc1,  /* U+0E21 THAI CHARACTER MO MA */
+	XK_Thai_yoyak                    = 0x0dc2,  /* U+0E22 THAI CHARACTER YO YAK */
+	XK_Thai_rorua                    = 0x0dc3,  /* U+0E23 THAI CHARACTER RO RUA */
+	XK_Thai_ru                       = 0x0dc4,  /* U+0E24 THAI CHARACTER RU */
+	XK_Thai_loling                   = 0x0dc5,  /* U+0E25 THAI CHARACTER LO LING */
+	XK_Thai_lu                       = 0x0dc6,  /* U+0E26 THAI CHARACTER LU */
+	XK_Thai_wowaen                   = 0x0dc7,  /* U+0E27 THAI CHARACTER WO WAEN */
+	XK_Thai_sosala                   = 0x0dc8,  /* U+0E28 THAI CHARACTER SO SALA */
+	XK_Thai_sorusi                   = 0x0dc9,  /* U+0E29 THAI CHARACTER SO RUSI */
+	XK_Thai_sosua                    = 0x0dca,  /* U+0E2A THAI CHARACTER SO SUA */
+	XK_Thai_hohip                    = 0x0dcb,  /* U+0E2B THAI CHARACTER HO HIP */
+	XK_Thai_lochula                  = 0x0dcc,  /* U+0E2C THAI CHARACTER LO CHULA */
+	XK_Thai_oang                     = 0x0dcd,  /* U+0E2D THAI CHARACTER O ANG */
+	XK_Thai_honokhuk                 = 0x0dce,  /* U+0E2E THAI CHARACTER HO NOKHUK */
+	XK_Thai_paiyannoi                = 0x0dcf,  /* U+0E2F THAI CHARACTER PAIYANNOI */
+	XK_Thai_saraa                    = 0x0dd0,  /* U+0E30 THAI CHARACTER SARA A */
+	XK_Thai_maihanakat               = 0x0dd1,  /* U+0E31 THAI CHARACTER MAI HAN-AKAT */
+	XK_Thai_saraaa                   = 0x0dd2,  /* U+0E32 THAI CHARACTER SARA AA */
+	XK_Thai_saraam                   = 0x0dd3,  /* U+0E33 THAI CHARACTER SARA AM */
+	XK_Thai_sarai                    = 0x0dd4,  /* U+0E34 THAI CHARACTER SARA I */
+	XK_Thai_saraii                   = 0x0dd5,  /* U+0E35 THAI CHARACTER SARA II */
+	XK_Thai_saraue                   = 0x0dd6,  /* U+0E36 THAI CHARACTER SARA UE */
+	XK_Thai_sarauee                  = 0x0dd7,  /* U+0E37 THAI CHARACTER SARA UEE */
+	XK_Thai_sarau                    = 0x0dd8,  /* U+0E38 THAI CHARACTER SARA U */
+	XK_Thai_sarauu                   = 0x0dd9,  /* U+0E39 THAI CHARACTER SARA UU */
+	XK_Thai_phinthu                  = 0x0dda,  /* U+0E3A THAI CHARACTER PHINTHU */
+	XK_Thai_maihanakat_maitho        = 0x0dde,
+	XK_Thai_baht                     = 0x0ddf,  /* U+0E3F THAI CURRENCY SYMBOL BAHT */
+	XK_Thai_sarae                    = 0x0de0,  /* U+0E40 THAI CHARACTER SARA E */
+	XK_Thai_saraae                   = 0x0de1,  /* U+0E41 THAI CHARACTER SARA AE */
+	XK_Thai_sarao                    = 0x0de2,  /* U+0E42 THAI CHARACTER SARA O */
+	XK_Thai_saraaimaimuan            = 0x0de3,  /* U+0E43 THAI CHARACTER SARA AI MAIMUAN */
+	XK_Thai_saraaimaimalai           = 0x0de4,  /* U+0E44 THAI CHARACTER SARA AI MAIMALAI */
+	XK_Thai_lakkhangyao              = 0x0de5,  /* U+0E45 THAI CHARACTER LAKKHANGYAO */
+	XK_Thai_maiyamok                 = 0x0de6,  /* U+0E46 THAI CHARACTER MAIYAMOK */
+	XK_Thai_maitaikhu                = 0x0de7,  /* U+0E47 THAI CHARACTER MAITAIKHU */
+	XK_Thai_maiek                    = 0x0de8,  /* U+0E48 THAI CHARACTER MAI EK */
+	XK_Thai_maitho                   = 0x0de9,  /* U+0E49 THAI CHARACTER MAI THO */
+	XK_Thai_maitri                   = 0x0dea,  /* U+0E4A THAI CHARACTER MAI TRI */
+	XK_Thai_maichattawa              = 0x0deb,  /* U+0E4B THAI CHARACTER MAI CHATTAWA */
+	XK_Thai_thanthakhat              = 0x0dec,  /* U+0E4C THAI CHARACTER THANTHAKHAT */
+	XK_Thai_nikhahit                 = 0x0ded,  /* U+0E4D THAI CHARACTER NIKHAHIT */
+	XK_Thai_leksun                   = 0x0df0,  /* U+0E50 THAI DIGIT ZERO */
+	XK_Thai_leknung                  = 0x0df1,  /* U+0E51 THAI DIGIT ONE */
+	XK_Thai_leksong                  = 0x0df2,  /* U+0E52 THAI DIGIT TWO */
+	XK_Thai_leksam                   = 0x0df3,  /* U+0E53 THAI DIGIT THREE */
+	XK_Thai_leksi                    = 0x0df4,  /* U+0E54 THAI DIGIT FOUR */
+	XK_Thai_lekha                    = 0x0df5,  /* U+0E55 THAI DIGIT FIVE */
+	XK_Thai_lekhok                   = 0x0df6,  /* U+0E56 THAI DIGIT SIX */
+	XK_Thai_lekchet                  = 0x0df7,  /* U+0E57 THAI DIGIT SEVEN */
+	XK_Thai_lekpaet                  = 0x0df8,  /* U+0E58 THAI DIGIT EIGHT */
+	XK_Thai_lekkao                   = 0x0df9,  /* U+0E59 THAI DIGIT NINE */
+	XK_Hangul                        = 0xff31,  /* Hangul start/stop(toggle) */
+	XK_Hangul_Start                  = 0xff32,  /* Hangul start */
+	XK_Hangul_End                    = 0xff33,  /* Hangul end, English start */
+	XK_Hangul_Hanja                  = 0xff34,  /* Start Hangul->Hanja Conversion */
+	XK_Hangul_Jamo                   = 0xff35,  /* Hangul Jamo mode */
+	XK_Hangul_Romaja                 = 0xff36,  /* Hangul Romaja mode */
+	XK_Hangul_Codeinput              = 0xff37,  /* Hangul code input mode */
+	XK_Hangul_Jeonja                 = 0xff38,  /* Jeonja mode */
+	XK_Hangul_Banja                  = 0xff39,  /* Banja mode */
+	XK_Hangul_PreHanja               = 0xff3a,  /* Pre Hanja conversion */
+	XK_Hangul_PostHanja              = 0xff3b,  /* Post Hanja conversion */
+	XK_Hangul_SingleCandidate        = 0xff3c,  /* Single candidate */
+	XK_Hangul_MultipleCandidate      = 0xff3d,  /* Multiple candidate */
+	XK_Hangul_PreviousCandidate      = 0xff3e,  /* Previous candidate */
+	XK_Hangul_Special                = 0xff3f,  /* Special symbols */
+	XK_Hangul_switch                 = 0xff7e,  /* Alias for mode_switch */
+	XK_Hangul_Kiyeog                 = 0x0ea1,
+	XK_Hangul_SsangKiyeog            = 0x0ea2,
+	XK_Hangul_KiyeogSios             = 0x0ea3,
+	XK_Hangul_Nieun                  = 0x0ea4,
+	XK_Hangul_NieunJieuj             = 0x0ea5,
+	XK_Hangul_NieunHieuh             = 0x0ea6,
+	XK_Hangul_Dikeud                 = 0x0ea7,
+	XK_Hangul_SsangDikeud            = 0x0ea8,
+	XK_Hangul_Rieul                  = 0x0ea9,
+	XK_Hangul_RieulKiyeog            = 0x0eaa,
+	XK_Hangul_RieulMieum             = 0x0eab,
+	XK_Hangul_RieulPieub             = 0x0eac,
+	XK_Hangul_RieulSios              = 0x0ead,
+	XK_Hangul_RieulTieut             = 0x0eae,
+	XK_Hangul_RieulPhieuf            = 0x0eaf,
+	XK_Hangul_RieulHieuh             = 0x0eb0,
+	XK_Hangul_Mieum                  = 0x0eb1,
+	XK_Hangul_Pieub                  = 0x0eb2,
+	XK_Hangul_SsangPieub             = 0x0eb3,
+	XK_Hangul_PieubSios              = 0x0eb4,
+	XK_Hangul_Sios                   = 0x0eb5,
+	XK_Hangul_SsangSios              = 0x0eb6,
+	XK_Hangul_Ieung                  = 0x0eb7,
+	XK_Hangul_Jieuj                  = 0x0eb8,
+	XK_Hangul_SsangJieuj             = 0x0eb9,
+	XK_Hangul_Cieuc                  = 0x0eba,
+	XK_Hangul_Khieuq                 = 0x0ebb,
+	XK_Hangul_Tieut                  = 0x0ebc,
+	XK_Hangul_Phieuf                 = 0x0ebd,
+	XK_Hangul_Hieuh                  = 0x0ebe,
+	XK_Hangul_A                      = 0x0ebf,
+	XK_Hangul_AE                     = 0x0ec0,
+	XK_Hangul_YA                     = 0x0ec1,
+	XK_Hangul_YAE                    = 0x0ec2,
+	XK_Hangul_EO                     = 0x0ec3,
+	XK_Hangul_E                      = 0x0ec4,
+	XK_Hangul_YEO                    = 0x0ec5,
+	XK_Hangul_YE                     = 0x0ec6,
+	XK_Hangul_O                      = 0x0ec7,
+	XK_Hangul_WA                     = 0x0ec8,
+	XK_Hangul_WAE                    = 0x0ec9,
+	XK_Hangul_OE                     = 0x0eca,
+	XK_Hangul_YO                     = 0x0ecb,
+	XK_Hangul_U                      = 0x0ecc,
+	XK_Hangul_WEO                    = 0x0ecd,
+	XK_Hangul_WE                     = 0x0ece,
+	XK_Hangul_WI                     = 0x0ecf,
+	XK_Hangul_YU                     = 0x0ed0,
+	XK_Hangul_EU                     = 0x0ed1,
+	XK_Hangul_YI                     = 0x0ed2,
+	XK_Hangul_I                      = 0x0ed3,
+	XK_Hangul_J_Kiyeog               = 0x0ed4,
+	XK_Hangul_J_SsangKiyeog          = 0x0ed5,
+	XK_Hangul_J_KiyeogSios           = 0x0ed6,
+	XK_Hangul_J_Nieun                = 0x0ed7,
+	XK_Hangul_J_NieunJieuj           = 0x0ed8,
+	XK_Hangul_J_NieunHieuh           = 0x0ed9,
+	XK_Hangul_J_Dikeud               = 0x0eda,
+	XK_Hangul_J_Rieul                = 0x0edb,
+	XK_Hangul_J_RieulKiyeog          = 0x0edc,
+	XK_Hangul_J_RieulMieum           = 0x0edd,
+	XK_Hangul_J_RieulPieub           = 0x0ede,
+	XK_Hangul_J_RieulSios            = 0x0edf,
+	XK_Hangul_J_RieulTieut           = 0x0ee0,
+	XK_Hangul_J_RieulPhieuf          = 0x0ee1,
+	XK_Hangul_J_RieulHieuh           = 0x0ee2,
+	XK_Hangul_J_Mieum                = 0x0ee3,
+	XK_Hangul_J_Pieub                = 0x0ee4,
+	XK_Hangul_J_PieubSios            = 0x0ee5,
+	XK_Hangul_J_Sios                 = 0x0ee6,
+	XK_Hangul_J_SsangSios            = 0x0ee7,
+	XK_Hangul_J_Ieung                = 0x0ee8,
+	XK_Hangul_J_Jieuj                = 0x0ee9,
+	XK_Hangul_J_Cieuc                = 0x0eea,
+	XK_Hangul_J_Khieuq               = 0x0eeb,
+	XK_Hangul_J_Tieut                = 0x0eec,
+	XK_Hangul_J_Phieuf               = 0x0eed,
+	XK_Hangul_J_Hieuh                = 0x0eee,
+	XK_Hangul_RieulYeorinHieuh       = 0x0eef,
+	XK_Hangul_SunkyeongeumMieum      = 0x0ef0,
+	XK_Hangul_SunkyeongeumPieub      = 0x0ef1,
+	XK_Hangul_PanSios                = 0x0ef2,
+	XK_Hangul_KkogjiDalrinIeung      = 0x0ef3,
+	XK_Hangul_SunkyeongeumPhieuf     = 0x0ef4,
+	XK_Hangul_YeorinHieuh            = 0x0ef5,
+	XK_Hangul_AraeA                  = 0x0ef6,
+	XK_Hangul_AraeAE                 = 0x0ef7,
+	XK_Hangul_J_PanSios              = 0x0ef8,
+	XK_Hangul_J_KkogjiDalrinIeung    = 0x0ef9,
+	XK_Hangul_J_YeorinHieuh          = 0x0efa,
+	XK_Korean_Won                    = 0x0eff,  /*(U+20A9 WON SIGN)*/
+	XK_Armenian_ligature_ew       = 0x1000587,  /* U+0587 ARMENIAN SMALL LIGATURE ECH YIWN */
+	XK_Armenian_full_stop         = 0x1000589,  /* U+0589 ARMENIAN FULL STOP */
+	XK_Armenian_verjaket          = 0x1000589,  /* U+0589 ARMENIAN FULL STOP */
+	XK_Armenian_separation_mark   = 0x100055d,  /* U+055D ARMENIAN COMMA */
+	XK_Armenian_but               = 0x100055d,  /* U+055D ARMENIAN COMMA */
+	XK_Armenian_hyphen            = 0x100058a,  /* U+058A ARMENIAN HYPHEN */
+	XK_Armenian_yentamna          = 0x100058a,  /* U+058A ARMENIAN HYPHEN */
+	XK_Armenian_exclam            = 0x100055c,  /* U+055C ARMENIAN EXCLAMATION MARK */
+	XK_Armenian_amanak            = 0x100055c,  /* U+055C ARMENIAN EXCLAMATION MARK */
+	XK_Armenian_accent            = 0x100055b,  /* U+055B ARMENIAN EMPHASIS MARK */
+	XK_Armenian_shesht            = 0x100055b,  /* U+055B ARMENIAN EMPHASIS MARK */
+	XK_Armenian_question          = 0x100055e,  /* U+055E ARMENIAN QUESTION MARK */
+	XK_Armenian_paruyk            = 0x100055e,  /* U+055E ARMENIAN QUESTION MARK */
+	XK_Armenian_AYB               = 0x1000531,  /* U+0531 ARMENIAN CAPITAL LETTER AYB */
+	XK_Armenian_ayb               = 0x1000561,  /* U+0561 ARMENIAN SMALL LETTER AYB */
+	XK_Armenian_BEN               = 0x1000532,  /* U+0532 ARMENIAN CAPITAL LETTER BEN */
+	XK_Armenian_ben               = 0x1000562,  /* U+0562 ARMENIAN SMALL LETTER BEN */
+	XK_Armenian_GIM               = 0x1000533,  /* U+0533 ARMENIAN CAPITAL LETTER GIM */
+	XK_Armenian_gim               = 0x1000563,  /* U+0563 ARMENIAN SMALL LETTER GIM */
+	XK_Armenian_DA                = 0x1000534,  /* U+0534 ARMENIAN CAPITAL LETTER DA */
+	XK_Armenian_da                = 0x1000564,  /* U+0564 ARMENIAN SMALL LETTER DA */
+	XK_Armenian_YECH              = 0x1000535,  /* U+0535 ARMENIAN CAPITAL LETTER ECH */
+	XK_Armenian_yech              = 0x1000565,  /* U+0565 ARMENIAN SMALL LETTER ECH */
+	XK_Armenian_ZA                = 0x1000536,  /* U+0536 ARMENIAN CAPITAL LETTER ZA */
+	XK_Armenian_za                = 0x1000566,  /* U+0566 ARMENIAN SMALL LETTER ZA */
+	XK_Armenian_E                 = 0x1000537,  /* U+0537 ARMENIAN CAPITAL LETTER EH */
+	XK_Armenian_e                 = 0x1000567,  /* U+0567 ARMENIAN SMALL LETTER EH */
+	XK_Armenian_AT                = 0x1000538,  /* U+0538 ARMENIAN CAPITAL LETTER ET */
+	XK_Armenian_at                = 0x1000568,  /* U+0568 ARMENIAN SMALL LETTER ET */
+	XK_Armenian_TO                = 0x1000539,  /* U+0539 ARMENIAN CAPITAL LETTER TO */
+	XK_Armenian_to                = 0x1000569,  /* U+0569 ARMENIAN SMALL LETTER TO */
+	XK_Armenian_ZHE               = 0x100053a,  /* U+053A ARMENIAN CAPITAL LETTER ZHE */
+	XK_Armenian_zhe               = 0x100056a,  /* U+056A ARMENIAN SMALL LETTER ZHE */
+	XK_Armenian_INI               = 0x100053b,  /* U+053B ARMENIAN CAPITAL LETTER INI */
+	XK_Armenian_ini               = 0x100056b,  /* U+056B ARMENIAN SMALL LETTER INI */
+	XK_Armenian_LYUN              = 0x100053c,  /* U+053C ARMENIAN CAPITAL LETTER LIWN */
+	XK_Armenian_lyun              = 0x100056c,  /* U+056C ARMENIAN SMALL LETTER LIWN */
+	XK_Armenian_KHE               = 0x100053d,  /* U+053D ARMENIAN CAPITAL LETTER XEH */
+	XK_Armenian_khe               = 0x100056d,  /* U+056D ARMENIAN SMALL LETTER XEH */
+	XK_Armenian_TSA               = 0x100053e,  /* U+053E ARMENIAN CAPITAL LETTER CA */
+	XK_Armenian_tsa               = 0x100056e,  /* U+056E ARMENIAN SMALL LETTER CA */
+	XK_Armenian_KEN               = 0x100053f,  /* U+053F ARMENIAN CAPITAL LETTER KEN */
+	XK_Armenian_ken               = 0x100056f,  /* U+056F ARMENIAN SMALL LETTER KEN */
+	XK_Armenian_HO                = 0x1000540,  /* U+0540 ARMENIAN CAPITAL LETTER HO */
+	XK_Armenian_ho                = 0x1000570,  /* U+0570 ARMENIAN SMALL LETTER HO */
+	XK_Armenian_DZA               = 0x1000541,  /* U+0541 ARMENIAN CAPITAL LETTER JA */
+	XK_Armenian_dza               = 0x1000571,  /* U+0571 ARMENIAN SMALL LETTER JA */
+	XK_Armenian_GHAT              = 0x1000542,  /* U+0542 ARMENIAN CAPITAL LETTER GHAD */
+	XK_Armenian_ghat              = 0x1000572,  /* U+0572 ARMENIAN SMALL LETTER GHAD */
+	XK_Armenian_TCHE              = 0x1000543,  /* U+0543 ARMENIAN CAPITAL LETTER CHEH */
+	XK_Armenian_tche              = 0x1000573,  /* U+0573 ARMENIAN SMALL LETTER CHEH */
+	XK_Armenian_MEN               = 0x1000544,  /* U+0544 ARMENIAN CAPITAL LETTER MEN */
+	XK_Armenian_men               = 0x1000574,  /* U+0574 ARMENIAN SMALL LETTER MEN */
+	XK_Armenian_HI                = 0x1000545,  /* U+0545 ARMENIAN CAPITAL LETTER YI */
+	XK_Armenian_hi                = 0x1000575,  /* U+0575 ARMENIAN SMALL LETTER YI */
+	XK_Armenian_NU                = 0x1000546,  /* U+0546 ARMENIAN CAPITAL LETTER NOW */
+	XK_Armenian_nu                = 0x1000576,  /* U+0576 ARMENIAN SMALL LETTER NOW */
+	XK_Armenian_SHA               = 0x1000547,  /* U+0547 ARMENIAN CAPITAL LETTER SHA */
+	XK_Armenian_sha               = 0x1000577,  /* U+0577 ARMENIAN SMALL LETTER SHA */
+	XK_Armenian_VO                = 0x1000548,  /* U+0548 ARMENIAN CAPITAL LETTER VO */
+	XK_Armenian_vo                = 0x1000578,  /* U+0578 ARMENIAN SMALL LETTER VO */
+	XK_Armenian_CHA               = 0x1000549,  /* U+0549 ARMENIAN CAPITAL LETTER CHA */
+	XK_Armenian_cha               = 0x1000579,  /* U+0579 ARMENIAN SMALL LETTER CHA */
+	XK_Armenian_PE                = 0x100054a,  /* U+054A ARMENIAN CAPITAL LETTER PEH */
+	XK_Armenian_pe                = 0x100057a,  /* U+057A ARMENIAN SMALL LETTER PEH */
+	XK_Armenian_JE                = 0x100054b,  /* U+054B ARMENIAN CAPITAL LETTER JHEH */
+	XK_Armenian_je                = 0x100057b,  /* U+057B ARMENIAN SMALL LETTER JHEH */
+	XK_Armenian_RA                = 0x100054c,  /* U+054C ARMENIAN CAPITAL LETTER RA */
+	XK_Armenian_ra                = 0x100057c,  /* U+057C ARMENIAN SMALL LETTER RA */
+	XK_Armenian_SE                = 0x100054d,  /* U+054D ARMENIAN CAPITAL LETTER SEH */
+	XK_Armenian_se                = 0x100057d,  /* U+057D ARMENIAN SMALL LETTER SEH */
+	XK_Armenian_VEV               = 0x100054e,  /* U+054E ARMENIAN CAPITAL LETTER VEW */
+	XK_Armenian_vev               = 0x100057e,  /* U+057E ARMENIAN SMALL LETTER VEW */
+	XK_Armenian_TYUN              = 0x100054f,  /* U+054F ARMENIAN CAPITAL LETTER TIWN */
+	XK_Armenian_tyun              = 0x100057f,  /* U+057F ARMENIAN SMALL LETTER TIWN */
+	XK_Armenian_RE                = 0x1000550,  /* U+0550 ARMENIAN CAPITAL LETTER REH */
+	XK_Armenian_re                = 0x1000580,  /* U+0580 ARMENIAN SMALL LETTER REH */
+	XK_Armenian_TSO               = 0x1000551,  /* U+0551 ARMENIAN CAPITAL LETTER CO */
+	XK_Armenian_tso               = 0x1000581,  /* U+0581 ARMENIAN SMALL LETTER CO */
+	XK_Armenian_VYUN              = 0x1000552,  /* U+0552 ARMENIAN CAPITAL LETTER YIWN */
+	XK_Armenian_vyun              = 0x1000582,  /* U+0582 ARMENIAN SMALL LETTER YIWN */
+	XK_Armenian_PYUR              = 0x1000553,  /* U+0553 ARMENIAN CAPITAL LETTER PIWR */
+	XK_Armenian_pyur              = 0x1000583,  /* U+0583 ARMENIAN SMALL LETTER PIWR */
+	XK_Armenian_KE                = 0x1000554,  /* U+0554 ARMENIAN CAPITAL LETTER KEH */
+	XK_Armenian_ke                = 0x1000584,  /* U+0584 ARMENIAN SMALL LETTER KEH */
+	XK_Armenian_O                 = 0x1000555,  /* U+0555 ARMENIAN CAPITAL LETTER OH */
+	XK_Armenian_o                 = 0x1000585,  /* U+0585 ARMENIAN SMALL LETTER OH */
+	XK_Armenian_FE                = 0x1000556,  /* U+0556 ARMENIAN CAPITAL LETTER FEH */
+	XK_Armenian_fe                = 0x1000586,  /* U+0586 ARMENIAN SMALL LETTER FEH */
+	XK_Armenian_apostrophe        = 0x100055a,  /* U+055A ARMENIAN APOSTROPHE */
+	XK_Georgian_an                = 0x10010d0,  /* U+10D0 GEORGIAN LETTER AN */
+	XK_Georgian_ban               = 0x10010d1,  /* U+10D1 GEORGIAN LETTER BAN */
+	XK_Georgian_gan               = 0x10010d2,  /* U+10D2 GEORGIAN LETTER GAN */
+	XK_Georgian_don               = 0x10010d3,  /* U+10D3 GEORGIAN LETTER DON */
+	XK_Georgian_en                = 0x10010d4,  /* U+10D4 GEORGIAN LETTER EN */
+	XK_Georgian_vin               = 0x10010d5,  /* U+10D5 GEORGIAN LETTER VIN */
+	XK_Georgian_zen               = 0x10010d6,  /* U+10D6 GEORGIAN LETTER ZEN */
+	XK_Georgian_tan               = 0x10010d7,  /* U+10D7 GEORGIAN LETTER TAN */
+	XK_Georgian_in                = 0x10010d8,  /* U+10D8 GEORGIAN LETTER IN */
+	XK_Georgian_kan               = 0x10010d9,  /* U+10D9 GEORGIAN LETTER KAN */
+	XK_Georgian_las               = 0x10010da,  /* U+10DA GEORGIAN LETTER LAS */
+	XK_Georgian_man               = 0x10010db,  /* U+10DB GEORGIAN LETTER MAN */
+	XK_Georgian_nar               = 0x10010dc,  /* U+10DC GEORGIAN LETTER NAR */
+	XK_Georgian_on                = 0x10010dd,  /* U+10DD GEORGIAN LETTER ON */
+	XK_Georgian_par               = 0x10010de,  /* U+10DE GEORGIAN LETTER PAR */
+	XK_Georgian_zhar              = 0x10010df,  /* U+10DF GEORGIAN LETTER ZHAR */
+	XK_Georgian_rae               = 0x10010e0,  /* U+10E0 GEORGIAN LETTER RAE */
+	XK_Georgian_san               = 0x10010e1,  /* U+10E1 GEORGIAN LETTER SAN */
+	XK_Georgian_tar               = 0x10010e2,  /* U+10E2 GEORGIAN LETTER TAR */
+	XK_Georgian_un                = 0x10010e3,  /* U+10E3 GEORGIAN LETTER UN */
+	XK_Georgian_phar              = 0x10010e4,  /* U+10E4 GEORGIAN LETTER PHAR */
+	XK_Georgian_khar              = 0x10010e5,  /* U+10E5 GEORGIAN LETTER KHAR */
+	XK_Georgian_ghan              = 0x10010e6,  /* U+10E6 GEORGIAN LETTER GHAN */
+	XK_Georgian_qar               = 0x10010e7,  /* U+10E7 GEORGIAN LETTER QAR */
+	XK_Georgian_shin              = 0x10010e8,  /* U+10E8 GEORGIAN LETTER SHIN */
+	XK_Georgian_chin              = 0x10010e9,  /* U+10E9 GEORGIAN LETTER CHIN */
+	XK_Georgian_can               = 0x10010ea,  /* U+10EA GEORGIAN LETTER CAN */
+	XK_Georgian_jil               = 0x10010eb,  /* U+10EB GEORGIAN LETTER JIL */
+	XK_Georgian_cil               = 0x10010ec,  /* U+10EC GEORGIAN LETTER CIL */
+	XK_Georgian_char              = 0x10010ed,  /* U+10ED GEORGIAN LETTER CHAR */
+	XK_Georgian_xan               = 0x10010ee,  /* U+10EE GEORGIAN LETTER XAN */
+	XK_Georgian_jhan              = 0x10010ef,  /* U+10EF GEORGIAN LETTER JHAN */
+	XK_Georgian_hae               = 0x10010f0,  /* U+10F0 GEORGIAN LETTER HAE */
+	XK_Georgian_he                = 0x10010f1,  /* U+10F1 GEORGIAN LETTER HE */
+	XK_Georgian_hie               = 0x10010f2,  /* U+10F2 GEORGIAN LETTER HIE */
+	XK_Georgian_we                = 0x10010f3,  /* U+10F3 GEORGIAN LETTER WE */
+	XK_Georgian_har               = 0x10010f4,  /* U+10F4 GEORGIAN LETTER HAR */
+	XK_Georgian_hoe               = 0x10010f5,  /* U+10F5 GEORGIAN LETTER HOE */
+	XK_Georgian_fi                = 0x10010f6,  /* U+10F6 GEORGIAN LETTER FI */
+	XK_Xabovedot                  = 0x1001e8a,  /* U+1E8A LATIN CAPITAL LETTER X WITH DOT ABOVE */
+	XK_Ibreve                     = 0x100012c,  /* U+012C LATIN CAPITAL LETTER I WITH BREVE */
+	XK_Zstroke                    = 0x10001b5,  /* U+01B5 LATIN CAPITAL LETTER Z WITH STROKE */
+	XK_Gcaron                     = 0x10001e6,  /* U+01E6 LATIN CAPITAL LETTER G WITH CARON */
+	XK_Ocaron                     = 0x10001d1,  /* U+01D2 LATIN CAPITAL LETTER O WITH CARON */
+	XK_Obarred                    = 0x100019f,  /* U+019F LATIN CAPITAL LETTER O WITH MIDDLE TILDE */
+	XK_xabovedot                  = 0x1001e8b,  /* U+1E8B LATIN SMALL LETTER X WITH DOT ABOVE */
+	XK_ibreve                     = 0x100012d,  /* U+012D LATIN SMALL LETTER I WITH BREVE */
+	XK_zstroke                    = 0x10001b6,  /* U+01B6 LATIN SMALL LETTER Z WITH STROKE */
+	XK_gcaron                     = 0x10001e7,  /* U+01E7 LATIN SMALL LETTER G WITH CARON */
+	XK_ocaron                     = 0x10001d2,  /* U+01D2 LATIN SMALL LETTER O WITH CARON */
+	XK_obarred                    = 0x1000275,  /* U+0275 LATIN SMALL LETTER BARRED O */
+	XK_SCHWA                      = 0x100018f,  /* U+018F LATIN CAPITAL LETTER SCHWA */
+	XK_schwa                      = 0x1000259,  /* U+0259 LATIN SMALL LETTER SCHWA */
+	XK_Lbelowdot                  = 0x1001e36,  /* U+1E36 LATIN CAPITAL LETTER L WITH DOT BELOW */
+	XK_lbelowdot                  = 0x1001e37,  /* U+1E37 LATIN SMALL LETTER L WITH DOT BELOW */
+	XK_Abelowdot                  = 0x1001ea0,  /* U+1EA0 LATIN CAPITAL LETTER A WITH DOT BELOW */
+	XK_abelowdot                  = 0x1001ea1,  /* U+1EA1 LATIN SMALL LETTER A WITH DOT BELOW */
+	XK_Ahook                      = 0x1001ea2,  /* U+1EA2 LATIN CAPITAL LETTER A WITH HOOK ABOVE */
+	XK_ahook                      = 0x1001ea3,  /* U+1EA3 LATIN SMALL LETTER A WITH HOOK ABOVE */
+	XK_Acircumflexacute           = 0x1001ea4,  /* U+1EA4 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE */
+	XK_acircumflexacute           = 0x1001ea5,  /* U+1EA5 LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE */
+	XK_Acircumflexgrave           = 0x1001ea6,  /* U+1EA6 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE */
+	XK_acircumflexgrave           = 0x1001ea7,  /* U+1EA7 LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE */
+	XK_Acircumflexhook            = 0x1001ea8,  /* U+1EA8 LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+	XK_acircumflexhook            = 0x1001ea9,  /* U+1EA9 LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE */
+	XK_Acircumflextilde           = 0x1001eaa,  /* U+1EAA LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE */
+	XK_acircumflextilde           = 0x1001eab,  /* U+1EAB LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE */
+	XK_Acircumflexbelowdot        = 0x1001eac,  /* U+1EAC LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+	XK_acircumflexbelowdot        = 0x1001ead,  /* U+1EAD LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW */
+	XK_Abreveacute                = 0x1001eae,  /* U+1EAE LATIN CAPITAL LETTER A WITH BREVE AND ACUTE */
+	XK_abreveacute                = 0x1001eaf,  /* U+1EAF LATIN SMALL LETTER A WITH BREVE AND ACUTE */
+	XK_Abrevegrave                = 0x1001eb0,  /* U+1EB0 LATIN CAPITAL LETTER A WITH BREVE AND GRAVE */
+	XK_abrevegrave                = 0x1001eb1,  /* U+1EB1 LATIN SMALL LETTER A WITH BREVE AND GRAVE */
+	XK_Abrevehook                 = 0x1001eb2,  /* U+1EB2 LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE */
+	XK_abrevehook                 = 0x1001eb3,  /* U+1EB3 LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE */
+	XK_Abrevetilde                = 0x1001eb4,  /* U+1EB4 LATIN CAPITAL LETTER A WITH BREVE AND TILDE */
+	XK_abrevetilde                = 0x1001eb5,  /* U+1EB5 LATIN SMALL LETTER A WITH BREVE AND TILDE */
+	XK_Abrevebelowdot             = 0x1001eb6,  /* U+1EB6 LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW */
+	XK_abrevebelowdot             = 0x1001eb7,  /* U+1EB7 LATIN SMALL LETTER A WITH BREVE AND DOT BELOW */
+	XK_Ebelowdot                  = 0x1001eb8,  /* U+1EB8 LATIN CAPITAL LETTER E WITH DOT BELOW */
+	XK_ebelowdot                  = 0x1001eb9,  /* U+1EB9 LATIN SMALL LETTER E WITH DOT BELOW */
+	XK_Ehook                      = 0x1001eba,  /* U+1EBA LATIN CAPITAL LETTER E WITH HOOK ABOVE */
+	XK_ehook                      = 0x1001ebb,  /* U+1EBB LATIN SMALL LETTER E WITH HOOK ABOVE */
+	XK_Etilde                     = 0x1001ebc,  /* U+1EBC LATIN CAPITAL LETTER E WITH TILDE */
+	XK_etilde                     = 0x1001ebd,  /* U+1EBD LATIN SMALL LETTER E WITH TILDE */
+	XK_Ecircumflexacute           = 0x1001ebe,  /* U+1EBE LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE */
+	XK_ecircumflexacute           = 0x1001ebf,  /* U+1EBF LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE */
+	XK_Ecircumflexgrave           = 0x1001ec0,  /* U+1EC0 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE */
+	XK_ecircumflexgrave           = 0x1001ec1,  /* U+1EC1 LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE */
+	XK_Ecircumflexhook            = 0x1001ec2,  /* U+1EC2 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+	XK_ecircumflexhook            = 0x1001ec3,  /* U+1EC3 LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE */
+	XK_Ecircumflextilde           = 0x1001ec4,  /* U+1EC4 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE */
+	XK_ecircumflextilde           = 0x1001ec5,  /* U+1EC5 LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE */
+	XK_Ecircumflexbelowdot        = 0x1001ec6,  /* U+1EC6 LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+	XK_ecircumflexbelowdot        = 0x1001ec7,  /* U+1EC7 LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW */
+	XK_Ihook                      = 0x1001ec8,  /* U+1EC8 LATIN CAPITAL LETTER I WITH HOOK ABOVE */
+	XK_ihook                      = 0x1001ec9,  /* U+1EC9 LATIN SMALL LETTER I WITH HOOK ABOVE */
+	XK_Ibelowdot                  = 0x1001eca,  /* U+1ECA LATIN CAPITAL LETTER I WITH DOT BELOW */
+	XK_ibelowdot                  = 0x1001ecb,  /* U+1ECB LATIN SMALL LETTER I WITH DOT BELOW */
+	XK_Obelowdot                  = 0x1001ecc,  /* U+1ECC LATIN CAPITAL LETTER O WITH DOT BELOW */
+	XK_obelowdot                  = 0x1001ecd,  /* U+1ECD LATIN SMALL LETTER O WITH DOT BELOW */
+	XK_Ohook                      = 0x1001ece,  /* U+1ECE LATIN CAPITAL LETTER O WITH HOOK ABOVE */
+	XK_ohook                      = 0x1001ecf,  /* U+1ECF LATIN SMALL LETTER O WITH HOOK ABOVE */
+	XK_Ocircumflexacute           = 0x1001ed0,  /* U+1ED0 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE */
+	XK_ocircumflexacute           = 0x1001ed1,  /* U+1ED1 LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE */
+	XK_Ocircumflexgrave           = 0x1001ed2,  /* U+1ED2 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE */
+	XK_ocircumflexgrave           = 0x1001ed3,  /* U+1ED3 LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE */
+	XK_Ocircumflexhook            = 0x1001ed4,  /* U+1ED4 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+	XK_ocircumflexhook            = 0x1001ed5,  /* U+1ED5 LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE */
+	XK_Ocircumflextilde           = 0x1001ed6,  /* U+1ED6 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE */
+	XK_ocircumflextilde           = 0x1001ed7,  /* U+1ED7 LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE */
+	XK_Ocircumflexbelowdot        = 0x1001ed8,  /* U+1ED8 LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+	XK_ocircumflexbelowdot        = 0x1001ed9,  /* U+1ED9 LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW */
+	XK_Ohornacute                 = 0x1001eda,  /* U+1EDA LATIN CAPITAL LETTER O WITH HORN AND ACUTE */
+	XK_ohornacute                 = 0x1001edb,  /* U+1EDB LATIN SMALL LETTER O WITH HORN AND ACUTE */
+	XK_Ohorngrave                 = 0x1001edc,  /* U+1EDC LATIN CAPITAL LETTER O WITH HORN AND GRAVE */
+	XK_ohorngrave                 = 0x1001edd,  /* U+1EDD LATIN SMALL LETTER O WITH HORN AND GRAVE */
+	XK_Ohornhook                  = 0x1001ede,  /* U+1EDE LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE */
+	XK_ohornhook                  = 0x1001edf,  /* U+1EDF LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE */
+	XK_Ohorntilde                 = 0x1001ee0,  /* U+1EE0 LATIN CAPITAL LETTER O WITH HORN AND TILDE */
+	XK_ohorntilde                 = 0x1001ee1,  /* U+1EE1 LATIN SMALL LETTER O WITH HORN AND TILDE */
+	XK_Ohornbelowdot              = 0x1001ee2,  /* U+1EE2 LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW */
+	XK_ohornbelowdot              = 0x1001ee3,  /* U+1EE3 LATIN SMALL LETTER O WITH HORN AND DOT BELOW */
+	XK_Ubelowdot                  = 0x1001ee4,  /* U+1EE4 LATIN CAPITAL LETTER U WITH DOT BELOW */
+	XK_ubelowdot                  = 0x1001ee5,  /* U+1EE5 LATIN SMALL LETTER U WITH DOT BELOW */
+	XK_Uhook                      = 0x1001ee6,  /* U+1EE6 LATIN CAPITAL LETTER U WITH HOOK ABOVE */
+	XK_uhook                      = 0x1001ee7,  /* U+1EE7 LATIN SMALL LETTER U WITH HOOK ABOVE */
+	XK_Uhornacute                 = 0x1001ee8,  /* U+1EE8 LATIN CAPITAL LETTER U WITH HORN AND ACUTE */
+	XK_uhornacute                 = 0x1001ee9,  /* U+1EE9 LATIN SMALL LETTER U WITH HORN AND ACUTE */
+	XK_Uhorngrave                 = 0x1001eea,  /* U+1EEA LATIN CAPITAL LETTER U WITH HORN AND GRAVE */
+	XK_uhorngrave                 = 0x1001eeb,  /* U+1EEB LATIN SMALL LETTER U WITH HORN AND GRAVE */
+	XK_Uhornhook                  = 0x1001eec,  /* U+1EEC LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE */
+	XK_uhornhook                  = 0x1001eed,  /* U+1EED LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE */
+	XK_Uhorntilde                 = 0x1001eee,  /* U+1EEE LATIN CAPITAL LETTER U WITH HORN AND TILDE */
+	XK_uhorntilde                 = 0x1001eef,  /* U+1EEF LATIN SMALL LETTER U WITH HORN AND TILDE */
+	XK_Uhornbelowdot              = 0x1001ef0,  /* U+1EF0 LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW */
+	XK_uhornbelowdot              = 0x1001ef1,  /* U+1EF1 LATIN SMALL LETTER U WITH HORN AND DOT BELOW */
+	XK_Ybelowdot                  = 0x1001ef4,  /* U+1EF4 LATIN CAPITAL LETTER Y WITH DOT BELOW */
+	XK_ybelowdot                  = 0x1001ef5,  /* U+1EF5 LATIN SMALL LETTER Y WITH DOT BELOW */
+	XK_Yhook                      = 0x1001ef6,  /* U+1EF6 LATIN CAPITAL LETTER Y WITH HOOK ABOVE */
+	XK_yhook                      = 0x1001ef7,  /* U+1EF7 LATIN SMALL LETTER Y WITH HOOK ABOVE */
+	XK_Ytilde                     = 0x1001ef8,  /* U+1EF8 LATIN CAPITAL LETTER Y WITH TILDE */
+	XK_ytilde                     = 0x1001ef9,  /* U+1EF9 LATIN SMALL LETTER Y WITH TILDE */
+	XK_Ohorn                      = 0x10001a0,  /* U+01A0 LATIN CAPITAL LETTER O WITH HORN */
+	XK_ohorn                      = 0x10001a1,  /* U+01A1 LATIN SMALL LETTER O WITH HORN */
+	XK_Uhorn                      = 0x10001af,  /* U+01AF LATIN CAPITAL LETTER U WITH HORN */
+	XK_uhorn                      = 0x10001b0,  /* U+01B0 LATIN SMALL LETTER U WITH HORN */
+	XK_EcuSign                    = 0x10020a0,  /* U+20A0 EURO-CURRENCY SIGN */
+	XK_ColonSign                  = 0x10020a1,  /* U+20A1 COLON SIGN */
+	XK_CruzeiroSign               = 0x10020a2,  /* U+20A2 CRUZEIRO SIGN */
+	XK_FFrancSign                 = 0x10020a3,  /* U+20A3 FRENCH FRANC SIGN */
+	XK_LiraSign                   = 0x10020a4,  /* U+20A4 LIRA SIGN */
+	XK_MillSign                   = 0x10020a5,  /* U+20A5 MILL SIGN */
+	XK_NairaSign                  = 0x10020a6,  /* U+20A6 NAIRA SIGN */
+	XK_PesetaSign                 = 0x10020a7,  /* U+20A7 PESETA SIGN */
+	XK_RupeeSign                  = 0x10020a8,  /* U+20A8 RUPEE SIGN */
+	XK_WonSign                    = 0x10020a9,  /* U+20A9 WON SIGN */
+	XK_NewSheqelSign              = 0x10020aa,  /* U+20AA NEW SHEQEL SIGN */
+	XK_DongSign                   = 0x10020ab,  /* U+20AB DONG SIGN */
+	XK_EuroSign                   = 0x20ac,  /* U+20AC EURO SIGN */
 }
 }
 
 

+ 311 - 311
vendor/x11/xlib/xlib_types.odin

@@ -47,9 +47,9 @@ XExtCodes :: struct {
 }
 }
 
 
 XPixmapFormatValues :: struct {
 XPixmapFormatValues :: struct {
-    depth:                 i32,
-    bits_per_pixel:        i32,
-    scanline_pad:          i32,
+	depth:                 i32,
+	bits_per_pixel:        i32,
+	scanline_pad:          i32,
 }
 }
 
 
 XGCValues :: struct {
 XGCValues :: struct {
@@ -130,47 +130,47 @@ ScreenFormat :: struct {
 }
 }
 
 
 XSetWindowAttributes :: struct {
 XSetWindowAttributes :: struct {
-    background_pixmap:     Pixmap,
-    background_pixel:      uint,
-    border_pixmap:         Pixmap,
-    border_pixel:          uint,
-    bit_gravity:           Gravity,
-    win_gravity:           Gravity,
-    backing_store:         BackingStore,
-    backing_planes:        uint,
-    backing_pixel:         uint,
-    save_under:            b32,
-    event_mask:            EventMask,
-    do_not_propagate_mask: EventMask,
-    override_redirect:     b32,
-    colormap:              Colormap,
-    cursor:                Cursor,
+	background_pixmap:     Pixmap,
+	background_pixel:      uint,
+	border_pixmap:         Pixmap,
+	border_pixel:          uint,
+	bit_gravity:           Gravity,
+	win_gravity:           Gravity,
+	backing_store:         BackingStore,
+	backing_planes:        uint,
+	backing_pixel:         uint,
+	save_under:            b32,
+	event_mask:            EventMask,
+	do_not_propagate_mask: EventMask,
+	override_redirect:     b32,
+	colormap:              Colormap,
+	cursor:                Cursor,
 }
 }
 
 
 XWindowAttributes :: struct {
 XWindowAttributes :: struct {
-    x:                     i32,
-    y:                     i32,
-    width:                 i32,
-    height:                i32,
-    border_width:          i32,
-    depth:                 i32,
-    visual:                ^Visual,
-    root:                  Window,
-    class:                 WindowClass,
-    bit_gravity:           Gravity,
-    win_gravity:           Gravity,
-    backing_store:         BackingStore,
-    backing_planes:        uint,
-    backing_pixel:         uint,
-    save_under:            b32,
-    colormap:              Colormap,
-    map_installed:         b32,
-    map_state:             WindowMapState,
-    all_event_masks:       EventMask,
-    your_event_mask:       EventMask,
-    do_not_propagate_mask: EventMask,
-    override_redirect:     b32,
-    screen:                ^Screen,
+	x:                     i32,
+	y:                     i32,
+	width:                 i32,
+	height:                i32,
+	border_width:          i32,
+	depth:                 i32,
+	visual:                ^Visual,
+	root:                  Window,
+	class:                 WindowClass,
+	bit_gravity:           Gravity,
+	win_gravity:           Gravity,
+	backing_store:         BackingStore,
+	backing_planes:        uint,
+	backing_pixel:         uint,
+	save_under:            b32,
+	colormap:              Colormap,
+	map_installed:         b32,
+	map_state:             WindowMapState,
+	all_event_masks:       EventMask,
+	your_event_mask:       EventMask,
+	do_not_propagate_mask: EventMask,
+	override_redirect:     b32,
+	screen:                ^Screen,
 }
 }
 
 
 XHostAddress :: struct {
 XHostAddress :: struct {
@@ -187,50 +187,50 @@ XServerInterpretedAddress :: struct {
 }
 }
 
 
 XImage :: struct {
 XImage :: struct {
-    width:                 i32,
-    height:                i32,
-    xoffset:               i32,
-    format:                ImageFormat,
-    data:                  rawptr,
-    byte_order:            i32,
-    bitmap_unit:           i32,
-    bitmap_bit_order:      ByteOrder,
-    bitmap_pad:            i32,
-    depth:                 i32,
-    bytes_per_line:        i32,
-    bits_per_pixel:        i32,
-    red_mask:              uint,
-    green_mask:            uint,
-    blue_mask:             uint,
-    obdata:                rawptr,
-    f: struct {
-    	create_image: proc "c" (
-    		display: ^Display,
-    		visual: ^Visual,
-    		depth: u32,
-    		format: i32,
-    		offset: i32,
-    		data: rawptr,
-    		width: u32,
-    		height: u32,
-    		pad: i32,
-    		stride: i32) -> ^XImage,
-    	destroy_image: proc "c" (image: ^XImage) -> i32,
-    	get_pixel: proc "c" (image: ^XImage) -> uint,
-    	put_pixel: proc "c" (image: ^XImage, x: i32, y: i32, pixel: uint) -> i32,
-    	sub_image: proc "c" (image: ^XImage, x: i32, y: i32, w: u32, h: u32) -> ^XImage,
-    	add_pixel: proc "c" (image: ^XImage, val: int) -> i32,
+	width:                 i32,
+	height:                i32,
+	xoffset:               i32,
+	format:                ImageFormat,
+	data:                  rawptr,
+	byte_order:            i32,
+	bitmap_unit:           i32,
+	bitmap_bit_order:      ByteOrder,
+	bitmap_pad:            i32,
+	depth:                 i32,
+	bytes_per_line:        i32,
+	bits_per_pixel:        i32,
+	red_mask:              uint,
+	green_mask:            uint,
+	blue_mask:             uint,
+	obdata:                rawptr,
+	f: struct {
+		create_image: proc "c" (
+			display: ^Display,
+			visual: ^Visual,
+			depth: u32,
+			format: i32,
+			offset: i32,
+			data: rawptr,
+			width: u32,
+			height: u32,
+			pad: i32,
+			stride: i32) -> ^XImage,
+		destroy_image: proc "c" (image: ^XImage) -> i32,
+		get_pixel: proc "c" (image: ^XImage) -> uint,
+		put_pixel: proc "c" (image: ^XImage, x: i32, y: i32, pixel: uint) -> i32,
+		sub_image: proc "c" (image: ^XImage, x: i32, y: i32, w: u32, h: u32) -> ^XImage,
+		add_pixel: proc "c" (image: ^XImage, val: int) -> i32,
 	},
 	},
 }
 }
 
 
 XWindowChanges :: struct {
 XWindowChanges :: struct {
-    x:                     i32,
-    y:                     i32,
-    width:                 i32,
-    height:                i32,
-    border_width:          i32,
-    sibling:               Window,
-    stack_mode:            WindowStacking,
+	x:                     i32,
+	y:                     i32,
+	width:                 i32,
+	height:                i32,
+	border_width:          i32,
+	sibling:               Window,
+	stack_mode:            WindowStacking,
 }
 }
 
 
 XColor :: struct {
 XColor :: struct {
@@ -243,42 +243,42 @@ XColor :: struct {
 }
 }
 
 
 XSegment :: struct {
 XSegment :: struct {
-    x1:     i16,
-    y1:     i16,
-    x2:     i16,
-    y2:     i16,
+	x1:     i16,
+	y1:     i16,
+	x2:     i16,
+	y2:     i16,
 }
 }
 
 
 XPoint :: struct {
 XPoint :: struct {
-    x:      i16,
-    y:      i16,
+	x:      i16,
+	y:      i16,
 }
 }
 
 
 XRectangle :: struct {
 XRectangle :: struct {
-    x:      i16,
-    y:      i16,
-    width:  u16,
-    height: u16,
+	x:      i16,
+	y:      i16,
+	width:  u16,
+	height: u16,
 }
 }
 
 
 XArc :: struct {
 XArc :: struct {
-    x:      i16,
-    y:      i16,
-    width:  u16,
-    height: u16,
-    angle1: i16,
-    angle2: i16,
+	x:      i16,
+	y:      i16,
+	width:  u16,
+	height: u16,
+	angle1: i16,
+	angle2: i16,
 }
 }
 
 
 XKeyboardControl :: struct {
 XKeyboardControl :: struct {
-    key_click_percent:  i32,
-    bell_percent:       i32,
-    bell_pitch:         i32,
-    bell_duration:      i32,
-    led:                i32,
-    led_mode:           KeyboardLedMode,
-    key:                i32,
-    auto_repeat_mode:   KeyboardAutoRepeatMode,
+	key_click_percent:  i32,
+	bell_percent:       i32,
+	bell_pitch:         i32,
+	bell_duration:      i32,
+	led:                i32,
+	led_mode:           KeyboardLedMode,
+	key:                i32,
+	auto_repeat_mode:   KeyboardAutoRepeatMode,
 }
 }
 
 
 XKeyboardState :: struct {
 XKeyboardState :: struct {
@@ -700,23 +700,23 @@ XAnyEvent :: struct {
 }
 }
 
 
 XGenericEvent :: struct {
 XGenericEvent :: struct {
-    type:              EventType,
-    serial:            uint,
-    send_event:        b32,
-    display:           ^Display,
-    extension:         i32,
-    evtype:            i32,
+	type:              EventType,
+	serial:            uint,
+	send_event:        b32,
+	display:           ^Display,
+	extension:         i32,
+	evtype:            i32,
 }
 }
 
 
 XGenericEventCookie :: struct {
 XGenericEventCookie :: struct {
-    type:              EventType,
-    serial:            uint,
-    send_event:        b32,
-    display:           ^Display,
-    extension:         i32,
-    evtype:            i32,
-    cookie:            u32,
-    data:              rawptr,
+	type:              EventType,
+	serial:            uint,
+	send_event:        b32,
+	display:           ^Display,
+	extension:         i32,
+	evtype:            i32,
+	cookie:            u32,
+	data:              rawptr,
 }
 }
 
 
 XEvent :: struct #raw_union {
 XEvent :: struct #raw_union {
@@ -758,55 +758,55 @@ XEvent :: struct #raw_union {
 }
 }
 
 
 XCharStruct :: struct {
 XCharStruct :: struct {
-    lbearing:          i16,
-    rbearing:          i16,
-    width:             i16,
-    ascent:            i16,
-    descent:           i16,
-    attributes:        u16,
+	lbearing:          i16,
+	rbearing:          i16,
+	width:             i16,
+	ascent:            i16,
+	descent:           i16,
+	attributes:        u16,
 }
 }
 
 
 XFontProp :: struct {
 XFontProp :: struct {
-    name:              Atom,
-    card32:            uint,
+	name:              Atom,
+	card32:            uint,
 }
 }
 
 
 XFontStruct :: struct {
 XFontStruct :: struct {
-    ext_data:          ^XExtData,
-    fid:               Font,
-    direction:         u32,
-    min_char_or_byte2: u32,
-    max_char_or_byte2: u32,
-    min_byte1:         u32,
-    max_byte1:         u32,
-    all_chars_exist:   i32,
-    default_char:      u32,
-    n_properties:      i32,
-    properties:        ^XFontProp,
-    min_bounds:        XCharStruct,
-    max_bounds:        XCharStruct,
-    per_char:          ^XCharStruct,
-    ascent:            i32,
-    descent:           i32,
+	ext_data:          ^XExtData,
+	fid:               Font,
+	direction:         u32,
+	min_char_or_byte2: u32,
+	max_char_or_byte2: u32,
+	min_byte1:         u32,
+	max_byte1:         u32,
+	all_chars_exist:   i32,
+	default_char:      u32,
+	n_properties:      i32,
+	properties:        ^XFontProp,
+	min_bounds:        XCharStruct,
+	max_bounds:        XCharStruct,
+	per_char:          ^XCharStruct,
+	ascent:            i32,
+	descent:           i32,
 }
 }
 
 
 XTextItem :: struct {
 XTextItem :: struct {
-    chars:  [^]u8,
-    nchars: i32,
-    delta:  i32,
-    font:   Font,
+	chars:  [^]u8,
+	nchars: i32,
+	delta:  i32,
+	font:   Font,
 }
 }
 
 
 XChar2b :: struct {
 XChar2b :: struct {
-    byte1: u8,
-    byte2: u8,
+	byte1: u8,
+	byte2: u8,
 }
 }
 
 
 XTextItem16 :: struct {
 XTextItem16 :: struct {
-    chars:  ^XChar2b,
-    nchars: i32,
-    delta:  i32,
-    font:   Font,
+	chars:  ^XChar2b,
+	nchars: i32,
+	delta:  i32,
+	font:   Font,
 }
 }
 
 
 XEDataObject :: struct #raw_union {
 XEDataObject :: struct #raw_union {
@@ -819,8 +819,8 @@ XEDataObject :: struct #raw_union {
 }
 }
 
 
 XFontSetExtents :: struct {
 XFontSetExtents :: struct {
-    max_ink_extent:     XRectangle,
-    max_logical_extent: XRectangle,
+	max_ink_extent:     XRectangle,
+	max_logical_extent: XRectangle,
 }
 }
 
 
 XOM      :: distinct rawptr
 XOM      :: distinct rawptr
@@ -828,41 +828,41 @@ XOC      :: distinct rawptr
 XFontSet :: XOC
 XFontSet :: XOC
 
 
 XmbTextItem :: struct {
 XmbTextItem :: struct {
-    chars:    [^]u8,
-    nchars:   i32,
-    delta:    i32,
-    font_set: XFontSet,
+	chars:    [^]u8,
+	nchars:   i32,
+	delta:    i32,
+	font_set: XFontSet,
 }
 }
 
 
 XwcTextItem :: struct {
 XwcTextItem :: struct {
-    chars:    [^]rune,
-    nchars:   i32,
-    delta:    i32,
-    font_set: XFontSet,
+	chars:    [^]rune,
+	nchars:   i32,
+	delta:    i32,
+	font_set: XFontSet,
 }
 }
 
 
 XOMCharSetList :: struct {
 XOMCharSetList :: struct {
-    charset_count: i32,
-    charset_list: [^]cstring,
+	charset_count: i32,
+	charset_list: [^]cstring,
 }
 }
 
 
 XOrientation :: enum i32 {
 XOrientation :: enum i32 {
-    XOMOrientation_LTR_TTB = 0,
-    XOMOrientation_RTL_TTB = 1,
-    XOMOrientation_TTB_LTR = 2,
-    XOMOrientation_TTB_RTL = 3,
-    XOMOrientation_Context = 4,
+	XOMOrientation_LTR_TTB = 0,
+	XOMOrientation_RTL_TTB = 1,
+	XOMOrientation_TTB_LTR = 2,
+	XOMOrientation_TTB_RTL = 3,
+	XOMOrientation_Context = 4,
 }
 }
 
 
 XOMOrientation :: struct {
 XOMOrientation :: struct {
-    num_orientation:  i32,
-    orientation:      [^]XOrientation,
+	num_orientation:  i32,
+	orientation:      [^]XOrientation,
 }
 }
 
 
 XOMFontInfo :: struct {
 XOMFontInfo :: struct {
-    num_font:         i32,
-    font_struct_list: [^]^XFontStruct,
-    font_name_list:   [^]cstring,
+	num_font:         i32,
+	font_struct_list: [^]^XFontStruct,
+	font_name_list:   [^]cstring,
 }
 }
 
 
 XIM :: distinct rawptr
 XIM :: distinct rawptr
@@ -875,38 +875,38 @@ XIDProc :: #type proc "c" (xim: XIM, client_data: rawptr, call_data: rawptr)
 XIMStyle :: uint
 XIMStyle :: uint
 
 
 XIMStyles :: struct {
 XIMStyles :: struct {
-    count_styles:     u16,
-    supported_styles: [^]XIMStyle,
+	count_styles:     u16,
+	supported_styles: [^]XIMStyle,
 }
 }
 
 
 XVaNestedList :: distinct rawptr
 XVaNestedList :: distinct rawptr
 
 
 XIMCallback :: struct {
 XIMCallback :: struct {
-    client_data: rawptr,
-    callback:    XIMProc,
+	client_data: rawptr,
+	callback:    XIMProc,
 }
 }
 
 
 XICCallback :: struct {
 XICCallback :: struct {
-    client_data: rawptr,
-    callback:    XICProc,
+	client_data: rawptr,
+	callback:    XICProc,
 }
 }
 
 
 XIMFeedback :: uint
 XIMFeedback :: uint
 
 
 XIMText :: struct {
 XIMText :: struct {
-    length:            u16,
-    feedback:          ^XIMFeedback,
-    encoding_is_wchar: b32,
-    string: struct #raw_union {
+	length:            u16,
+	feedback:          ^XIMFeedback,
+	encoding_is_wchar: b32,
+	string: struct #raw_union {
 		multi_byte: [^]u8,
 		multi_byte: [^]u8,
 		wide_char:  [^]rune,
 		wide_char:  [^]rune,
-    },
+	},
 }
 }
 
 
 XIMPreeditState :: uint
 XIMPreeditState :: uint
 
 
 XIMPreeditStateNotifyCallbackStruct :: struct {
 XIMPreeditStateNotifyCallbackStruct :: struct {
-    state: XIMPreeditState,
+	state: XIMPreeditState,
 }
 }
 
 
 XIMResetState :: uint
 XIMResetState :: uint
@@ -914,13 +914,13 @@ XIMResetState :: uint
 XIMStringConversionFeedback :: uint
 XIMStringConversionFeedback :: uint
 
 
 XIMStringConversionText :: struct {
 XIMStringConversionText :: struct {
-    length: u16,
-    feedback: ^XIMStringConversionFeedback,
-    encoding_is_wchar: b32,
-    string: struct #raw_union {
+	length: u16,
+	feedback: ^XIMStringConversionFeedback,
+	encoding_is_wchar: b32,
+	string: struct #raw_union {
 		mbs: [^]u8,
 		mbs: [^]u8,
 		wcs: [^]rune,
 		wcs: [^]rune,
-    },
+	},
 }
 }
 
 
 XIMStringConversionPosition  :: u16
 XIMStringConversionPosition  :: u16
@@ -928,76 +928,76 @@ XIMStringConversionType      :: u16
 XIMStringConversionOperation :: u16
 XIMStringConversionOperation :: u16
 
 
 XIMCaretDirection :: enum i32 {
 XIMCaretDirection :: enum i32 {
-    XIMForwardChar      = 0,
-    XIMBackwardChar     = 1,
-    XIMForwardWord      = 2,
-    XIMBackwardWord     = 3,
-    XIMCaretUp          = 4,
-    XIMCaretDown        = 5,
-    XIMNextLine         = 6,
-    XIMPreviousLine     = 7,
-    XIMLineStart        = 8,
-    XIMLineEnd          = 9,
-    XIMAbsolutePosition = 10,
-    XIMDontChang        = 11,
+	XIMForwardChar      = 0,
+	XIMBackwardChar     = 1,
+	XIMForwardWord      = 2,
+	XIMBackwardWord     = 3,
+	XIMCaretUp          = 4,
+	XIMCaretDown        = 5,
+	XIMNextLine         = 6,
+	XIMPreviousLine     = 7,
+	XIMLineStart        = 8,
+	XIMLineEnd          = 9,
+	XIMAbsolutePosition = 10,
+	XIMDontChang        = 11,
 }
 }
 
 
 XIMStringConversionCallbackStruct :: struct {
 XIMStringConversionCallbackStruct :: struct {
-    position:  XIMStringConversionPosition,
-    direction: XIMCaretDirection,
-    operation: XIMStringConversionOperation,
-    factor:    u16,
-    text:      ^XIMStringConversionText,
+	position:  XIMStringConversionPosition,
+	direction: XIMCaretDirection,
+	operation: XIMStringConversionOperation,
+	factor:    u16,
+	text:      ^XIMStringConversionText,
 }
 }
 
 
 XIMPreeditDrawCallbackStruct :: struct {
 XIMPreeditDrawCallbackStruct :: struct {
-    caret:      i32,
-    chg_first:  i32,
-    chg_length: i32,
-    text:       ^XIMText,
+	caret:      i32,
+	chg_first:  i32,
+	chg_length: i32,
+	text:       ^XIMText,
 }
 }
 
 
 XIMCaretStyle :: enum i32 {
 XIMCaretStyle :: enum i32 {
-    XIMIsInvisible,
-    XIMIsPrimary,
-    XIMIsSecondary,
+	XIMIsInvisible,
+	XIMIsPrimary,
+	XIMIsSecondary,
 }
 }
 
 
 XIMPreeditCaretCallbackStruct :: struct {
 XIMPreeditCaretCallbackStruct :: struct {
-    position:  i32,
-    direction: XIMCaretDirection,
-    style:     XIMCaretStyle,
+	position:  i32,
+	direction: XIMCaretDirection,
+	style:     XIMCaretStyle,
 }
 }
 
 
 XIMStatusDataType :: enum {
 XIMStatusDataType :: enum {
-    XIMTextType,
-    XIMBitmapType,
+	XIMTextType,
+	XIMBitmapType,
 }
 }
 
 
 XIMStatusDrawCallbackStruct :: struct {
 XIMStatusDrawCallbackStruct :: struct {
-    type: XIMStatusDataType,
-    data: struct #raw_union {
+	type: XIMStatusDataType,
+	data: struct #raw_union {
 		text: ^XIMText,
 		text: ^XIMText,
 		bitmap: Pixmap,
 		bitmap: Pixmap,
-    },
+	},
 }
 }
 
 
 XIMHotKeyTrigger :: struct {
 XIMHotKeyTrigger :: struct {
-    keysym:        KeySym,
-    modifier:      i32,
-    modifier_mask: i32,
+	keysym:        KeySym,
+	modifier:      i32,
+	modifier_mask: i32,
 }
 }
 
 
 XIMHotKeyTriggers :: struct {
 XIMHotKeyTriggers :: struct {
-    num_hot_key: i32,
-    key:         [^]XIMHotKeyTrigger,
+	num_hot_key: i32,
+	key:         [^]XIMHotKeyTrigger,
 }
 }
 
 
 XIMHotKeyState :: uint
 XIMHotKeyState :: uint
 
 
 XIMValuesList :: struct {
 XIMValuesList :: struct {
-    count_values: u16,
-    supported_values: [^]cstring,
+	count_values: u16,
+	supported_values: [^]cstring,
 }
 }
 
 
 XConnectionWatchProc :: #type proc "c" (
 XConnectionWatchProc :: #type proc "c" (
@@ -1775,62 +1775,62 @@ XcmsColorFormat :: uint
 XcmsFloat :: f64
 XcmsFloat :: f64
 
 
 XcmsRGB :: struct {
 XcmsRGB :: struct {
-    red:   u16,
-    green: u16,
-    blue:  u16,
+	red:   u16,
+	green: u16,
+	blue:  u16,
 }
 }
 
 
 XcmsRGBi :: struct {
 XcmsRGBi :: struct {
-    red:   XcmsFloat,
-    green: XcmsFloat,
-    blue:  XcmsFloat,
+	red:   XcmsFloat,
+	green: XcmsFloat,
+	blue:  XcmsFloat,
 }
 }
 
 
 XcmsCIEXYZ :: struct {
 XcmsCIEXYZ :: struct {
-    X: XcmsFloat,
-    Y: XcmsFloat,
-    Z: XcmsFloat,
+	X: XcmsFloat,
+	Y: XcmsFloat,
+	Z: XcmsFloat,
 }
 }
 
 
 XcmsCIEuvY :: struct {
 XcmsCIEuvY :: struct {
-    u_prime: XcmsFloat,
-    v_prime: XcmsFloat,
-    Y:       XcmsFloat,
+	u_prime: XcmsFloat,
+	v_prime: XcmsFloat,
+	Y:       XcmsFloat,
 }
 }
 
 
 XcmsCIExyY :: struct {
 XcmsCIExyY :: struct {
-    x: XcmsFloat,
-    y: XcmsFloat,
-    Y: XcmsFloat,
+	x: XcmsFloat,
+	y: XcmsFloat,
+	Y: XcmsFloat,
 }
 }
 
 
 XcmsCIELab :: struct {
 XcmsCIELab :: struct {
-    L_star: XcmsFloat,
-    a_star: XcmsFloat,
-    b_star: XcmsFloat,
+	L_star: XcmsFloat,
+	a_star: XcmsFloat,
+	b_star: XcmsFloat,
 }
 }
 
 
 XcmsCIELuv :: struct {
 XcmsCIELuv :: struct {
-    L_star: XcmsFloat,
-    u_star: XcmsFloat,
-    v_star: XcmsFloat,
+	L_star: XcmsFloat,
+	u_star: XcmsFloat,
+	v_star: XcmsFloat,
 }
 }
 
 
 XcmsTekHVC :: struct {
 XcmsTekHVC :: struct {
-    H: XcmsFloat,
-    V: XcmsFloat,
-    C: XcmsFloat,
+	H: XcmsFloat,
+	V: XcmsFloat,
+	C: XcmsFloat,
 }
 }
 
 
 XcmsPad :: struct {
 XcmsPad :: struct {
-    _: XcmsFloat,
-    _: XcmsFloat,
-    _: XcmsFloat,
-    _: XcmsFloat,
+	_: XcmsFloat,
+	_: XcmsFloat,
+	_: XcmsFloat,
+	_: XcmsFloat,
 }
 }
 
 
 XcmsColor :: struct {
 XcmsColor :: struct {
-    spec: struct #raw_union {
+	spec: struct #raw_union {
 		RGB:    XcmsRGB,
 		RGB:    XcmsRGB,
 		RGBi:   XcmsRGBi,
 		RGBi:   XcmsRGBi,
 		CIEXYZ: XcmsCIEXYZ,
 		CIEXYZ: XcmsCIEXYZ,
@@ -1840,17 +1840,17 @@ XcmsColor :: struct {
 		CIELuv: XcmsCIELuv,
 		CIELuv: XcmsCIELuv,
 		TekHVC: XcmsTekHVC,
 		TekHVC: XcmsTekHVC,
 		_:      XcmsPad,
 		_:      XcmsPad,
-    },
-    pixel:  uint,
-    format: XcmsColorFormat,
+	},
+	pixel:  uint,
+	format: XcmsColorFormat,
 }
 }
 
 
 XcmsPerScrnInfo :: struct {
 XcmsPerScrnInfo :: struct {
-    screenWhitePt: XcmsColor,
-    functionSet:   rawptr,
-    screenData:    rawptr,
-    state:         u8,
-    _:             [3]u8,
+	screenWhitePt: XcmsColor,
+	functionSet:   rawptr,
+	screenData:    rawptr,
+	state:         u8,
+	_:             [3]u8,
 }
 }
 
 
 XcmsCCC :: distinct rawptr
 XcmsCCC :: distinct rawptr
@@ -1872,15 +1872,15 @@ XcmsWhiteAdjustProc :: #type proc "c" (
 	compression: [^]b32) -> Status
 	compression: [^]b32) -> Status
 
 
 XcmsCCCRec :: struct {
 XcmsCCCRec :: struct {
-    dpy:                  ^Display,
-    screenNumber:         i32,
-    visual:               ^Visual,
-    clientWhitePt:        XcmsColor,
-    gamutCompProc:        XcmsCompressionProc,
-    gamutCompClientData:  rawptr,
-    whitePtAdjProc:       XcmsWhiteAdjustProc,
-    whitePtAdjClientData: rawptr,
-    pPerScrnInfo:         ^XcmsPerScrnInfo,
+	dpy:                  ^Display,
+	screenNumber:         i32,
+	visual:               ^Visual,
+	clientWhitePt:        XcmsColor,
+	gamutCompProc:        XcmsCompressionProc,
+	gamutCompClientData:  rawptr,
+	whitePtAdjProc:       XcmsWhiteAdjustProc,
+	whitePtAdjClientData: rawptr,
+	pPerScrnInfo:         ^XcmsPerScrnInfo,
 }
 }
 
 
 XcmsScreenInitProc :: #type proc "c" (
 XcmsScreenInitProc :: #type proc "c" (
@@ -1909,18 +1909,18 @@ XcmsFuncListPtr    :: [^]XcmsConversionProc
 XcmsParseStringProc :: #type proc "c" (color_string: cstring, color: ^XcmsColor) -> i32
 XcmsParseStringProc :: #type proc "c" (color_string: cstring, color: ^XcmsColor) -> i32
 
 
 XcmsColorSpace :: struct {
 XcmsColorSpace :: struct {
-    prefix:        cstring,
-    id:            XcmsColorFormat,
-    parseString:   XcmsParseStringProc,
-    to_CIEXYZ:     XcmsFuncListPtr,
-    from_CIEXYZ:   XcmsFuncListPtr,
-    inverse_flag:  i32,
+	prefix:        cstring,
+	id:            XcmsColorFormat,
+	parseString:   XcmsParseStringProc,
+	to_CIEXYZ:     XcmsFuncListPtr,
+	from_CIEXYZ:   XcmsFuncListPtr,
+	inverse_flag:  i32,
 }
 }
 
 
 XcmsFunctionSet :: struct {
 XcmsFunctionSet :: struct {
-    DDColorSpaces: [^]^XcmsColorSpace,
-    screenInitProc: XcmsScreenInitProc,
-    screenFreeProc: XcmsScreenFreeProc,
+	DDColorSpaces: [^]^XcmsColorSpace,
+	screenInitProc: XcmsScreenInitProc,
+	screenFreeProc: XcmsScreenFreeProc,
 }
 }
 
 
 
 
@@ -1958,18 +1958,18 @@ XWMHints :: struct {
 }
 }
 
 
 XTextProperty :: struct {
 XTextProperty :: struct {
-    value:         [^]u8,
-    encoding:      Atom,
-    format:        int,
-    nitems:        uint,
+	value:         [^]u8,
+	encoding:      Atom,
+	format:        int,
+	nitems:        uint,
 }
 }
 
 
 XICCEncodingStyle :: enum i32 {
 XICCEncodingStyle :: enum i32 {
-    XStringStyle,
-    XCompoundTextStyle,
-    XTextStyle,
-    XStdICCTextStyle,
-    XUTF8StringStyle,
+	XStringStyle,
+	XCompoundTextStyle,
+	XTextStyle,
+	XStdICCTextStyle,
+	XUTF8StringStyle,
 }
 }
 
 
 XIconSize :: struct {
 XIconSize :: struct {
@@ -1987,8 +1987,8 @@ XClassHint :: struct {
 }
 }
 
 
 XComposeStatus :: struct {
 XComposeStatus :: struct {
-    compose_ptr:   rawptr,
-    chars_matched: i32,
+	compose_ptr:   rawptr,
+	chars_matched: i32,
 }
 }
 
 
 Region :: distinct rawptr
 Region :: distinct rawptr
@@ -2041,8 +2041,8 @@ XrmClassList      :: XrmQuarkList
 XrmRepresentation :: XrmQuark
 XrmRepresentation :: XrmQuark
 
 
 XrmValue :: struct {
 XrmValue :: struct {
-    size: u32,
-    addr: rawptr,
+	size: u32,
+	addr: rawptr,
 }
 }
 XrmValuePtr   :: [^]XrmValue
 XrmValuePtr   :: [^]XrmValue
 
 
@@ -2052,21 +2052,21 @@ XrmSearchList :: [^]XrmHashTable
 XrmDatabase   :: distinct rawptr
 XrmDatabase   :: distinct rawptr
 
 
 XrmOptionKind :: enum {
 XrmOptionKind :: enum {
-    XrmoptionNoArg,
-    XrmoptionIsArg,
-    XrmoptionStickyArg,
-    XrmoptionSepArg,
-    XrmoptionResArg,
-    XrmoptionSkipArg,
-    XrmoptionSkipLine,
-    XrmoptionSkipNArgs,
+	XrmoptionNoArg,
+	XrmoptionIsArg,
+	XrmoptionStickyArg,
+	XrmoptionSepArg,
+	XrmoptionResArg,
+	XrmoptionSkipArg,
+	XrmoptionSkipLine,
+	XrmoptionSkipNArgs,
 }
 }
 
 
 XrmOptionDescRec :: struct {
 XrmOptionDescRec :: struct {
-    option:    cstring,
-    specifier: cstring,
-    argKind:   XrmOptionKind,
-    value:     rawptr,
+	option:    cstring,
+	specifier: cstring,
+	argKind:   XrmOptionKind,
+	value:     rawptr,
 }
 }
 
 
 XrmOptionDescList :: [^]XrmOptionDescRec
 XrmOptionDescList :: [^]XrmOptionDescRec