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 |