Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: ui/events/event.cc

Issue 742103002: Ozone keyboard layout (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@lite-code
Patch Set: reeeeebase Created 6 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/events/event.h ('k') | ui/events/events.gyp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
OLDNEW
« no previous file with comments | « ui/events/event.h ('k') | ui/events/events.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698