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

Unified Diff: ui/events/event.h

Issue 404203003: Distinguish between keystroke and character events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: IsCharFromNative() for Mac build Created 6 years, 5 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/events/cocoa/events_mac.mm ('k') | ui/events/event.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/events/event.h
diff --git a/ui/events/event.h b/ui/events/event.h
index 64a3a01bf7b3301087bc3386b72595ac65c90535..ea826f9b29eb0dee6a15fad49e0201439063274b 100644
--- a/ui/events/event.h
+++ b/ui/events/event.h
@@ -543,30 +543,66 @@ class EVENTS_EXPORT TouchEvent : public LocatedEvent {
float force_;
};
+// A KeyEvent is really two distinct classes, melded together due to the
+// DOM legacy of Windows key events: a keystroke event (is_char_ == false),
+// or a character event (is_char_ == true).
+//
+// For a keystroke event,
+// -- is_char_ is false.
+// -- type() can be any one of ET_KEY_PRESSED, ET_KEY_RELEASED,
+// ET_TRANSLATED_KEY_PRESS, or ET_TRANSLATED_KEY_RELEASE.
+// -- character_ functions as a bypass or cache for GetCharacter().
+// -- key_code_ is a VKEY_ value associated with the key. For printable
+// characters, this may or may not be a mapped value, imitating MS Windows:
+// if the mapped key generates a character that has an associated VKEY_
+// code, then key_code_ is that code; if not, then key_code_ is the unmapped
+// VKEY_ code. For example, US, Greek, Cyrillic, Japanese, etc. all use
+// VKEY_Q for the key beside Tab, while French uses VKEY_A.
+// -- code_ is in one-to-one correspondence with a physical keyboard
+// location, and does not vary depending on key layout.
+//
+// For a character event,
+// -- is_char_ is true.
+// -- type() is ET_KEY_PRESSED.
+// -- character_ is a UTF-16 character value.
+// -- key_code_ is conflated with character_ by some code, because both
+// arrive in the wParam field of a Windows event.
+// -- code_ is "".
+//
class EVENTS_EXPORT KeyEvent : public Event {
public:
- KeyEvent(const base::NativeEvent& native_event, bool is_char);
+ // Create a KeyEvent from a NativeEvent. For Windows this native event can
+ // be either a keystroke message (WM_KEYUP/WM_KEYDOWN) or a character message
+ // (WM_CHAR). Other systems have only keystroke events.
+ explicit KeyEvent(const base::NativeEvent& native_event);
- // Used for synthetic events.
- KeyEvent(EventType type, KeyboardCode key_code, int flags, bool is_char);
+ // Create a keystroke event.
+ KeyEvent(EventType type, KeyboardCode key_code, int flags);
+
+ // Create a character event.
+ KeyEvent(base::char16 character, KeyboardCode key_code, int flags);
// Used for synthetic events with code of DOM KeyboardEvent (e.g. 'KeyA')
// See also: ui/events/keycodes/dom4/keycode_converter_data.h
- KeyEvent(EventType type, KeyboardCode key_code, const std::string& code,
- int flags, bool is_char);
+ KeyEvent(EventType type,
+ KeyboardCode key_code,
+ const std::string& code,
+ int flags);
// This allows an I18N virtual keyboard to fabricate a keyboard event that
// does not have a corresponding KeyboardCode (example: U+00E1 Latin small
// letter A with acute, U+0410 Cyrillic capital letter A).
- void set_character(uint16 character) { character_ = character; }
+ void set_character(base::char16 character) { character_ = character; }
// Gets the character generated by this key event. It only supports Unicode
// BMP characters.
- uint16 GetCharacter() const;
+ base::char16 GetCharacter() const;
// Gets the platform key code. For XKB, this is the xksym value.
uint32 platform_keycode() const { return platform_keycode_; }
KeyboardCode key_code() const { return key_code_; }
+
+ // True if this is a character event, false if this is a keystroke event.
bool is_char() const { return is_char_; }
// This is only intended to be used externally by classes that are modifying
@@ -580,9 +616,8 @@ class EVENTS_EXPORT KeyEvent : public Event {
std::string code() const { return code_; }
- // Normalizes flags_ to make it Windows/Mac compatible. Since the way
- // of setting modifier mask on X is very different than Windows/Mac as shown
- // in http://crbug.com/127142#c8, the normalization is necessary.
+ // Normalizes flags_ so that it describes the state after the event.
+ // (Native X11 event flags describe the state before the event.)
void NormalizeFlags();
// Returns true if the key event has already been processed by an input method
@@ -592,6 +627,8 @@ class EVENTS_EXPORT KeyEvent : public Event {
void SetTranslated(bool translated);
protected:
+ friend class KeyEventTestApi;
+
// This allows a subclass TranslatedKeyEvent to be a non character event.
void set_is_char(bool is_char) { is_char_ = is_char; }
@@ -605,8 +642,7 @@ class EVENTS_EXPORT KeyEvent : public Event {
// converted from / to keyboard scan code like XKB.
std::string code_;
- // True if this is a translated character event (vs. a raw key down). Both
- // share the same type: ET_KEY_PRESSED.
+ // True if this is a character event, false if this is a keystroke event.
bool is_char_;
// The platform related keycode value. For XKB, it's keysym value.
@@ -619,7 +655,7 @@ class EVENTS_EXPORT KeyEvent : public Event {
// This value represents the text that the key event will insert to input
// field. For key with modifier key, it may have specifial text.
// e.g. CTRL+A has '\x01'.
- uint16 character_;
+ base::char16 character_;
static bool IsRepeated(const KeyEvent& event);
« no previous file with comments | « ui/events/cocoa/events_mac.mm ('k') | ui/events/event.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698