keyboard.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Command & Conquer *
  23. * *
  24. * $Archive:: /Commando/Code/wwlib/keyboard.h $*
  25. * *
  26. * $Author:: Jani_p $*
  27. * *
  28. * $Modtime:: 5/04/01 9:03p $*
  29. * *
  30. * $Revision:: 2 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #ifndef KEY_H
  36. #define KEY_H
  37. #include "_xmouse.h"
  38. #include "win.h"
  39. /*
  40. ** The "bool" integral type was defined by the C++ comittee in
  41. ** November of '94. Until the compiler supports this, use the following
  42. ** definition.
  43. */
  44. #include "bool.h"
  45. typedef enum {
  46. WWKEY_SHIFT_BIT = 0x100,
  47. WWKEY_CTRL_BIT = 0x200,
  48. WWKEY_ALT_BIT = 0x400,
  49. WWKEY_RLS_BIT = 0x800,
  50. WWKEY_VK_BIT = 0x1000,
  51. WWKEY_DBL_BIT = 0x2000,
  52. WWKEY_BTN_BIT = 0x8000
  53. } WWKey_Type;
  54. class WWKeyboardClass
  55. {
  56. public:
  57. /* Define the base constructor and destructors for the class */
  58. WWKeyboardClass();
  59. /* Define the functions which work with the Keyboard Class */
  60. unsigned short Check(void) const;
  61. unsigned short Get(void);
  62. bool Put(unsigned short key);
  63. void Clear(void);
  64. char To_ASCII(unsigned short num);
  65. bool Down(unsigned short key);
  66. /* Define the main hook for the message processing loop. */
  67. bool Message_Handler(HWND hwnd, UINT message, UINT wParam, LONG lParam);
  68. /* Define the public access variables which are used with the */
  69. /* Keyboard Class. */
  70. int MouseQX;
  71. int MouseQY;
  72. private:
  73. /*
  74. ** This is a keyboard state array that is used to aid in translating
  75. ** KN_ keys into KA_ keys.
  76. */
  77. unsigned char KeyState[256];
  78. /*
  79. ** This is the circular keyboard holding buffer. It holds the VK key and
  80. ** the current shift state at the time the key was added to the queue.
  81. */
  82. unsigned short Buffer[256]; // buffer which holds actual keypresses
  83. unsigned short Buff_Get(void);
  84. unsigned short Fetch_Element(void);
  85. unsigned short Peek_Element(void) const;
  86. bool Put_Element(unsigned short val);
  87. bool Is_Buffer_Full(void) const;
  88. bool Is_Buffer_Empty(void) const;
  89. static bool Is_Mouse_Key(unsigned short key);
  90. void Fill_Buffer_From_System(void);
  91. bool Put_Key_Message(unsigned short vk_key, bool release = false);
  92. bool Put_Mouse_Message(unsigned short vk_key, int x, int y, bool release = false);
  93. int Available_Buffer_Room(void) const;
  94. /*
  95. ** These are the tracking pointers to maintain the
  96. ** circular keyboard list.
  97. */
  98. int Head;
  99. int Tail;
  100. };
  101. #define VK_NONE 0x00
  102. #define VK_LBUTTON 0x01
  103. #define VK_RBUTTON 0x02
  104. #define VK_CANCEL 0x03
  105. #define VK_MBUTTON 0x04
  106. #define VK_NONE_05 0x05
  107. #define VK_NONE_06 0x06
  108. #define VK_NONE_07 0x07
  109. #define VK_BACK 0x08
  110. #define VK_TAB 0x09
  111. #define VK_NONE_0A 0x0A
  112. #define VK_NONE_0B 0x0B
  113. #define VK_CLEAR 0x0C
  114. #define VK_RETURN 0x0D
  115. #define VK_NONE_0E 0x0E
  116. #define VK_NONE_0F 0x0F
  117. #define VK_SHIFT 0x10
  118. #define VK_CONTROL 0x11
  119. #define VK_MENU 0x12
  120. #define VK_PAUSE 0x13
  121. #define VK_CAPITAL 0x14
  122. #define VK_NONE_15 0x15
  123. #define VK_NONE_16 0x16
  124. #define VK_NONE_17 0x17
  125. #define VK_NONE_18 0x18
  126. #define VK_NONE_19 0x19
  127. #define VK_NONE_1A 0x1A
  128. #define VK_ESCAPE 0x1B
  129. #define VK_NONE_1C 0x1C
  130. #define VK_NONE_1D 0x1D
  131. #define VK_NONE_1E 0x1E
  132. #define VK_NONE_1F 0x1F
  133. #define VK_SPACE 0x20
  134. #define VK_PRIOR 0x21
  135. #define VK_NEXT 0x22
  136. #define VK_END 0x23
  137. #define VK_HOME 0x24
  138. #define VK_LEFT 0x25
  139. #define VK_UP 0x26
  140. #define VK_RIGHT 0x27
  141. #define VK_DOWN 0x28
  142. #define VK_SELECT 0x29
  143. #define VK_PRINT 0x2A
  144. #define VK_EXECUTE 0x2B
  145. #define VK_SNAPSHOT 0x2C
  146. #define VK_INSERT 0x2D
  147. #define VK_DELETE 0x2E
  148. #define VK_HELP 0x2F
  149. #define VK_0 0x30
  150. #define VK_1 0x31
  151. #define VK_2 0x32
  152. #define VK_3 0x33
  153. #define VK_4 0x34
  154. #define VK_5 0x35
  155. #define VK_6 0x36
  156. #define VK_7 0x37
  157. #define VK_8 0x38
  158. #define VK_9 0x39
  159. #define VK_NONE_3B 0x3B
  160. #define VK_NONE_3C 0x3C
  161. #define VK_NONE_3D 0x3D
  162. #define VK_NONE_3E 0x3E
  163. #define VK_NONE_3F 0x3F
  164. #define VK_NONE_40 0x40
  165. #define VK_A 0x41
  166. #define VK_B 0x42
  167. #define VK_C 0x43
  168. #define VK_D 0x44
  169. #define VK_E 0x45
  170. #define VK_F 0x46
  171. #define VK_G 0x47
  172. #define VK_H 0x48
  173. #define VK_I 0x49
  174. #define VK_J 0x4A
  175. #define VK_K 0x4B
  176. #define VK_L 0x4C
  177. #define VK_M 0x4D
  178. #define VK_N 0x4E
  179. #define VK_O 0x4F
  180. #define VK_P 0x50
  181. #define VK_Q 0x51
  182. #define VK_R 0x52
  183. #define VK_S 0x53
  184. #define VK_T 0x54
  185. #define VK_U 0x55
  186. #define VK_V 0x56
  187. #define VK_W 0x57
  188. #define VK_X 0x58
  189. #define VK_Y 0x59
  190. #define VK_Z 0x5A
  191. #define VK_NONE_5B 0x5B
  192. #define VK_NONE_5C 0x5C
  193. #define VK_NONE_5D 0x5D
  194. #define VK_NONE_5E 0x5E
  195. #define VK_NONE_5F 0x5F
  196. #define VK_NUMPAD0 0x60
  197. #define VK_NUMPAD1 0x61
  198. #define VK_NUMPAD2 0x62
  199. #define VK_NUMPAD3 0x63
  200. #define VK_NUMPAD4 0x64
  201. #define VK_NUMPAD5 0x65
  202. #define VK_NUMPAD6 0x66
  203. #define VK_NUMPAD7 0x67
  204. #define VK_NUMPAD8 0x68
  205. #define VK_NUMPAD9 0x69
  206. #define VK_MULTIPLY 0x6A
  207. #define VK_ADD 0x6B
  208. #define VK_SEPARATOR 0x6C
  209. #define VK_SUBTRACT 0x6D
  210. #define VK_DECIMAL 0x6E
  211. #define VK_DIVIDE 0x6F
  212. #define VK_F1 0x70
  213. #define VK_F2 0x71
  214. #define VK_F3 0x72
  215. #define VK_F4 0x73
  216. #define VK_F5 0x74
  217. #define VK_F6 0x75
  218. #define VK_F7 0x76
  219. #define VK_F8 0x77
  220. #define VK_F9 0x78
  221. #define VK_F10 0x79
  222. #define VK_F11 0x7A
  223. #define VK_F12 0x7B
  224. #define VK_F13 0x7C
  225. #define VK_F14 0x7D
  226. #define VK_F15 0x7E
  227. #define VK_F16 0x7F
  228. #define VK_F17 0x80
  229. #define VK_F18 0x81
  230. #define VK_F19 0x82
  231. #define VK_F20 0x83
  232. #define VK_F21 0x84
  233. #define VK_F22 0x85
  234. #define VK_F23 0x86
  235. #define VK_F24 0x87
  236. #define VK_NONE_88 0x88
  237. #define VK_NONE_89 0x89
  238. #define VK_NONE_8A 0x8A
  239. #define VK_NONE_8B 0x8B
  240. #define VK_NONE_8C 0x8C
  241. #define VK_NONE_8D 0x8D
  242. #define VK_NONE_8E 0x8E
  243. #define VK_NONE_8F 0x8F
  244. #define VK_NUMLOCK 0x90
  245. #define VK_SCROLL 0x91
  246. #define VK_NONE_92 0x92
  247. #define VK_NONE_93 0x93
  248. #define VK_NONE_94 0x94
  249. #define VK_NONE_95 0x95
  250. #define VK_NONE_96 0x96
  251. #define VK_NONE_97 0x97
  252. #define VK_NONE_98 0x98
  253. #define VK_NONE_99 0x99
  254. #define VK_NONE_9A 0x9A
  255. #define VK_NONE_9B 0x9B
  256. #define VK_NONE_9C 0x9C
  257. #define VK_NONE_9D 0x9D
  258. #define VK_NONE_9E 0x9E
  259. #define VK_NONE_9F 0x9F
  260. #define VK_NONE_A0 0xA0
  261. #define VK_NONE_A1 0xA1
  262. #define VK_NONE_A2 0xA2
  263. #define VK_NONE_A3 0xA3
  264. #define VK_NONE_A4 0xA4
  265. #define VK_NONE_A5 0xA5
  266. #define VK_NONE_A6 0xA6
  267. #define VK_NONE_A7 0xA7
  268. #define VK_NONE_A8 0xA8
  269. #define VK_NONE_A9 0xA9
  270. #define VK_NONE_AA 0xAA
  271. #define VK_NONE_AB 0xAB
  272. #define VK_NONE_AC 0xAC
  273. #define VK_NONE_AD 0xAD
  274. #define VK_NONE_AE 0xAE
  275. #define VK_NONE_AF 0xAF
  276. #define VK_NONE_B0 0xB0
  277. #define VK_NONE_B1 0xB1
  278. #define VK_NONE_B2 0xB2
  279. #define VK_NONE_B3 0xB3
  280. #define VK_NONE_B4 0xB4
  281. #define VK_NONE_B5 0xB5
  282. #define VK_NONE_B6 0xB6
  283. #define VK_NONE_B7 0xB7
  284. #define VK_NONE_B8 0xB8
  285. #define VK_NONE_B9 0xB9
  286. #define VK_NONE_BA 0xBA // ;
  287. #define VK_NONE_BB 0xBB // =
  288. #define VK_NONE_BC 0xBC // ,
  289. #define VK_NONE_BD 0xBD // -
  290. #define VK_NONE_BE 0xBE // .
  291. #define VK_NONE_BF 0xBF // /
  292. #define VK_NONE_C0 0xC0 // `
  293. #define VK_NONE_C1 0xC1
  294. #define VK_NONE_C2 0xC2
  295. #define VK_NONE_C3 0xC3
  296. #define VK_NONE_C4 0xC4
  297. #define VK_NONE_C5 0xC5
  298. #define VK_NONE_C6 0xC6
  299. #define VK_NONE_C7 0xC7
  300. #define VK_NONE_C8 0xC8
  301. #define VK_NONE_C9 0xC9
  302. #define VK_NONE_CA 0xCA
  303. #define VK_NONE_CB 0xCB
  304. #define VK_NONE_CC 0xCC
  305. #define VK_NONE_CD 0xCD
  306. #define VK_NONE_CE 0xCE
  307. #define VK_NONE_CF 0xCF
  308. #define VK_NONE_D0 0xD0
  309. #define VK_NONE_D1 0xD1
  310. #define VK_NONE_D2 0xD2
  311. #define VK_NONE_D3 0xD3
  312. #define VK_NONE_D4 0xD4
  313. #define VK_NONE_D5 0xD5
  314. #define VK_NONE_D6 0xD6
  315. #define VK_NONE_D7 0xD7
  316. #define VK_NONE_D8 0xD8
  317. #define VK_NONE_D9 0xD9
  318. #define VK_NONE_DA 0xDA
  319. #define VK_NONE_DB 0xDB // [
  320. #define VK_NONE_DC 0xDC // '\'
  321. #define VK_NONE_DD 0xDD // ]
  322. #define VK_NONE_DE 0xDE // '
  323. #define VK_NONE_DF 0xDF
  324. #define VK_NONE_E0 0xE0
  325. #define VK_NONE_E1 0xE1
  326. #define VK_NONE_E2 0xE2
  327. #define VK_NONE_E3 0xE3
  328. #define VK_NONE_E4 0xE4
  329. #define VK_NONE_E5 0xE5
  330. #define VK_NONE_E6 0xE6
  331. #define VK_NONE_E7 0xE7
  332. #define VK_NONE_E8 0xE8
  333. #define VK_NONE_E9 0xE9
  334. #define VK_NONE_EA 0xEA
  335. #define VK_NONE_EB 0xEB
  336. #define VK_NONE_EC 0xEC
  337. #define VK_NONE_ED 0xED
  338. #define VK_NONE_EE 0xEE
  339. #define VK_NONE_EF 0xEF
  340. #define VK_NONE_F0 0xF0
  341. #define VK_NONE_F1 0xF1
  342. #define VK_NONE_F2 0xF2
  343. #define VK_NONE_F3 0xF3
  344. #define VK_NONE_F4 0xF4
  345. #define VK_NONE_F5 0xF5
  346. #define VK_NONE_F6 0xF6
  347. #define VK_NONE_F7 0xF7
  348. #define VK_NONE_F8 0xF8
  349. #define VK_NONE_F9 0xF9
  350. #define VK_NONE_FA 0xFA
  351. #define VK_NONE_FB 0xFB
  352. #define VK_NONE_FC 0xFC
  353. #define VK_NONE_FD 0xFD
  354. #define VK_NONE_FE 0xFE
  355. #define VK_NONE_FF 0xFF
  356. #define VK_UPLEFT VK_HOME
  357. #define VK_UPRIGHT VK_PRIOR
  358. #define VK_DOWNLEFT VK_END
  359. #define VK_DOWNRIGHT VK_NEXT
  360. #define VK_ALT VK_MENU
  361. typedef enum KeyASCIIType {
  362. //
  363. // Define all the KA types as variations of the VK types. This is
  364. // so the KA functions will work properly under windows 95.
  365. //
  366. KA_NONE = 0,
  367. KA_MORE = 1,
  368. KA_SETBKGDCOL = 2,
  369. KA_SETFORECOL = 6,
  370. KA_FORMFEED = 12,
  371. KA_SPCTAB = 20,
  372. KA_SETX = 25,
  373. KA_SETY = 26,
  374. KA_SPACE = 32, /* */
  375. KA_EXCLAMATION, /* ! */
  376. KA_DQUOTE, /* " */
  377. KA_POUND, /* # */
  378. KA_DOLLAR, /* $ */
  379. KA_PERCENT, /* % */
  380. KA_AMPER, /* & */
  381. KA_SQUOTE, /* ' */
  382. KA_LPAREN, /* ( */
  383. KA_RPAREN, /* ) */
  384. KA_ASTERISK, /* * */
  385. KA_PLUS, /* + */
  386. KA_COMMA, /* , */
  387. KA_MINUS, /* - */
  388. KA_PERIOD, /* . */
  389. KA_SLASH, /* / */
  390. KA_0, KA_1, KA_2, KA_3, KA_4, KA_5, KA_6, KA_7, KA_8, KA_9,
  391. KA_COLON, /* : */
  392. KA_SEMICOLON, /* ; */
  393. KA_LESS_THAN, /* < */
  394. KA_EQUAL, /* = */
  395. KA_GREATER_THAN, /* > */
  396. KA_QUESTION, /* ? */
  397. KA_AT, /* @ */
  398. KA_A, /* A */
  399. KA_B, /* B */
  400. KA_C, /* C */
  401. KA_D, /* D */
  402. KA_E, /* E */
  403. KA_F, /* F */
  404. KA_G, /* G */
  405. KA_H, /* H */
  406. KA_I, /* I */
  407. KA_J, /* J */
  408. KA_K, /* K */
  409. KA_L, /* L */
  410. KA_M, /* M */
  411. KA_N, /* N */
  412. KA_O, /* O */
  413. KA_P, /* P */
  414. KA_Q, /* Q */
  415. KA_R, /* R */
  416. KA_S, /* S */
  417. KA_T, /* T */
  418. KA_U, /* U */
  419. KA_V, /* V */
  420. KA_W, /* W */
  421. KA_X, /* X */
  422. KA_Y, /* Y */
  423. KA_Z, /* Z */
  424. KA_LBRACKET, /* [ */
  425. KA_BACKSLASH, /* \ */
  426. KA_RBRACKET, /* ] */
  427. KA_CARROT, /* ^ */
  428. KA_UNDERLINE, /* _ */
  429. KA_GRAVE, /* ` */
  430. KA_a, /* a */
  431. KA_b, /* b */
  432. KA_c, /* c */
  433. KA_d, /* d */
  434. KA_e, /* e */
  435. KA_f, /* f */
  436. KA_g, /* g */
  437. KA_h, /* h */
  438. KA_i, /* i */
  439. KA_j, /* j */
  440. KA_k, /* k */
  441. KA_l, /* l */
  442. KA_m, /* m */
  443. KA_n, /* n */
  444. KA_o, /* o */
  445. KA_p, /* p */
  446. KA_q, /* q */
  447. KA_r, /* r */
  448. KA_s, /* s */
  449. KA_t, /* t */
  450. KA_u, /* u */
  451. KA_v, /* v */
  452. KA_w, /* w */
  453. KA_x, /* x */
  454. KA_y, /* y */
  455. KA_z, /* z */
  456. KA_LBRACE, /* { */
  457. KA_BAR, /* | */
  458. KA_RBRACE, /* ] */
  459. KA_TILDA, /* ~ */
  460. KA_ESC = VK_ESCAPE,
  461. KA_EXTEND = VK_ESCAPE,
  462. KA_RETURN = VK_RETURN,
  463. KA_BACKSPACE = VK_BACK,
  464. KA_TAB = VK_TAB ,
  465. KA_DELETE = VK_DELETE, /* <DELETE> */
  466. KA_INSERT = VK_INSERT, /* <INSERT> */
  467. KA_PGDN = VK_NEXT, /* <PAGE DOWN> */
  468. KA_DOWNRIGHT = VK_NEXT,
  469. KA_DOWN = VK_DOWN, /* <DOWN ARROW> */
  470. KA_END = VK_END, /* <END> */
  471. KA_DOWNLEFT = VK_END,
  472. KA_RIGHT = VK_RIGHT, /* <RIGHT ARROW> */
  473. KA_KEYPAD5 = VK_SELECT, /* NUMERIC KEY PAD <5> */
  474. KA_LEFT = VK_LEFT, /* <LEFT ARROW> */
  475. KA_PGUP = VK_PRIOR, /* <PAGE UP> */
  476. KA_UPRIGHT = VK_PRIOR,
  477. KA_UP = VK_UP, /* <UP ARROW> */
  478. KA_HOME = VK_HOME, /* <HOME> */
  479. KA_UPLEFT = VK_HOME,
  480. KA_F12 = VK_F12,
  481. KA_F11 = VK_F11,
  482. KA_F10 = VK_F10,
  483. KA_F9 = VK_F9,
  484. KA_F8 = VK_F8,
  485. KA_F7 = VK_F7,
  486. KA_F6 = VK_F6,
  487. KA_F5 = VK_F5,
  488. KA_F4 = VK_F4,
  489. KA_F3 = VK_F3,
  490. KA_F2 = VK_F2,
  491. KA_F1 = VK_F1,
  492. KA_LMOUSE = VK_LBUTTON,
  493. KA_RMOUSE = VK_RBUTTON,
  494. KA_SHIFT_BIT = WWKEY_SHIFT_BIT,
  495. KA_CTRL_BIT = WWKEY_CTRL_BIT,
  496. KA_ALT_BIT = WWKEY_ALT_BIT,
  497. KA_RLSE_BIT = WWKEY_RLS_BIT
  498. } KeyASCIIType;
  499. typedef enum KeyNumType {
  500. KN_NONE = 0,
  501. KN_0 = VK_0,
  502. KN_1 = VK_1,
  503. KN_2 = VK_2,
  504. KN_3 = VK_3,
  505. KN_4 = VK_4,
  506. KN_5 = VK_5,
  507. KN_6 = VK_6,
  508. KN_7 = VK_7,
  509. KN_8 = VK_8,
  510. KN_9 = VK_9,
  511. KN_A = VK_A,
  512. KN_B = VK_B,
  513. KN_BACKSLASH = VK_NONE_DC,
  514. KN_BACKSPACE = VK_BACK,
  515. KN_C = VK_C,
  516. KN_CAPSLOCK = VK_CAPITAL,
  517. KN_CENTER = VK_CLEAR,
  518. KN_COMMA = VK_NONE_BC,
  519. KN_D = VK_D,
  520. KN_DELETE = VK_DELETE,
  521. KN_DOWN = VK_DOWN,
  522. KN_DOWNLEFT = VK_END,
  523. KN_DOWNRIGHT = VK_NEXT,
  524. KN_E = VK_E,
  525. KN_END = VK_END,
  526. KN_EQUAL = VK_NONE_BB,
  527. KN_ESC = VK_ESCAPE,
  528. KN_E_DELETE = VK_DELETE,
  529. KN_E_DOWN = VK_NUMPAD2,
  530. KN_E_END = VK_NUMPAD1,
  531. KN_E_HOME = VK_NUMPAD7,
  532. KN_E_INSERT = VK_INSERT,
  533. KN_E_LEFT = VK_NUMPAD4,
  534. KN_E_PGDN = VK_NUMPAD3,
  535. KN_E_PGUP = VK_NUMPAD9,
  536. KN_E_RIGHT = VK_NUMPAD6,
  537. KN_E_UP = VK_NUMPAD8,
  538. KN_F = VK_F,
  539. KN_F1 = VK_F1,
  540. KN_F10 = VK_F10,
  541. KN_F11 = VK_F11,
  542. KN_F12 = VK_F12,
  543. KN_F2 = VK_F2,
  544. KN_F3 = VK_F3,
  545. KN_F4 = VK_F4,
  546. KN_F5 = VK_F5,
  547. KN_F6 = VK_F6,
  548. KN_F7 = VK_F7,
  549. KN_F8 = VK_F8,
  550. KN_F9 = VK_F9,
  551. KN_G = VK_G,
  552. KN_GRAVE = VK_NONE_C0,
  553. KN_H = VK_H,
  554. KN_HOME = VK_HOME,
  555. KN_I = VK_I,
  556. KN_INSERT = VK_INSERT,
  557. KN_J = VK_J,
  558. KN_K = VK_K,
  559. KN_KEYPAD_ASTERISK= VK_MULTIPLY,
  560. KN_KEYPAD_MINUS = VK_SUBTRACT,
  561. KN_KEYPAD_PLUS = VK_ADD,
  562. KN_KEYPAD_RETURN = VK_RETURN,
  563. KN_KEYPAD_SLASH = VK_DIVIDE,
  564. KN_L = VK_L,
  565. KN_LALT = VK_MENU,
  566. KN_LBRACKET = VK_NONE_DB,
  567. KN_LCTRL = VK_CONTROL,
  568. KN_LEFT = VK_LEFT,
  569. KN_LMOUSE = VK_LBUTTON,
  570. KN_LSHIFT = VK_SHIFT,
  571. KN_M = VK_M,
  572. KN_MINUS = VK_NONE_BD,
  573. KN_N = VK_N,
  574. KN_NUMLOCK = VK_NUMLOCK,
  575. KN_O = VK_O,
  576. KN_P = VK_P,
  577. KN_PAUSE = VK_PAUSE,
  578. KN_PERIOD = VK_NONE_BE,
  579. KN_PGDN = VK_NEXT,
  580. KN_PGUP = VK_PRIOR,
  581. KN_PRNTSCRN = VK_PRINT,
  582. KN_Q = VK_Q,
  583. KN_R = VK_R,
  584. KN_RALT = VK_MENU,
  585. KN_RBRACKET = VK_NONE_DD,
  586. KN_RCTRL = VK_CONTROL,
  587. KN_RETURN = VK_RETURN,
  588. KN_RIGHT = VK_RIGHT,
  589. KN_RMOUSE = VK_RBUTTON,
  590. KN_RSHIFT = VK_SHIFT,
  591. KN_S = VK_S,
  592. KN_SCROLLLOCK = VK_SCROLL,
  593. KN_SEMICOLON = VK_NONE_BA,
  594. KN_SLASH = VK_NONE_BF,
  595. KN_SPACE = VK_SPACE,
  596. KN_SQUOTE = VK_NONE_DE,
  597. KN_T = VK_T,
  598. KN_TAB = VK_TAB,
  599. KN_U = VK_U,
  600. KN_UP = VK_UP,
  601. KN_UPLEFT = VK_HOME,
  602. KN_UPRIGHT = VK_PRIOR,
  603. KN_V = VK_V,
  604. KN_W = VK_W,
  605. KN_X = VK_X,
  606. KN_Y = VK_Y,
  607. KN_Z = VK_Z,
  608. KN_SHIFT_BIT = WWKEY_SHIFT_BIT,
  609. KN_CTRL_BIT = WWKEY_CTRL_BIT,
  610. KN_ALT_BIT = WWKEY_ALT_BIT,
  611. KN_RLSE_BIT = WWKEY_RLS_BIT,
  612. KN_BUTTON = WWKEY_BTN_BIT
  613. } KeyNumType;
  614. /*
  615. ** Interface class to the keyboard. This insulates the game from library vagaries. Most
  616. ** notable being the return values are declared as "int" in the library whereas C&C
  617. ** expects it to be of KeyNumType.
  618. */
  619. //lint -esym(1725,KeyboardClass::MouseQX,KeyboardClass::MouseQY)
  620. struct KeyboardClass : public WWKeyboardClass
  621. {
  622. /*
  623. ** This flag is used to indicate whether the WW library has taken over
  624. ** the keyboard or not. If not, then the normal console input
  625. ** takes precedence.
  626. */
  627. unsigned IsLibrary;
  628. KeyboardClass() : IsLibrary(true) {}
  629. KeyNumType Get(void) {return ((KeyNumType)WWKeyboardClass::Get());};
  630. KeyNumType Check(void) {return ((KeyNumType)WWKeyboardClass::Check());};
  631. KeyASCIIType To_ASCII(KeyNumType key) {return((KeyASCIIType)WWKeyboardClass::To_ASCII((unsigned short)key));};
  632. void Clear(void) {WWKeyboardClass::Clear();};
  633. int Down(KeyNumType key) {return(WWKeyboardClass::Down((unsigned short)key));};
  634. int Mouse_X(void) {return(Get_Mouse_X());};
  635. int Mouse_Y(void) {return(Get_Mouse_Y());};
  636. };
  637. #endif