llkeyboardmacosx.cpp
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:9k
源码类别:

游戏引擎

开发平台:

C++ Builder

  1. /** 
  2.  * @file llkeyboardmacosx.cpp
  3.  * @brief Handler for assignable key bindings
  4.  *
  5.  * $LicenseInfo:firstyear=2001&license=viewergpl$
  6.  * 
  7.  * Copyright (c) 2001-2010, Linden Research, Inc.
  8.  * 
  9.  * Second Life Viewer Source Code
  10.  * The source code in this file ("Source Code") is provided by Linden Lab
  11.  * to you under the terms of the GNU General Public License, version 2.0
  12.  * ("GPL"), unless you have obtained a separate licensing agreement
  13.  * ("Other License"), formally executed by you and Linden Lab.  Terms of
  14.  * the GPL can be found in doc/GPL-license.txt in this distribution, or
  15.  * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
  16.  * 
  17.  * There are special exceptions to the terms and conditions of the GPL as
  18.  * it is applied to this Source Code. View the full text of the exception
  19.  * in the file doc/FLOSS-exception.txt in this software distribution, or
  20.  * online at
  21.  * http://secondlifegrid.net/programs/open_source/licensing/flossexception
  22.  * 
  23.  * By copying, modifying or distributing this software, you acknowledge
  24.  * that you have read and understood your obligations described above,
  25.  * and agree to abide by those obligations.
  26.  * 
  27.  * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
  28.  * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
  29.  * COMPLETENESS OR PERFORMANCE.
  30.  * $/LicenseInfo$
  31.  */
  32. #if LL_DARWIN
  33. #include "linden_common.h"
  34. #include "llkeyboardmacosx.h"
  35. #include "llwindowcallbacks.h"
  36. #include <Carbon/Carbon.h>
  37. LLKeyboardMacOSX::LLKeyboardMacOSX()
  38. {
  39. // Virtual keycode mapping table.  Yes, this was as annoying to generate as it looks.
  40. mTranslateKeyMap[0x00] = 'A';
  41. mTranslateKeyMap[0x01] = 'S';
  42. mTranslateKeyMap[0x02] = 'D';
  43. mTranslateKeyMap[0x03] = 'F';
  44. mTranslateKeyMap[0x04] = 'H';
  45. mTranslateKeyMap[0x05] = 'G';
  46. mTranslateKeyMap[0x06] = 'Z';
  47. mTranslateKeyMap[0x07] = 'X';
  48. mTranslateKeyMap[0x08] = 'C';
  49. mTranslateKeyMap[0x09] = 'V';
  50. mTranslateKeyMap[0x0b] = 'B';
  51. mTranslateKeyMap[0x0c] = 'Q';
  52. mTranslateKeyMap[0x0d] = 'W';
  53. mTranslateKeyMap[0x0e] = 'E';
  54. mTranslateKeyMap[0x0f] = 'R';
  55. mTranslateKeyMap[0x10] = 'Y';
  56. mTranslateKeyMap[0x11] = 'T';
  57. mTranslateKeyMap[0x12] = '1';
  58. mTranslateKeyMap[0x13] = '2';
  59. mTranslateKeyMap[0x14] = '3';
  60. mTranslateKeyMap[0x15] = '4';
  61. mTranslateKeyMap[0x16] = '6';
  62. mTranslateKeyMap[0x17] = '5';
  63. mTranslateKeyMap[0x18] = '='; // KEY_EQUALS
  64. mTranslateKeyMap[0x19] = '9';
  65. mTranslateKeyMap[0x1a] = '7';
  66. mTranslateKeyMap[0x1b] = '-'; // KEY_HYPHEN
  67. mTranslateKeyMap[0x1c] = '8';
  68. mTranslateKeyMap[0x1d] = '0';
  69. mTranslateKeyMap[0x1e] = ']';
  70. mTranslateKeyMap[0x1f] = 'O';
  71. mTranslateKeyMap[0x20] = 'U';
  72. mTranslateKeyMap[0x21] = '[';
  73. mTranslateKeyMap[0x22] = 'I';
  74. mTranslateKeyMap[0x23] = 'P';
  75. mTranslateKeyMap[0x24] = KEY_RETURN,
  76. mTranslateKeyMap[0x25] = 'L';
  77. mTranslateKeyMap[0x26] = 'J';
  78. mTranslateKeyMap[0x27] = ''';
  79. mTranslateKeyMap[0x28] = 'K';
  80. mTranslateKeyMap[0x29] = ';';
  81. mTranslateKeyMap[0x2a] = '\';
  82. mTranslateKeyMap[0x2b] = ',';
  83. mTranslateKeyMap[0x2c] = KEY_DIVIDE;
  84. mTranslateKeyMap[0x2d] = 'N';
  85. mTranslateKeyMap[0x2e] = 'M';
  86. mTranslateKeyMap[0x2f] = '.';
  87. mTranslateKeyMap[0x30] = KEY_TAB;
  88. mTranslateKeyMap[0x31] = ' '; // space!
  89. mTranslateKeyMap[0x32] = '`';
  90. mTranslateKeyMap[0x33] = KEY_BACKSPACE;
  91. mTranslateKeyMap[0x35] = KEY_ESCAPE;
  92. //mTranslateKeyMap[0x37] = 0; // Command key.  (not used yet)
  93. mTranslateKeyMap[0x38] = KEY_SHIFT;
  94. mTranslateKeyMap[0x39] = KEY_CAPSLOCK;
  95. mTranslateKeyMap[0x3a] = KEY_ALT;
  96. mTranslateKeyMap[0x3b] = KEY_CONTROL;
  97. mTranslateKeyMap[0x41] = '.'; // keypad
  98. mTranslateKeyMap[0x43] = '*'; // keypad
  99. mTranslateKeyMap[0x45] = '+'; // keypad
  100. mTranslateKeyMap[0x4b] = KEY_PAD_DIVIDE; // keypad
  101. mTranslateKeyMap[0x4c] = KEY_RETURN; // keypad enter
  102. mTranslateKeyMap[0x4e] = '-'; // keypad
  103. mTranslateKeyMap[0x51] = '='; // keypad
  104. mTranslateKeyMap[0x52] = '0'; // keypad
  105. mTranslateKeyMap[0x53] = '1'; // keypad
  106. mTranslateKeyMap[0x54] = '2'; // keypad
  107. mTranslateKeyMap[0x55] = '3'; // keypad
  108. mTranslateKeyMap[0x56] = '4'; // keypad
  109. mTranslateKeyMap[0x57] = '5'; // keypad
  110. mTranslateKeyMap[0x58] = '6'; // keypad
  111. mTranslateKeyMap[0x59] = '7'; // keypad
  112. mTranslateKeyMap[0x5b] = '8'; // keypad
  113. mTranslateKeyMap[0x5c] = '9'; // keypad
  114. mTranslateKeyMap[0x60] = KEY_F5;
  115. mTranslateKeyMap[0x61] = KEY_F6;
  116. mTranslateKeyMap[0x62] = KEY_F7;
  117. mTranslateKeyMap[0x63] = KEY_F3;
  118. mTranslateKeyMap[0x64] = KEY_F8;
  119. mTranslateKeyMap[0x65] = KEY_F9;
  120. mTranslateKeyMap[0x67] = KEY_F11;
  121. mTranslateKeyMap[0x6d] = KEY_F10;
  122. mTranslateKeyMap[0x6f] = KEY_F12;
  123. mTranslateKeyMap[0x72] = KEY_INSERT;
  124. mTranslateKeyMap[0x73] = KEY_HOME;
  125. mTranslateKeyMap[0x74] = KEY_PAGE_UP;
  126. mTranslateKeyMap[0x75] = KEY_DELETE;
  127. mTranslateKeyMap[0x76] = KEY_F4;
  128. mTranslateKeyMap[0x77] = KEY_END;
  129. mTranslateKeyMap[0x78] = KEY_F2;
  130. mTranslateKeyMap[0x79] = KEY_PAGE_DOWN;
  131. mTranslateKeyMap[0x7a] = KEY_F1;
  132. mTranslateKeyMap[0x7b] = KEY_LEFT;
  133. mTranslateKeyMap[0x7c] = KEY_RIGHT;
  134. mTranslateKeyMap[0x7d] = KEY_DOWN;
  135. mTranslateKeyMap[0x7e] = KEY_UP;
  136. // Build inverse map
  137. std::map<U16, KEY>::iterator iter;
  138. for (iter = mTranslateKeyMap.begin(); iter != mTranslateKeyMap.end(); iter++)
  139. {
  140. mInvTranslateKeyMap[iter->second] = iter->first;
  141. }
  142. // build numpad maps
  143. mTranslateNumpadMap[0x52] = KEY_PAD_INS;    // keypad 0
  144. mTranslateNumpadMap[0x53] = KEY_PAD_END;   // keypad 1
  145. mTranslateNumpadMap[0x54] = KEY_PAD_DOWN; // keypad 2
  146. mTranslateNumpadMap[0x55] = KEY_PAD_PGDN; // keypad 3
  147. mTranslateNumpadMap[0x56] = KEY_PAD_LEFT; // keypad 4
  148. mTranslateNumpadMap[0x57] = KEY_PAD_CENTER; // keypad 5
  149. mTranslateNumpadMap[0x58] = KEY_PAD_RIGHT; // keypad 6
  150. mTranslateNumpadMap[0x59] = KEY_PAD_HOME; // keypad 7
  151. mTranslateNumpadMap[0x5b] = KEY_PAD_UP; // keypad 8
  152. mTranslateNumpadMap[0x5c] = KEY_PAD_PGUP; // keypad 9
  153. mTranslateNumpadMap[0x41] = KEY_PAD_DEL; // keypad .
  154. mTranslateNumpadMap[0x4c] = KEY_PAD_RETURN; // keypad enter
  155. // Build inverse numpad map
  156. for (iter = mTranslateNumpadMap.begin(); iter != mTranslateNumpadMap.end(); iter++)
  157. {
  158. mInvTranslateNumpadMap[iter->second] = iter->first;
  159. }
  160. }
  161. void LLKeyboardMacOSX::resetMaskKeys()
  162. {
  163. U32 mask = GetCurrentEventKeyModifiers();
  164. // MBW -- XXX -- This mirrors the operation of the Windows version of resetMaskKeys().
  165. //    It looks a bit suspicious, as it won't correct for keys that have been released.
  166. //    Is this the way it's supposed to work?
  167. if(mask & shiftKey)
  168. {
  169. mKeyLevel[KEY_SHIFT] = TRUE;
  170. }
  171. if(mask & (controlKey))
  172. {
  173. mKeyLevel[KEY_CONTROL] = TRUE;
  174. }
  175. if(mask & optionKey)
  176. {
  177. mKeyLevel[KEY_ALT] = TRUE;
  178. }
  179. }
  180. /*
  181. static BOOL translateKeyMac(const U16 key, const U32 mask, KEY &outKey, U32 &outMask)
  182. {
  183. // Translate the virtual keycode into the keycodes the keyboard system expects.
  184. U16 virtualKey = (mask >> 24) & 0x0000007F;
  185. outKey = macKeyTransArray[virtualKey];
  186. return(outKey != 0);
  187. }
  188. */
  189. MASK LLKeyboardMacOSX::updateModifiers(const U32 mask)
  190. {
  191. // translate the mask
  192. MASK out_mask = 0;
  193. if(mask & shiftKey)
  194. {
  195. out_mask |= MASK_SHIFT;
  196. }
  197. if(mask & (controlKey | cmdKey))
  198. {
  199. out_mask |= MASK_CONTROL;
  200. }
  201. if(mask & optionKey)
  202. {
  203. out_mask |= MASK_ALT;
  204. }
  205. return out_mask;
  206. }
  207. BOOL LLKeyboardMacOSX::handleKeyDown(const U16 key, const U32 mask)
  208. {
  209. KEY translated_key = 0;
  210. U32 translated_mask = 0;
  211. BOOL handled = FALSE;
  212. translated_mask = updateModifiers(mask);
  213. if(translateNumpadKey(key, &translated_key))
  214. {
  215. handled = handleTranslatedKeyDown(translated_key, translated_mask);
  216. }
  217. return handled;
  218. }
  219. BOOL LLKeyboardMacOSX::handleKeyUp(const U16 key, const U32 mask)
  220. {
  221. KEY translated_key = 0;
  222. U32 translated_mask = 0;
  223. BOOL handled = FALSE;
  224. translated_mask = updateModifiers(mask);
  225. if(translateNumpadKey(key, &translated_key))
  226. {
  227. handled = handleTranslatedKeyUp(translated_key, translated_mask);
  228. }
  229. return handled;
  230. }
  231. MASK LLKeyboardMacOSX::currentMask(BOOL for_mouse_event)
  232. {
  233. MASK result = MASK_NONE;
  234. U32 mask = GetCurrentEventKeyModifiers();
  235. if (mask & shiftKey) result |= MASK_SHIFT;
  236. if (mask & controlKey) result |= MASK_CONTROL;
  237. if (mask & optionKey) result |= MASK_ALT;
  238. // For keyboard events, consider Command equivalent to Control
  239. if (!for_mouse_event)
  240. {
  241. if (mask & cmdKey) result |= MASK_CONTROL;
  242. }
  243. return result;
  244. }
  245. void LLKeyboardMacOSX::scanKeyboard()
  246. {
  247. S32 key;
  248. for (key = 0; key < KEY_COUNT; key++)
  249. {
  250. // Generate callback if any event has occurred on this key this frame.
  251. // Can't just test mKeyLevel, because this could be a slow frame and
  252. // key might have gone down then up. JC
  253. if (mKeyLevel[key] || mKeyDown[key] || mKeyUp[key])
  254. {
  255. mCurScanKey = key;
  256. mCallbacks->handleScanKey(key, mKeyDown[key], mKeyUp[key], mKeyLevel[key]);
  257. }
  258. }
  259. // Reset edges for next frame
  260. for (key = 0; key < KEY_COUNT; key++)
  261. {
  262. mKeyUp[key] = FALSE;
  263. mKeyDown[key] = FALSE;
  264. if (mKeyLevel[key])
  265. {
  266. mKeyLevelFrameCount[key]++;
  267. }
  268. }
  269. }
  270. BOOL LLKeyboardMacOSX::translateNumpadKey( const U16 os_key, KEY *translated_key )
  271. {
  272. if(mNumpadDistinct == ND_NUMLOCK_ON)
  273. {
  274. std::map<U16, KEY>::iterator iter= mTranslateNumpadMap.find(os_key);
  275. if(iter != mTranslateNumpadMap.end())
  276. {
  277. *translated_key = iter->second;
  278. return TRUE;
  279. }
  280. }
  281. return translateKey(os_key, translated_key);
  282. }
  283. U16 LLKeyboardMacOSX::inverseTranslateNumpadKey(const KEY translated_key)
  284. {
  285. if(mNumpadDistinct == ND_NUMLOCK_ON)
  286. {
  287. std::map<KEY, U16>::iterator iter= mInvTranslateNumpadMap.find(translated_key);
  288. if(iter != mInvTranslateNumpadMap.end())
  289. {
  290. return iter->second;
  291. }
  292. }
  293. return inverseTranslateKey(translated_key);
  294. }
  295. #endif // LL_DARWIN