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 285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 296 const KeyboardRemapping& map = remappings[i]; | 296 const KeyboardRemapping& map = remappings[i]; |
| 297 | 297 |
| 298 if (keysym != map.input_keysym) | 298 if (keysym != map.input_keysym) |
| 299 continue; | 299 continue; |
| 300 unsigned int matched_mods = native_mods & map.input_native_mods; | 300 unsigned int matched_mods = native_mods & map.input_native_mods; |
| 301 if (matched_mods != map.input_native_mods) | 301 if (matched_mods != map.input_native_mods) |
| 302 continue; | 302 continue; |
| 303 | 303 |
| 304 *remapped_native_keysym = map.output_keysym; | 304 *remapped_native_keysym = map.output_keysym; |
| 305 *remapped_keycode = map.output_keycode; | 305 *remapped_keycode = map.output_keycode; |
| 306 *remapped_native_mods = native_mods & ~map.input_native_mods; | 306 *remapped_native_mods = (native_mods & ~map.input_native_mods) | |
| 307 *remapped_mods = mods & ~map.input_mods; | 307 map.output_native_mods; |
| 308 *remapped_mods = (mods & ~map.input_mods) | map.output_mods; | |
| 308 return true; | 309 return true; |
| 309 } | 310 } |
| 310 | 311 |
| 311 return false; | 312 return false; |
| 312 } | 313 } |
| 313 | 314 |
| 314 bool EventRewriter::RewriteWithKeyboardRemappingsByKeyCode( | 315 bool EventRewriter::RewriteWithKeyboardRemappingsByKeyCode( |
| 315 const KeyboardRemapping* remappings, | 316 const KeyboardRemapping* remappings, |
| 316 size_t num_remappings, | 317 size_t num_remappings, |
| 317 KeyCode keycode, | 318 KeyCode keycode, |
| 318 unsigned int native_mods, | 319 unsigned int native_mods, |
| 319 unsigned int mods, | 320 unsigned int mods, |
| 320 KeySym* remapped_native_keysym, | 321 KeySym* remapped_native_keysym, |
| 321 unsigned int* remapped_native_mods, | 322 unsigned int* remapped_native_mods, |
| 322 ui::KeyboardCode* remapped_keycode, | 323 ui::KeyboardCode* remapped_keycode, |
| 323 unsigned int* remapped_mods) { | 324 unsigned int* remapped_mods) { |
| 324 for (size_t i = 0; i < num_remappings; ++i) { | 325 for (size_t i = 0; i < num_remappings; ++i) { |
| 325 const KeyboardRemapping& map = remappings[i]; | 326 const KeyboardRemapping& map = remappings[i]; |
| 326 | 327 |
| 327 KeyCode input_keycode = NativeKeySymToNativeKeycode(map.input_keysym); | 328 KeyCode input_keycode = NativeKeySymToNativeKeycode(map.input_keysym); |
| 328 if (keycode != input_keycode) | 329 if (keycode != input_keycode) |
| 329 continue; | 330 continue; |
| 330 unsigned int matched_mods = native_mods & map.input_native_mods; | 331 unsigned int matched_mods = native_mods & map.input_native_mods; |
| 331 if (matched_mods != map.input_native_mods) | 332 if (matched_mods != map.input_native_mods) |
| 332 continue; | 333 continue; |
| 333 | 334 |
| 334 *remapped_native_keysym = map.output_keysym; | 335 *remapped_native_keysym = map.output_keysym; |
| 335 *remapped_keycode = map.output_keycode; | 336 *remapped_keycode = map.output_keycode; |
| 336 *remapped_native_mods = native_mods & ~map.input_native_mods; | 337 *remapped_native_mods = (native_mods & ~map.input_native_mods) | |
| 337 *remapped_mods = mods & ~map.input_mods; | 338 map.output_native_mods; |
| 339 *remapped_mods = (mods & ~map.input_mods) | map.output_mods; | |
| 338 return true; | 340 return true; |
| 339 } | 341 } |
| 340 | 342 |
| 341 return false; | 343 return false; |
| 342 } | 344 } |
| 343 #endif | 345 #endif |
| 344 | 346 |
| 345 void EventRewriter::Rewrite(ui::KeyEvent* event) { | 347 void EventRewriter::Rewrite(ui::KeyEvent* event) { |
| 346 #if defined(OS_CHROMEOS) | 348 #if defined(OS_CHROMEOS) |
| 347 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See | 349 // Do not rewrite an event sent by ui_controls::SendKeyPress(). See |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 627 break; | 629 break; |
| 628 } | 630 } |
| 629 #else | 631 #else |
| 630 // TODO(yusukes): Support Ash on other platforms if needed. | 632 // TODO(yusukes): Support Ash on other platforms if needed. |
| 631 #endif | 633 #endif |
| 632 return rewritten; | 634 return rewritten; |
| 633 } | 635 } |
| 634 | 636 |
| 635 bool EventRewriter::RewriteExtendedKeys(ui::KeyEvent* event) { | 637 bool EventRewriter::RewriteExtendedKeys(ui::KeyEvent* event) { |
| 636 #if defined(OS_CHROMEOS) | 638 #if defined(OS_CHROMEOS) |
| 637 const bool search_as_function_key = | |
| 638 CommandLine::ForCurrentProcess()->HasSwitch( | |
| 639 switches::kEnableChromebookFunctionKey); | |
| 640 | |
| 641 XEvent* xev = event->native_event(); | 639 XEvent* xev = event->native_event(); |
| 642 XKeyEvent* xkey = &(xev->xkey); | 640 XKeyEvent* xkey = &(xev->xkey); |
| 643 const KeySym keysym = XLookupKeysym(xkey, 0); | 641 const KeySym keysym = XLookupKeysym(xkey, 0); |
| 644 | 642 |
| 645 KeySym remapped_native_keysym = 0; | 643 KeySym remapped_native_keysym = 0; |
| 646 unsigned int remapped_native_mods = 0; | 644 unsigned int remapped_native_mods = 0; |
| 647 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; | 645 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; |
| 648 unsigned int remapped_mods = 0; | 646 unsigned int remapped_mods = 0; |
| 649 | 647 |
| 650 if (!search_as_function_key) { | 648 if (xkey->state & Mod4Mask) { |
| 651 static const KeyboardRemapping remappings[] = { | 649 // Allow Search to avoid rewriting extended keys. |
| 652 { // Alt+BackSpace -> Delete | 650 static const KeyboardRemapping kAvoidRemappings[] = { |
| 651 { // Alt+Backspace | |
| 653 XK_BackSpace, | 652 XK_BackSpace, |
| 653 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, | |
| 654 XK_BackSpace, ui::VKEY_BACK, | |
| 654 ui::EF_ALT_DOWN, Mod1Mask, | 655 ui::EF_ALT_DOWN, Mod1Mask, |
| 655 XK_Delete, ui::VKEY_DELETE, | |
| 656 }, | 656 }, |
| 657 { // Control+Alt+Up -> Home | 657 { // Control+Alt+Up |
| 658 XK_Up, | 658 XK_Up, |
| 659 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, | |
| 660 Mod1Mask | ControlMask | Mod4Mask, | |
|
Daniel Erat
2012/12/17 20:32:02
It doesn't need to happen in this change, but it w
danakj
2012/12/17 20:33:47
That could be useful, yeah. I'll keep it out of th
| |
| 661 XK_Up, ui::VKEY_UP, | |
| 659 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | 662 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
| 660 XK_Home, ui::VKEY_HOME, | |
| 661 }, | 663 }, |
| 662 { // Alt+Up -> Prior (aka PageUp) | 664 { // Alt+Up |
| 663 XK_Up, | 665 XK_Up, |
| 666 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, | |
| 667 XK_Up, ui::VKEY_UP, | |
| 664 ui::EF_ALT_DOWN, Mod1Mask, | 668 ui::EF_ALT_DOWN, Mod1Mask, |
| 665 XK_Prior, ui::VKEY_PRIOR, | |
| 666 }, | 669 }, |
| 667 { // Control+Alt+Down -> End | 670 { // Control+Alt+Down |
| 668 XK_Down, | 671 XK_Down, |
| 672 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, | |
| 673 Mod1Mask | ControlMask | Mod4Mask, | |
| 674 XK_Down, ui::VKEY_DOWN, | |
| 669 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | 675 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, |
| 670 XK_End, ui::VKEY_END, | |
| 671 }, | 676 }, |
| 672 { // Alt+Down -> Next (aka PageDown) | 677 { // Alt+Down |
| 673 XK_Down, | 678 XK_Down, |
| 679 ui::EF_ALT_DOWN, Mod1Mask | Mod4Mask, | |
| 680 XK_Down, ui::VKEY_DOWN, | |
| 674 ui::EF_ALT_DOWN, Mod1Mask, | 681 ui::EF_ALT_DOWN, Mod1Mask, |
| 675 XK_Next, ui::VKEY_NEXT, | |
| 676 } | 682 } |
| 677 }; | 683 }; |
| 678 | 684 |
| 679 RewriteWithKeyboardRemappingsByKeySym(remappings, | 685 RewriteWithKeyboardRemappingsByKeySym(kAvoidRemappings, |
| 680 arraysize(remappings), | 686 arraysize(kAvoidRemappings), |
| 681 keysym, | 687 keysym, |
| 682 xkey->state, | 688 xkey->state, |
| 683 event->flags(), | 689 event->flags(), |
| 684 &remapped_native_keysym, | 690 &remapped_native_keysym, |
| 685 &remapped_native_mods, | 691 &remapped_native_mods, |
| 686 &remapped_keycode, | 692 &remapped_keycode, |
| 687 &remapped_mods); | 693 &remapped_mods); |
| 688 } else { | 694 } |
| 689 static const KeyboardRemapping remappings[] = { | 695 |
| 696 if (remapped_keycode == ui::VKEY_UNKNOWN) { | |
| 697 static const KeyboardRemapping kSearchRemappings[] = { | |
| 690 { // Search+BackSpace -> Delete | 698 { // Search+BackSpace -> Delete |
| 691 XK_BackSpace, | 699 XK_BackSpace, |
| 692 0, Mod4Mask, | 700 0, Mod4Mask, |
| 693 XK_Delete, ui::VKEY_DELETE, | 701 XK_Delete, ui::VKEY_DELETE, |
| 702 0, 0 | |
| 694 }, | 703 }, |
| 695 { // Search+Left -> Home | 704 { // Search+Left -> Home |
| 696 XK_Left, | 705 XK_Left, |
| 697 0, Mod4Mask, | 706 0, Mod4Mask, |
| 698 XK_Home, ui::VKEY_HOME, | 707 XK_Home, ui::VKEY_HOME, |
| 708 0, 0 | |
| 699 }, | 709 }, |
| 700 { // Search+Up -> Prior (aka PageUp) | 710 { // Search+Up -> Prior (aka PageUp) |
| 701 XK_Up, | 711 XK_Up, |
| 702 0, Mod4Mask, | 712 0, Mod4Mask, |
| 703 XK_Prior, ui::VKEY_PRIOR, | 713 XK_Prior, ui::VKEY_PRIOR, |
| 714 0, 0 | |
| 704 }, | 715 }, |
| 705 { // Search+Right -> End | 716 { // Search+Right -> End |
| 706 XK_Right, | 717 XK_Right, |
| 707 0, Mod4Mask, | 718 0, Mod4Mask, |
| 708 XK_End, ui::VKEY_END, | 719 XK_End, ui::VKEY_END, |
| 720 0, 0 | |
| 709 }, | 721 }, |
| 710 { // Search+Down -> Next (aka PageDown) | 722 { // Search+Down -> Next (aka PageDown) |
| 711 XK_Down, | 723 XK_Down, |
| 712 0, Mod4Mask, | 724 0, Mod4Mask, |
| 713 XK_Next, ui::VKEY_NEXT, | 725 XK_Next, ui::VKEY_NEXT, |
| 726 0, 0 | |
| 714 }, | 727 }, |
| 715 { // Search+Period -> Insert | 728 { // Search+Period -> Insert |
| 716 XK_period, | 729 XK_period, |
| 717 0, Mod4Mask, | 730 0, Mod4Mask, |
| 718 XK_Insert, ui::VKEY_INSERT, | 731 XK_Insert, ui::VKEY_INSERT, |
| 732 0, 0 | |
| 719 } | 733 } |
| 720 }; | 734 }; |
| 721 | 735 |
| 722 RewriteWithKeyboardRemappingsByKeySym(remappings, | 736 RewriteWithKeyboardRemappingsByKeySym(kSearchRemappings, |
| 723 arraysize(remappings), | 737 arraysize(kSearchRemappings), |
| 724 keysym, | 738 keysym, |
| 725 xkey->state, | 739 xkey->state, |
| 726 event->flags(), | 740 event->flags(), |
| 741 &remapped_native_keysym, | |
| 742 &remapped_native_mods, | |
| 743 &remapped_keycode, | |
| 744 &remapped_mods); | |
| 745 } | |
| 746 | |
| 747 if (remapped_keycode == ui::VKEY_UNKNOWN) { | |
| 748 static const KeyboardRemapping kNonSearchRemappings[] = { | |
| 749 { // Alt+BackSpace -> Delete | |
| 750 XK_BackSpace, | |
| 751 ui::EF_ALT_DOWN, Mod1Mask, | |
| 752 XK_Delete, ui::VKEY_DELETE, | |
| 753 0, 0 | |
| 754 }, | |
| 755 { // Control+Alt+Up -> Home | |
| 756 XK_Up, | |
| 757 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | |
| 758 XK_Home, ui::VKEY_HOME, | |
| 759 0, 0 | |
| 760 }, | |
| 761 { // Alt+Up -> Prior (aka PageUp) | |
| 762 XK_Up, | |
| 763 ui::EF_ALT_DOWN, Mod1Mask, | |
| 764 XK_Prior, ui::VKEY_PRIOR, | |
| 765 0, 0 | |
| 766 }, | |
| 767 { // Control+Alt+Down -> End | |
| 768 XK_Down, | |
| 769 ui::EF_ALT_DOWN | ui::EF_CONTROL_DOWN, Mod1Mask | ControlMask, | |
| 770 XK_End, ui::VKEY_END, | |
| 771 0, 0 | |
| 772 }, | |
| 773 { // Alt+Down -> Next (aka PageDown) | |
| 774 XK_Down, | |
| 775 ui::EF_ALT_DOWN, Mod1Mask, | |
| 776 XK_Next, ui::VKEY_NEXT, | |
| 777 0, 0 | |
| 778 } | |
| 779 }; | |
| 780 | |
| 781 RewriteWithKeyboardRemappingsByKeySym(kNonSearchRemappings, | |
| 782 arraysize(kNonSearchRemappings), | |
| 783 keysym, | |
| 784 xkey->state, | |
| 785 event->flags(), | |
| 727 &remapped_native_keysym, | 786 &remapped_native_keysym, |
| 728 &remapped_native_mods, | 787 &remapped_native_mods, |
| 729 &remapped_keycode, | 788 &remapped_keycode, |
| 730 &remapped_mods); | 789 &remapped_mods); |
| 731 } | 790 } |
| 732 | 791 |
| 733 if (!remapped_native_keysym || remapped_keycode == ui::VKEY_UNKNOWN) | 792 if (remapped_keycode == ui::VKEY_UNKNOWN) |
| 734 return false; | 793 return false; |
| 735 | 794 |
| 736 OverwriteEvent(event, | 795 OverwriteEvent(event, |
| 737 NativeKeySymToNativeKeycode(remapped_native_keysym), | 796 NativeKeySymToNativeKeycode(remapped_native_keysym), |
| 738 remapped_native_mods, | 797 remapped_native_mods, |
| 739 remapped_keycode, | 798 remapped_keycode, |
| 740 remapped_mods); | 799 remapped_mods); |
| 741 return true; | 800 return true; |
| 742 #else | 801 #else |
| 743 // TODO(yusukes): Support Ash on other platforms if needed. | 802 // TODO(yusukes): Support Ash on other platforms if needed. |
| 744 return false; | 803 return false; |
| 745 #endif | 804 #endif |
| 746 } | 805 } |
| 747 | 806 |
| 748 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { | 807 bool EventRewriter::RewriteFunctionKeys(ui::KeyEvent* event) { |
| 749 #if defined(OS_CHROMEOS) | 808 #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(); | 809 XEvent* xev = event->native_event(); |
| 755 XKeyEvent* xkey = &(xev->xkey); | 810 XKeyEvent* xkey = &(xev->xkey); |
| 756 const KeySym keysym = XLookupKeysym(xkey, 0); | 811 const KeySym keysym = XLookupKeysym(xkey, 0); |
| 757 | 812 |
| 758 KeySym remapped_native_keysym = 0; | 813 KeySym remapped_native_keysym = 0; |
| 759 unsigned int remapped_native_mods = 0; | 814 unsigned int remapped_native_mods = 0; |
| 760 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; | 815 ui::KeyboardCode remapped_keycode = ui::VKEY_UNKNOWN; |
| 761 unsigned int remapped_mods = 0; | 816 unsigned int remapped_mods = 0; |
| 762 | 817 |
| 763 bool remapped = false; | 818 if (xkey->state & Mod4Mask) { |
| 764 | |
| 765 if (search_as_function_key && xkey->state & Mod4Mask) { | |
| 766 // Allow Search to avoid rewriting F1-F12. | 819 // Allow Search to avoid rewriting F1-F12. |
| 767 static const KeyboardRemapping kFkeysToFkeys[] = { | 820 static const KeyboardRemapping kFkeysToFkeys[] = { |
| 768 { XK_F1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, }, | 821 { XK_F1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, }, |
| 769 { XK_F2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, }, | 822 { XK_F2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, }, |
| 770 { XK_F3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, }, | 823 { XK_F3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, }, |
| 771 { XK_F4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, }, | 824 { XK_F4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, }, |
| 772 { XK_F5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, }, | 825 { XK_F5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, }, |
| 773 { XK_F6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, }, | 826 { XK_F6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, }, |
| 774 { XK_F7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, }, | 827 { XK_F7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, }, |
| 775 { XK_F8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, }, | 828 { XK_F8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, }, |
| 776 { XK_F9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, }, | 829 { XK_F9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, }, |
| 777 { XK_F10, 0, Mod4Mask, XK_F10, ui::VKEY_F10, }, | 830 { XK_F10, 0, Mod4Mask, XK_F10, ui::VKEY_F10, }, |
| 778 { XK_F11, 0, Mod4Mask, XK_F11, ui::VKEY_F11, }, | 831 { XK_F11, 0, Mod4Mask, XK_F11, ui::VKEY_F11, }, |
| 779 { XK_F12, 0, Mod4Mask, XK_F12, ui::VKEY_F12, }, | 832 { XK_F12, 0, Mod4Mask, XK_F12, ui::VKEY_F12, }, |
| 780 }; | 833 }; |
| 781 | 834 |
| 782 remapped = | 835 RewriteWithKeyboardRemappingsByKeySym(kFkeysToFkeys, |
| 783 RewriteWithKeyboardRemappingsByKeySym(kFkeysToFkeys, | 836 arraysize(kFkeysToFkeys), |
| 784 arraysize(kFkeysToFkeys), | 837 keysym, |
| 785 keysym, | 838 xkey->state, |
| 786 xkey->state, | 839 event->flags(), |
| 787 event->flags(), | 840 &remapped_native_keysym, |
| 788 &remapped_native_keysym, | 841 &remapped_native_mods, |
| 789 &remapped_native_mods, | 842 &remapped_keycode, |
| 790 &remapped_keycode, | 843 &remapped_mods); |
| 791 &remapped_mods); | |
| 792 } | 844 } |
| 793 | 845 |
| 794 if (!remapped) { | 846 if (remapped_keycode == ui::VKEY_UNKNOWN) { |
| 795 // Rewrite the actual F1-F12 keys on a Chromebook keyboard to special keys. | 847 // Rewrite the actual F1-F12 keys on a Chromebook keyboard to special keys. |
| 796 static const KeyboardRemapping kFkeysToSpecialKeys[] = { | 848 static const KeyboardRemapping kFkeysToSpecialKeys[] = { |
| 797 { XK_F1, 0, 0, XF86XK_Back, ui::VKEY_BROWSER_BACK, }, | 849 { XK_F1, 0, 0, XF86XK_Back, ui::VKEY_BROWSER_BACK, 0, 0 }, |
| 798 { XK_F2, 0, 0, XF86XK_Forward, ui::VKEY_BROWSER_FORWARD, }, | 850 { XK_F2, 0, 0, XF86XK_Forward, ui::VKEY_BROWSER_FORWARD, 0, 0 }, |
| 799 { XK_F3, 0, 0, XF86XK_Reload, ui::VKEY_BROWSER_REFRESH, }, | 851 { XK_F3, 0, 0, XF86XK_Reload, ui::VKEY_BROWSER_REFRESH, 0, 0 }, |
| 800 { XK_F4, 0, 0, XF86XK_LaunchB, ui::VKEY_MEDIA_LAUNCH_APP2, }, | 852 { XK_F4, 0, 0, XF86XK_LaunchB, ui::VKEY_MEDIA_LAUNCH_APP2, 0, 0 }, |
| 801 { XK_F5, 0, 0, XF86XK_LaunchA, ui::VKEY_MEDIA_LAUNCH_APP1, }, | 853 { XK_F5, 0, 0, XF86XK_LaunchA, ui::VKEY_MEDIA_LAUNCH_APP1, 0, 0 }, |
| 802 { XK_F6, 0, 0, XF86XK_MonBrightnessDown, ui::VKEY_BRIGHTNESS_DOWN, }, | 854 { XK_F6, 0, 0, XF86XK_MonBrightnessDown, ui::VKEY_BRIGHTNESS_DOWN, 0, 0 }, |
| 803 { XK_F7, 0, 0, XF86XK_MonBrightnessUp, ui::VKEY_BRIGHTNESS_UP, }, | 855 { XK_F7, 0, 0, XF86XK_MonBrightnessUp, ui::VKEY_BRIGHTNESS_UP, 0, 0 }, |
| 804 { XK_F8, 0, 0, XF86XK_AudioMute, ui::VKEY_VOLUME_MUTE, }, | 856 { XK_F8, 0, 0, XF86XK_AudioMute, ui::VKEY_VOLUME_MUTE, 0, 0 }, |
| 805 { XK_F9, 0, 0, XF86XK_AudioLowerVolume, ui::VKEY_VOLUME_DOWN, }, | 857 { XK_F9, 0, 0, XF86XK_AudioLowerVolume, ui::VKEY_VOLUME_DOWN, 0, 0 }, |
| 806 { XK_F10, 0, 0, XF86XK_AudioRaiseVolume, ui::VKEY_VOLUME_UP, }, | 858 { XK_F10, 0, 0, XF86XK_AudioRaiseVolume, ui::VKEY_VOLUME_UP, 0, 0 }, |
| 807 }; | 859 }; |
| 808 | 860 |
| 809 remapped = | 861 RewriteWithKeyboardRemappingsByKeySym(kFkeysToSpecialKeys, |
| 810 RewriteWithKeyboardRemappingsByKeySym(kFkeysToSpecialKeys, | 862 arraysize(kFkeysToSpecialKeys), |
| 811 arraysize(kFkeysToSpecialKeys), | 863 keysym, |
| 812 keysym, | 864 xkey->state, |
| 813 xkey->state, | 865 event->flags(), |
| 814 event->flags(), | 866 &remapped_native_keysym, |
| 815 &remapped_native_keysym, | 867 &remapped_native_mods, |
| 816 &remapped_native_mods, | 868 &remapped_keycode, |
| 817 &remapped_keycode, | 869 &remapped_mods); |
| 818 &remapped_mods); | |
| 819 } | 870 } |
| 820 | 871 |
| 821 if (!remapped) { | 872 if (remapped_keycode == ui::VKEY_UNKNOWN && xkey->state & Mod4Mask) { |
| 822 // When using Search as a Function key, remap Search+<number> to F<number>. | 873 // Remap Search+<number> to F<number>. |
| 823 if (search_as_function_key && xkey->state & Mod4Mask) { | 874 // 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 | 875 // different keysyms when modifiers are pressed, such as shift. |
| 825 // different keysyms when modifiers are pressed, such as shift. | |
| 826 | 876 |
| 827 // TODO(danakj): On some i18n keyboards, these choices will be bad and we | 877 // 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 | 878 // 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. | 879 // "-" and "6" are the same key, so F11 will not be accessible. |
| 830 static const KeyboardRemapping kNumberKeysToFkeys[] = { | 880 static const KeyboardRemapping kNumberKeysToFkeys[] = { |
| 831 { XK_1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, }, | 881 { XK_1, 0, Mod4Mask, XK_F1, ui::VKEY_F1, 0, 0 }, |
| 832 { XK_2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, }, | 882 { XK_2, 0, Mod4Mask, XK_F2, ui::VKEY_F2, 0, 0 }, |
| 833 { XK_3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, }, | 883 { XK_3, 0, Mod4Mask, XK_F3, ui::VKEY_F3, 0, 0 }, |
| 834 { XK_4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, }, | 884 { XK_4, 0, Mod4Mask, XK_F4, ui::VKEY_F4, 0, 0 }, |
| 835 { XK_5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, }, | 885 { XK_5, 0, Mod4Mask, XK_F5, ui::VKEY_F5, 0, 0 }, |
| 836 { XK_6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, }, | 886 { XK_6, 0, Mod4Mask, XK_F6, ui::VKEY_F6, 0, 0 }, |
| 837 { XK_7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, }, | 887 { XK_7, 0, Mod4Mask, XK_F7, ui::VKEY_F7, 0, 0 }, |
| 838 { XK_8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, }, | 888 { XK_8, 0, Mod4Mask, XK_F8, ui::VKEY_F8, 0, 0 }, |
| 839 { XK_9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, }, | 889 { XK_9, 0, Mod4Mask, XK_F9, ui::VKEY_F9, 0, 0 }, |
| 840 { XK_0, 0, Mod4Mask, XK_F10, ui::VKEY_F10, }, | 890 { XK_0, 0, Mod4Mask, XK_F10, ui::VKEY_F10, 0, 0 }, |
| 841 { XK_minus, 0, Mod4Mask, XK_F11, ui::VKEY_F11, }, | 891 { XK_minus, 0, Mod4Mask, XK_F11, ui::VKEY_F11, 0, 0 }, |
| 842 { XK_equal, 0, Mod4Mask, XK_F12, ui::VKEY_F12, } | 892 { XK_equal, 0, Mod4Mask, XK_F12, ui::VKEY_F12, 0, 0 } |
| 843 }; | 893 }; |
| 844 | 894 |
| 845 RewriteWithKeyboardRemappingsByKeyCode(kNumberKeysToFkeys, | 895 RewriteWithKeyboardRemappingsByKeyCode(kNumberKeysToFkeys, |
| 846 arraysize(kNumberKeysToFkeys), | 896 arraysize(kNumberKeysToFkeys), |
| 847 xkey->keycode, | 897 xkey->keycode, |
| 848 xkey->state, | 898 xkey->state, |
| 849 event->flags(), | 899 event->flags(), |
| 850 &remapped_native_keysym, | 900 &remapped_native_keysym, |
| 851 &remapped_native_mods, | 901 &remapped_native_mods, |
| 852 &remapped_keycode, | 902 &remapped_keycode, |
| 853 &remapped_mods); | 903 &remapped_mods); |
| 854 } | |
| 855 } | 904 } |
| 856 | 905 |
| 857 if (!remapped_native_keysym || remapped_keycode == ui::VKEY_UNKNOWN) | 906 if (remapped_keycode == ui::VKEY_UNKNOWN) |
| 858 return false; | 907 return false; |
| 859 | 908 |
| 860 OverwriteEvent(event, | 909 OverwriteEvent(event, |
| 861 NativeKeySymToNativeKeycode(remapped_native_keysym), | 910 NativeKeySymToNativeKeycode(remapped_native_keysym), |
| 862 remapped_native_mods, | 911 remapped_native_mods, |
| 863 remapped_keycode, | 912 remapped_keycode, |
| 864 remapped_mods); | 913 remapped_mods); |
| 865 return true; | 914 return true; |
| 866 #else | 915 #else |
| 867 // TODO(danakj): Support Ash on other platforms if needed. | 916 // TODO(danakj): Support Ash on other platforms if needed. |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 937 const DeviceType type = EventRewriter::GetDeviceType(device_name); | 986 const DeviceType type = EventRewriter::GetDeviceType(device_name); |
| 938 if (type == kDeviceAppleKeyboard) { | 987 if (type == kDeviceAppleKeyboard) { |
| 939 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " | 988 VLOG(1) << "Apple keyboard '" << device_name << "' connected: " |
| 940 << "id=" << device_id; | 989 << "id=" << device_id; |
| 941 } | 990 } |
| 942 // Always overwrite the existing device_id since the X server may reuse a | 991 // Always overwrite the existing device_id since the X server may reuse a |
| 943 // device id for an unattached device. | 992 // device id for an unattached device. |
| 944 device_id_to_type_[device_id] = type; | 993 device_id_to_type_[device_id] = type; |
| 945 return type; | 994 return type; |
| 946 } | 995 } |
| OLD | NEW |