| 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 |