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 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 301 f3_xkeycode_ = XKeysymToKeycode(display, XK_F3); | 301 f3_xkeycode_ = XKeysymToKeycode(display, XK_F3); |
| 302 f4_xkeycode_ = XKeysymToKeycode(display, XK_F4); | 302 f4_xkeycode_ = XKeysymToKeycode(display, XK_F4); |
| 303 f5_xkeycode_ = XKeysymToKeycode(display, XK_F5); | 303 f5_xkeycode_ = XKeysymToKeycode(display, XK_F5); |
| 304 f6_xkeycode_ = XKeysymToKeycode(display, XK_F6); | 304 f6_xkeycode_ = XKeysymToKeycode(display, XK_F6); |
| 305 f7_xkeycode_ = XKeysymToKeycode(display, XK_F7); | 305 f7_xkeycode_ = XKeysymToKeycode(display, XK_F7); |
| 306 f8_xkeycode_ = XKeysymToKeycode(display, XK_F8); | 306 f8_xkeycode_ = XKeysymToKeycode(display, XK_F8); |
| 307 f9_xkeycode_ = XKeysymToKeycode(display, XK_F9); | 307 f9_xkeycode_ = XKeysymToKeycode(display, XK_F9); |
| 308 f10_xkeycode_ = XKeysymToKeycode(display, XK_F10); | 308 f10_xkeycode_ = XKeysymToKeycode(display, XK_F10); |
| 309 f11_xkeycode_ = XKeysymToKeycode(display, XK_F11); | 309 f11_xkeycode_ = XKeysymToKeycode(display, XK_F11); |
| 310 f12_xkeycode_ = XKeysymToKeycode(display, XK_F12); | 310 f12_xkeycode_ = XKeysymToKeycode(display, XK_F12); |
| 311 browser_back_xkeycode_ = XKeysymToKeycode(display, XF86XK_Back); | |
| 312 browser_forward_xkeycode_ = XKeysymToKeycode(display, XF86XK_Forward); | |
| 313 browser_refresh_xkeycode_ = XKeysymToKeycode(display, XF86XK_Reload); | |
| 314 media_launch_app1_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchA); | |
| 315 media_launch_app2_xkeycode_ = XKeysymToKeycode(display, XF86XK_LaunchB); | |
| 316 brightness_down_xkeycode_ = | |
| 317 XKeysymToKeycode(display, XF86XK_MonBrightnessDown); | |
| 318 brightness_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_MonBrightnessUp); | |
| 319 volume_mute_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioMute); | |
| 320 volume_down_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioLowerVolume); | |
| 321 volume_up_xkeycode_ = XKeysymToKeycode(display, XF86XK_AudioRaiseVolume); | |
| 322 power_xkeycode_ = XKeysymToKeycode(display, XF86XK_PowerOff); | |
| 311 } | 323 } |
| 312 | 324 |
| 313 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { | 325 KeyCode EventRewriter::NativeKeySymToNativeKeycode(KeySym keysym) { |
| 314 switch (keysym) { | 326 switch (keysym) { |
| 315 case XK_Control_L: | 327 case XK_Control_L: |
| 316 return control_l_xkeycode_; | 328 return control_l_xkeycode_; |
| 317 case XK_Control_R: | 329 case XK_Control_R: |
| 318 return control_r_xkeycode_; | 330 return control_r_xkeycode_; |
| 319 case XK_Alt_L: | 331 case XK_Alt_L: |
| 320 return alt_l_xkeycode_; | 332 return alt_l_xkeycode_; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 375 // crbug.com/136465. | 387 // crbug.com/136465. |
| 376 if (event->native_event()->xkey.send_event) | 388 if (event->native_event()->xkey.send_event) |
| 377 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; | 389 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; |
| 378 | 390 |
| 379 if (DropSearchKey(event)) | 391 if (DropSearchKey(event)) |
| 380 return ash::EventRewriterDelegate::ACTION_DROP_EVENT; | 392 return ash::EventRewriterDelegate::ACTION_DROP_EVENT; |
| 381 #endif | 393 #endif |
| 382 RewriteModifiers(event); | 394 RewriteModifiers(event); |
| 383 RewriteNumPadKeys(event); | 395 RewriteNumPadKeys(event); |
| 384 RewriteBackspaceAndArrowKeys(event); | 396 RewriteBackspaceAndArrowKeys(event); |
| 397 RewriteFunctionKeys(event); | |
| 385 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; | 398 return ash::EventRewriterDelegate::ACTION_REWRITE_EVENT; |
| 386 } | 399 } |
| 387 | 400 |
| 388 bool EventRewriter::IsAppleKeyboard() const { | 401 bool EventRewriter::IsAppleKeyboard() const { |
| 389 if (last_device_id_ == kBadDeviceId) | 402 if (last_device_id_ == kBadDeviceId) |
| 390 return false; | 403 return false; |
| 391 | 404 |
| 392 // Check which device generated |event|. | 405 // Check which device generated |event|. |
| 393 std::map<int, DeviceType>::const_iterator iter = | 406 std::map<int, DeviceType>::const_iterator iter = |
| 394 device_id_to_type_.find(last_device_id_); | 407 device_id_to_type_.find(last_device_id_); |
| (...skipping 335 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 730 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask, | 743 OverwriteEvent(event, next_xkeycode_, xkey->state & ~Mod4Mask, |
| 731 ui::VKEY_NEXT, event->flags()); | 744 ui::VKEY_NEXT, event->flags()); |
| 732 rewritten = true; | 745 rewritten = true; |
| 733 } | 746 } |
| 734 #else | 747 #else |
| 735 // TODO(yusukes): Support Ash on other platforms if needed. | 748 // TODO(yusukes): Support Ash on other platforms if needed. |
| 736 #endif | 749 #endif |
| 737 return rewritten; | 750 return rewritten; |
| 738 } | 751 } |
| 739 | 752 |
| 753 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { | |
| 754 #if defined(OS_CHROMEOS) | |
| 755 XEvent* xev = event->native_event(); | |
| 756 XKeyEvent* xkey = &(xev->xkey); | |
| 757 const KeySym keysym = XLookupKeysym(xkey, 0); | |
| 758 | |
| 759 KeyCode remapped_native_keycode = 0; | |
| 760 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; | |
| 761 unsigned int remapped_native_state = xkey->state; | |
| 762 int remapped_flags = event->flags(); | |
| 763 | |
| 764 // On a ChromeOS keyboard, F<number> keys have special purposes. On other | |
|
Yusuke Sato
2012/11/26 07:28:19
What's the expected behavior when Stumpy is used w
danakj
2012/11/26 17:50:38
Stumpy should not --has-chromeos-keyboard, so it s
Yusuke Sato
2012/11/26 19:00:00
Sorry: I thought that HasChromeOSKeyboard() was a
danakj
2012/11/26 19:07:17
Ok. I will had an EventSourceIsChromebookKeyboard(
| |
| 765 // keyboards they should act as usual. | |
| 766 // TODO(danakj): Early out here when the event came from an external keyboard. | |
| 767 if (!HasChromeOSKeyboard()) | |
| 768 return false; | |
| 769 | |
| 770 // Rewrite the actual F1-F12 keys on a ChromeOS keyboard to special keys. | |
| 771 switch (keysym) { | |
| 772 case XK_F1: | |
| 773 // Remap F1 to BROWSER_BACK | |
| 774 remapped_native_keycode = browser_back_xkeycode_; | |
| 775 remapped_keycode = ui::VKEY_BROWSER_BACK; | |
| 776 break; | |
| 777 case XK_F2: | |
| 778 // Remap F2 to BROWSER_FORWARD | |
| 779 remapped_native_keycode = browser_forward_xkeycode_; | |
| 780 remapped_keycode = ui::VKEY_BROWSER_FORWARD; | |
| 781 break; | |
| 782 case XK_F3: | |
| 783 // Remap F3 to BROWSER_REFRESH | |
| 784 remapped_native_keycode = browser_refresh_xkeycode_; | |
| 785 remapped_keycode = ui::VKEY_BROWSER_REFRESH; | |
| 786 break; | |
| 787 case XK_F4: | |
| 788 // Remap F4 to MEDIA_LAUNCH_APP2 | |
| 789 remapped_native_keycode = media_launch_app2_xkeycode_; | |
| 790 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP2; | |
| 791 break; | |
| 792 case XK_F5: | |
| 793 // Remap F5 to MEDIA_LAUNCH_APP1 | |
| 794 remapped_native_keycode = media_launch_app1_xkeycode_; | |
| 795 remapped_keycode = ui::VKEY_MEDIA_LAUNCH_APP1; | |
| 796 break; | |
| 797 case XK_F6: | |
| 798 // Remap F6 to BRIGHTNESS_DOWN | |
| 799 remapped_native_keycode = brightness_down_xkeycode_; | |
| 800 remapped_keycode = ui::VKEY_BRIGHTNESS_DOWN; | |
| 801 break; | |
| 802 case XK_F7: | |
| 803 // Remap F7 to BRIGHTNESS_UP | |
| 804 remapped_native_keycode = brightness_up_xkeycode_; | |
| 805 remapped_keycode = ui::VKEY_BRIGHTNESS_UP; | |
| 806 break; | |
| 807 case XK_F8: | |
| 808 // Remap F8 to VOLUME_MUTE | |
| 809 remapped_native_keycode = volume_mute_xkeycode_; | |
| 810 remapped_keycode = ui::VKEY_VOLUME_MUTE; | |
| 811 break; | |
| 812 case XK_F9: | |
| 813 // Remap F9 to VOLUME_DOWN | |
| 814 remapped_native_keycode = volume_down_xkeycode_; | |
| 815 remapped_keycode = ui::VKEY_VOLUME_DOWN; | |
| 816 break; | |
| 817 case XK_F10: | |
| 818 // Remap F10 to VOLUME_UP | |
| 819 remapped_native_keycode = volume_up_xkeycode_; | |
| 820 remapped_keycode = ui::VKEY_VOLUME_UP; | |
| 821 break; | |
| 822 case XK_F11: | |
| 823 // Remap F11 to POWER | |
| 824 remapped_native_keycode = power_xkeycode_; | |
| 825 remapped_keycode = ui::VKEY_POWER; | |
| 826 break; | |
| 827 default: | |
| 828 break; | |
| 829 } | |
| 830 | |
| 831 const PrefService* pref_service = | |
| 832 pref_service_ ? pref_service_ : GetPrefService(); | |
| 833 | |
| 834 const bool search_as_function_key = pref_service && | |
| 835 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); | |
| 836 | |
| 837 // When using Search as a Function key, remap Search+<number> to F<number>. | |
| 838 if (search_as_function_key && xkey->state & Mod4Mask) { | |
| 839 switch (keysym) { | |
| 840 case XK_1: | |
|
Yusuke Sato
2012/11/26 07:28:19
This is very dirty, but probably we should check |
danakj
2012/11/26 21:08:38
Ok this sounds reasonable. If we check that keycod
| |
| 841 // Remap Search+1 to F1. | |
| 842 remapped_native_keycode = f1_xkeycode_; | |
| 843 remapped_keycode = ui::VKEY_F1; | |
| 844 remapped_native_state &= ~Mod4Mask; | |
| 845 break; | |
| 846 case XK_2: | |
| 847 // Remap Search+2 to F2. | |
| 848 remapped_native_keycode = f2_xkeycode_; | |
| 849 remapped_keycode = ui::VKEY_F2; | |
| 850 remapped_native_state &= ~Mod4Mask; | |
| 851 break; | |
| 852 case XK_3: | |
| 853 // Remap Search+3 to F3. | |
| 854 remapped_native_keycode = f3_xkeycode_; | |
| 855 remapped_keycode = ui::VKEY_F3; | |
| 856 remapped_native_state &= ~Mod4Mask; | |
| 857 break; | |
| 858 case XK_4: | |
| 859 // Remap Search+4 to F4. | |
| 860 remapped_native_keycode = f4_xkeycode_; | |
| 861 remapped_keycode = ui::VKEY_F4; | |
| 862 remapped_native_state &= ~Mod4Mask; | |
| 863 break; | |
| 864 case XK_5: | |
| 865 // Remap Search+5 to F5. | |
| 866 remapped_native_keycode = f5_xkeycode_; | |
| 867 remapped_keycode = ui::VKEY_F5; | |
| 868 remapped_native_state &= ~Mod4Mask; | |
| 869 break; | |
| 870 case XK_6: | |
| 871 // Remap Search+6 to F6. | |
| 872 remapped_native_keycode = f6_xkeycode_; | |
| 873 remapped_keycode = ui::VKEY_F6; | |
| 874 remapped_native_state &= ~Mod4Mask; | |
| 875 break; | |
| 876 case XK_7: | |
| 877 // Remap Search+7 to F7. | |
| 878 remapped_native_keycode = f7_xkeycode_; | |
| 879 remapped_keycode = ui::VKEY_F7; | |
| 880 remapped_native_state &= ~Mod4Mask; | |
| 881 break; | |
| 882 case XK_8: | |
| 883 // Remap Search+8 to F8. | |
| 884 remapped_native_keycode = f8_xkeycode_; | |
| 885 remapped_keycode = ui::VKEY_F8; | |
| 886 remapped_native_state &= ~Mod4Mask; | |
| 887 break; | |
| 888 case XK_9: | |
| 889 // Remap Search+9 to F9. | |
| 890 remapped_native_keycode = f9_xkeycode_; | |
| 891 remapped_keycode = ui::VKEY_F9; | |
| 892 remapped_native_state &= ~Mod4Mask; | |
| 893 break; | |
| 894 case XK_0: | |
| 895 // Remap Search+0 to F10. | |
| 896 remapped_native_keycode = f10_xkeycode_; | |
| 897 remapped_keycode = ui::VKEY_F10; | |
| 898 remapped_native_state &= ~Mod4Mask; | |
| 899 break; | |
| 900 case XK_minus: | |
| 901 // Remap Search+- to F11. | |
| 902 remapped_native_keycode = f11_xkeycode_; | |
| 903 remapped_keycode = ui::VKEY_F11; | |
| 904 remapped_native_state &= ~Mod4Mask; | |
| 905 break; | |
| 906 case XK_equal: | |
| 907 // Remap Search+= to F12. | |
| 908 remapped_native_keycode = f12_xkeycode_; | |
| 909 remapped_keycode = ui::VKEY_F12; | |
| 910 remapped_native_state &= ~Mod4Mask; | |
| 911 break; | |
| 912 default: | |
| 913 break; | |
| 914 } | |
| 915 } | |
| 916 | |
| 917 if (!remapped_native_keycode || remapped_keycode == ui::VKEY_UNKNOWN) | |
| 918 return false; | |
| 919 | |
| 920 OverwriteEvent(event, remapped_native_keycode, remapped_native_state, | |
| 921 remapped_keycode, remapped_flags); | |
| 922 return true; | |
| 923 #else | |
| 924 // TODO(danakj): Support Ash on other platforms if needed. | |
| 925 #endif | |
| 926 | |
| 927 return false; | |
| 928 } | |
| 929 | |
| 740 #if defined(OS_CHROMEOS) | 930 #if defined(OS_CHROMEOS) |
| 741 bool EventRewriter::DropSearchKey(ui::KeyEvent* event) { | 931 bool EventRewriter::DropSearchKey(ui::KeyEvent* event) { |
| 742 const PrefService* pref_service = | 932 const PrefService* pref_service = |
| 743 pref_service_ ? pref_service_ : GetPrefService(); | 933 pref_service_ ? pref_service_ : GetPrefService(); |
| 744 if (!pref_service) | 934 if (!pref_service) |
| 745 return false; | 935 return false; |
| 746 const bool search_as_function_key = | 936 const bool search_as_function_key = |
| 747 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); | 937 pref_service->GetBoolean(prefs::kLanguageSearchKeyActsAsFunctionKey); |
| 748 | 938 |
| 749 if (!search_as_function_key) | 939 if (!search_as_function_key) |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 846 const DeviceType type = EventRewriter::GetDeviceType(device_name); | 1036 const DeviceType type = EventRewriter::GetDeviceType(device_name); |
| 847 if (type == kDeviceAppleKeyboard) { | 1037 if (type == kDeviceAppleKeyboard) { |
| 848 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 1038 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
| 849 << "id=" << device_id; | 1039 << "id=" << device_id; |
| 850 } | 1040 } |
| 851 // Always overwrite the existing device_id since the X server may reuse a | 1041 // Always overwrite the existing device_id since the X server may reuse a |
| 852 // device id for an unattached device. | 1042 // device id for an unattached device. |
| 853 device_id_to_type_[device_id] = type; | 1043 device_id_to_type_[device_id] = type; |
| 854 return type; | 1044 return type; |
| 855 } | 1045 } |
| OLD | NEW |