Keyboard.cpp 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988
  1. /*
  2. ** Command & Conquer Generals(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. // //
  20. // (c) 2001-2003 Electronic Arts Inc. //
  21. // //
  22. ////////////////////////////////////////////////////////////////////////////////
  23. // FILE: Keyboard.cpp /////////////////////////////////////////////////////////////////////////////
  24. // Created: Colin Day, June 2001
  25. // Desc: Basic keyboard
  26. ///////////////////////////////////////////////////////////////////////////////////////////////////
  27. #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine
  28. #include "Common/Language.h"
  29. #include "Common/GameEngine.h"
  30. #include "Common/MessageStream.h"
  31. #include "GameClient/Keyboard.h"
  32. #include "GameClient/KeyDefs.h"
  33. // PUBLIC DATA ////////////////////////////////////////////////////////////////////////////////////
  34. Keyboard *TheKeyboard = NULL;
  35. ///////////////////////////////////////////////////////////////////////////////////////////////////
  36. // PRIVATE PROTOTYPES /////////////////////////////////////////////////////////////////////////////
  37. ///////////////////////////////////////////////////////////////////////////////////////////////////
  38. //-------------------------------------------------------------------------------------------------
  39. /** Given the state of the device, create messages from the input and
  40. * place them on the message stream */
  41. //-------------------------------------------------------------------------------------------------
  42. void Keyboard::createStreamMessages( void )
  43. {
  44. // santiy
  45. if( TheMessageStream == NULL )
  46. return;
  47. KeyboardIO *key = getFirstKey();
  48. GameMessage *msg = NULL;
  49. while( key->key != KEY_NONE )
  50. {
  51. // add message to stream
  52. if( BitTest( key->state, KEY_STATE_DOWN ) )
  53. {
  54. msg = TheMessageStream->appendMessage( GameMessage::MSG_RAW_KEY_DOWN );
  55. DEBUG_ASSERTCRASH( msg, ("Unable to append key down message to stream\n") );
  56. } // end if
  57. else if( BitTest( key->state, KEY_STATE_UP ) )
  58. {
  59. msg = TheMessageStream->appendMessage( GameMessage::MSG_RAW_KEY_UP );
  60. DEBUG_ASSERTCRASH( msg, ("Unable to append key up message to stream\n") );
  61. } // end else if
  62. else
  63. {
  64. DEBUG_CRASH(( "Unknown key state when creating msg stream\n" ));
  65. } // end else
  66. // fill out message arguments
  67. if( msg )
  68. {
  69. msg->appendIntegerArgument( key->key );
  70. msg->appendIntegerArgument( key->state );
  71. }
  72. // next key please
  73. key++;
  74. } // end while
  75. } // end createStreamMessages
  76. //-------------------------------------------------------------------------------------------------
  77. /** update all our key state data */
  78. //-------------------------------------------------------------------------------------------------
  79. void Keyboard::updateKeys( void )
  80. {
  81. Int index = 0;
  82. // get latest keys
  83. do
  84. {
  85. do
  86. {
  87. // get a single key
  88. getKey( &m_keys[ index ] );
  89. //
  90. // if we get back that our device was lost, we haven't been paying
  91. // attention to the keyboard, lets start over now, we only need to
  92. // do this reset once in this loop though just to be efficient
  93. //
  94. if( m_keys[ index ].key == KEY_LOST)
  95. {
  96. resetKeys();
  97. index = 0;
  98. } // end if
  99. }
  100. while( m_keys[ index ].key == KEY_LOST );
  101. }
  102. while( m_keys[ index++ ].key != KEY_NONE );
  103. // update keyboard status array
  104. index = 0;
  105. while( m_keys[ index ].key != KEY_NONE )
  106. {
  107. /** @todo -- if we don't have focus, we could destroy all the keys retrieved
  108. here so that we don't process anything */
  109. m_keyStatus[ m_keys[ index ].key ].state = m_keys[ index ].state;
  110. m_keyStatus[ m_keys[ index ].key ].status = m_keys[ index ].status;
  111. m_keyStatus[ m_keys[ index ].key ].sequence = m_inputFrame;
  112. // prevent ALT-TAB from causing a TAB event
  113. if( m_keys[ index ].key == KEY_TAB )
  114. {
  115. if( BitTest( m_keyStatus[ KEY_LALT ].state, KEY_STATE_DOWN ) ||
  116. BitTest( m_keyStatus[ KEY_RALT ].state, KEY_STATE_DOWN ) )
  117. {
  118. m_keys[index].status = KeyboardIO::STATUS_USED;
  119. }
  120. }
  121. else if( m_keys[ index ].key == KEY_CAPS ||
  122. m_keys[ index ].key == KEY_LCTRL ||
  123. m_keys[ index ].key == KEY_RCTRL ||
  124. m_keys[ index ].key == KEY_LSHIFT ||
  125. m_keys[ index ].key == KEY_RSHIFT ||
  126. m_keys[ index ].key == KEY_LALT ||
  127. m_keys[ index ].key == KEY_RALT )
  128. {
  129. //
  130. // this keeps our internal key state accurate event though we don't
  131. // use the returned translation ... kinda weird I think
  132. //
  133. translateKey( m_keys[ index ].key );
  134. } // end else if
  135. index++;
  136. } // end while
  137. // check for key repeats
  138. checkKeyRepeat();
  139. if( m_modifiers )
  140. {
  141. index = 0;
  142. while( m_keys[ index ].key != KEY_NONE )
  143. {
  144. // set in the modifier data into the already existing up/down state
  145. BitSet( m_keys[ index ].state, m_modifiers );
  146. // next key
  147. index++;
  148. } // end while
  149. } // end if
  150. } // end updateKeys
  151. //-------------------------------------------------------------------------------------------------
  152. /** check key repeat sequences, TRUE is returned if repeat is occurring */
  153. //-------------------------------------------------------------------------------------------------
  154. Bool Keyboard::checkKeyRepeat( void )
  155. {
  156. Bool retVal = FALSE;
  157. Int index = 0;
  158. Int key;
  159. /** @todo we shouldn't think about repeating any keys while we
  160. don't have the focus */
  161. // if( currentFocus == FOCUS_OUT )
  162. // return FALSE;
  163. // Find end of real keys for this frame
  164. while( m_keys[ index ].key != KEY_NONE )
  165. index++;
  166. // Scan Keyboard status array for first key down
  167. // long enough to repeat
  168. for( key = 0; key < 256; key++ )
  169. {
  170. if( BitTest( m_keyStatus[ key ].state, KEY_STATE_DOWN ) )
  171. {
  172. if( (m_inputFrame - m_keyStatus[ key ].sequence) > Keyboard::KEY_REPEAT_DELAY )
  173. {
  174. // Add key to this frame
  175. m_keys[ index ].key = (UnsignedByte)key;
  176. m_keys[ index ].state = KEY_STATE_DOWN | KEY_STATE_AUTOREPEAT; // note: not a bitset; this is an assignment
  177. m_keys[ index ].status = KeyboardIO::STATUS_UNUSED;
  178. // Set End Flag
  179. m_keys[ ++index ].key = KEY_NONE;
  180. // Set all keys as new to prevent multiple keys repeating
  181. for( index = 0; index< NUM_KEYS; index++ )
  182. m_keyStatus[ index ].sequence = m_inputFrame;
  183. // Set repeated key so it will repeat again in two frames
  184. m_keyStatus[ key ].sequence = m_inputFrame - (Keyboard::KEY_REPEAT_DELAY + 2);
  185. retVal = TRUE;
  186. break; // exit for key
  187. } // end if
  188. } // end if, key down
  189. } // end for key
  190. return retVal;
  191. } // end checkKeyRepeat
  192. //-------------------------------------------------------------------------------------------------
  193. /** Initialize the keyboard key-names array */
  194. //-------------------------------------------------------------------------------------------------
  195. void Keyboard::initKeyNames( void )
  196. {
  197. Int i;
  198. #define _set_keyname_(k,s,s2,z) (m_keyNames[z].stdKey = k, m_keyNames[z].shifted = s, m_keyNames[z].shifted2 = s2)
  199. /*
  200. * Initialize the keyboard key-names array.
  201. */
  202. for( i = 0; i < KEY_NAMES_COUNT; i++ )
  203. {
  204. m_keyNames[ i ].stdKey = L'\0';
  205. m_keyNames[ i ].shifted = L'\0';
  206. m_keyNames[ i ].shifted2 = L'\0';
  207. } // end for i
  208. m_shift2Key = KEY_NONE;
  209. // generic to all languages
  210. _set_keyname_(L'\0', L'\0', L'\0', KEY_UP );
  211. _set_keyname_(L'\0', L'\0', L'\0', KEY_DOWN );
  212. _set_keyname_(L'\0', L'\0', L'\0', KEY_LEFT );
  213. _set_keyname_(L'\0', L'\0', L'\0', KEY_RIGHT );
  214. _set_keyname_(L'\0', L'\0', L'\0', KEY_HOME );
  215. _set_keyname_(L'\0', L'\0', L'\0', KEY_END );
  216. _set_keyname_(L'\0', L'\0', L'\0', KEY_PGUP );
  217. _set_keyname_(L'\0', L'\0', L'\0', KEY_PGDN );
  218. _set_keyname_(L'\0', L'\0', L'\0', KEY_INS );
  219. _set_keyname_(L'\b', L'\b', L'\0', KEY_DEL );
  220. _set_keyname_(L'\b', L'\b', L'\0', KEY_BACKSPACE );
  221. _set_keyname_(L'\0', L'\0', L'\0', KEY_ESC );
  222. _set_keyname_(L'\t', L'\t', L'\0', KEY_TAB );
  223. _set_keyname_(L'\0', L'\0', L'\0', KEY_CAPS );
  224. _set_keyname_(L'\n', L'\n', L'\0', KEY_ENTER );
  225. _set_keyname_(L'\0', L'\0', L'\0', KEY_RALT );
  226. _set_keyname_(L'\0', L'\0', L'\0', KEY_RCTRL );
  227. _set_keyname_(L'\0', L'\0', L'\0', KEY_RSHIFT );
  228. _set_keyname_(L'\0', L'\0', L'\0', KEY_LALT );
  229. _set_keyname_(L'\0', L'\0', L'\0', KEY_LCTRL );
  230. _set_keyname_(L'\0', L'\0', L'\0', KEY_LSHIFT );
  231. _set_keyname_(L'\0', L'\0', L'\0', KEY_NUM );
  232. _set_keyname_(L'\0', L'\0', L'\0', KEY_SCROLL );
  233. _set_keyname_(L'\0', L'\0', L'\0', KEY_SYSREQ );
  234. _set_keyname_(L'\0', L'\0', L'\0', KEY_F1 );
  235. _set_keyname_(L'\0', L'\0', L'\0', KEY_F2 );
  236. _set_keyname_(L'\0', L'\0', L'\0', KEY_F3 );
  237. _set_keyname_(L'\0', L'\0', L'\0', KEY_F4 );
  238. _set_keyname_(L'\0', L'\0', L'\0', KEY_F5 );
  239. _set_keyname_(L'\0', L'\0', L'\0', KEY_F6 );
  240. _set_keyname_(L'\0', L'\0', L'\0', KEY_F7 );
  241. _set_keyname_(L'\0', L'\0', L'\0', KEY_F8 );
  242. _set_keyname_(L'\0', L'\0', L'\0', KEY_F9 );
  243. _set_keyname_(L'\0', L'\0', L'\0', KEY_F10 );
  244. _set_keyname_(L'\0', L'\0', L'\0', KEY_F11 );
  245. _set_keyname_(L'\0', L'\0', L'\0', KEY_F12 );
  246. _set_keyname_(L'1', L'1', L'\0', KEY_KP1 );
  247. _set_keyname_(L'2', L'2', L'\0', KEY_KP2 );
  248. _set_keyname_(L'3', L'3', L'\0', KEY_KP3 );
  249. _set_keyname_(L'4', L'4', L'\0', KEY_KP4 );
  250. _set_keyname_(L'5', L'5', L'\0', KEY_KP5 );
  251. _set_keyname_(L'6', L'6', L'\0', KEY_KP6 );
  252. _set_keyname_(L'7', L'7', L'\0', KEY_KP7 );
  253. _set_keyname_(L'8', L'8', L'\0', KEY_KP8 );
  254. _set_keyname_(L'9', L'9', L'\0', KEY_KP9 );
  255. _set_keyname_(L'0', L'0', L'\0', KEY_KP0 );
  256. _set_keyname_(L' ', L' ', L'\0', KEY_SPACE );
  257. HKL kLayout = GetKeyboardLayout(0);
  258. Int low = (UnsignedInt)kLayout & 0xFFFF;
  259. LanguageID currentLanguage = OurLanguage;
  260. if(low == 0x040c
  261. || low == 0x080c
  262. || low == 0x0c0c
  263. || low == 0x100c
  264. || low == 0x140c)
  265. currentLanguage = LANGUAGE_ID_FRENCH;
  266. switch( currentLanguage )
  267. {
  268. case LANGUAGE_ID_US:
  269. case LANGUAGE_ID_JAPANESE:
  270. case LANGUAGE_ID_KOREAN:
  271. case LANGUAGE_ID_JABBER:
  272. case LANGUAGE_ID_UNKNOWN:
  273. case LANGUAGE_ID_SPANISH: // not localized
  274. _set_keyname_(L'-', L'-', L'\0', KEY_KPMINUS );
  275. _set_keyname_(L'+', L'+', L'\0', KEY_KPPLUS );
  276. _set_keyname_(L'\n', L'\n', L'\0', KEY_KPENTER );
  277. _set_keyname_(L'/', L'/', L'\0', KEY_KPSLASH );
  278. _set_keyname_(L'.', L'.', L'\0', KEY_KPDEL );
  279. _set_keyname_(L'*', L'*', L'\0', KEY_KPSTAR );
  280. _set_keyname_(L'a', L'A', L'\0', KEY_A );
  281. _set_keyname_(L'b', L'B', L'\0', KEY_B );
  282. _set_keyname_(L'c', L'C', L'\0', KEY_C );
  283. _set_keyname_(L'd', L'D', L'\0', KEY_D );
  284. _set_keyname_(L'e', L'E', L'\0', KEY_E );
  285. _set_keyname_(L'f', L'F', L'\0', KEY_F );
  286. _set_keyname_(L'g', L'G', L'\0', KEY_G );
  287. _set_keyname_(L'h', L'H', L'\0', KEY_H );
  288. _set_keyname_(L'i', L'I', L'\0', KEY_I );
  289. _set_keyname_(L'j', L'J', L'\0', KEY_J );
  290. _set_keyname_(L'k', L'K', L'\0', KEY_K );
  291. _set_keyname_(L'l', L'L', L'\0', KEY_L );
  292. _set_keyname_(L'm', L'M', L'\0', KEY_M );
  293. _set_keyname_(L'n', L'N', L'\0', KEY_N );
  294. _set_keyname_(L'o', L'O', L'\0', KEY_O );
  295. _set_keyname_(L'p', L'P', L'\0', KEY_P );
  296. _set_keyname_(L'q', L'Q', L'\0', KEY_Q );
  297. _set_keyname_(L'r', L'R', L'\0', KEY_R );
  298. _set_keyname_(L's', L'S', L'\0', KEY_S );
  299. _set_keyname_(L't', L'T', L'\0', KEY_T );
  300. _set_keyname_(L'u', L'U', L'\0', KEY_U );
  301. _set_keyname_(L'v', L'V', L'\0', KEY_V );
  302. _set_keyname_(L'w', L'W', L'\0', KEY_W );
  303. _set_keyname_(L'x', L'X', L'\0', KEY_X );
  304. _set_keyname_(L'y', L'Y', L'\0', KEY_Y );
  305. _set_keyname_(L'z', L'Z', L'\0', KEY_Z );
  306. _set_keyname_(L'1', L'!', L'\0', KEY_1 );
  307. _set_keyname_(L'2', L'@', L'\0', KEY_2 );
  308. _set_keyname_(L'3', L'#', L'\0', KEY_3 );
  309. _set_keyname_(L'4', L'$', L'\0', KEY_4 );
  310. _set_keyname_(L'5', L'%', L'\0', KEY_5 );
  311. _set_keyname_(L'6', L'^', L'\0', KEY_6 );
  312. _set_keyname_(L'7', L'&', L'\0', KEY_7 );
  313. _set_keyname_(L'8', L'*', L'\0', KEY_8 );
  314. _set_keyname_(L'9', L'(', L'\0', KEY_9 );
  315. _set_keyname_(L'0', L')', L'\0', KEY_0 );
  316. _set_keyname_(L',', L'<', L'\0', KEY_COMMA );
  317. _set_keyname_(L'.', L'>', L'\0', KEY_PERIOD );
  318. _set_keyname_(L'/', L'?', L'\0', KEY_SLASH );
  319. _set_keyname_(L'[', L'{', L'\0', KEY_LBRACKET );
  320. _set_keyname_(L']', L'}', L'\0', KEY_RBRACKET );
  321. _set_keyname_(L';', L':', L'\0', KEY_SEMICOLON );
  322. _set_keyname_(L'\'', L'\"', L'\0', KEY_APOSTROPHE );
  323. _set_keyname_(L'`', L'~', L'\0', KEY_TICK );
  324. _set_keyname_(L'\\', L'|', L'\0', KEY_BACKSLASH );
  325. _set_keyname_(L'-', L'_', L'\0', KEY_MINUS );
  326. _set_keyname_(L'=', L'+', L'\0', KEY_EQUAL );
  327. break;
  328. case LANGUAGE_ID_UK:
  329. _set_keyname_(L'-', L'-', L'\0', KEY_KPMINUS );
  330. _set_keyname_(L'+', L'+', L'\0', KEY_KPPLUS );
  331. _set_keyname_(L'\n', L'\n', L'\0', KEY_KPENTER );
  332. _set_keyname_(L'/', L'/', L'\0', KEY_KPSLASH );
  333. _set_keyname_(L'.', L'.', L'\0', KEY_KPDEL );
  334. _set_keyname_(L'*', L'*', L'\0', KEY_KPSTAR );
  335. _set_keyname_(L'a', L'A', L'\0', KEY_A );
  336. _set_keyname_(L'b', L'B', L'\0', KEY_B );
  337. _set_keyname_(L'c', L'C', L'\0', KEY_C );
  338. _set_keyname_(L'd', L'D', L'\0', KEY_D );
  339. _set_keyname_(L'e', L'E', L'\0', KEY_E );
  340. _set_keyname_(L'f', L'F', L'\0', KEY_F );
  341. _set_keyname_(L'g', L'G', L'\0', KEY_G );
  342. _set_keyname_(L'h', L'H', L'\0', KEY_H );
  343. _set_keyname_(L'i', L'I', L'\0', KEY_I );
  344. _set_keyname_(L'j', L'J', L'\0', KEY_J );
  345. _set_keyname_(L'k', L'K', L'\0', KEY_K );
  346. _set_keyname_(L'l', L'L', L'\0', KEY_L );
  347. _set_keyname_(L'm', L'M', L'\0', KEY_M );
  348. _set_keyname_(L'n', L'N', L'\0', KEY_N );
  349. _set_keyname_(L'o', L'O', L'\0', KEY_O );
  350. _set_keyname_(L'p', L'P', L'\0', KEY_P );
  351. _set_keyname_(L'q', L'Q', L'\0', KEY_Q );
  352. _set_keyname_(L'r', L'R', L'\0', KEY_R );
  353. _set_keyname_(L's', L'S', L'\0', KEY_S );
  354. _set_keyname_(L't', L'T', L'\0', KEY_T );
  355. _set_keyname_(L'u', L'U', L'\0', KEY_U );
  356. _set_keyname_(L'v', L'V', L'\0', KEY_V );
  357. _set_keyname_(L'w', L'W', L'\0', KEY_W );
  358. _set_keyname_(L'x', L'X', L'\0', KEY_X );
  359. _set_keyname_(L'y', L'Y', L'\0', KEY_Y );
  360. _set_keyname_(L'z', L'Z', L'\0', KEY_Z );
  361. _set_keyname_(L'1', L'!', L'\0', KEY_1 );
  362. _set_keyname_(L'2', L'\"', L'\0', KEY_2 );
  363. _set_keyname_(L'3', 0x00A3, L'\0', KEY_3 ); //£
  364. _set_keyname_(L'4', L'$', L'€', KEY_4 );
  365. _set_keyname_(L'5', L'%', L'\0', KEY_5 );
  366. _set_keyname_(L'6', L'^', L'\0', KEY_6 );
  367. _set_keyname_(L'7', L'&', L'\0', KEY_7 );
  368. _set_keyname_(L'8', L'*', L'\0', KEY_8 );
  369. _set_keyname_(L'9', L'(', L'\0', KEY_9 );
  370. _set_keyname_(L'0', L')', L'\0', KEY_0 );
  371. _set_keyname_(L',', L'<', L'\0', KEY_COMMA );
  372. _set_keyname_(L'.', L'>', L'\0', KEY_PERIOD );
  373. _set_keyname_(L'/', L'?', L'\0', KEY_SLASH );
  374. _set_keyname_(L'[', L'{', L'\0', KEY_LBRACKET );
  375. _set_keyname_(L']', L'}', L'\0', KEY_RBRACKET );
  376. _set_keyname_(L';', L':', L'\0', KEY_SEMICOLON );
  377. _set_keyname_(L'\'', L'@', L'\0', KEY_APOSTROPHE );
  378. _set_keyname_(L'`', 0x00AC, 0x00A6, KEY_TICK ); //¬¦
  379. _set_keyname_(L'#', L'~', L'\0', KEY_BACKSLASH );
  380. _set_keyname_(L'-', L'_', L'\0', KEY_MINUS );
  381. _set_keyname_(L'=', L'+', L'\0', KEY_EQUAL );
  382. _set_keyname_(L'\\', L'|', L'\0', KEY_102 );
  383. m_shift2Key = KEY_RALT;
  384. break;
  385. case LANGUAGE_ID_GERMAN:
  386. _set_keyname_(L'-', L'-', L'\0', KEY_KPMINUS );
  387. _set_keyname_(L'+', L'+', L'\0', KEY_KPPLUS );
  388. _set_keyname_(L'\n', L'\n', L'\0', KEY_KPENTER );
  389. _set_keyname_(L'/', L'/', L'\0', KEY_KPSLASH );
  390. _set_keyname_(L',', L',', L'\0', KEY_KPDEL );
  391. _set_keyname_(L'*', L'*', L'\0', KEY_KPSTAR );
  392. _set_keyname_(L'a', L'A', L'\0', KEY_A );
  393. _set_keyname_(L'b', L'B', L'\0', KEY_B );
  394. _set_keyname_(L'c', L'C', L'\0', KEY_C );
  395. _set_keyname_(L'd', L'D', L'\0', KEY_D );
  396. _set_keyname_(L'e', L'E', L'\0', KEY_E );
  397. _set_keyname_(L'f', L'F', L'\0', KEY_F );
  398. _set_keyname_(L'g', L'G', L'\0', KEY_G );
  399. _set_keyname_(L'h', L'H', L'\0', KEY_H );
  400. _set_keyname_(L'i', L'I', L'\0', KEY_I );
  401. _set_keyname_(L'j', L'J', L'\0', KEY_J );
  402. _set_keyname_(L'k', L'K', L'\0', KEY_K );
  403. _set_keyname_(L'l', L'L', L'\0', KEY_L );
  404. _set_keyname_(L'm', L'M', 0x00B5, KEY_M ); //µ
  405. _set_keyname_(L'n', L'N', L'\0', KEY_N );
  406. _set_keyname_(L'o', L'O', L'\0', KEY_O );
  407. _set_keyname_(L'p', L'P', L'\0', KEY_P );
  408. _set_keyname_(L'q', L'Q', L'@', KEY_Q );
  409. _set_keyname_(L'r', L'R', L'\0', KEY_R );
  410. _set_keyname_(L's', L'S', L'\0', KEY_S );
  411. _set_keyname_(L't', L'T', L'\0', KEY_T );
  412. _set_keyname_(L'u', L'U', L'\0', KEY_U );
  413. _set_keyname_(L'v', L'V', L'\0', KEY_V );
  414. _set_keyname_(L'w', L'W', L'\0', KEY_W );
  415. _set_keyname_(L'x', L'X', L'\0', KEY_X );
  416. _set_keyname_(L'z', L'Z', L'\0', KEY_Y );
  417. _set_keyname_(L'y', L'Y', L'\0', KEY_Z );
  418. _set_keyname_(L'1', L'!', L'\0', KEY_1 );
  419. _set_keyname_(L'2', L'"', 0x00B2, KEY_2 ); //²
  420. _set_keyname_(L'3', 0x00A7, 0x00B3, KEY_3 ); //§³
  421. _set_keyname_(L'4', L'$', L'\0', KEY_4 );
  422. _set_keyname_(L'5', L'%', L'\0', KEY_5 );
  423. _set_keyname_(L'6', L'&', L'\0', KEY_6 );
  424. _set_keyname_(L'7', L'/', L'{', KEY_7 );
  425. _set_keyname_(L'8', L'(', L'[', KEY_8 );
  426. _set_keyname_(L'9', L')', L']', KEY_9 );
  427. _set_keyname_(L'0', L'=', L'}', KEY_0 );
  428. _set_keyname_(L',', L';', L'\0', KEY_COMMA );
  429. _set_keyname_(L'.', L':', L'\0', KEY_PERIOD );
  430. _set_keyname_(L'-', L'_', L'\0', KEY_SLASH );
  431. _set_keyname_(0x00FC, 0x00DC, L'\0', KEY_LBRACKET ); //üÜ
  432. _set_keyname_(L'+', L'*', L'~', KEY_RBRACKET );
  433. _set_keyname_(0x00F6, 0x00D6, L'\0', KEY_SEMICOLON ); //öÖ
  434. _set_keyname_(0x00E4, 0x00C4, L'\0', KEY_APOSTROPHE ); //äÄ
  435. _set_keyname_(L'^', 0x00B0, L'\0', KEY_TICK ); //°
  436. _set_keyname_(L'#', L'\'', L'\0', KEY_BACKSLASH );
  437. _set_keyname_(0x00DF, L'?', L'\\', KEY_MINUS ); //ß
  438. _set_keyname_(0x00B4, L'`', L'\0', KEY_EQUAL ); //´
  439. _set_keyname_(L'<', L'>', L'|', KEY_102 );
  440. m_shift2Key = KEY_RALT;
  441. break;
  442. case LANGUAGE_ID_FRENCH:
  443. _set_keyname_(L'-', L'-', L'\0', KEY_KPMINUS );
  444. _set_keyname_(L'+', L'+', L'\0', KEY_KPPLUS );
  445. _set_keyname_(L'\n', L'\n', L'\0', KEY_KPENTER );
  446. _set_keyname_(L'/', L'/', L'\0', KEY_KPSLASH );
  447. _set_keyname_(L'.', L'.', L'\0', KEY_KPDEL );
  448. _set_keyname_(L'*', L'*', L'\0', KEY_KPSTAR );
  449. _set_keyname_(L'q', L'Q', L'\0', KEY_A );
  450. _set_keyname_(L'b', L'B', L'\0', KEY_B );
  451. _set_keyname_(L'c', L'C', L'\0', KEY_C );
  452. _set_keyname_(L'd', L'D', L'\0', KEY_D );
  453. _set_keyname_(L'e', L'E', L'\0', KEY_E );
  454. _set_keyname_(L'f', L'F', L'\0', KEY_F );
  455. _set_keyname_(L'g', L'G', L'\0', KEY_G );
  456. _set_keyname_(L'h', L'H', L'\0', KEY_H );
  457. _set_keyname_(L'i', L'I', L'\0', KEY_I );
  458. _set_keyname_(L'j', L'J', L'\0', KEY_J );
  459. _set_keyname_(L'k', L'K', L'\0', KEY_K );
  460. _set_keyname_(L'l', L'L', L'\0', KEY_L );
  461. _set_keyname_(L',', L'?', L'\0', KEY_M );
  462. _set_keyname_(L'n', L'N', L'\0', KEY_N );
  463. _set_keyname_(L'o', L'O', L'\0', KEY_O );
  464. _set_keyname_(L'p', L'P', L'\0', KEY_P );
  465. _set_keyname_(L'a', L'A', L'\0', KEY_Q );
  466. _set_keyname_(L'r', L'R', L'\0', KEY_R );
  467. _set_keyname_(L's', L'S', L'\0', KEY_S );
  468. _set_keyname_(L't', L'T', L'\0', KEY_T );
  469. _set_keyname_(L'u', L'U', L'\0', KEY_U );
  470. _set_keyname_(L'v', L'V', L'\0', KEY_V );
  471. _set_keyname_(L'z', L'Z', L'\0', KEY_W );
  472. _set_keyname_(L'x', L'X', L'\0', KEY_X );
  473. _set_keyname_(L'y', L'Y', L'\0', KEY_Y );
  474. _set_keyname_(L'w', L'W', L'\0', KEY_Z );
  475. _set_keyname_(L'&', L'1', L'\0', KEY_1 );
  476. _set_keyname_(0x00E9, L'2', L'~', KEY_2 ); //é
  477. _set_keyname_(L'"', L'3', L'#', KEY_3 );
  478. _set_keyname_(L'\'', L'4', L'{', KEY_4 );
  479. _set_keyname_(L'(', L'5', L'[', KEY_5 );
  480. _set_keyname_(L'-', L'6', L'|', KEY_6 );
  481. _set_keyname_(0x00E8, L'7', L'`', KEY_7 ); //è
  482. _set_keyname_(L'_', L'8', L'\\', KEY_8 );
  483. _set_keyname_(0x00E7, L'9', L'\0', KEY_9 ); //ç
  484. _set_keyname_(0x00E0, L'0', L'@', KEY_0 ); //à
  485. _set_keyname_(L';', L'.', L'\0', KEY_COMMA );
  486. _set_keyname_(L':', L'/', L'\0', KEY_PERIOD );
  487. _set_keyname_(L'!', 0x00A7, L'\0', KEY_SLASH ); //§
  488. _set_keyname_(L'^', 0x00A8, L'\0', KEY_LBRACKET ); //¨
  489. _set_keyname_(L'$', 0x00A3, 0x00A4, KEY_RBRACKET ); //£¤
  490. _set_keyname_(L'm', L'M', L'\0', KEY_SEMICOLON );
  491. _set_keyname_(0x00F9, L'%', L'\0', KEY_APOSTROPHE ); //ù
  492. _set_keyname_(0x00B2, L'\0', L'\0', KEY_TICK ); //²
  493. _set_keyname_(L'*', 0x00B5, L'\0', KEY_BACKSLASH ); //µ
  494. _set_keyname_(L')', 0x00B0, L']', KEY_MINUS ); //°
  495. _set_keyname_(L'=', L'+', L'}', KEY_EQUAL );
  496. _set_keyname_(L'<', L'>', L'\0', KEY_102 );
  497. m_shift2Key = KEY_RALT;
  498. break;
  499. case LANGUAGE_ID_ITALIAN:
  500. _set_keyname_(L'-', L'-', L'\0', KEY_KPMINUS );
  501. _set_keyname_(L'+', L'+', L'\0', KEY_KPPLUS );
  502. _set_keyname_(L'\n', L'\n', L'\0', KEY_KPENTER );
  503. _set_keyname_(L'/', L'/', L'\0', KEY_KPSLASH );
  504. _set_keyname_(L'.', L'.', L'\0', KEY_KPDEL );
  505. _set_keyname_(L'*', L'*', L'\0', KEY_KPSTAR );
  506. _set_keyname_(L'a', L'A', L'\0', KEY_A );
  507. _set_keyname_(L'b', L'B', L'\0', KEY_B );
  508. _set_keyname_(L'c', L'C', L'\0', KEY_C );
  509. _set_keyname_(L'd', L'D', L'\0', KEY_D );
  510. _set_keyname_(L'e', L'E', L'\0', KEY_E );
  511. _set_keyname_(L'f', L'F', L'\0', KEY_F );
  512. _set_keyname_(L'g', L'G', L'\0', KEY_G );
  513. _set_keyname_(L'h', L'H', L'\0', KEY_H );
  514. _set_keyname_(L'i', L'I', L'\0', KEY_I );
  515. _set_keyname_(L'j', L'J', L'\0', KEY_J );
  516. _set_keyname_(L'k', L'K', L'\0', KEY_K );
  517. _set_keyname_(L'l', L'L', L'\0', KEY_L );
  518. _set_keyname_(L'm', L'M', L'\0', KEY_M );
  519. _set_keyname_(L'n', L'N', L'\0', KEY_N );
  520. _set_keyname_(L'o', L'O', L'\0', KEY_O );
  521. _set_keyname_(L'p', L'P', L'\0', KEY_P );
  522. _set_keyname_(L'q', L'Q', L'\0', KEY_Q );
  523. _set_keyname_(L'r', L'R', L'\0', KEY_R );
  524. _set_keyname_(L's', L'S', L'\0', KEY_S );
  525. _set_keyname_(L't', L'T', L'\0', KEY_T );
  526. _set_keyname_(L'u', L'U', L'\0', KEY_U );
  527. _set_keyname_(L'v', L'V', L'\0', KEY_V );
  528. _set_keyname_(L'w', L'W', L'\0', KEY_W );
  529. _set_keyname_(L'x', L'X', L'\0', KEY_X );
  530. _set_keyname_(L'y', L'Y', L'\0', KEY_Y );
  531. _set_keyname_(L'z', L'Z', L'\0', KEY_Z );
  532. _set_keyname_(L'1', L'!', L'\0', KEY_1 );
  533. _set_keyname_(L'2', L'"', L'\0', KEY_2 );
  534. _set_keyname_(L'3', 0x00A3, L'\0', KEY_3 ); //£
  535. _set_keyname_(L'4', L'$', L'\0', KEY_4 );
  536. _set_keyname_(L'5', L'%', L'\0', KEY_5 );
  537. _set_keyname_(L'6', L'&', L'\0', KEY_6 );
  538. _set_keyname_(L'7', L'/', L'\0', KEY_7 );
  539. _set_keyname_(L'8', L'(', L'\0', KEY_8 );
  540. _set_keyname_(L'9', L')', L'\0', KEY_9 );
  541. _set_keyname_(L'0', L'=', L'\0', KEY_0 );
  542. _set_keyname_(L',', L';', L'\0', KEY_COMMA );
  543. _set_keyname_(L'.', L':', L'\0', KEY_PERIOD );
  544. _set_keyname_(L'-', L'_', L'\0', KEY_SLASH );
  545. _set_keyname_(0x00E8, 0x00E9, L'[', KEY_LBRACKET ); //èé
  546. _set_keyname_(L'+', L'*', L']', KEY_RBRACKET );
  547. _set_keyname_(0x00F2, 0x00E7, L'@', KEY_SEMICOLON ); //òç
  548. _set_keyname_(0x00E0, 0x00B0, L'#', KEY_APOSTROPHE ); //à°
  549. _set_keyname_(L'\\', L'|', L'\0', KEY_TICK );
  550. _set_keyname_(0x00F9, 0x00A7, L'\0', KEY_BACKSLASH ); //ù§
  551. _set_keyname_(L'\'', L'?', L'\0', KEY_MINUS );
  552. _set_keyname_(0x00EC, L'^', L'\0', KEY_EQUAL ); //ì
  553. _set_keyname_(L'<', L'>', L'\0', KEY_102 );
  554. m_shift2Key = KEY_RALT;
  555. break;
  556. } // end switch( Language )
  557. } // end initKeyNames
  558. ///////////////////////////////////////////////////////////////////////////////////////////////////
  559. // PUBLIC PROTOTYPES //////////////////////////////////////////////////////////////////////////////
  560. ///////////////////////////////////////////////////////////////////////////////////////////////////
  561. //-------------------------------------------------------------------------------------------------
  562. //-------------------------------------------------------------------------------------------------
  563. Keyboard::Keyboard( void )
  564. {
  565. memset( m_keys, 0, sizeof( m_keys ) );
  566. memset( m_keyStatus, 0, sizeof( m_keyStatus ) );
  567. m_modifiers = KEY_STATE_NONE;
  568. m_shift2Key = KEY_NONE;
  569. memset( m_keyNames, 0, sizeof( m_keyNames ) );
  570. m_inputFrame = 0;
  571. } // end Keyboard
  572. //-------------------------------------------------------------------------------------------------
  573. //-------------------------------------------------------------------------------------------------
  574. Keyboard::~Keyboard( void )
  575. {
  576. } // end ~Keyboard
  577. //-------------------------------------------------------------------------------------------------
  578. /** Initialzie the keyboard */
  579. //-------------------------------------------------------------------------------------------------
  580. void Keyboard::init( void )
  581. {
  582. // initialize the key names
  583. initKeyNames();
  584. // first input frame
  585. m_inputFrame = 0;
  586. } // end init
  587. //-------------------------------------------------------------------------------------------------
  588. /** Reset keyboard system */
  589. //-------------------------------------------------------------------------------------------------
  590. void Keyboard::reset( void )
  591. {
  592. } // end reset
  593. //-------------------------------------------------------------------------------------------------
  594. /** Called once per frame to gather key data input */
  595. //-------------------------------------------------------------------------------------------------
  596. void Keyboard::update( void )
  597. {
  598. // increment input frame
  599. m_inputFrame++;
  600. // update the key data
  601. updateKeys();
  602. } // end update
  603. //-------------------------------------------------------------------------------------------------
  604. /** Reset the state data for the keys, we likely want to do this when
  605. * we once again gain focus to our app from something like an alt tab */
  606. //-------------------------------------------------------------------------------------------------
  607. void Keyboard::resetKeys( void )
  608. {
  609. memset( m_keys, 0, sizeof( m_keys ) );
  610. memset( m_keyStatus, 0, sizeof( m_keyStatus ) );
  611. m_modifiers = KEY_STATE_NONE;
  612. if( getCapsState() )
  613. {
  614. m_modifiers |= KEY_STATE_CAPSLOCK;
  615. }
  616. } // end resetKeys
  617. //-------------------------------------------------------------------------------------------------
  618. /** get the first key in our current state of the keyboard */
  619. //-------------------------------------------------------------------------------------------------
  620. KeyboardIO *Keyboard::getFirstKey( void )
  621. {
  622. return &m_keys[ 0 ];
  623. } // end getFirstKey
  624. //-------------------------------------------------------------------------------------------------
  625. /** return the key status for the specified key */
  626. //-------------------------------------------------------------------------------------------------
  627. UnsignedByte Keyboard::getKeyStatusData( UnsignedByte key )
  628. {
  629. return m_keyStatus[ key ].status;
  630. } // end getKeyStatusData
  631. //-------------------------------------------------------------------------------------------------
  632. /** Get the key state data as a Bool for the specified key */
  633. //-------------------------------------------------------------------------------------------------
  634. Bool Keyboard::getKeyStateBit( UnsignedByte key, Int bit )
  635. {
  636. return (m_keyStatus[ key ].state & bit) ? 1 : 0;
  637. } // end getKeyStateBit
  638. //-------------------------------------------------------------------------------------------------
  639. /** return the sequence data for the given key */
  640. //-------------------------------------------------------------------------------------------------
  641. UnsignedInt Keyboard::getKeySequenceData( UnsignedByte key )
  642. {
  643. return m_keyStatus[ key ].sequence;
  644. } // end getKeySequenceData
  645. //-------------------------------------------------------------------------------------------------
  646. /** set the key status data */
  647. //-------------------------------------------------------------------------------------------------
  648. void Keyboard::setKeyStatusData( UnsignedByte key, KeyboardIO::StatusType data )
  649. {
  650. m_keyStatus[ key ].status = data;
  651. } // end setKeyStatusData
  652. //-------------------------------------------------------------------------------------------------
  653. /** set the key state data */
  654. //-------------------------------------------------------------------------------------------------
  655. void Keyboard::setKeyStateData( UnsignedByte key, UnsignedByte data )
  656. {
  657. m_keyStatus[ key ].state = data;
  658. } // end setKeyStateData
  659. //-------------------------------------------------------------------------------------------------
  660. /** This routine must be called with every character to
  661. * properly monitor the shift state. Takes a keycode as
  662. * input, and returns the UNICODE char representing the
  663. * character. */
  664. //-------------------------------------------------------------------------------------------------
  665. WideChar Keyboard::translateKey( WideChar keyCode )
  666. {
  667. if( keyCode > 0x00FF )
  668. return keyCode;
  669. UnsignedByte ubKeyCode = (UnsignedByte)keyCode;
  670. switch( ubKeyCode )
  671. {
  672. case KEY_CAPS:
  673. if( getKeyStatusData( KEY_CAPS ) == KeyboardIO::STATUS_UNUSED )
  674. {
  675. if( getKeyStateBit( KEY_CAPS, KEY_STATE_DOWN ) )
  676. {
  677. if( m_modifiers & KEY_STATE_CAPSLOCK )
  678. {
  679. // Toggle caplocks off
  680. m_modifiers &= ~KEY_STATE_CAPSLOCK;
  681. }
  682. else
  683. {
  684. // Toggle caplocks on
  685. m_modifiers |= KEY_STATE_CAPSLOCK;
  686. }
  687. }
  688. setKeyStatusData( KEY_CAPS, KeyboardIO::STATUS_USED );
  689. }
  690. return 0;
  691. case KEY_LSHIFT:
  692. if( getKeyStateBit( KEY_LSHIFT, KEY_STATE_DOWN ) )
  693. {
  694. m_modifiers |= KEY_STATE_LSHIFT;
  695. }
  696. else
  697. {
  698. m_modifiers &= ~KEY_STATE_LSHIFT;
  699. }
  700. return 0;
  701. case KEY_RSHIFT:
  702. if( getKeyStateBit( KEY_RSHIFT, KEY_STATE_DOWN ) )
  703. {
  704. m_modifiers |= KEY_STATE_RSHIFT;
  705. }
  706. else
  707. {
  708. m_modifiers &= ~KEY_STATE_RSHIFT;
  709. }
  710. return 0;
  711. case KEY_LCTRL:
  712. if( getKeyStateBit( KEY_LCTRL, KEY_STATE_DOWN ) )
  713. {
  714. m_modifiers |= KEY_STATE_LCONTROL;
  715. }
  716. else
  717. {
  718. m_modifiers &= ~KEY_STATE_LCONTROL;
  719. }
  720. return 0;
  721. case KEY_RCTRL:
  722. if( getKeyStateBit( KEY_RCTRL, KEY_STATE_DOWN ) )
  723. {
  724. m_modifiers |= KEY_STATE_RCONTROL;
  725. }
  726. else
  727. {
  728. m_modifiers &= ~KEY_STATE_RCONTROL;
  729. }
  730. return 0;
  731. case KEY_LALT:
  732. if( getKeyStateBit( KEY_LALT, KEY_STATE_DOWN ) )
  733. {
  734. m_modifiers |= KEY_STATE_LALT;
  735. }
  736. else
  737. {
  738. m_modifiers &= ~KEY_STATE_LALT;
  739. }
  740. return 0;
  741. case KEY_RALT:
  742. if( getKeyStateBit( KEY_RALT, KEY_STATE_DOWN ) )
  743. {
  744. m_modifiers |= KEY_STATE_RALT;
  745. }
  746. else
  747. {
  748. m_modifiers &= ~KEY_STATE_RALT;
  749. }
  750. return 0;
  751. default:
  752. if( ubKeyCode == m_shift2Key )
  753. {
  754. if( getKeyStateBit( m_shift2Key, KEY_STATE_DOWN ) )
  755. {
  756. m_modifiers |= KEY_STATE_SHIFT2;
  757. }
  758. else
  759. {
  760. m_modifiers &= ~KEY_STATE_SHIFT2;
  761. }
  762. return 0;
  763. }
  764. if( m_modifiers & KEY_STATE_SHIFT2 )
  765. {
  766. return( m_keyNames[ ubKeyCode ].shifted2 );
  767. }
  768. if( isShift() || getCapsState() && GameIsAlpha( m_keyNames[ ubKeyCode ].stdKey ) )
  769. {
  770. return( m_keyNames[ ubKeyCode ].shifted );
  771. }
  772. return( m_keyNames[ubKeyCode ].stdKey );
  773. } // end switch( ubKeyCode )
  774. } // end translateKey
  775. //-------------------------------------------------------------------------------------------------
  776. /** returns true if any shift state is pressed */
  777. //-------------------------------------------------------------------------------------------------
  778. Bool Keyboard::isShift()
  779. {
  780. if( m_modifiers & KEY_STATE_LSHIFT || m_modifiers & KEY_STATE_RSHIFT || m_modifiers & KEY_STATE_SHIFT2 )
  781. {
  782. return TRUE;
  783. }
  784. return FALSE;
  785. } // end isShift()
  786. //-------------------------------------------------------------------------------------------------
  787. /** returns true if any control state is pressed */
  788. //-------------------------------------------------------------------------------------------------
  789. Bool Keyboard::isCtrl()
  790. {
  791. if( m_modifiers & KEY_STATE_LCONTROL || m_modifiers & KEY_STATE_RCONTROL )
  792. {
  793. return TRUE;
  794. }
  795. return FALSE;
  796. } // end isCtrl()
  797. //-------------------------------------------------------------------------------------------------
  798. /** returns true if any shift state is pressed */
  799. //-------------------------------------------------------------------------------------------------
  800. Bool Keyboard::isAlt()
  801. {
  802. if( m_modifiers & KEY_STATE_LALT || m_modifiers & KEY_STATE_RALT )
  803. {
  804. return TRUE;
  805. }
  806. return FALSE;
  807. } // end isAlt()
  808. WideChar Keyboard::getPrintableKey( UnsignedByte key, Int state )
  809. {
  810. if((key < 0 || key >=KEY_NAMES_COUNT) || ( state < 0 || state >= MAX_KEY_STATES))
  811. return L'';
  812. if(state == 0)
  813. return m_keyNames[key].stdKey;
  814. else if(state == 1)
  815. return m_keyNames[key].shifted;
  816. else
  817. return m_keyNames[key].shifted2;
  818. }