Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #import "ui/base/keycodes/keyboard_code_conversion_mac.h" | 5 #import "ui/base/keycodes/keyboard_code_conversion_mac.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #import <Carbon/Carbon.h> | 8 #import <Carbon/Carbon.h> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 193 { VKEY_PLAY /* 0xFA */, -1, 0 }, | 193 { VKEY_PLAY /* 0xFA */, -1, 0 }, |
| 194 { VKEY_ZOOM /* 0xFB */, -1, 0 }, | 194 { VKEY_ZOOM /* 0xFB */, -1, 0 }, |
| 195 { VKEY_NONAME /* 0xFC */, -1, 0 }, | 195 { VKEY_NONAME /* 0xFC */, -1, 0 }, |
| 196 { VKEY_PA1 /* 0xFD */, -1, 0 }, | 196 { VKEY_PA1 /* 0xFD */, -1, 0 }, |
| 197 { VKEY_OEM_CLEAR /* 0xFE */, kVK_ANSI_KeypadClear, kClearCharCode } | 197 { VKEY_OEM_CLEAR /* 0xFE */, kVK_ANSI_KeypadClear, kClearCharCode } |
| 198 }; | 198 }; |
| 199 | 199 |
| 200 // A convenient array for getting symbol characters on the number keys. | 200 // A convenient array for getting symbol characters on the number keys. |
| 201 const char kShiftCharsForNumberKeys[] = ")!@#$%^&*("; | 201 const char kShiftCharsForNumberKeys[] = ")!@#$%^&*("; |
| 202 | 202 |
| 203 // Translates from character code to keyboard code. | |
| 204 KeyboardCode KeyboardCodeFromCharCode(unichar charCode) { | |
| 205 switch (charCode) { | |
| 206 case 8: case 0x7F: return VKEY_BACK; | |
| 207 case 9: return VKEY_TAB; | |
| 208 case 0xD: case 3: return VKEY_RETURN; | |
| 209 case 0x1B: return VKEY_ESCAPE; | |
| 210 case ' ': return VKEY_SPACE; | |
| 211 case NSHomeFunctionKey: return VKEY_HOME; | |
| 212 case NSEndFunctionKey: return VKEY_END; | |
| 213 case NSPageUpFunctionKey: return VKEY_PRIOR; | |
| 214 case NSPageDownFunctionKey: return VKEY_NEXT; | |
| 215 case NSUpArrowFunctionKey: return VKEY_UP; | |
| 216 case NSDownArrowFunctionKey: return VKEY_DOWN; | |
| 217 case NSLeftArrowFunctionKey: return VKEY_LEFT; | |
| 218 case NSRightArrowFunctionKey: return VKEY_RIGHT; | |
| 219 case NSDeleteFunctionKey: return VKEY_DELETE; | |
| 220 | |
| 221 case '0': case ')': return VKEY_0; | |
| 222 case '1': case '!': return VKEY_1; | |
| 223 case '2': case '@': return VKEY_2; | |
| 224 case '3': case '#': return VKEY_3; | |
| 225 case '4': case '$': return VKEY_4; | |
| 226 case '5': case '%': return VKEY_5; | |
| 227 case '6': case '^': return VKEY_6; | |
| 228 case '7': case '&': return VKEY_7; | |
| 229 case '8': case '*': return VKEY_8; | |
| 230 case '9': case '(': return VKEY_9; | |
| 231 | |
| 232 case 'a': case 'A': return VKEY_A; | |
| 233 case 'b': case 'B': return VKEY_B; | |
| 234 case 'c': case 'C': return VKEY_C; | |
| 235 case 'd': case 'D': return VKEY_D; | |
| 236 case 'e': case 'E': return VKEY_E; | |
| 237 case 'f': case 'F': return VKEY_F; | |
| 238 case 'g': case 'G': return VKEY_G; | |
| 239 case 'h': case 'H': return VKEY_H; | |
| 240 case 'i': case 'I': return VKEY_I; | |
| 241 case 'j': case 'J': return VKEY_J; | |
| 242 case 'k': case 'K': return VKEY_K; | |
| 243 case 'l': case 'L': return VKEY_L; | |
| 244 case 'm': case 'M': return VKEY_M; | |
| 245 case 'n': case 'N': return VKEY_N; | |
| 246 case 'o': case 'O': return VKEY_O; | |
| 247 case 'p': case 'P': return VKEY_P; | |
| 248 case 'q': case 'Q': return VKEY_Q; | |
| 249 case 'r': case 'R': return VKEY_R; | |
| 250 case 's': case 'S': return VKEY_S; | |
| 251 case 't': case 'T': return VKEY_T; | |
| 252 case 'u': case 'U': return VKEY_U; | |
| 253 case 'v': case 'V': return VKEY_V; | |
| 254 case 'w': case 'W': return VKEY_W; | |
| 255 case 'x': case 'X': return VKEY_X; | |
| 256 case 'y': case 'Y': return VKEY_Y; | |
| 257 case 'z': case 'Z': return VKEY_Z; | |
| 258 | |
| 259 case NSPauseFunctionKey: return VKEY_PAUSE; | |
| 260 case NSSelectFunctionKey: return VKEY_SELECT; | |
| 261 case NSPrintFunctionKey: return VKEY_PRINT; | |
| 262 case NSExecuteFunctionKey: return VKEY_EXECUTE; | |
| 263 case NSPrintScreenFunctionKey: return VKEY_SNAPSHOT; | |
| 264 case NSInsertFunctionKey: return VKEY_INSERT; | |
| 265 case NSHelpFunctionKey: return VKEY_INSERT; | |
| 266 | |
| 267 case NSF1FunctionKey: return VKEY_F1; | |
| 268 case NSF2FunctionKey: return VKEY_F2; | |
| 269 case NSF3FunctionKey: return VKEY_F3; | |
| 270 case NSF4FunctionKey: return VKEY_F4; | |
| 271 case NSF5FunctionKey: return VKEY_F5; | |
| 272 case NSF6FunctionKey: return VKEY_F6; | |
| 273 case NSF7FunctionKey: return VKEY_F7; | |
| 274 case NSF8FunctionKey: return VKEY_F8; | |
| 275 case NSF9FunctionKey: return VKEY_F9; | |
| 276 case NSF10FunctionKey: return VKEY_F10; | |
| 277 case NSF11FunctionKey: return VKEY_F11; | |
| 278 case NSF12FunctionKey: return VKEY_F12; | |
| 279 case NSF13FunctionKey: return VKEY_F13; | |
| 280 case NSF14FunctionKey: return VKEY_F14; | |
| 281 case NSF15FunctionKey: return VKEY_F15; | |
| 282 case NSF16FunctionKey: return VKEY_F16; | |
| 283 case NSF17FunctionKey: return VKEY_F17; | |
| 284 case NSF18FunctionKey: return VKEY_F18; | |
| 285 case NSF19FunctionKey: return VKEY_F19; | |
| 286 case NSF20FunctionKey: return VKEY_F20; | |
| 287 | |
| 288 case NSF21FunctionKey: return VKEY_F21; | |
| 289 case NSF22FunctionKey: return VKEY_F22; | |
| 290 case NSF23FunctionKey: return VKEY_F23; | |
| 291 case NSF24FunctionKey: return VKEY_F24; | |
| 292 case NSScrollLockFunctionKey: return VKEY_SCROLL; | |
| 293 | |
| 294 // U.S. Specific mappings. Mileage may vary. | |
| 295 case ';': case ':': return VKEY_OEM_1; | |
| 296 case '=': case '+': return VKEY_OEM_PLUS; | |
| 297 case ',': case '<': return VKEY_OEM_COMMA; | |
| 298 case '-': case '_': return VKEY_OEM_MINUS; | |
| 299 case '.': case '>': return VKEY_OEM_PERIOD; | |
| 300 case '/': case '?': return VKEY_OEM_2; | |
| 301 case '`': case '~': return VKEY_OEM_3; | |
| 302 case '[': case '{': return VKEY_OEM_4; | |
| 303 case '\\': case '|': return VKEY_OEM_5; | |
| 304 case ']': case '}': return VKEY_OEM_6; | |
| 305 case '\'': case '"': return VKEY_OEM_7; | |
| 306 } | |
| 307 | |
| 308 return VKEY_UNKNOWN; | |
| 309 } | |
| 310 | |
| 311 KeyboardCode KeyboardCodeFromKeyCode(unsigned short keyCode) { | |
| 312 static const KeyboardCode kKeyboardCodes[] = { | |
| 313 /* 0 */ VKEY_A, | |
| 314 /* 1 */ VKEY_S, | |
| 315 /* 2 */ VKEY_D, | |
| 316 /* 3 */ VKEY_F, | |
| 317 /* 4 */ VKEY_H, | |
| 318 /* 5 */ VKEY_G, | |
| 319 /* 6 */ VKEY_Z, | |
| 320 /* 7 */ VKEY_X, | |
| 321 /* 8 */ VKEY_C, | |
| 322 /* 9 */ VKEY_V, | |
| 323 /* 0x0A */ VKEY_OEM_3, // Section key. | |
| 324 /* 0x0B */ VKEY_B, | |
| 325 /* 0x0C */ VKEY_Q, | |
| 326 /* 0x0D */ VKEY_W, | |
| 327 /* 0x0E */ VKEY_E, | |
| 328 /* 0x0F */ VKEY_R, | |
| 329 /* 0x10 */ VKEY_Y, | |
| 330 /* 0x11 */ VKEY_T, | |
| 331 /* 0x12 */ VKEY_1, | |
| 332 /* 0x13 */ VKEY_2, | |
| 333 /* 0x14 */ VKEY_3, | |
| 334 /* 0x15 */ VKEY_4, | |
| 335 /* 0x16 */ VKEY_6, | |
| 336 /* 0x17 */ VKEY_5, | |
| 337 /* 0x18 */ VKEY_OEM_PLUS, // =+ | |
| 338 /* 0x19 */ VKEY_9, | |
| 339 /* 0x1A */ VKEY_7, | |
| 340 /* 0x1B */ VKEY_OEM_MINUS, // -_ | |
| 341 /* 0x1C */ VKEY_8, | |
| 342 /* 0x1D */ VKEY_0, | |
| 343 /* 0x1E */ VKEY_OEM_6, // ]} | |
| 344 /* 0x1F */ VKEY_O, | |
| 345 /* 0x20 */ VKEY_U, | |
| 346 /* 0x21 */ VKEY_OEM_4, // {[ | |
| 347 /* 0x22 */ VKEY_I, | |
| 348 /* 0x23 */ VKEY_P, | |
| 349 /* 0x24 */ VKEY_RETURN, // Return | |
| 350 /* 0x25 */ VKEY_L, | |
| 351 /* 0x26 */ VKEY_J, | |
| 352 /* 0x27 */ VKEY_OEM_7, // '" | |
| 353 /* 0x28 */ VKEY_K, | |
| 354 /* 0x29 */ VKEY_OEM_1, // ;: | |
| 355 /* 0x2A */ VKEY_OEM_5, // \| | |
| 356 /* 0x2B */ VKEY_OEM_COMMA, // ,< | |
| 357 /* 0x2C */ VKEY_OEM_2, // /? | |
| 358 /* 0x2D */ VKEY_N, | |
| 359 /* 0x2E */ VKEY_M, | |
| 360 /* 0x2F */ VKEY_OEM_PERIOD, // .> | |
| 361 /* 0x30 */ VKEY_TAB, | |
| 362 /* 0x31 */ VKEY_SPACE, | |
| 363 /* 0x32 */ VKEY_OEM_3, // `~ | |
| 364 /* 0x33 */ VKEY_BACK, // Backspace | |
| 365 /* 0x34 */ VKEY_UNKNOWN, // n/a | |
| 366 /* 0x35 */ VKEY_ESCAPE, | |
| 367 /* 0x36 */ VKEY_APPS, // Right Command | |
| 368 /* 0x37 */ VKEY_LWIN, // Left Command | |
| 369 /* 0x38 */ VKEY_SHIFT, // Left Shift | |
| 370 /* 0x39 */ VKEY_CAPITAL, // Caps Lock | |
| 371 /* 0x3A */ VKEY_MENU, // Left Option | |
| 372 /* 0x3B */ VKEY_CONTROL, // Left Ctrl | |
| 373 /* 0x3C */ VKEY_SHIFT, // Right Shift | |
| 374 /* 0x3D */ VKEY_MENU, // Right Option | |
| 375 /* 0x3E */ VKEY_CONTROL, // Right Ctrl | |
| 376 /* 0x3F */ VKEY_UNKNOWN, // fn | |
| 377 /* 0x40 */ VKEY_F17, | |
| 378 /* 0x41 */ VKEY_DECIMAL, // Num Pad . | |
| 379 /* 0x42 */ VKEY_UNKNOWN, // n/a | |
| 380 /* 0x43 */ VKEY_MULTIPLY, // Num Pad * | |
| 381 /* 0x44 */ VKEY_UNKNOWN, // n/a | |
| 382 /* 0x45 */ VKEY_ADD, // Num Pad + | |
| 383 /* 0x46 */ VKEY_UNKNOWN, // n/a | |
| 384 /* 0x47 */ VKEY_CLEAR, // Num Pad Clear | |
| 385 /* 0x48 */ VKEY_VOLUME_UP, | |
| 386 /* 0x49 */ VKEY_VOLUME_DOWN, | |
| 387 /* 0x4A */ VKEY_VOLUME_MUTE, | |
| 388 /* 0x4B */ VKEY_DIVIDE, // Num Pad / | |
| 389 /* 0x4C */ VKEY_RETURN, // Num Pad Enter | |
| 390 /* 0x4D */ VKEY_UNKNOWN, // n/a | |
| 391 /* 0x4E */ VKEY_SUBTRACT, // Num Pad - | |
| 392 /* 0x4F */ VKEY_F18, | |
| 393 /* 0x50 */ VKEY_F19, | |
| 394 /* 0x51 */ VKEY_OEM_PLUS, // Num Pad =. | |
| 395 /* 0x52 */ VKEY_NUMPAD0, | |
| 396 /* 0x53 */ VKEY_NUMPAD1, | |
| 397 /* 0x54 */ VKEY_NUMPAD2, | |
| 398 /* 0x55 */ VKEY_NUMPAD3, | |
| 399 /* 0x56 */ VKEY_NUMPAD4, | |
| 400 /* 0x57 */ VKEY_NUMPAD5, | |
| 401 /* 0x58 */ VKEY_NUMPAD6, | |
| 402 /* 0x59 */ VKEY_NUMPAD7, | |
| 403 /* 0x5A */ VKEY_F20, | |
| 404 /* 0x5B */ VKEY_NUMPAD8, | |
| 405 /* 0x5C */ VKEY_NUMPAD9, | |
| 406 /* 0x5D */ VKEY_UNKNOWN, // Yen (JIS Keyboard Only) | |
| 407 /* 0x5E */ VKEY_UNKNOWN, // Underscore (JIS Keyboard Only) | |
| 408 /* 0x5F */ VKEY_UNKNOWN, // KeypadComma (JIS Keyboard Only) | |
| 409 /* 0x60 */ VKEY_F5, | |
| 410 /* 0x61 */ VKEY_F6, | |
| 411 /* 0x62 */ VKEY_F7, | |
| 412 /* 0x63 */ VKEY_F3, | |
| 413 /* 0x64 */ VKEY_F8, | |
| 414 /* 0x65 */ VKEY_F9, | |
| 415 /* 0x66 */ VKEY_UNKNOWN, // Eisu (JIS Keyboard Only) | |
| 416 /* 0x67 */ VKEY_F11, | |
| 417 /* 0x68 */ VKEY_UNKNOWN, // Kana (JIS Keyboard Only) | |
| 418 /* 0x69 */ VKEY_F13, | |
| 419 /* 0x6A */ VKEY_F16, | |
| 420 /* 0x6B */ VKEY_F14, | |
| 421 /* 0x6C */ VKEY_UNKNOWN, // n/a | |
| 422 /* 0x6D */ VKEY_F10, | |
| 423 /* 0x6E */ VKEY_UNKNOWN, // n/a (Windows95 key?) | |
| 424 /* 0x6F */ VKEY_F12, | |
| 425 /* 0x70 */ VKEY_UNKNOWN, // n/a | |
| 426 /* 0x71 */ VKEY_F15, | |
| 427 /* 0x72 */ VKEY_INSERT, // Help | |
| 428 /* 0x73 */ VKEY_HOME, // Home | |
| 429 /* 0x74 */ VKEY_PRIOR, // Page Up | |
| 430 /* 0x75 */ VKEY_DELETE, // Forward Delete | |
| 431 /* 0x76 */ VKEY_F4, | |
| 432 /* 0x77 */ VKEY_END, // End | |
| 433 /* 0x78 */ VKEY_F2, | |
| 434 /* 0x79 */ VKEY_NEXT, // Page Down | |
| 435 /* 0x7A */ VKEY_F1, | |
| 436 /* 0x7B */ VKEY_LEFT, // Left Arrow | |
| 437 /* 0x7C */ VKEY_RIGHT, // Right Arrow | |
| 438 /* 0x7D */ VKEY_DOWN, // Down Arrow | |
| 439 /* 0x7E */ VKEY_UP, // Up Arrow | |
| 440 /* 0x7F */ VKEY_UNKNOWN // n/a | |
| 441 }; | |
| 442 | |
| 443 if (keyCode >= 0x80) | |
| 444 return VKEY_UNKNOWN; | |
| 445 | |
| 446 return kKeyboardCodes[keyCode]; | |
| 447 } | |
| 448 | |
| 203 } // anonymous namespace | 449 } // anonymous namespace |
| 204 | 450 |
| 205 int MacKeyCodeForWindowsKeyCode(KeyboardCode keycode, | 451 int MacKeyCodeForWindowsKeyCode(KeyboardCode keycode, |
| 206 NSUInteger flags, | 452 NSUInteger flags, |
| 207 unichar* character, | 453 unichar* character, |
| 208 unichar* characterIgnoringModifiers) { | 454 unichar* characterIgnoringModifiers) { |
| 209 KeyCodeMap from; | 455 KeyCodeMap from; |
| 210 from.keycode = keycode; | 456 from.keycode = keycode; |
| 211 | 457 |
| 212 const KeyCodeMap* ptr = std::lower_bound( | 458 const KeyCodeMap* ptr = std::lower_bound( |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 281 else if (macKeycode == kVK_ANSI_Backslash) | 527 else if (macKeycode == kVK_ANSI_Backslash) |
| 282 *character = 28; | 528 *character = 28; |
| 283 else if (macKeycode == kVK_ANSI_RightBracket) | 529 else if (macKeycode == kVK_ANSI_RightBracket) |
| 284 *character = 29; | 530 *character = 29; |
| 285 } | 531 } |
| 286 | 532 |
| 287 // TODO(suzhe): Support characters for Option key bindings. | 533 // TODO(suzhe): Support characters for Option key bindings. |
| 288 return macKeycode; | 534 return macKeycode; |
| 289 } | 535 } |
| 290 | 536 |
| 537 KeyboardCode KeyboardCodeFromNSEvent(NSEvent* event) { | |
|
Nico
2011/12/19 23:30:28
As far as I understand, this will return "undefine
dhollowa
2011/12/20 00:05:34
VKEY_UNKNOWN is returned for key codes >= 0x80 if
| |
| 538 KeyboardCode code = VKEY_UNKNOWN; | |
| 539 | |
| 540 if ([event type] == NSKeyDown || [event type] == NSKeyUp) { | |
| 541 NSString* characters = [event characters]; | |
| 542 if ([characters length] > 0) | |
| 543 code = KeyboardCodeFromCharCode([characters characterAtIndex:0]); | |
| 544 if (code) | |
| 545 return code; | |
| 546 | |
| 547 characters = [event charactersIgnoringModifiers]; | |
| 548 if ([characters length] > 0) | |
| 549 code = KeyboardCodeFromCharCode([characters characterAtIndex:0]); | |
| 550 if (code) | |
| 551 return code; | |
| 552 } | |
| 553 return KeyboardCodeFromKeyCode([event keyCode]); | |
| 554 } | |
| 555 | |
| 291 } // namespace ui | 556 } // namespace ui |
| OLD | NEW |