Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

334 lines
11 KiB

  1. /*++
  2. Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
  3. Module Name:
  4. DATA.c
  5. ++*/
  6. #include <windows.h>
  7. #include <regstr.h>
  8. #include <immdev.h>
  9. #include "imeattr.h"
  10. #include "imedefs.h"
  11. #pragma data_seg("INSTDATA")
  12. HINSTANCE hInst = NULL;
  13. #if defined(UNIIME)
  14. INSTDATAG sInstG = {0};
  15. #endif
  16. #if !defined(UNIIME)
  17. LPIMEL lpImeL = NULL; // per instance pointer to &sImeL
  18. INSTDATAL sInstL = {0};
  19. LPINSTDATAL lpInstL = NULL;
  20. #endif
  21. #pragma data_seg()
  22. #if !defined(MINIIME)
  23. IMEG sImeG;
  24. #endif
  25. #if !defined(UNIIME)
  26. IMEL sImeL;
  27. #endif
  28. #if !defined(MINIIME)
  29. #if !defined(ROMANIME)
  30. int iDx[3 * CANDPERPAGE];
  31. #endif
  32. #if !defined(ROMANIME)
  33. const TCHAR szDigit[] = TEXT("01234567890");
  34. #endif
  35. #if !defined(ROMANIME)
  36. // convert char to upper case
  37. const BYTE bUpper[] = {
  38. // 0x20 - 0x27
  39. 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
  40. // 0x28 - 0x2F
  41. 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F,
  42. // 0x30 - 0x37
  43. 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37,
  44. // 0x38 - 0x3F
  45. 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F,
  46. // 0x40 - 0x47
  47. 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
  48. // 0x48 - 0x4F
  49. 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F,
  50. // 0x50 - 0x57
  51. 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
  52. // 0x58 - 0x5F
  53. 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
  54. // ` a b c d e f g
  55. '`', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
  56. // h i j k l m n o
  57. 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
  58. // p q r s t u v w
  59. 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
  60. // x y z { | } ~
  61. 'X', 'Y', 'Z', '{', '|', '}', '~'
  62. };
  63. const WORD fMask[] = { // offset of bitfield
  64. 0x0001, 0x0002, 0x0004, 0x0008, 0x0010, 0x0020, 0x0040, 0x0080,
  65. 0x0100, 0x0200, 0x0400, 0x0800, 0x1000, 0x2000, 0x4000, 0x8000
  66. };
  67. const TCHAR szRegNearCaret[] = TEXT("Control Panel\\Input Method");
  68. const TCHAR szPhrasePtr[] = TEXT("Phrase Prediction Pointer");
  69. const TCHAR szPhraseDic[] = TEXT("Phrase Prediction Dictionary");
  70. const TCHAR szPara[] = TEXT("Parallel Distance");
  71. const TCHAR szPerp[] = TEXT("Perpendicular Distance");
  72. const TCHAR szParaTol[] = TEXT("Parallel Tolerance");
  73. const TCHAR szPerpTol[] = TEXT("Perpendicular Tolerance");
  74. // 0
  75. // |
  76. // Parallel Dist should on x, Penpendicular Dist should on y
  77. // LofFontHi also need to be considered as the distance
  78. // *-----------+
  79. // 1 * LogFontHi | |
  80. // +-----------+
  81. // 1 * LogFontWi
  82. // 900 1 * LogFontWi
  83. // +------------+
  84. // -1 * LogFontHi | |
  85. // *------------+
  86. // Parallel Dist should on y, Penpendicular Dist should on x
  87. // LofFontHi also need be considered as distance
  88. // -
  89. // 1800
  90. // |
  91. // Parallel Dist should on (- x), Penpendicular Dist should on y
  92. // LofFontHi do not need be considered as distance
  93. // *------------+
  94. // 1 * LogFontHi | |
  95. // +------------+
  96. // 1 * LogFontWi
  97. // 2700
  98. // _
  99. // Parallel Dist should on (- y), Penpendicular Dist should on (- x)
  100. // LofFontHi also need to be considered as the distance
  101. // +------------*
  102. // 1 * LogFontHi | |
  103. // +------------+
  104. // -1 * LogFontWi
  105. // decide UI offset base on escapement
  106. const NEARCARET ncUIEsc[] = {
  107. // LogFontX LogFontY ParaX PerpX ParaY PerpY
  108. { 0, 1, 1, 0, 0, 1}, // 0
  109. { 1, 0, 0, 1, 1, 0}, // 900
  110. { 0, 0, -1, 0, 0, 1}, // 1800
  111. {-1, 0, 0, -1, -1, 0} // 2700
  112. };
  113. // decide input rectangle base on escapement
  114. const POINT ptInputEsc[] = {
  115. // LogFontWi LogFontHi
  116. {1, 1}, // 0
  117. {1, -1}, // 900
  118. {1, 1}, // 1800
  119. {-1, 1} // 2700
  120. };
  121. // decide another UI offset base on escapement
  122. const NEARCARET ncAltUIEsc[] = {
  123. // LogFontX LogFontY ParaX PerpX ParaY PerpY
  124. { 0, 0, 1, 0, 0, -1}, // 0
  125. { 0, 0, 0, -1, 1, 0}, // 900
  126. { 0, 0, -1, 0, 0, -1}, // 1800
  127. { 0, 0, 0, 1, -1, 0} // 2700
  128. };
  129. // decide another input rectangle base on escapement
  130. const POINT ptAltInputEsc[] = {
  131. // LogFontWi LogFontHi
  132. {1, -1}, // 0
  133. {-1, -1}, // 900
  134. {1, -1}, // 1800
  135. {1, 1} // 2700
  136. };
  137. #if defined(PHON)
  138. const TCHAR szRegReadLayout[] = TEXT("Keyboard Mapping");
  139. #endif
  140. const TCHAR szRegRevKL[] = TEXT("Reverse Layout");
  141. const TCHAR szRegUserDic[] = TEXT("User Dictionary");
  142. #endif
  143. // per user setting for
  144. const TCHAR szRegAppUser[] = REGSTR_PATH_SETUP;
  145. const TCHAR szRegModeConfig[] = TEXT("Mode Configuration");
  146. // all shift keys are not for typing reading characters
  147. const BYTE bChar2VirtKey[] = {
  148. // ' ' ! " # $ % & '
  149. 0, 0, 0, 0, 0, 0, 0, VK_OEM_QUOTE,
  150. // ( ) * + , - . /
  151. 0, 0, 0, 0, VK_OEM_COMMA, VK_OEM_MINUS, VK_OEM_PERIOD, VK_OEM_SLASH,
  152. // 0 1 2 3 4 5 6 7
  153. '0', '1', '2', '3', '4', '5', '6', '7',
  154. // 8 9 : ; < = > ?
  155. '8', '9', 0, VK_OEM_SEMICLN, 0, VK_OEM_EQUAL, 0, 0,
  156. // @ A B C D E F G
  157. 0, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
  158. // H I J K L M N O
  159. 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
  160. // P Q R S T U V W
  161. 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
  162. // X Y Z [ \ ] ^ _
  163. 'X', 'Y', 'Z', VK_OEM_LBRACKET, VK_OEM_BSLASH, VK_OEM_RBRACKET, 0, 0
  164. // ' a b c
  165. , VK_OEM_3, 0, 0, 0
  166. // For Dayi, the above VK_OEM_3 for ROAD input,
  167. // For Other IMEs, it is for EURO symbol input.
  168. };
  169. #if defined(PHON)
  170. // this table will convert key of other layout to the standard layout
  171. // '!' for invalid key
  172. const BYTE bStandardLayout[READ_LAYOUTS][0x41] = {
  173. {
  174. // ' ' ! " # $ % & '
  175. ' ', '!', '!', '!', '!', '!', '!', '!',
  176. // ( ) * + , - . /
  177. '!', '!', '!', '!', ',', '-', '.', '/',
  178. // 0 1 2 3 4 5 6 7
  179. '0', '1', '2', '3', '4', '5', '6', '7',
  180. // 8 9 : ; < = > ?
  181. '8', '9', '!', ';', '<', '!', '>', '?',
  182. // @ A B C D E F G
  183. '!', 'A', 'B', 'C', 'D', 'E', 'F', 'G',
  184. // H I J K L M N O
  185. 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
  186. // P Q R S T U V W
  187. 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
  188. // X Y Z [ \ ] ^ _ `
  189. 'X', 'Y', 'Z', '!', '!', '!', '!', '!', '`'
  190. }
  191. , {
  192. // ' ' ! " # $ % & '
  193. ' ', '!', '!', '!', '!', '!', '!', 'H',
  194. // ( ) * + , - . /
  195. '!', '!', '!', '!', '5', '/', 'T', 'G',
  196. // 0 1 2 3 4 5 6 7
  197. ';', '7', '6', '3', '4', '!', '!', 'F',
  198. // 8 9 : ; < = > ?
  199. '0', 'P', '!', 'Y', '<', '-', '>', '?',
  200. // @ A B C D E F G
  201. '!', '8', '1', 'V', '2', 'U', 'Z', 'R',
  202. // H I J K L M N O
  203. 'C', '9', 'B', 'D', 'X', 'A', 'S', 'I',
  204. // P Q R S T U V W
  205. 'Q', 'O', 'K', 'N', 'W', 'M', 'E', ',',
  206. // X Y Z [ \ ] ^ _ `
  207. 'J', '.', 'L', '!', '!', '!', '!', '!', '`'
  208. }
  209. , {
  210. // ' ' ! " # $ % & '
  211. ' ', '!', '!', '!', '!', '!', '!', '!',
  212. // ( ) * + , - . /
  213. '!', '!', '!', '!', '3', 'C', '4', '7',
  214. // 0 1 2 3 4 5 6 7
  215. 'D', '1', 'Q', 'A', 'Z', '2', 'W', 'S',
  216. // 8 9 : ; < = > ?
  217. 'X', 'E', '!', 'L', '<', '!', '>', '?',
  218. // @ A B C D E F G
  219. '!', 'U', '/', 'P', 'M', 'V', '8', 'I',
  220. // H I J K L M N O
  221. 'K', 'Y', ',', '9', 'O', '6', '-', 'H',
  222. // P Q R S T U V W
  223. 'N', 'R', '5', 'J', 'T', 'B', ';', 'F',
  224. // X Y Z [ \ ] ^ _ `
  225. '0', 'G', '.', '!', '!', '!', '!', '!', '`'
  226. }
  227. , {
  228. // ' ' ! " # $ % & '
  229. ' ', '!', '!', '!', '!', '!', '!', 'M',
  230. // ( ) * + , - . /
  231. '!', '!', '!', '!', ',', 'U', '.', '/',
  232. // 0 1 2 3 4 5 6 7
  233. '0', '7', '1', '2', '!', '!', '5', '!',
  234. // 8 9 : ; < = > ?
  235. '8', '9', '!', ';', '<', '-', '>', '?',
  236. // @ A B C D E F G
  237. '!', '3', 'V', 'X', 'S', 'W', 'D', 'F',
  238. // H I J K L M N O
  239. 'G', 'I', 'H', 'K', 'L', 'N', 'B', 'O',
  240. // P Q R S T U V W
  241. 'P', '6', 'E', 'A', 'R', 'Y', 'C', 'Q',
  242. // X Y Z [ \ ] ^ _ `
  243. 'Z', 'T', '4', 'J', '!', '!', '!', '!', '`'
  244. }
  245. };
  246. // the index (position) of bo, po, mo, and fo.
  247. // only 0 to 3 is a valid value
  248. const char cIndexTable[] = {
  249. // ' ' ! " # $ % & '
  250. 3, -1, -1, -1, -1, -1, -1, -1,
  251. // ( ) * + , - . /
  252. -1, -1, -1, -1, 2, 2, 2, 2,
  253. // 0 1 2 3 4 5 6 7
  254. 2, 0, 0, 3, 3, 0, 3, 3,
  255. // 8 9 : ; < = > ?
  256. 2, 2, -1, 2, -1, -1, -1, -1,
  257. // @ A B C D E F G
  258. -1, 0, 0, 0, 0, 0, 0, 0,
  259. // H I J K L M N O
  260. 0, 2, 1, 2, 2, 1, 0, 2,
  261. // P Q R S T U V W
  262. 2, 0, 0, 0, 0, 1, 0, 0,
  263. // X Y Z [ \ ] ^ _ `
  264. 0, 0, 0, -1, -1, -1, -1, -1, -1
  265. };
  266. // convert sequence code to index [position]
  267. const char cSeq2IndexTbl[] = {
  268. // 0 1 2 3 4 5 6 7
  269. -1, 0, 0, 0, 0, 0, 0, 0,
  270. // 8 9 10 11 12 13 14 15
  271. 0, 0, 0, 0, 0, 0, 0, 0,
  272. // 16 17 18 19 20 21 22 23
  273. 0, 0, 0, 0, 0, 0, 1, 1,
  274. // 24 25 26 27 28 29 30 31
  275. 1, 2, 2, 2, 2, 2, 2, 2,
  276. // 32 33 34 35 36 37 38 39
  277. 2, 2, 2, 2, 2, 2, 3, 3,
  278. // 40 41 42
  279. 3, 3, 3
  280. };
  281. #endif // defined(PHON)
  282. #ifdef UNICODE
  283. #if defined(PHON) || defined(DAYI)
  284. const BYTE bValidFirstHex[] = {
  285. // 0 1 2 3 4 5 6 7 8 9, A B C D E F
  286. 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1
  287. };
  288. const BYTE bInverseEncode[] = {
  289. // 0 1 2 3 4 5 6 7
  290. 0x3, 0x4, 0x5, 0x0, 0x1, 0x2, 0xA, 0xB,
  291. // 8 9, A B C D E F
  292. 0xC, 0xD, 0x6, 0x7, 0x8, 0x9, 0xF, 0xE
  293. };
  294. #endif
  295. #endif
  296. #endif // !defined(MINIIME)