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 "ui/events/event.h" | 5 #include "ui/events/event.h" |
6 | 6 |
7 #if defined(USE_X11) | 7 #if defined(USE_X11) |
8 #include <X11/extensions/XInput2.h> | 8 #include <X11/extensions/XInput2.h> |
9 #include <X11/keysym.h> | 9 #include <X11/keysym.h> |
10 #include <X11/Xlib.h> | 10 #include <X11/Xlib.h> |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
690 if (is_char_) | 690 if (is_char_) |
691 character_ = native_event.wParam; | 691 character_ = native_event.wParam; |
692 #endif | 692 #endif |
693 } | 693 } |
694 | 694 |
695 KeyEvent::KeyEvent(EventType type, | 695 KeyEvent::KeyEvent(EventType type, |
696 KeyboardCode key_code, | 696 KeyboardCode key_code, |
697 int flags) | 697 int flags) |
698 : Event(type, EventTimeForNow(), flags), | 698 : Event(type, EventTimeForNow(), flags), |
699 key_code_(key_code), | 699 key_code_(key_code), |
700 code_(DomCode::NONE), | 700 code_(UsLayoutKeyboardCodeToDomCode(key_code)), |
701 is_char_(false), | 701 is_char_(false), |
702 platform_keycode_(0), | 702 platform_keycode_(0), |
703 key_(DomKey::NONE), | 703 key_(DomKey::NONE), |
704 character_() { | 704 character_() { |
705 } | 705 } |
706 | 706 |
707 KeyEvent::KeyEvent(EventType type, | 707 KeyEvent::KeyEvent(EventType type, |
708 KeyboardCode key_code, | 708 KeyboardCode key_code, |
709 DomCode code, | 709 DomCode code, |
710 int flags) | 710 int flags) |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
779 | 779 |
780 void KeyEvent::ApplyLayout() const { | 780 void KeyEvent::ApplyLayout() const { |
781 // If the client has set the character (e.g. faked key events from virtual | 781 // If the client has set the character (e.g. faked key events from virtual |
782 // keyboard), it's client's responsibility to set the dom key correctly. | 782 // keyboard), it's client's responsibility to set the dom key correctly. |
783 // Otherwise, set the dom key as unidentified. | 783 // Otherwise, set the dom key as unidentified. |
784 // Please refer to crbug.com/443889. | 784 // Please refer to crbug.com/443889. |
785 if (character_ != 0) { | 785 if (character_ != 0) { |
786 key_ = DomKey::UNIDENTIFIED; | 786 key_ = DomKey::UNIDENTIFIED; |
787 return; | 787 return; |
788 } | 788 } |
| 789 ui::DomCode code = code_; |
| 790 if (code == DomCode::NONE) { |
| 791 // Catch old code that tries to do layout without a physical key, and try |
| 792 // to recover using the KeyboardCode. Once key events are fully defined |
| 793 // on construction (see TODO in event.h) this will go away. |
| 794 LOG(WARNING) << "DomCode::NONE keycode=" << key_code_; |
| 795 code = UsLayoutKeyboardCodeToDomCode(key_code_); |
| 796 if (code == DomCode::NONE) { |
| 797 key_ = DomKey::UNIDENTIFIED; |
| 798 return; |
| 799 } |
| 800 } |
| 801 KeyboardCode dummy_key_code; |
789 #if defined(OS_WIN) | 802 #if defined(OS_WIN) |
790 // Native Windows character events always have is_char_ == true, | 803 // Native Windows character events always have is_char_ == true, |
791 // so this is a synthetic or native keystroke event. | 804 // so this is a synthetic or native keystroke event. |
792 // Therefore, perform only the fallback action. | 805 // Therefore, perform only the fallback action. |
793 GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); | |
794 #elif defined(USE_X11) | 806 #elif defined(USE_X11) |
795 // When a control key is held, prefer ASCII characters to non ASCII | 807 // When a control key is held, prefer ASCII characters to non ASCII |
796 // characters in order to use it for shortcut keys. GetCharacterFromKeyCode | 808 // characters in order to use it for shortcut keys. GetCharacterFromKeyCode |
797 // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. | 809 // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. |
798 // GetCharacterFromXEvent returns 'à' in that case. | 810 // GetCharacterFromXEvent returns 'à' in that case. |
799 character_ = (IsControlDown() || !native_event()) ? | 811 if (!IsControlDown() && native_event()) { |
800 GetCharacterFromKeyCode(key_code_, flags()) : | 812 character_ = GetCharacterFromXEvent(native_event()); |
801 GetCharacterFromXEvent(native_event()); | 813 // TODO(kpschoedel): set key_ field for X11. |
802 // TODO(kpschoedel): set key_ field for X11. | 814 return; |
| 815 } |
803 #elif defined(USE_OZONE) | 816 #elif defined(USE_OZONE) |
804 KeyboardCode key_code; | 817 if (KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup( |
805 if (!KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup( | 818 code, flags(), &key_, &character_, &dummy_key_code, |
806 code_, flags(), &key_, &character_, &key_code, &platform_keycode_)) { | 819 &platform_keycode_)) { |
807 GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); | 820 return; |
808 } | 821 } |
809 #else | 822 #else |
810 if (native_event()) { | 823 if (native_event()) { |
811 DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || | 824 DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || |
812 EventTypeFromNative(native_event()) == ET_KEY_RELEASED); | 825 EventTypeFromNative(native_event()) == ET_KEY_RELEASED); |
813 } | 826 } |
814 // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_ | |
815 GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); | |
816 #endif | 827 #endif |
| 828 if (!DomCodeToUsLayoutMeaning(code, flags(), &key_, &character_, |
| 829 &dummy_key_code)) { |
| 830 key_ = DomKey::UNIDENTIFIED; |
| 831 } |
817 } | 832 } |
818 | 833 |
819 DomKey KeyEvent::GetDomKey() const { | 834 DomKey KeyEvent::GetDomKey() const { |
820 // Determination of character_ and key_ may be done lazily. | 835 // Determination of character_ and key_ may be done lazily. |
821 if (key_ == DomKey::NONE) | 836 if (key_ == DomKey::NONE) |
822 ApplyLayout(); | 837 ApplyLayout(); |
823 return key_; | 838 return key_; |
824 } | 839 } |
825 | 840 |
826 base::char16 KeyEvent::GetCharacter() const { | 841 base::char16 KeyEvent::GetCharacter() const { |
827 // Determination of character_ and key_ may be done lazily. | 842 // Determination of character_ and key_ may be done lazily. |
828 if (key_ == DomKey::NONE) | 843 if (key_ == DomKey::NONE) |
829 ApplyLayout(); | 844 ApplyLayout(); |
830 return character_; | 845 return character_; |
831 } | 846 } |
832 | 847 |
833 base::char16 KeyEvent::GetText() const { | 848 base::char16 KeyEvent::GetText() const { |
834 if ((flags() & EF_CONTROL_DOWN) != 0) { | 849 if ((flags() & EF_CONTROL_DOWN) != 0) { |
835 // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_ | 850 base::char16 character; |
836 return GetControlCharacterForKeycode(key_code_, | 851 ui::DomKey key; |
837 (flags() & EF_SHIFT_DOWN) != 0); | 852 ui::KeyboardCode key_code; |
| 853 if (DomCodeToControlCharacter(code_, flags(), &key, &character, &key_code)) |
| 854 return character; |
838 } | 855 } |
839 return GetUnmodifiedText(); | 856 return GetUnmodifiedText(); |
840 } | 857 } |
841 | 858 |
842 base::char16 KeyEvent::GetUnmodifiedText() const { | 859 base::char16 KeyEvent::GetUnmodifiedText() const { |
843 if (!is_char_ && (key_code_ == VKEY_RETURN)) | 860 if (!is_char_ && (key_code_ == VKEY_RETURN)) |
844 return '\r'; | 861 return '\r'; |
845 return GetCharacter(); | 862 return GetCharacter(); |
846 } | 863 } |
847 | 864 |
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 gfx::PointF(x, y), | 1009 gfx::PointF(x, y), |
993 time_stamp, | 1010 time_stamp, |
994 flags | EF_FROM_TOUCH), | 1011 flags | EF_FROM_TOUCH), |
995 details_(details) { | 1012 details_(details) { |
996 } | 1013 } |
997 | 1014 |
998 GestureEvent::~GestureEvent() { | 1015 GestureEvent::~GestureEvent() { |
999 } | 1016 } |
1000 | 1017 |
1001 } // namespace ui | 1018 } // namespace ui |
OLD | NEW |