Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(643)

Side by Side Diff: chrome/browser/ui/ash/event_rewriter.cc

Issue 11578044: Enable Search-key modifiers for extended key shortcuts. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 616 matching lines...) Expand 10 before | Expand all | Expand 10 after
627 break; 627 break;
628 } 628 }
629 #else 629 #else
630 // TODO(yusukes): Support Ash on other platforms if needed. 630 // TODO(yusukes): Support Ash on other platforms if needed.
631 #endif 631 #endif
632 return rewritten; 632 return rewritten;
633 } 633 }
634 634
635 bool EventRewriter::RewriteExtendedKeys(ui::KeyEvent* event) { 635 bool EventRewriter::RewriteExtendedKeys(ui::KeyEvent* event) {
636 #if defined(OS_CHROMEOS) 636 #if defined(OS_CHROMEOS)
637 const bool search_as_function_key = 637 const bool keep_non_search_shortcuts =
638 CommandLine::ForCurrentProcess()->HasSwitch( 638 !CommandLine::ForCurrentProcess()->HasSwitch(
639 switches::kEnableChromebookFunctionKey); 639 switches::kDisableNonSearchExtendedKeyShortcuts);
640 640
641 XEvent* xev = event->native_event(); 641 XEvent* xev = event->native_event();
642 XKeyEvent* xkey = &(xev->xkey); 642 XKeyEvent* xkey = &(xev->xkey);
643 const KeySym keysym = XLookupKeysym(xkey, 0); 643 const KeySym keysym = XLookupKeysym(xkey, 0);
644 644
645 KeySym remapped_native_keysym = 0; 645 KeySym remapped_native_keysym = 0;
646 unsigned int remapped_native_mods = 0; 646 unsigned int remapped_native_mods = 0;
647 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; 647 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN;
648 unsigned int remapped_mods = 0; 648 unsigned int remapped_mods = 0;
649 649
650 if (!search_as_function_key) { 650 static const KeyboardRemapping remappings[] = {
651 { // Search+BackSpace -> Delete
652 XK_BackSpace,
653 0, Mod4Mask,
654 XK_Delete, ui::VKEY_DELETE,
655 },
656 { // Search+Left -> Home
657 XK_Left,
658 0, Mod4Mask,
659 XK_Home, ui::VKEY_HOME,
660 },
661 { // Search+Up -> Prior (aka PageUp)
662 XK_Up,
663 0, Mod4Mask,
664 XK_Prior, ui::VKEY_PRIOR,
665 },
666 { // Search+Right -> End
667 XK_Right,
668 0, Mod4Mask,
669 XK_End, ui::VKEY_END,
670 },
671 { // Search+Down -> Next (aka PageDown)
672 XK_Down,
673 0, Mod4Mask,
674 XK_Next, ui::VKEY_NEXT,
675 },
676 { // Search+Period -> Insert
677 XK_period,
678 0, Mod4Mask,
679 XK_Insert, ui::VKEY_INSERT,
680 }
681 };
682
683 RewriteWithKeyboardRemappingsByKeySym(remappings,
684 arraysize(remappings),
685 keysym,
686 xkey->state,
687 event->flags(),
688 &remapped_native_keysym,
689 &remapped_native_mods,
690 &remapped_keycode,
691 &remapped_mods);
692
693 if (keep_non_search_shortcuts && remapped_keycode == ui::VKEY_UNKNOWN) {
Yusuke Sato 2012/12/17 00:26:17 Do we really need the new chrome://flag? Our UX te
danakj 2012/12/17 02:05:14 Ok. The one downside is you have to choose between
651 static const KeyboardRemapping remappings[] = { 694 static const KeyboardRemapping remappings[] = {
652 { // Alt+BackSpace -> Delete 695 { // Alt+BackSpace -> Delete
653 XK_BackSpace, 696 XK_BackSpace,
654 ui::EF_ALT_DOWN, Mod1Mask, 697 ui::EF_ALT_DOWN, Mod1Mask,
655 XK_Delete, ui::VKEY_DELETE, 698 XK_Delete, ui::VKEY_DELETE,
656 }, 699 },
657 { // Control+Alt+Up -> Home 700 { // Control+Alt+Up -> Home
658 XK_Up, 701 XK_Up,
659 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, 702 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask,
660 XK_Home, ui::VKEY_HOME, 703 XK_Home, ui::VKEY_HOME,
(...skipping 17 matching lines...) Expand all
678 721
679 RewriteWithKeyboardRemappingsByKeySym(remappings, 722 RewriteWithKeyboardRemappingsByKeySym(remappings,
680 arraysize(remappings), 723 arraysize(remappings),
681 keysym, 724 keysym,
682 xkey->state, 725 xkey->state,
683 event->flags(), 726 event->flags(),
684 &remapped_native_keysym, 727 &remapped_native_keysym,
685 &remapped_native_mods, 728 &remapped_native_mods,
686 &remapped_keycode, 729 &remapped_keycode,
687 &remapped_mods); 730 &remapped_mods);
688 } else {
689 static const KeyboardRemapping remappings[] = {
690 { // Search+BackSpace -> Delete
691 XK_BackSpace,
692 0, Mod4Mask,
693 XK_Delete, ui::VKEY_DELETE,
694 },
695 { // Search+Left -> Home
696 XK_Left,
697 0, Mod4Mask,
698 XK_Home, ui::VKEY_HOME,
699 },
700 { // Search+Up -> Prior (aka PageUp)
701 XK_Up,
702 0, Mod4Mask,
703 XK_Prior, ui::VKEY_PRIOR,
704 },
705 { // Search+Right -> End
706 XK_Right,
707 0, Mod4Mask,
708 XK_End, ui::VKEY_END,
709 },
710 { // Search+Down -> Next (aka PageDown)
711 XK_Down,
712 0, Mod4Mask,
713 XK_Next, ui::VKEY_NEXT,
714 },
715 { // Search+Period -> Insert
716 XK_period,
717 0, Mod4Mask,
718 XK_Insert, ui::VKEY_INSERT,
719 }
720 };
721
722 RewriteWithKeyboardRemappingsByKeySym(remappings,
723 arraysize(remappings),
724 keysym,
725 xkey->state,
726 event->flags(),
727 &remapped_native_keysym,
728 &remapped_native_mods,
729 &remapped_keycode,
730 &remapped_mods);
731 } 731 }
732 732
733 if (!remapped_native_keysym || remapped_keycode == ui::VKEY_UNKNOWN) 733 if (remapped_keycode == ui::VKEY_UNKNOWN)
734 return false; 734 return false;
735 735
736 OverwriteEvent(event, 736 OverwriteEvent(event,
737 NativeKeySymToNativeKeycode(remapped_native_keysym), 737 NativeKeySymToNativeKeycode(remapped_native_keysym),
738 remapped_native_mods, 738 remapped_native_mods,
739 remapped_keycode, 739 remapped_keycode,
740 remapped_mods); 740 remapped_mods);
741 return true; 741 return true;
742 #else 742 #else
743 // TODO(yusukes): Support Ash on other platforms if needed. 743 // TODO(yusukes): Support Ash on other platforms if needed.
744 return false; 744 return false;
745 #endif 745 #endif
746 } 746 }
747 747
748 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { 748 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) {
749 #if defined(OS_CHROMEOS) 749 #if defined(OS_CHROMEOS)
750 const bool search_as_function_key =
751 CommandLine::ForCurrentProcess()->HasSwitch(
752 switches::kEnableChromebookFunctionKey);
753
754 XEvent* xev = event->native_event(); 750 XEvent* xev = event->native_event();
755 XKeyEvent* xkey = &(xev->xkey); 751 XKeyEvent* xkey = &(xev->xkey);
756 const KeySym keysym = XLookupKeysym(xkey, 0); 752 const KeySym keysym = XLookupKeysym(xkey, 0);
757 753
758 KeySym remapped_native_keysym = 0; 754 KeySym remapped_native_keysym = 0;
759 unsigned int remapped_native_mods = 0; 755 unsigned int remapped_native_mods = 0;
760 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; 756 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN;
761 unsigned int remapped_mods = 0; 757 unsigned int remapped_mods = 0;
762 758
763 bool remapped = false; 759 if (xkey->state & Mod4Mask) {
764
765 if (search_as_function_key && xkey->state & Mod4Mask) {
766 // Allow Search to avoid rewriting F1-F12. 760 // Allow Search to avoid rewriting F1-F12.
767 static const KeyboardRemapping kFkeysToFkeys[] = { 761 static const KeyboardRemapping kFkeysToFkeys[] = {
768 { XK_F1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, }, 762 { XK_F1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, },
769 { XK_F2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, }, 763 { XK_F2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, },
770 { XK_F3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, }, 764 { XK_F3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, },
771 { XK_F4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, }, 765 { XK_F4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, },
772 { XK_F5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, }, 766 { XK_F5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, },
773 { XK_F6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, }, 767 { XK_F6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, },
774 { XK_F7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, }, 768 { XK_F7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, },
775 { XK_F8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, }, 769 { XK_F8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, },
776 { XK_F9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, }, 770 { XK_F9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, },
777 { XK_F10, 0, Mod4Mask, XK_F10, ui::VKEY_F10, }, 771 { XK_F10, 0, Mod4Mask, XK_F10, ui::VKEY_F10, },
778 { XK_F11, 0, Mod4Mask, XK_F11, ui::VKEY_F11, }, 772 { XK_F11, 0, Mod4Mask, XK_F11, ui::VKEY_F11, },
779 { XK_F12, 0, Mod4Mask, XK_F12, ui::VKEY_F12, }, 773 { XK_F12, 0, Mod4Mask, XK_F12, ui::VKEY_F12, },
780 }; 774 };
781 775
782 remapped = 776 RewriteWithKeyboardRemappingsByKeySym(kFkeysToFkeys,
783 RewriteWithKeyboardRemappingsByKeySym(kFkeysToFkeys, 777 arraysize(kFkeysToFkeys),
784 arraysize(kFkeysToFkeys), 778 keysym,
785 keysym, 779 xkey->state,
786 xkey->state, 780 event->flags(),
787 event->flags(), 781 &remapped_native_keysym,
788 &remapped_native_keysym, 782 &remapped_native_mods,
789 &remapped_native_mods, 783 &remapped_keycode,
790 &remapped_keycode, 784 &remapped_mods);
791 &remapped_mods);
792 } 785 }
793 786
794 if (!remapped) { 787 if (remapped_keycode == ui::VKEY_UNKNOWN) {
795 // Rewrite the actual F1-F12 keys on a Chromebook keyboard to special keys. 788 // Rewrite the actual F1-F12 keys on a Chromebook keyboard to special keys.
796 static const KeyboardRemapping kFkeysToSpecialKeys[] = { 789 static const KeyboardRemapping kFkeysToSpecialKeys[] = {
797 { XK_F1, 0, 0, XF86XK_Back, ui::VKEY_BROWSER_BACK, }, 790 { XK_F1, 0, 0, XF86XK_Back, ui::VKEY_BROWSER_BACK, },
798 { XK_F2, 0, 0, XF86XK_Forward, ui::VKEY_BROWSER_FORWARD, }, 791 { XK_F2, 0, 0, XF86XK_Forward, ui::VKEY_BROWSER_FORWARD, },
799 { XK_F3, 0, 0, XF86XK_Reload, ui::VKEY_BROWSER_REFRESH, }, 792 { XK_F3, 0, 0, XF86XK_Reload, ui::VKEY_BROWSER_REFRESH, },
800 { XK_F4, 0, 0, XF86XK_LaunchB, ui::VKEY_MEDIA_LAUNCH_APP2, }, 793 { XK_F4, 0, 0, XF86XK_LaunchB, ui::VKEY_MEDIA_LAUNCH_APP2, },
801 { XK_F5, 0, 0, XF86XK_LaunchA, ui::VKEY_MEDIA_LAUNCH_APP1, }, 794 { XK_F5, 0, 0, XF86XK_LaunchA, ui::VKEY_MEDIA_LAUNCH_APP1, },
802 { XK_F6, 0, 0, XF86XK_MonBrightnessDown, ui::VKEY_BRIGHTNESS_DOWN, }, 795 { XK_F6, 0, 0, XF86XK_MonBrightnessDown, ui::VKEY_BRIGHTNESS_DOWN, },
803 { XK_F7, 0, 0, XF86XK_MonBrightnessUp, ui::VKEY_BRIGHTNESS_UP, }, 796 { XK_F7, 0, 0, XF86XK_MonBrightnessUp, ui::VKEY_BRIGHTNESS_UP, },
804 { XK_F8, 0, 0, XF86XK_AudioMute, ui::VKEY_VOLUME_MUTE, }, 797 { XK_F8, 0, 0, XF86XK_AudioMute, ui::VKEY_VOLUME_MUTE, },
805 { XK_F9, 0, 0, XF86XK_AudioLowerVolume, ui::VKEY_VOLUME_DOWN, }, 798 { XK_F9, 0, 0, XF86XK_AudioLowerVolume, ui::VKEY_VOLUME_DOWN, },
806 { XK_F10, 0, 0, XF86XK_AudioRaiseVolume, ui::VKEY_VOLUME_UP, }, 799 { XK_F10, 0, 0, XF86XK_AudioRaiseVolume, ui::VKEY_VOLUME_UP, },
807 }; 800 };
808 801
809 remapped = 802 RewriteWithKeyboardRemappingsByKeySym(kFkeysToSpecialKeys,
810 RewriteWithKeyboardRemappingsByKeySym(kFkeysToSpecialKeys, 803 arraysize(kFkeysToSpecialKeys),
811 arraysize(kFkeysToSpecialKeys), 804 keysym,
812 keysym, 805 xkey->state,
813 xkey->state, 806 event->flags(),
814 event->flags(), 807 &remapped_native_keysym,
815 &remapped_native_keysym, 808 &remapped_native_mods,
816 &remapped_native_mods, 809 &remapped_keycode,
817 &remapped_keycode, 810 &remapped_mods);
818 &remapped_mods);
819 } 811 }
820 812
821 if (!remapped) { 813 if (remapped_keycode == ui::VKEY_UNKNOWN && xkey->state & Mod4Mask) {
822 // When using Search as a Function key, remap Search+<number> to F<number>. 814 // Remap Search+<number> to F<number>.
823 if (search_as_function_key && xkey->state & Mod4Mask) { 815 // We check the keycode here instead of the keysym, as these keys have
824 // We check the keycode here instead of the keysym, as these keys have 816 // different keysyms when modifiers are pressed, such as shift.
825 // different keysyms when modifiers are pressed, such as shift.
826 817
827 // TODO(danakj): On some i18n keyboards, these choices will be bad and we 818 // TODO(danakj): On some i18n keyboards, these choices will be bad and we
828 // should make layout-specific choices here. For eg. on a french keyboard 819 // should make layout-specific choices here. For eg. on a french keyboard
829 // "-" and "6" are the same key, so F11 will not be accessible. 820 // "-" and "6" are the same key, so F11 will not be accessible.
830 static const KeyboardRemapping kNumberKeysToFkeys[] = { 821 static const KeyboardRemapping kNumberKeysToFkeys[] = {
831 { XK_1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, }, 822 { XK_1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, },
832 { XK_2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, }, 823 { XK_2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, },
833 { XK_3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, }, 824 { XK_3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, },
834 { XK_4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, }, 825 { XK_4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, },
835 { XK_5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, }, 826 { XK_5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, },
836 { XK_6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, }, 827 { XK_6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, },
837 { XK_7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, }, 828 { XK_7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, },
838 { XK_8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, }, 829 { XK_8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, },
839 { XK_9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, }, 830 { XK_9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, },
840 { XK_0, 0, Mod4Mask, XK_F10, ui::VKEY_F10, }, 831 { XK_0, 0, Mod4Mask, XK_F10, ui::VKEY_F10, },
841 { XK_minus, 0, Mod4Mask, XK_F11, ui::VKEY_F11, }, 832 { XK_minus, 0, Mod4Mask, XK_F11, ui::VKEY_F11, },
842 { XK_equal, 0, Mod4Mask, XK_F12, ui::VKEY_F12, } 833 { XK_equal, 0, Mod4Mask, XK_F12, ui::VKEY_F12, }
843 }; 834 };
844 835
845 RewriteWithKeyboardRemappingsByKeyCode(kNumberKeysToFkeys, 836 RewriteWithKeyboardRemappingsByKeyCode(kNumberKeysToFkeys,
846 arraysize(kNumberKeysToFkeys), 837 arraysize(kNumberKeysToFkeys),
847 xkey->keycode, 838 xkey->keycode,
848 xkey->state, 839 xkey->state,
849 event->flags(), 840 event->flags(),
850 &remapped_native_keysym, 841 &remapped_native_keysym,
851 &remapped_native_mods, 842 &remapped_native_mods,
852 &remapped_keycode, 843 &remapped_keycode,
853 &remapped_mods); 844 &remapped_mods);
854 }
855 } 845 }
856 846
857 if (!remapped_native_keysym || remapped_keycode == ui::VKEY_UNKNOWN) 847 if (remapped_keycode == ui::VKEY_UNKNOWN)
858 return false; 848 return false;
859 849
860 OverwriteEvent(event, 850 OverwriteEvent(event,
861 NativeKeySymToNativeKeycode(remapped_native_keysym), 851 NativeKeySymToNativeKeycode(remapped_native_keysym),
862 remapped_native_mods, 852 remapped_native_mods,
863 remapped_keycode, 853 remapped_keycode,
864 remapped_mods); 854 remapped_mods);
865 return true; 855 return true;
866 #else 856 #else
867 // TODO(danakj): Support Ash on other platforms if needed. 857 // TODO(danakj): Support Ash on other platforms if needed.
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 const DeviceType type = EventRewriter::GetDeviceType(device_name); 927 const DeviceType type = EventRewriter::GetDeviceType(device_name);
938 if (type == kDeviceAppleKeyboard) { 928 if (type == kDeviceAppleKeyboard) {
939 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " 929 VLOG(1) << "Apple keyboard '" << device_name << "' connected: "
940 << "id=" << device_id; 930 << "id=" << device_id;
941 } 931 }
942 // Always overwrite the existing device_id since the X server may reuse a 932 // Always overwrite the existing device_id since the X server may reuse a
943 // device id for an unattached device. 933 // device id for an unattached device.
944 device_id_to_type_[device_id] = type; 934 device_id_to_type_[device_id] = type;
945 return type; 935 return type;
946 } 936 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698