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

Unified Diff: ui/events/event.cc

Issue 479873002: Removing X11 native_event uses for key events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Remove web_input_event_aurax11.cc from Android license whitelist. Created 6 years, 3 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/event.h ('k') | ui/events/event_utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/events/event.cc
diff --git a/ui/events/event.cc b/ui/events/event.cc
index 27de2a96b6a150891a4632df87890562f06a4eb0..0ee17094c8d8b099da9d4585002163f312fe42b5 100644
--- a/ui/events/event.cc
+++ b/ui/events/event.cc
@@ -7,6 +7,7 @@
#if defined(USE_X11)
#include <X11/extensions/XInput2.h>
#include <X11/Xlib.h>
+#include <X11/keysym.h>
#endif
#include <cmath>
@@ -591,6 +592,11 @@ KeyEvent::KeyEvent(const base::NativeEvent& native_event)
#if defined(USE_X11)
NormalizeFlags();
#endif
+#if defined(OS_WIN)
+ // Only Windows has native character events.
+ if (is_char_)
+ character_ = native_event.wParam;
+#endif
}
KeyEvent::KeyEvent(EventType type,
@@ -600,7 +606,7 @@ KeyEvent::KeyEvent(EventType type,
key_code_(key_code),
is_char_(false),
platform_keycode_(0),
- character_(GetCharacterFromKeyCode(key_code, flags)) {
+ character_() {
}
KeyEvent::KeyEvent(EventType type,
@@ -612,7 +618,7 @@ KeyEvent::KeyEvent(EventType type,
code_(code),
is_char_(false),
platform_keycode_(0),
- character_(GetCharacterFromKeyCode(key_code, flags)) {
+ character_(0) {
}
KeyEvent::KeyEvent(base::char16 character, KeyboardCode key_code, int flags)
@@ -657,15 +663,21 @@ void KeyEvent::SetExtendedKeyEventData(scoped_ptr<ExtendedKeyEventData> data) {
}
base::char16 KeyEvent::GetCharacter() const {
- if (character_)
+ if (is_char_ || character_)
return character_;
+ // TODO(kpschoedel): streamline these cases after settling Ozone
+ // positional coding.
#if defined(OS_WIN)
- return (native_event().message == WM_CHAR) ? key_code_ :
- GetCharacterFromKeyCode(key_code_, flags());
+ // Native Windows character events always have is_char_ == true,
+ // so this is a synthetic or native keystroke event.
+ character_ = GetCharacterFromKeyCode(key_code_, flags());
+ return character_;
#elif defined(USE_X11)
- if (!native_event())
- return GetCharacterFromKeyCode(key_code_, flags());
+ if (!native_event()) {
+ character_ = GetCharacterFromKeyCode(key_code_, flags());
+ return character_;
+ }
DCHECK(native_event()->type == KeyPress ||
native_event()->type == KeyRelease ||
@@ -690,6 +702,20 @@ base::char16 KeyEvent::GetCharacter() const {
#endif
}
+base::char16 KeyEvent::GetText() const {
+ if ((flags() & EF_CONTROL_DOWN) != 0) {
+ return GetControlCharacterForKeycode(key_code_,
+ (flags() & EF_SHIFT_DOWN) != 0);
+ }
+ return GetUnmodifiedText();
+}
+
+base::char16 KeyEvent::GetUnmodifiedText() const {
+ if (!is_char_ && (key_code_ == VKEY_RETURN))
+ return '\r';
+ return GetCharacter();
+}
+
bool KeyEvent::IsUnicodeKeyCode() const {
#if defined(OS_WIN)
if (!IsAltDown())
@@ -763,6 +789,83 @@ void KeyEvent::SetTranslated(bool translated) {
}
}
+bool KeyEvent::IsRightSideKey() const {
+ switch (key_code_) {
+ case VKEY_CONTROL:
+ case VKEY_SHIFT:
+ case VKEY_MENU:
+ case VKEY_LWIN:
+#if defined(USE_X11)
+ // Under X11, setting code_ requires platform-dependent information, and
+ // currently assumes that X keycodes are based on Linux evdev keycodes.
+ // In certain test environments this is not the case, and code_ is not
+ // set accurately, so we need a different mechanism. Fortunately X11 key
+ // mapping preserves the left-right distinction, so testing keysyms works
+ // if the value is available (as it is for all X11 native-based events).
+ if (platform_keycode_) {
+ return (platform_keycode_ == XK_Shift_R) ||
+ (platform_keycode_ == XK_Control_R) ||
+ (platform_keycode_ == XK_Alt_R) ||
+ (platform_keycode_ == XK_Meta_R) ||
+ (platform_keycode_ == XK_Super_R) ||
+ (platform_keycode_ == XK_Hyper_R);
+ }
+ // Fall through to the generic code if we have no platform_keycode_.
+ // Under X11, this must be a synthetic event, so we can require that
+ // code_ be set correctly.
+#endif
+ return ((code_.size() > 5) &&
+ (code_.compare(code_.size() - 5, 5, "Right", 5)) == 0);
+ default:
+ return false;
+ }
+}
+
+KeyboardCode KeyEvent::GetLocatedWindowsKeyboardCode() const {
+ switch (key_code_) {
+ case VKEY_SHIFT:
+ return IsRightSideKey() ? VKEY_RSHIFT : VKEY_LSHIFT;
+ case VKEY_CONTROL:
+ return IsRightSideKey() ? VKEY_RCONTROL : VKEY_LCONTROL;
+ case VKEY_MENU:
+ return IsRightSideKey() ? VKEY_RMENU : VKEY_LMENU;
+ case VKEY_LWIN:
+ return IsRightSideKey() ? VKEY_RWIN : VKEY_LWIN;
+ // TODO(kpschoedel): EF_NUMPAD_KEY is present only on X11. Currently this
+ // function is only called on X11. Likely the tests here will be replaced
+ // with a DOM-based code enumeration test in the course of Ozone
+ // platform-indpendent key event work.
+ case VKEY_0:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD0 : VKEY_0;
+ case VKEY_1:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD1 : VKEY_1;
+ case VKEY_2:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD2 : VKEY_2;
+ case VKEY_3:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD3 : VKEY_3;
+ case VKEY_4:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD4 : VKEY_4;
+ case VKEY_5:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD5 : VKEY_5;
+ case VKEY_6:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD6 : VKEY_6;
+ case VKEY_7:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD7 : VKEY_7;
+ case VKEY_8:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD8 : VKEY_8;
+ case VKEY_9:
+ return (flags() & EF_NUMPAD_KEY) ? VKEY_NUMPAD9 : VKEY_9;
+ default:
+ return key_code_;
+ }
+}
+
+uint16 KeyEvent::GetConflatedWindowsKeyCode() const {
+ if (is_char_)
+ return character_;
+ return key_code_;
+}
+
////////////////////////////////////////////////////////////////////////////////
// ScrollEvent
« no previous file with comments | « ui/events/event.h ('k') | ui/events/event_utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698