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/Xlib.h> | 9 #include <X11/Xlib.h> |
10 #include <X11/keysym.h> | 10 #include <X11/keysym.h> |
11 #endif | 11 #endif |
12 | 12 |
13 #include <cmath> | 13 #include <cmath> |
14 #include <cstring> | 14 #include <cstring> |
15 | 15 |
16 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
17 #include "base/strings/stringprintf.h" | 17 #include "base/strings/stringprintf.h" |
18 #include "ui/events/event_utils.h" | 18 #include "ui/events/event_utils.h" |
19 #include "ui/events/keycodes/dom3/dom_code.h" | 19 #include "ui/events/keycodes/dom3/dom_code.h" |
| 20 #include "ui/events/keycodes/dom3/dom_key.h" |
20 #include "ui/events/keycodes/dom4/keycode_converter.h" | 21 #include "ui/events/keycodes/dom4/keycode_converter.h" |
21 #include "ui/events/keycodes/keyboard_code_conversion.h" | 22 #include "ui/events/keycodes/keyboard_code_conversion.h" |
22 #include "ui/gfx/geometry/safe_integer_conversions.h" | 23 #include "ui/gfx/geometry/safe_integer_conversions.h" |
23 #include "ui/gfx/point3_f.h" | 24 #include "ui/gfx/point3_f.h" |
24 #include "ui/gfx/point_conversions.h" | 25 #include "ui/gfx/point_conversions.h" |
25 #include "ui/gfx/transform.h" | 26 #include "ui/gfx/transform.h" |
26 #include "ui/gfx/transform_util.h" | 27 #include "ui/gfx/transform_util.h" |
27 | 28 |
28 #if defined(USE_X11) | 29 #if defined(USE_X11) |
29 #include "ui/events/keycodes/keyboard_code_conversion_x.h" | 30 #include "ui/events/keycodes/keyboard_code_conversion_x.h" |
30 #elif defined(USE_OZONE) | 31 #elif defined(USE_OZONE) |
31 #include "ui/events/keycodes/keyboard_code_conversion.h" | 32 #include "ui/events/ozone/layout/keyboard_layout_engine.h" |
| 33 #include "ui/events/ozone/layout/keyboard_layout_engine_manager.h" |
32 #endif | 34 #endif |
33 | 35 |
34 namespace { | 36 namespace { |
35 | 37 |
36 std::string EventTypeName(ui::EventType type) { | 38 std::string EventTypeName(ui::EventType type) { |
37 #define RETURN_IF_TYPE(t) if (type == ui::t) return #t | 39 #define RETURN_IF_TYPE(t) if (type == ui::t) return #t |
38 #define CASE_TYPE(t) case ui::t: return #t | 40 #define CASE_TYPE(t) case ui::t: return #t |
39 switch (type) { | 41 switch (type) { |
40 CASE_TYPE(ET_UNKNOWN); | 42 CASE_TYPE(ET_UNKNOWN); |
41 CASE_TYPE(ET_MOUSE_PRESSED); | 43 CASE_TYPE(ET_MOUSE_PRESSED); |
(...skipping 595 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
637 } | 639 } |
638 | 640 |
639 KeyEvent::KeyEvent(const base::NativeEvent& native_event) | 641 KeyEvent::KeyEvent(const base::NativeEvent& native_event) |
640 : Event(native_event, | 642 : Event(native_event, |
641 EventTypeFromNative(native_event), | 643 EventTypeFromNative(native_event), |
642 EventFlagsFromNative(native_event)), | 644 EventFlagsFromNative(native_event)), |
643 key_code_(KeyboardCodeFromNative(native_event)), | 645 key_code_(KeyboardCodeFromNative(native_event)), |
644 code_(CodeFromNative(native_event)), | 646 code_(CodeFromNative(native_event)), |
645 is_char_(IsCharFromNative(native_event)), | 647 is_char_(IsCharFromNative(native_event)), |
646 platform_keycode_(PlatformKeycodeFromNative(native_event)), | 648 platform_keycode_(PlatformKeycodeFromNative(native_event)), |
| 649 key_(DomKey::NONE), |
647 character_(0) { | 650 character_(0) { |
648 if (IsRepeated(*this)) | 651 if (IsRepeated(*this)) |
649 set_flags(flags() | ui::EF_IS_REPEAT); | 652 set_flags(flags() | ui::EF_IS_REPEAT); |
650 | 653 |
651 #if defined(USE_X11) | 654 #if defined(USE_X11) |
652 NormalizeFlags(); | 655 NormalizeFlags(); |
653 #endif | 656 #endif |
654 #if defined(OS_WIN) | 657 #if defined(OS_WIN) |
655 // Only Windows has native character events. | 658 // Only Windows has native character events. |
656 if (is_char_) | 659 if (is_char_) |
657 character_ = native_event.wParam; | 660 character_ = native_event.wParam; |
658 #endif | 661 #endif |
659 } | 662 } |
660 | 663 |
661 KeyEvent::KeyEvent(EventType type, | 664 KeyEvent::KeyEvent(EventType type, |
662 KeyboardCode key_code, | 665 KeyboardCode key_code, |
663 int flags) | 666 int flags) |
664 : Event(type, EventTimeForNow(), flags), | 667 : Event(type, EventTimeForNow(), flags), |
665 key_code_(key_code), | 668 key_code_(key_code), |
666 code_(DomCode::NONE), | 669 code_(DomCode::NONE), |
667 is_char_(false), | 670 is_char_(false), |
668 platform_keycode_(0), | 671 platform_keycode_(0), |
| 672 key_(DomKey::NONE), |
669 character_() { | 673 character_() { |
670 } | 674 } |
671 | 675 |
672 KeyEvent::KeyEvent(EventType type, | 676 KeyEvent::KeyEvent(EventType type, |
673 KeyboardCode key_code, | 677 KeyboardCode key_code, |
674 DomCode code, | 678 DomCode code, |
675 int flags) | 679 int flags) |
676 : Event(type, EventTimeForNow(), flags), | 680 : Event(type, EventTimeForNow(), flags), |
677 key_code_(key_code), | 681 key_code_(key_code), |
678 code_(code), | 682 code_(code), |
679 is_char_(false), | 683 is_char_(false), |
680 platform_keycode_(0), | 684 platform_keycode_(0), |
| 685 key_(DomKey::NONE), |
681 character_(0) { | 686 character_(0) { |
682 } | 687 } |
683 | 688 |
| 689 KeyEvent::KeyEvent(EventType type, |
| 690 KeyboardCode key_code, |
| 691 DomCode code, |
| 692 int flags, |
| 693 DomKey key, |
| 694 base::char16 character) |
| 695 : Event(type, EventTimeForNow(), flags), |
| 696 key_code_(key_code), |
| 697 code_(code), |
| 698 is_char_(false), |
| 699 platform_keycode_(0), |
| 700 key_(key), |
| 701 character_(character) { |
| 702 } |
| 703 |
684 KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) | 704 KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) |
685 : Event(ET_KEY_PRESSED, EventTimeForNow(), flags), | 705 : Event(ET_KEY_PRESSED, EventTimeForNow(), flags), |
686 key_code_(key_code), | 706 key_code_(key_code), |
687 code_(DomCode::NONE), | 707 code_(DomCode::NONE), |
688 is_char_(true), | 708 is_char_(true), |
689 platform_keycode_(0), | 709 platform_keycode_(0), |
| 710 key_(DomKey::CHARACTER), |
690 character_(character) { | 711 character_(character) { |
691 } | 712 } |
692 | 713 |
693 KeyEvent::KeyEvent(const KeyEvent& rhs) | 714 KeyEvent::KeyEvent(const KeyEvent& rhs) |
694 : Event(rhs), | 715 : Event(rhs), |
695 key_code_(rhs.key_code_), | 716 key_code_(rhs.key_code_), |
696 code_(rhs.code_), | 717 code_(rhs.code_), |
697 is_char_(rhs.is_char_), | 718 is_char_(rhs.is_char_), |
698 platform_keycode_(rhs.platform_keycode_), | 719 platform_keycode_(rhs.platform_keycode_), |
| 720 key_(rhs.key_), |
699 character_(rhs.character_) { | 721 character_(rhs.character_) { |
700 if (rhs.extended_key_event_data_) | 722 if (rhs.extended_key_event_data_) |
701 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); | 723 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); |
702 } | 724 } |
703 | 725 |
704 KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { | 726 KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { |
705 if (this != &rhs) { | 727 if (this != &rhs) { |
706 Event::operator=(rhs); | 728 Event::operator=(rhs); |
707 key_code_ = rhs.key_code_; | 729 key_code_ = rhs.key_code_; |
708 code_ = rhs.code_; | 730 code_ = rhs.code_; |
| 731 key_ = rhs.key_; |
709 is_char_ = rhs.is_char_; | 732 is_char_ = rhs.is_char_; |
710 platform_keycode_ = rhs.platform_keycode_; | 733 platform_keycode_ = rhs.platform_keycode_; |
711 character_ = rhs.character_; | 734 character_ = rhs.character_; |
712 | 735 |
713 if (rhs.extended_key_event_data_) | 736 if (rhs.extended_key_event_data_) |
714 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); | 737 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); |
715 } | 738 } |
716 return *this; | 739 return *this; |
717 } | 740 } |
718 | 741 |
719 KeyEvent::~KeyEvent() {} | 742 KeyEvent::~KeyEvent() {} |
720 | 743 |
721 void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) { | 744 void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) { |
722 extended_key_event_data_ = data.Pass(); | 745 extended_key_event_data_ = data.Pass(); |
723 } | 746 } |
724 | 747 |
725 base::char16 KeyEvent::GetCharacter() const { | 748 void KeyEvent::ApplyLayout() const { |
726 if (is_char_ || character_) | |
727 return character_; | |
728 | |
729 // TODO(kpschoedel): streamline these cases after settling Ozone | |
730 // positional coding. | |
731 #if defined(OS_WIN) | 749 #if defined(OS_WIN) |
732 // Native Windows character events always have is_char_ == true, | 750 // Native Windows character events always have is_char_ == true, |
733 // so this is a synthetic or native keystroke event. | 751 // so this is a synthetic or native keystroke event. |
734 character_ = GetCharacterFromKeyCode(key_code_, flags()); | 752 // Therefore, perform only the fallback action. |
735 return character_; | 753 GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); |
736 #elif defined(USE_X11) | 754 #elif defined(USE_X11) |
737 if (!native_event()) { | |
738 character_ = GetCharacterFromKeyCode(key_code_, flags()); | |
739 return character_; | |
740 } | |
741 | |
742 DCHECK(native_event()->type == KeyPress || | |
743 native_event()->type == KeyRelease || | |
744 (native_event()->type == GenericEvent && | |
745 (native_event()->xgeneric.evtype == XI_KeyPress || | |
746 native_event()->xgeneric.evtype == XI_KeyRelease))); | |
747 | |
748 // When a control key is held, prefer ASCII characters to non ASCII | 755 // When a control key is held, prefer ASCII characters to non ASCII |
749 // characters in order to use it for shortcut keys. GetCharacterFromKeyCode | 756 // characters in order to use it for shortcut keys. GetCharacterFromKeyCode |
750 // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. | 757 // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. |
751 // GetCharacterFromXEvent returns 'à' in that case. | 758 // GetCharacterFromXEvent returns 'à' in that case. |
752 return IsControlDown() ? | 759 character_ = (IsControlDown() || !native_event()) ? |
753 GetCharacterFromKeyCode(key_code_, flags()) : | 760 GetCharacterFromKeyCode(key_code_, flags()) : |
754 GetCharacterFromXEvent(native_event()); | 761 GetCharacterFromXEvent(native_event()); |
| 762 // TODO(kpschoedel): set key_ field for X11. |
| 763 #elif defined(USE_OZONE) |
| 764 KeyboardCode key_code; |
| 765 if (!KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup( |
| 766 code_, flags(), &key_, &character_, &key_code)) { |
| 767 GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); |
| 768 } |
755 #else | 769 #else |
756 if (native_event()) { | 770 if (native_event()) { |
757 DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || | 771 DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || |
758 EventTypeFromNative(native_event()) == ET_KEY_RELEASED); | 772 EventTypeFromNative(native_event()) == ET_KEY_RELEASED); |
759 } | 773 } |
| 774 // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_ |
| 775 GetMeaningFromKeyCode(key_code_, flags(), &key_, &character_); |
| 776 #endif |
| 777 } |
760 | 778 |
761 return GetCharacterFromKeyCode(key_code_, flags()); | 779 DomKey KeyEvent::GetDomKey() const { |
762 #endif | 780 // Determination of character_ and key_ may be done lazily. |
| 781 if (key_ == DomKey::NONE) |
| 782 ApplyLayout(); |
| 783 return key_; |
| 784 } |
| 785 |
| 786 base::char16 KeyEvent::GetCharacter() const { |
| 787 // Determination of character_ and key_ may be done lazily. |
| 788 if (key_ == DomKey::NONE) |
| 789 ApplyLayout(); |
| 790 return character_; |
763 } | 791 } |
764 | 792 |
765 base::char16 KeyEvent::GetText() const { | 793 base::char16 KeyEvent::GetText() const { |
766 if ((flags() & EF_CONTROL_DOWN) != 0) { | 794 if ((flags() & EF_CONTROL_DOWN) != 0) { |
| 795 // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_ |
767 return GetControlCharacterForKeycode(key_code_, | 796 return GetControlCharacterForKeycode(key_code_, |
768 (flags() & EF_SHIFT_DOWN) != 0); | 797 (flags() & EF_SHIFT_DOWN) != 0); |
769 } | 798 } |
770 return GetUnmodifiedText(); | 799 return GetUnmodifiedText(); |
771 } | 800 } |
772 | 801 |
773 base::char16 KeyEvent::GetUnmodifiedText() const { | 802 base::char16 KeyEvent::GetUnmodifiedText() const { |
774 if (!is_char_ && (key_code_ == VKEY_RETURN)) | 803 if (!is_char_ && (key_code_ == VKEY_RETURN)) |
775 return '\r'; | 804 return '\r'; |
776 return GetCharacter(); | 805 return GetCharacter(); |
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
993 gfx::PointF(x, y), | 1022 gfx::PointF(x, y), |
994 time_stamp, | 1023 time_stamp, |
995 flags | EF_FROM_TOUCH), | 1024 flags | EF_FROM_TOUCH), |
996 details_(details) { | 1025 details_(details) { |
997 } | 1026 } |
998 | 1027 |
999 GestureEvent::~GestureEvent() { | 1028 GestureEvent::~GestureEvent() { |
1000 } | 1029 } |
1001 | 1030 |
1002 } // namespace ui | 1031 } // namespace ui |
OLD | NEW |