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

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: works on link 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
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 579 matching lines...) Expand 10 before | Expand all | Expand 10 after
621 last_key_event_ = new KeyEvent(event); 623 last_key_event_ = new KeyEvent(event);
622 return false; 624 return false;
623 } 625 }
624 626
625 KeyEvent::KeyEvent(const base::NativeEvent& native_event) 627 KeyEvent::KeyEvent(const base::NativeEvent& native_event)
626 : Event(native_event, 628 : Event(native_event,
627 EventTypeFromNative(native_event), 629 EventTypeFromNative(native_event),
628 EventFlagsFromNative(native_event)), 630 EventFlagsFromNative(native_event)),
629 key_code_(KeyboardCodeFromNative(native_event)), 631 key_code_(KeyboardCodeFromNative(native_event)),
630 code_(CodeFromNative(native_event)), 632 code_(CodeFromNative(native_event)),
633 key_(DomKey::NONE),
631 is_char_(IsCharFromNative(native_event)), 634 is_char_(IsCharFromNative(native_event)),
632 platform_keycode_(PlatformKeycodeFromNative(native_event)), 635 platform_keycode_(PlatformKeycodeFromNative(native_event)),
633 character_(0) { 636 character_(0) {
Wez 2014/12/02 05:45:07 Does Blink allow delegated constructors yet?
kpschoedel 2014/12/02 16:45:45 Don't know about Blink, but they're allowed here.
634 if (IsRepeated(*this)) 637 if (IsRepeated(*this))
635 set_flags(flags() | ui::EF_IS_REPEAT); 638 set_flags(flags() | ui::EF_IS_REPEAT);
636 639
637 #if defined(USE_X11) 640 #if defined(USE_X11)
638 NormalizeFlags(); 641 NormalizeFlags();
639 #endif 642 #endif
640 #if defined(OS_WIN) 643 #if defined(OS_WIN)
641 // Only Windows has native character events. 644 // Only Windows has native character events.
642 if (is_char_) 645 if (is_char_)
643 character_ = native_event.wParam; 646 character_ = native_event.wParam;
644 #endif 647 #endif
645 } 648 }
646 649
647 KeyEvent::KeyEvent(EventType type, 650 KeyEvent::KeyEvent(EventType type,
648 KeyboardCode key_code, 651 KeyboardCode key_code,
649 int flags) 652 int flags)
650 : Event(type, EventTimeForNow(), flags), 653 : Event(type, EventTimeForNow(), flags),
651 key_code_(key_code), 654 key_code_(key_code),
652 code_(DomCode::NONE), 655 code_(DomCode::NONE),
656 key_(DomKey::NONE),
653 is_char_(false), 657 is_char_(false),
654 platform_keycode_(0), 658 platform_keycode_(0),
655 character_() { 659 character_() {
656 } 660 }
657 661
658 KeyEvent::KeyEvent(EventType type, 662 KeyEvent::KeyEvent(EventType type,
659 KeyboardCode key_code, 663 KeyboardCode key_code,
660 DomCode code, 664 DomCode code,
661 int flags) 665 int flags)
662 : Event(type, EventTimeForNow(), flags), 666 : Event(type, EventTimeForNow(), flags),
663 key_code_(key_code), 667 key_code_(key_code),
664 code_(code), 668 code_(code),
669 key_(DomKey::NONE),
665 is_char_(false), 670 is_char_(false),
666 platform_keycode_(0), 671 platform_keycode_(0),
667 character_(0) { 672 character_(0) {
668 } 673 }
669 674
675 KeyEvent::KeyEvent(EventType type,
676 KeyboardCode key_code,
677 DomCode code,
678 int flags,
679 DomKey key,
680 base::char16 character)
681 : Event(type, EventTimeForNow(), flags),
682 key_code_(key_code),
683 code_(code),
684 key_(key),
685 is_char_(false),
686 platform_keycode_(0),
687 character_(character) {
688 }
689
670 KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags) 690 KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags)
671 : Event(ET_KEY_PRESSED, EventTimeForNow(), flags), 691 : Event(ET_KEY_PRESSED, EventTimeForNow(), flags),
672 key_code_(key_code), 692 key_code_(key_code),
673 code_(DomCode::NONE), 693 code_(DomCode::NONE),
694 key_(DomKey::CHARACTER),
674 is_char_(true), 695 is_char_(true),
675 platform_keycode_(0), 696 platform_keycode_(0),
676 character_(character) { 697 character_(character) {
677 } 698 }
678 699
679 KeyEvent::KeyEvent(const KeyEvent& rhs) 700 KeyEvent::KeyEvent(const KeyEvent& rhs)
680 : Event(rhs), 701 : Event(rhs),
681 key_code_(rhs.key_code_), 702 key_code_(rhs.key_code_),
682 code_(rhs.code_), 703 code_(rhs.code_),
704 key_(rhs.key_),
683 is_char_(rhs.is_char_), 705 is_char_(rhs.is_char_),
684 platform_keycode_(rhs.platform_keycode_), 706 platform_keycode_(rhs.platform_keycode_),
685 character_(rhs.character_) { 707 character_(rhs.character_) {
686 if (rhs.extended_key_event_data_) 708 if (rhs.extended_key_event_data_)
687 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); 709 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone());
688 } 710 }
689 711
690 KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) { 712 KeyEvent& KeyEvent::operator=(const KeyEvent& rhs) {
691 if (this != &rhs) { 713 if (this != &rhs) {
692 Event::operator=(rhs); 714 Event::operator=(rhs);
693 key_code_ = rhs.key_code_; 715 key_code_ = rhs.key_code_;
694 code_ = rhs.code_; 716 code_ = rhs.code_;
717 key_ = rhs.key_;
695 is_char_ = rhs.is_char_; 718 is_char_ = rhs.is_char_;
696 platform_keycode_ = rhs.platform_keycode_; 719 platform_keycode_ = rhs.platform_keycode_;
697 character_ = rhs.character_; 720 character_ = rhs.character_;
698 721
699 if (rhs.extended_key_event_data_) 722 if (rhs.extended_key_event_data_)
700 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone()); 723 extended_key_event_data_.reset(rhs.extended_key_event_data_->Clone());
701 } 724 }
702 return *this; 725 return *this;
703 } 726 }
704 727
705 KeyEvent::~KeyEvent() {} 728 KeyEvent::~KeyEvent() {}
706 729
707 void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) { 730 void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) {
708 extended_key_event_data_ = data.Pass(); 731 extended_key_event_data_ = data.Pass();
709 } 732 }
710 733
711 base::char16 KeyEvent::GetCharacter() const { 734 void KeyEvent::ApplyLayout() const {
712 if (is_char_ || character_)
713 return character_;
714
715 // TODO(kpschoedel): streamline these cases after settling Ozone
716 // positional coding.
717 #if defined(OS_WIN) 735 #if defined(OS_WIN)
718 // Native Windows character events always have is_char_ == true, 736 // Native Windows character events always have is_char_ == true,
719 // so this is a synthetic or native keystroke event. 737 // so this is a synthetic or native keystroke event.
720 character_ = GetCharacterFromKeyCode(key_code_, flags()); 738 // Therefore, perform only the fallback action.
721 return character_; 739 GetInterpretationFromKeyCode(key_code_, flags(), &key_, &character_);
Wez 2014/12/02 05:45:07 Is "interpretation" a term we're using elsewhere?
kpschoedel 2014/12/02 16:45:45 Works for me.
722 #elif defined(USE_X11) 740 #elif defined(USE_X11)
723 if (!native_event()) {
724 character_ = GetCharacterFromKeyCode(key_code_, flags());
725 return character_;
726 }
727
728 DCHECK(native_event()->type == KeyPress ||
729 native_event()->type == KeyRelease ||
730 (native_event()->type == GenericEvent &&
731 (native_event()->xgeneric.evtype == XI_KeyPress ||
732 native_event()->xgeneric.evtype == XI_KeyRelease)));
733
734 // When a control key is held, prefer ASCII characters to non ASCII 741 // When a control key is held, prefer ASCII characters to non ASCII
735 // characters in order to use it for shortcut keys. GetCharacterFromKeyCode 742 // characters in order to use it for shortcut keys. GetCharacterFromKeyCode
736 // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11. 743 // returns 'a' for VKEY_A even if the key is actually bound to 'à' in X11.
737 // GetCharacterFromXEvent returns 'à' in that case. 744 // GetCharacterFromXEvent returns 'à' in that case.
738 return IsControlDown() ? 745 character_ = (IsControlDown() || !native_event()) ?
739 GetCharacterFromKeyCode(key_code_, flags()) : 746 GetCharacterFromKeyCode(key_code_, flags()) :
740 GetCharacterFromXEvent(native_event()); 747 GetCharacterFromXEvent(native_event());
748 // TODO(kpschoedel): set key_ field for X11.
749 #elif defined(USE_OZONE)
750 KeyboardCode key_code;
751 if (!KeyboardLayoutEngineManager::GetKeyboardLayoutEngine()->Lookup(
752 code_, flags(), &key_, &character_, &key_code)) {
753 GetInterpretationFromKeyCode(key_code_, flags(), &key_, &character_);
754 }
741 #else 755 #else
742 if (native_event()) { 756 if (native_event()) {
743 DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED || 757 DCHECK(EventTypeFromNative(native_event()) == ET_KEY_PRESSED ||
744 EventTypeFromNative(native_event()) == ET_KEY_RELEASED); 758 EventTypeFromNative(native_event()) == ET_KEY_RELEASED);
745 } 759 }
760 // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_
761 GetInterpretationFromKeyCode(key_code_, flags(), &key_, &character_);
762 #endif
763 }
746 764
747 return GetCharacterFromKeyCode(key_code_, flags()); 765 DomKey KeyEvent::GetDomKey() const {
748 #endif 766 // Determination of character_ and key_ may be done lazily.
767 if (key_ == DomKey::NONE)
768 ApplyLayout();
769 return key_;
770 }
771
772 base::char16 KeyEvent::GetCharacter() const {
773 // Determination of character_ and key_ may be done lazily.
774 if (key_ == DomKey::NONE)
775 ApplyLayout();
776 return character_;
749 } 777 }
750 778
751 base::char16 KeyEvent::GetText() const { 779 base::char16 KeyEvent::GetText() const {
752 if ((flags() & EF_CONTROL_DOWN) != 0) { 780 if ((flags() & EF_CONTROL_DOWN) != 0) {
781 // TODO(kpschoedel): revise to use DOM code_ instead of Windows key_code_
753 return GetControlCharacterForKeycode(key_code_, 782 return GetControlCharacterForKeycode(key_code_,
754 (flags() & EF_SHIFT_DOWN) != 0); 783 (flags() & EF_SHIFT_DOWN) != 0);
755 } 784 }
756 return GetUnmodifiedText(); 785 return GetUnmodifiedText();
757 } 786 }
758 787
759 base::char16 KeyEvent::GetUnmodifiedText() const { 788 base::char16 KeyEvent::GetUnmodifiedText() const {
760 if (!is_char_ && (key_code_ == VKEY_RETURN)) 789 if (!is_char_ && (key_code_ == VKEY_RETURN))
761 return '\r'; 790 return '\r';
762 return GetCharacter(); 791 return GetCharacter();
(...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 gfx::PointF(x, y), 1008 gfx::PointF(x, y),
980 time_stamp, 1009 time_stamp,
981 flags | EF_FROM_TOUCH), 1010 flags | EF_FROM_TOUCH),
982 details_(details) { 1011 details_(details) {
983 } 1012 }
984 1013
985 GestureEvent::~GestureEvent() { 1014 GestureEvent::~GestureEvent() {
986 } 1015 }
987 1016
988 } // namespace ui 1017 } // namespace ui
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698