Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "chrome/browser/ui/ash/event_rewriter.h" | 5 #include "chrome/browser/ui/ash/event_rewriter.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "ash/shell.h" | 9 #include "ash/shell.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 break; | 114 break; |
| 115 } | 115 } |
| 116 return false; | 116 return false; |
| 117 } | 117 } |
| 118 | 118 |
| 119 bool HasChromeOSKeyboard() { | 119 bool HasChromeOSKeyboard() { |
| 120 return CommandLine::ForCurrentProcess()->HasSwitch( | 120 return CommandLine::ForCurrentProcess()->HasSwitch( |
| 121 switches::kHasChromeOSKeyboard); | 121 switches::kHasChromeOSKeyboard); |
| 122 } | 122 } |
| 123 | 123 |
| 124 bool EventSourceIsChromebookKeyboard(ui::KeyEvent* /* event */) { | |
| 125 // TODO(danakj): Determine if the event came from a Chromebook internal | |
| 126 // keyboard. | |
| 127 return true; | |
| 128 } | |
| 129 | |
| 130 bool IsMod3UsedByCurrentInputMethod() { | 124 bool IsMod3UsedByCurrentInputMethod() { |
| 131 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, | 125 // Since both German Neo2 XKB layout and Caps Lock depend on Mod3Mask, |
| 132 // it's not possible to make both features work. For now, we don't remap | 126 // it's not possible to make both features work. For now, we don't remap |
| 133 // Mod3Mask when Neo2 is in use. | 127 // Mod3Mask when Neo2 is in use. |
| 134 // TODO(yusukes): Remove the restriction. | 128 // TODO(yusukes): Remove the restriction. |
| 135 return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() == | 129 return InputMethodManager::GetInstance()->GetCurrentInputMethod().id() == |
| 136 kNeo2LayoutId; | 130 kNeo2LayoutId; |
| 137 } | 131 } |
| 138 #endif | 132 #endif |
| 139 | 133 |
| 140 const PrefService* GetPrefService() { | 134 const PrefService* GetPrefService() { |
| 141 Profile* profile = ProfileManager::GetDefaultProfile(); | 135 Profile* profile = ProfileManager::GetDefaultProfile(); |
| 142 if (profile) | 136 if (profile) |
| 143 return profile->GetPrefs(); | 137 return profile->GetPrefs(); |
| 144 return NULL; | 138 return NULL; |
| 145 } | 139 } |
| 146 | 140 |
| 147 } // namespace | 141 } // namespace |
| 148 | 142 |
| 149 EventRewriter::EventRewriter() | 143 EventRewriter::EventRewriter() |
| 150 : last_device_id_(kBadDeviceId), | 144 : last_device_id_(kBadDeviceId), |
| 151 #if defined(OS_CHROMEOS) | 145 #if defined(OS_CHROMEOS) |
| 146 force_external_keyboard_for_testing_(false), | |
| 152 xkeyboard_(NULL), | 147 xkeyboard_(NULL), |
| 153 #endif | 148 #endif |
| 154 pref_service_(NULL) { | 149 pref_service_(NULL) { |
| 155 // The ash shell isn't instantiated for our unit tests. | 150 // The ash shell isn't instantiated for our unit tests. |
| 156 if (ash::Shell::HasInstance()) | 151 if (ash::Shell::HasInstance()) |
| 157 ash::Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this); | 152 ash::Shell::GetPrimaryRootWindow()->AddRootWindowObserver(this); |
| 158 #if defined(OS_CHROMEOS) | 153 #if defined(OS_CHROMEOS) |
| 159 if (base::chromeos::IsRunningOnChromeOS()) { | 154 if (base::chromeos::IsRunningOnChromeOS()) { |
| 160 chromeos::XInputHierarchyChangedEventListener::GetInstance() | 155 chromeos::XInputHierarchyChangedEventListener::GetInstance() |
| 161 ->AddObserver(this); | 156 ->AddObserver(this); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 193 bool found_keyboard = false; | 188 bool found_keyboard = false; |
| 194 for (size_t i = 0; i < tokens.size(); ++i) { | 189 for (size_t i = 0; i < tokens.size(); ++i) { |
| 195 if (!found_apple && LowerCaseEqualsASCII(tokens[i], "apple")) | 190 if (!found_apple && LowerCaseEqualsASCII(tokens[i], "apple")) |
| 196 found_apple = true; | 191 found_apple = true; |
| 197 if (!found_keyboard && LowerCaseEqualsASCII(tokens[i], "keyboard")) | 192 if (!found_keyboard && LowerCaseEqualsASCII(tokens[i], "keyboard")) |
| 198 found_keyboard = true; | 193 found_keyboard = true; |
| 199 if (found_apple && found_keyboard) | 194 if (found_apple && found_keyboard) |
| 200 return kDeviceAppleKeyboard; | 195 return kDeviceAppleKeyboard; |
| 201 } | 196 } |
| 202 | 197 |
| 198 // TODO(danakj): This could also impact laptops other than Chromebooks, and | |
| 199 // might belong behind a command-line flag to be used only on Chromebooks. | |
| 200 // The chromebook internal keyboard's name. | |
| 201 if (LowerCaseEqualsASCII(device_name, "at translated set 2 keyboard")) | |
| 202 return kDeviceChromebookKeyboard; | |
| 203 // The chromebox chrome-specific keyboard's name. | |
| 204 if (LowerCaseEqualsASCII(device_name, "samsung usb keyboard")) | |
| 205 return kDeviceChromebookKeyboard; | |
|
Daniel Erat
2012/11/28 22:23:03
it's possible that i misunderstood the conversatio
danakj
2012/11/29 01:50:54
Hm.. It should refer to ChromeOS keyboards that ha
| |
| 206 | |
| 203 return kDeviceUnknown; | 207 return kDeviceUnknown; |
| 204 } | 208 } |
| 205 | 209 |
| 206 void EventRewriter::RewriteForTesting(ui::KeyEvent* event) { | 210 void EventRewriter::RewriteForTesting(ui::KeyEvent* event) { |
| 207 Rewrite(event); | 211 Rewrite(event); |
| 208 } | 212 } |
| 209 | 213 |
| 210 ash::EventRewriterDelegate::Action EventRewriter::RewriteOrFilterKeyEvent( | 214 ash::EventRewriterDelegate::Action EventRewriter::RewriteOrFilterKeyEvent( |
| 211 ui::KeyEvent* event) { | 215 ui::KeyEvent* event) { |
| 212 if (event->HasNativeEvent()) | 216 if (event->HasNativeEvent()) |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 294 kp_1_xkeycode_ = XKeysymToKeycode(display, XK_KP_1); | 298 kp_1_xkeycode_ = XKeysymToKeycode(display, XK_KP_1); |
| 295 kp_2_xkeycode_ = XKeysymToKeycode(display, XK_KP_2); | 299 kp_2_xkeycode_ = XKeysymToKeycode(display, XK_KP_2); |
| 296 kp_3_xkeycode_ = XKeysymToKeycode(display, XK_KP_3); | 300 kp_3_xkeycode_ = XKeysymToKeycode(display, XK_KP_3); |
| 297 kp_4_xkeycode_ = XKeysymToKeycode(display, XK_KP_4); | 301 kp_4_xkeycode_ = XKeysymToKeycode(display, XK_KP_4); |
| 298 kp_5_xkeycode_ = XKeysymToKeycode(display, XK_KP_5); | 302 kp_5_xkeycode_ = XKeysymToKeycode(display, XK_KP_5); |
| 299 kp_6_xkeycode_ = XKeysymToKeycode(display, XK_KP_6); | 303 kp_6_xkeycode_ = XKeysymToKeycode(display, XK_KP_6); |
| 300 kp_7_xkeycode_ = XKeysymToKeycode(display, XK_KP_7); | 304 kp_7_xkeycode_ = XKeysymToKeycode(display, XK_KP_7); |
| 301 kp_8_xkeycode_ = XKeysymToKeycode(display, XK_KP_8); | 305 kp_8_xkeycode_ = XKeysymToKeycode(display, XK_KP_8); |
| 302 kp_9_xkeycode_ = XKeysymToKeycode(display, XK_KP_9); | 306 kp_9_xkeycode_ = XKeysymToKeycode(display, XK_KP_9); |
| 303 kp_decimal_xkeycode_ = XKeysymToKeycode(display, XK_KP_Decimal); | 307 kp_decimal_xkeycode_ = XKeysymToKeycode(display, XK_KP_Decimal); |
| 308 f1_xkeycode_ = XKeysymToKeycode(display, XK_F1); | |
| 309 f2_xkeycode_ = XKeysymToKeycode(display, XK_F2); | |
| 310 f3_xkeycode_ = XKeysymToKeycode(display, XK_F3); | |
| 311 f4_xkeycode_ = XKeysymToKeycode(display, XK_F4); | |
| 312 f5_xkeycode_ = XKeysymToKeycode(display, XK_F5); | |
| 313 f6_xkeycode_ = XKeysymToKeycode(display, XK_F6); | |
| 314 f7_xkeycode_ = XKeysymToKeycode(display, XK_F7); | |
| 315 f8_xkeycode_ = XKeysymToKeycode(display, XK_F8); | |
| 316 f9_xkeycode_ = XKeysymToKeycode(display, XK_F9); | |
| 317 f10_xkeycode_ = XKeysymToKeycode(display, XK_F10); | |
| 318 f11_xkeycode_ = XKeysymToKeycode(display, XK_F11); | |
| 319 f12_xkeycode_ = XKeysymToKeycode(display, XK_F12); | |
| 320 number1_xkeycode_ = XKeysymToKeycode(display, XK_1); | |
| 321 number2_xkeycode_ = XKeysymToKeycode(display, XK_2); | |
| 322 number3_xkeycode_ = XKeysymToKeycode(display, XK_3); | |
| 323 number4_xkeycode_ = XKeysymToKeycode(display, XK_4); | |
| 324 number5_xkeycode_ = XKeysymToKeycode(display, XK_5); | |
| 325 number6_xkeycode_ = XKeysymToKeycode(display, XK_6); | |
| 326 number7_xkeycode_ = XKeysymToKeycode(display, XK_7); | |
| 327 number8_xkeycode_ = XKeysymToKeycode(display, XK_8); | |
| 328 number9_xkeycode_ = XKeysymToKeycode(display, XK_9); | |
| 329 number0_xkeycode_ = XKeysymToKeycode(display, XK_0); | |
| 330 minus_xkeycode_ = XKeysymToKeycode(display, XK_minus); | |
| 331 equal_xkeycode_ = XKeysymToKeycode(display, XK_equal); | |
| 332 browser_back_xkeycode_ = XKeysymToKeycode(display, XF86XK_Back); | |
| 333 browser_forward_xkeycode_ = XKeysymToKeycode(display, XF86XK_Forward); | |
| 334 browser_refresh_xkeycode_ = XKeysymToKeycode(display, XF86XK_Reload); | |
| 335 media_launch_app1_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchA); | |
| 336 media_launch_app2_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchB); | |
| 337 brightness_down_xkeycode_ = | |
| 338 XKeysymToKeycode(display, XF86XK_MonBrightnessDown); | |
| 339 brightness_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_MonBrightnessUp); | |
| 340 volume_mute_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioMute); | |
| 341 volume_down_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioLowerVolume); | |
| 342 volume_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioRaiseVolume); | |
| 343 power_xkeycode_ = XKeysymToKeycode(display, XF86XK_PowerOff); | |
| 304 } | 344 } |
| 305 | 345 |
| 306 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { | 346 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { |
| 307 switch (keysym) { | 347 switch (keysym) { |
| 308 case XK_Control_L: | 348 case XK_Control_L: |
| 309 return control_l_xkeycode_; | 349 return control_l_xkeycode_; |
| 310 case XK_Control_R: | 350 case XK_Control_R: |
| 311 return control_r_xkeycode_; | 351 return control_r_xkeycode_; |
| 312 case XK_Alt_L: | 352 case XK_Alt_L: |
| 313 return alt_l_xkeycode_; | 353 return alt_l_xkeycode_; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 353 return kp_8_xkeycode_; | 393 return kp_8_xkeycode_; |
| 354 case XK_KP_9: | 394 case XK_KP_9: |
| 355 return kp_9_xkeycode_; | 395 return kp_9_xkeycode_; |
| 356 case XK_KP_Decimal: | 396 case XK_KP_Decimal: |
| 357 return kp_decimal_xkeycode_; | 397 return kp_decimal_xkeycode_; |
| 358 default: | 398 default: |
| 359 break; | 399 break; |
| 360 } | 400 } |
| 361 return 0U; | 401 return 0U; |
| 362 } | 402 } |
| 403 | |
| 404 bool EventRewriter::EventSourceIsChromebookKeyboard(ui::KeyEvent* /* event */) { | |
| 405 if (force_external_keyboard_for_testing_) | |
| 406 return false; | |
| 407 | |
| 408 if (last_device_id_ == kBadDeviceId) | |
| 409 return false; | |
| 410 | |
| 411 // Check which device generated |event|. | |
| 412 std::map<int, DeviceType>::const_iterator iter = | |
| 413 device_id_to_type_.find(last_device_id_); | |
| 414 if (iter == device_id_to_type_.end()) { | |
| 415 LOG(ERROR) << "Device ID " << last_device_id_ << " is unknown."; | |
| 416 return false; | |
| 417 } | |
| 418 | |
| 419 const DeviceType type = iter->second; | |
| 420 return type == kDeviceChromebookKeyboard; | |
| 421 } | |
| 363 #endif | 422 #endif |
| 364 | 423 |
| 365 void EventRewriter::Rewrite(ui::KeyEvent* event) { | 424 void EventRewriter::Rewrite(ui::KeyEvent* event) { |
| 366 #if defined(OS_CHROMEOS) | 425 #if defined(OS_CHROMEOS) |
| 367 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See | 426 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See |
| 368 // crbug.com/136465. | 427 // crbug.com/136465. |
| 369 if (event->native_event()->xkey.send_event) | 428 if (event->native_event()->xkey.send_event) |
| 370 return; | 429 return; |
| 371 #endif | 430 #endif |
| 372 RewriteModifiers(event); | 431 RewriteModifiers(event); |
| 373 RewriteNumPadKeys(event); | 432 RewriteNumPadKeys(event); |
| 374 RewriteBackspaceAndArrowKeys(event); | 433 RewriteBackspaceAndArrowKeys(event); |
| 375 // TODO(yusukes): Implement crosbug.com/27167 (allow sending function keys). | 434 RewriteFunctionKeys(event); |
| 376 } | 435 } |
| 377 | 436 |
| 378 bool EventRewriter::IsAppleKeyboard() const { | 437 bool EventRewriter::IsAppleKeyboard() const { |
| 379 if (last_device_id_ == kBadDeviceId) | 438 if (last_device_id_ == kBadDeviceId) |
| 380 return false; | 439 return false; |
| 381 | 440 |
| 382 // Check which device generated |event|. | 441 // Check which device generated |event|. |
| 383 std::map<int, DeviceType>::const_iterator iter = | 442 std::map<int, DeviceType>::const_iterator iter = |
| 384 device_id_to_type_.find(last_device_id_); | 443 device_id_to_type_.find(last_device_id_); |
| 385 if (iter == device_id_to_type_.end()) { | 444 if (iter == device_id_to_type_.end()) { |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 724 ui::VKEY_NEXT, event->flags()); | 783 ui::VKEY_NEXT, event->flags()); |
| 725 rewritten = true; | 784 rewritten = true; |
| 726 } | 785 } |
| 727 } | 786 } |
| 728 #else | 787 #else |
| 729 // TODO(yusukes): Support Ash on other platforms if needed. | 788 // TODO(yusukes): Support Ash on other platforms if needed. |
| 730 #endif | 789 #endif |
| 731 return rewritten; | 790 return rewritten; |
| 732 } | 791 } |
| 733 | 792 |
| 793 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { | |
| 794 #if defined(OS_CHROMEOS) | |
| 795 XEvent* xev = event->native_event(); | |
| 796 XKeyEvent* xkey = &(xev->xkey); | |
| 797 const KeySym keysym = XLookupKeysym(xkey, 0); | |
| 798 | |
| 799 KeyCode remapped_native_keycode = 0; | |
| 800 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; | |
| 801 unsigned int remapped_native_state = xkey->state; | |
| 802 int remapped_flags = event->flags(); | |
| 803 | |
| 804 // On a Chromebook keyboard, F<number> keys have special purposes. On other | |
| 805 // keyboards, they should act as usual. | |
| 806 if (!EventSourceIsChromebookKeyboard(event)) | |
| 807 return false; | |
| 808 | |
| 809 // Rewrite the actual F1-F12 keys on a Chromebook keyboard to special keys. | |
| 810 switch (keysym) { | |
| 811 case XK_F1: | |
| 812 // Remap F1 to BROWSER_BACK | |
| 813 remapped_native_keycode = browser_back_xkeycode_; | |
| 814 remapped_keycode = ui::VKEY_BROWSER_BACK; | |
| 815 break; | |
| 816 case XK_F2: | |
| 817 // Remap F2 to BROWSER_FORWARD | |
| 818 remapped_native_keycode = browser_forward_xkeycode_; | |
| 819 remapped_keycode = ui::VKEY_BROWSER_FORWARD; | |
| 820 break; | |
| 821 case XK_F3: | |
| 822 // Remap F3 to BROWSER_REFRESH | |
| 823 remapped_native_keycode = browser_refresh_xkeycode_; | |
| 824 remapped_keycode = ui::VKEY_BROWSER_REFRESH; | |
| 825 break; | |
| 826 case XK_F4: | |
| 827 // Remap F4 to MEDIA_LAUNCH_APP2 | |
| 828 remapped_native_keycode = media_launch_app2_xkeycode_; | |
| 829 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP2; | |
| 830 break; | |
| 831 case XK_F5: | |
| 832 // Remap F5 to MEDIA_LAUNCH_APP1 | |
| 833 remapped_native_keycode = media_launch_app1_xkeycode_; | |
| 834 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP1; | |
| 835 break; | |
| 836 case XK_F6: | |
| 837 // Remap F6 to BRIGHTNESS_DOWN | |
| 838 remapped_native_keycode = brightness_down_xkeycode_; | |
| 839 remapped_keycode = ui::VKEY_BRIGHTNESS_DOWN; | |
| 840 break; | |
| 841 case XK_F7: | |
| 842 // Remap F7 to BRIGHTNESS_UP | |
| 843 remapped_native_keycode = brightness_up_xkeycode_; | |
| 844 remapped_keycode = ui::VKEY_BRIGHTNESS_UP; | |
| 845 break; | |
| 846 case XK_F8: | |
| 847 // Remap F8 to VOLUME_MUTE | |
| 848 remapped_native_keycode = volume_mute_xkeycode_; | |
| 849 remapped_keycode = ui::VKEY_VOLUME_MUTE; | |
| 850 break; | |
| 851 case XK_F9: | |
| 852 // Remap F9 to VOLUME_DOWN | |
| 853 remapped_native_keycode = volume_down_xkeycode_; | |
| 854 remapped_keycode = ui::VKEY_VOLUME_DOWN; | |
| 855 break; | |
| 856 case XK_F10: | |
| 857 // Remap F10 to VOLUME_UP | |
| 858 remapped_native_keycode = volume_up_xkeycode_; | |
| 859 remapped_keycode = ui::VKEY_VOLUME_UP; | |
| 860 break; | |
| 861 case XK_F11: | |
| 862 // Remap F11 to POWER | |
| 863 remapped_native_keycode = power_xkeycode_; | |
| 864 remapped_keycode = ui::VKEY_POWER; | |
| 865 break; | |
| 866 default: | |
| 867 break; | |
| 868 } | |
| 869 | |
| 870 const PrefService* pref_service = | |
| 871 pref_service_ ? pref_service_ : GetPrefService(); | |
| 872 bool chromebook_function_key = CommandLine::ForCurrentProcess()->HasSwitch( | |
| 873 switches::kEnableChromebookFunctionKey); | |
| 874 | |
| 875 bool search_as_function_key = chromebook_function_key && pref_service && | |
| 876 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); | |
| 877 | |
| 878 // When using Search as a Function key, remap Search+<number> to F<number>. | |
| 879 if (search_as_function_key && xkey->state & Mod4Mask) { | |
| 880 // We check the keycode here instead of the keysym, as these keys have | |
| 881 // different keysyms when modifiers are pressed, such as shift. | |
| 882 | |
| 883 // TODO(danakj): On some i18n keyboards, these choices will be bad and we | |
| 884 // should make layout-specific choices here. For eg. on a french keyboard | |
| 885 // "-" and "6" are the same key, so F11 will not be accessible. | |
| 886 KeyCode xkeycode = xkey->keycode; | |
| 887 if (xkeycode == number1_xkeycode_) { | |
| 888 // Remap Search+1 to F1. | |
| 889 remapped_native_keycode = f1_xkeycode_; | |
| 890 remapped_keycode = ui::VKEY_F1; | |
| 891 remapped_native_state &= ~Mod4Mask; | |
| 892 } else if (xkeycode == number2_xkeycode_) { | |
| 893 // Remap Search+2 to F2. | |
|
Daniel Erat
2012/11/28 22:23:03
i'd probably remove these repetitive comments in f
danakj
2012/11/29 01:50:54
Done.
| |
| 894 remapped_native_keycode = f2_xkeycode_; | |
| 895 remapped_keycode = ui::VKEY_F2; | |
| 896 remapped_native_state &= ~Mod4Mask; | |
| 897 } else if (xkeycode == number3_xkeycode_) { | |
| 898 // Remap Search+3 to F3. | |
| 899 remapped_native_keycode = f3_xkeycode_; | |
| 900 remapped_keycode = ui::VKEY_F3; | |
| 901 remapped_native_state &= ~Mod4Mask; | |
| 902 } else if (xkeycode == number4_xkeycode_) { | |
| 903 // Remap Search+4 to F4. | |
| 904 remapped_native_keycode = f4_xkeycode_; | |
| 905 remapped_keycode = ui::VKEY_F4; | |
| 906 remapped_native_state &= ~Mod4Mask; | |
| 907 } else if (xkeycode == number5_xkeycode_) { | |
| 908 // Remap Search+5 to F5. | |
| 909 remapped_native_keycode = f5_xkeycode_; | |
| 910 remapped_keycode = ui::VKEY_F5; | |
| 911 remapped_native_state &= ~Mod4Mask; | |
| 912 } else if (xkeycode == number6_xkeycode_) { | |
| 913 // Remap Search+6 to F6. | |
| 914 remapped_native_keycode = f6_xkeycode_; | |
| 915 remapped_keycode = ui::VKEY_F6; | |
| 916 remapped_native_state &= ~Mod4Mask; | |
| 917 } else if (xkeycode == number7_xkeycode_) { | |
| 918 // Remap Search+7 to F7. | |
| 919 remapped_native_keycode = f7_xkeycode_; | |
| 920 remapped_keycode = ui::VKEY_F7; | |
| 921 remapped_native_state &= ~Mod4Mask; | |
| 922 } else if (xkeycode == number8_xkeycode_) { | |
| 923 // Remap Search+8 to F8. | |
| 924 remapped_native_keycode = f8_xkeycode_; | |
| 925 remapped_keycode = ui::VKEY_F8; | |
| 926 remapped_native_state &= ~Mod4Mask; | |
| 927 } else if (xkeycode == number9_xkeycode_) { | |
| 928 // Remap Search+9 to F9. | |
| 929 remapped_native_keycode = f9_xkeycode_; | |
| 930 remapped_keycode = ui::VKEY_F9; | |
| 931 remapped_native_state &= ~Mod4Mask; | |
| 932 } else if (xkeycode == number0_xkeycode_) { | |
| 933 // Remap Search+0 to F10. | |
| 934 remapped_native_keycode = f10_xkeycode_; | |
| 935 remapped_keycode = ui::VKEY_F10; | |
| 936 remapped_native_state &= ~Mod4Mask; | |
| 937 } else if (xkeycode == minus_xkeycode_) { | |
| 938 // Remap Search+- to F11. | |
| 939 remapped_native_keycode = f11_xkeycode_; | |
| 940 remapped_keycode = ui::VKEY_F11; | |
| 941 remapped_native_state &= ~Mod4Mask; | |
| 942 } else if (xkeycode == equal_xkeycode_) { | |
| 943 // Remap Search+= to F12. | |
| 944 remapped_native_keycode = f12_xkeycode_; | |
| 945 remapped_keycode = ui::VKEY_F12; | |
| 946 remapped_native_state &= ~Mod4Mask; | |
| 947 } | |
| 948 } | |
| 949 | |
| 950 if (!remapped_native_keycode || remapped_keycode == ui::VKEY_UNKNOWN) | |
| 951 return false; | |
| 952 | |
| 953 OverwriteEvent(event, remapped_native_keycode, remapped_native_state, | |
| 954 remapped_keycode, remapped_flags); | |
| 955 return true; | |
| 956 #else | |
| 957 // TODO(danakj): Support Ash on other platforms if needed. | |
| 958 return false; | |
| 959 #endif | |
| 960 } | |
| 961 | |
| 734 void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { | 962 void EventRewriter::RewriteLocatedEvent(ui::LocatedEvent* event) { |
| 735 #if defined(OS_CHROMEOS) | 963 #if defined(OS_CHROMEOS) |
| 736 if (event->flags() & ui::EF_IS_SYNTHESIZED) | 964 if (event->flags() & ui::EF_IS_SYNTHESIZED) |
| 737 return; | 965 return; |
| 738 | 966 |
| 739 XEvent* xevent = event->native_event(); | 967 XEvent* xevent = event->native_event(); |
| 740 if (!xevent || xevent->type != GenericEvent) | 968 if (!xevent || xevent->type != GenericEvent) |
| 741 return; | 969 return; |
| 742 | 970 |
| 743 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); | 971 XIDeviceEvent* xievent = static_cast<XIDeviceEvent*>(xevent->xcookie.data); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 793 #endif | 1021 #endif |
| 794 } | 1022 } |
| 795 | 1023 |
| 796 EventRewriter::DeviceType EventRewriter::DeviceAddedInternal( | 1024 EventRewriter::DeviceType EventRewriter::DeviceAddedInternal( |
| 797 int device_id, | 1025 int device_id, |
| 798 const std::string& device_name) { | 1026 const std::string& device_name) { |
| 799 const DeviceType type = EventRewriter::GetDeviceType(device_name); | 1027 const DeviceType type = EventRewriter::GetDeviceType(device_name); |
| 800 if (type == kDeviceAppleKeyboard) { | 1028 if (type == kDeviceAppleKeyboard) { |
| 801 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 1029 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
| 802 << "id=" << device_id; | 1030 << "id=" << device_id; |
| 1031 } else if (type == kDeviceChromebookKeyboard) { | |
| 1032 VLOG(1) << "Chromebook keyboard '" << device_name << "' connected: " | |
| 1033 << "id=" << device_id; | |
| 803 } | 1034 } |
| 804 // Always overwrite the existing device_id since the X server may reuse a | 1035 // Always overwrite the existing device_id since the X server may reuse a |
| 805 // device id for an unattached device. | 1036 // device id for an unattached device. |
| 806 device_id_to_type_[device_id] = type; | 1037 device_id_to_type_[device_id] = type; |
| 807 return type; | 1038 return type; |
| 808 } | 1039 } |
| OLD | NEW |