1 //========================================================================
2 // GLFW 3.4 X11 - www.glfw.org
3 //------------------------------------------------------------------------
4 // Copyright (c) 2002-2006 Marcus Geelnard
5 // Copyright (c) 2006-2017 Camilla Löwy <elmindreda@glfw.org>
7 // This software is provided 'as-is', without any express or implied
8 // warranty. In no event will the authors be held liable for any damages
9 // arising from the use of this software.
11 // Permission is granted to anyone to use this software for any purpose,
12 // including commercial applications, and to alter it and redistribute it
13 // freely, subject to the following restrictions:
15 // 1. The origin of this software must not be misrepresented; you must not
16 // claim that you wrote the original software. If you use this software
17 // in a product, an acknowledgment in the product documentation would
18 // be appreciated but is not required.
20 // 2. Altered source versions must be plainly marked as such, and must not
21 // be misrepresented as being the original software.
23 // 3. This notice may not be removed or altered from any source
26 //========================================================================
27 // It is fine to use C99 in this file because it will not be built with VS
28 //========================================================================
34 * Marcus: This code was originally written by Markus G. Kuhn.
35 * I have made some slight changes (trimmed it down a bit from >60 KB to
36 * 20 KB), but the functionality is the same.
40 * This module converts keysym values into the corresponding ISO 10646
41 * (UCS, Unicode) values.
43 * The array keysymtab[] contains pairs of X11 keysym values for graphical
44 * characters and the corresponding Unicode value. The function
45 * _glfwKeySym2Unicode() maps a keysym onto a Unicode value using a binary
46 * search, therefore keysymtab[] must remain SORTED by keysym value.
48 * We allow to represent any UCS character in the range U-00000000 to
49 * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
50 * This admittedly does not cover the entire 31-bit space of UCS, but
51 * it does cover all of the characters up to U-10FFFF, which can be
52 * represented by UTF-16, and more, and it is very unlikely that higher
53 * UCS codes will ever be assigned by ISO. So to get Unicode character
54 * U+ABCD you can directly use keysym 0x0100abcd.
56 * Original author: Markus G. Kuhn <mkuhn@acm.org>, University of
57 * Cambridge, April 2001
59 * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
60 * an initial draft of the mapping table.
65 //************************************************************************
66 //**** KeySym to Unicode mapping table ****
67 //************************************************************************
69 static const struct codepair {
70 unsigned short keysym;
857 { 0xfe80, 'a' }, // XK_dead_a
858 { 0xfe81, 'A' }, // XK_dead_A
859 { 0xfe82, 'e' }, // XK_dead_e
860 { 0xfe83, 'E' }, // XK_dead_E
861 { 0xfe84, 'i' }, // XK_dead_i
862 { 0xfe85, 'I' }, // XK_dead_I
863 { 0xfe86, 'o' }, // XK_dead_o
864 { 0xfe87, 'O' }, // XK_dead_O
865 { 0xfe88, 'u' }, // XK_dead_u
866 { 0xfe89, 'U' }, // XK_dead_U
873 { 0xff80 /*XKB_KEY_KP_Space*/, ' ' },
874 { 0xff95 /*XKB_KEY_KP_7*/, 0x0037 },
875 { 0xff96 /*XKB_KEY_KP_4*/, 0x0034 },
876 { 0xff97 /*XKB_KEY_KP_8*/, 0x0038 },
877 { 0xff98 /*XKB_KEY_KP_6*/, 0x0036 },
878 { 0xff99 /*XKB_KEY_KP_2*/, 0x0032 },
879 { 0xff9a /*XKB_KEY_KP_9*/, 0x0039 },
880 { 0xff9b /*XKB_KEY_KP_3*/, 0x0033 },
881 { 0xff9c /*XKB_KEY_KP_1*/, 0x0031 },
882 { 0xff9d /*XKB_KEY_KP_5*/, 0x0035 },
883 { 0xff9e /*XKB_KEY_KP_0*/, 0x0030 },
884 { 0xffaa /*XKB_KEY_KP_Multiply*/, '*' },
885 { 0xffab /*XKB_KEY_KP_Add*/, '+' },
886 { 0xffac /*XKB_KEY_KP_Separator*/, ',' },
887 { 0xffad /*XKB_KEY_KP_Subtract*/, '-' },
888 { 0xffae /*XKB_KEY_KP_Decimal*/, '.' },
889 { 0xffaf /*XKB_KEY_KP_Divide*/, '/' },
890 { 0xffb0 /*XKB_KEY_KP_0*/, 0x0030 },
891 { 0xffb1 /*XKB_KEY_KP_1*/, 0x0031 },
892 { 0xffb2 /*XKB_KEY_KP_2*/, 0x0032 },
893 { 0xffb3 /*XKB_KEY_KP_3*/, 0x0033 },
894 { 0xffb4 /*XKB_KEY_KP_4*/, 0x0034 },
895 { 0xffb5 /*XKB_KEY_KP_5*/, 0x0035 },
896 { 0xffb6 /*XKB_KEY_KP_6*/, 0x0036 },
897 { 0xffb7 /*XKB_KEY_KP_7*/, 0x0037 },
898 { 0xffb8 /*XKB_KEY_KP_8*/, 0x0038 },
899 { 0xffb9 /*XKB_KEY_KP_9*/, 0x0039 },
900 { 0xffbd /*XKB_KEY_KP_Equal*/, '=' }
904 //////////////////////////////////////////////////////////////////////////
905 ////// GLFW internal API //////
906 //////////////////////////////////////////////////////////////////////////
908 // Convert XKB KeySym to Unicode
910 long _glfwKeySym2Unicode(unsigned int keysym)
913 int max = sizeof(keysymtab) / sizeof(struct codepair) - 1;
916 // First check for Latin-1 characters (1:1 mapping)
917 if ((keysym >= 0x0020 && keysym <= 0x007e) ||
918 (keysym >= 0x00a0 && keysym <= 0x00ff))
923 // Also check for directly encoded 24-bit UCS characters
924 if ((keysym & 0xff000000) == 0x01000000)
925 return keysym & 0x00ffffff;
927 // Binary search in table
930 mid = (min + max) / 2;
931 if (keysymtab[mid].keysym < keysym)
933 else if (keysymtab[mid].keysym > keysym)
936 return keysymtab[mid].ucs;
939 // No matching Unicode value found