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 616 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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 Loading... | |
| 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 Loading... | |
| 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 } |
| OLD | NEW |