xref: /OK3568_Linux_fs/external/xserver/hw/xquartz/keysym2ucs.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * This module converts keysym values into the corresponding ISO 10646
3*4882a593Smuzhiyun  * (UCS, Unicode) values.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * The array keysymtab[] contains pairs of X11 keysym values for graphical
6*4882a593Smuzhiyun  * characters and the corresponding Unicode value. The function
7*4882a593Smuzhiyun  * keysym2ucs() maps a keysym onto a Unicode value using a binary search,
8*4882a593Smuzhiyun  * therefore keysymtab[] must remain SORTED by keysym value.
9*4882a593Smuzhiyun  *
10*4882a593Smuzhiyun  * The keysym -> UTF-8 conversion will hopefully one day be provided
11*4882a593Smuzhiyun  * by Xlib via XmbLookupString() and should ideally not have to be
12*4882a593Smuzhiyun  * done in X applications. But we are not there yet.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  * We allow to represent any UCS character in the range U-00000000 to
15*4882a593Smuzhiyun  * U-00FFFFFF by a keysym value in the range 0x01000000 to 0x01ffffff.
16*4882a593Smuzhiyun  * This admittedly does not cover the entire 31-bit space of UCS, but
17*4882a593Smuzhiyun  * it does cover all of the characters up to U-10FFFF, which can be
18*4882a593Smuzhiyun  * represented by UTF-16, and more, and it is very unlikely that higher
19*4882a593Smuzhiyun  * UCS codes will ever be assigned by ISO. So to get Unicode character
20*4882a593Smuzhiyun  * U+ABCD you can directly use keysym 0x0100abcd.
21*4882a593Smuzhiyun  *
22*4882a593Smuzhiyun  * Author: Markus G. Kuhn <mkuhn@acm.org>, University of Cambridge, April 2001
23*4882a593Smuzhiyun  *
24*4882a593Smuzhiyun  * Special thanks to Richard Verhoeven <river@win.tue.nl> for preparing
25*4882a593Smuzhiyun  * an initial draft of the mapping table.
26*4882a593Smuzhiyun  *
27*4882a593Smuzhiyun  * This software is in the public domain. Share and enjoy!
28*4882a593Smuzhiyun  */
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun #ifndef KEYSYM2UCS_H
31*4882a593Smuzhiyun #define KEYSYM2UCS_H 1
32*4882a593Smuzhiyun 
33*4882a593Smuzhiyun #define ARRAY_SIZE(a)  (sizeof((a)) / sizeof((a)[0]))
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun extern long
36*4882a593Smuzhiyun keysym2ucs(int keysym);
37*4882a593Smuzhiyun extern int
38*4882a593Smuzhiyun ucs2keysym(long ucs);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun #endif /* KEYSYM2UCS_H */
41