Commit 6b1efe3b authored by sadrul@chromium.org's avatar sadrul@chromium.org

aura: Fix shift/ctrl/alt keyevents with RWHVA and X11.

One of the functions didn't really do what it claimed it did. This ended up
causing problems where pressing just the shift key (or the ctrl or alt key)
would cause some garbage character to show up.

BUG=101440
TEST=manually

Review URL: http://codereview.chromium.org/8380033

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@107141 0039d316-1c4b-4281-b951-d872f2087c98
parent 92da5d27
...@@ -417,7 +417,6 @@ void RenderWidgetHostViewAura::OnCompositingEnded(ui::Compositor* compositor) { ...@@ -417,7 +417,6 @@ void RenderWidgetHostViewAura::OnCompositingEnded(ui::Compositor* compositor) {
} }
#endif #endif
#if !defined(TOUCH_UI)
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// RenderWidgetHostViewAura, private: // RenderWidgetHostViewAura, private:
...@@ -425,4 +424,3 @@ void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() { ...@@ -425,4 +424,3 @@ void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() {
//NOTIMPLEMENTED(); //NOTIMPLEMENTED();
// TODO(beng): See RenderWidgetHostViewWin. // TODO(beng): See RenderWidgetHostViewWin.
} }
#endif
...@@ -296,12 +296,10 @@ WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent( ...@@ -296,12 +296,10 @@ WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
webkit_event.windowsKeyCode = XKeyEventToWindowsKeyCode(native_key_event); webkit_event.windowsKeyCode = XKeyEventToWindowsKeyCode(native_key_event);
webkit_event.nativeKeyCode = native_key_event->keycode; webkit_event.nativeKeyCode = native_key_event->keycode;
if (webkit_event.windowsKeyCode == ui::VKEY_RETURN) { if (webkit_event.windowsKeyCode == ui::VKEY_RETURN)
webkit_event.unmodifiedText[0] = '\r'; webkit_event.unmodifiedText[0] = '\r';
} else { else
webkit_event.unmodifiedText[0] = webkit_event.unmodifiedText[0] = ui::DefaultSymbolFromXEvent(native_event);
ui::DefaultXKeysymFromHardwareKeycode(native_key_event->keycode);
}
if (webkit_event.modifiers & WebKit::WebInputEvent::ControlKey) { if (webkit_event.modifiers & WebKit::WebInputEvent::ControlKey) {
webkit_event.text[0] = webkit_event.text[0] =
......
...@@ -39,11 +39,8 @@ ...@@ -39,11 +39,8 @@
#include <gdk/gdkkeysyms.h> #include <gdk/gdkkeysyms.h>
#include "build/build_config.h" #include "build/build_config.h"
#include "ui/base/keycodes/keyboard_codes_posix.h"
#ifdef USE_X11
#include "ui/base/keycodes/keyboard_code_conversion_x.h" #include "ui/base/keycodes/keyboard_code_conversion_x.h"
#endif #include "ui/base/keycodes/keyboard_codes_posix.h"
namespace ui { namespace ui {
...@@ -637,14 +634,12 @@ int GdkNativeKeyCodeForWindowsKeyCode(KeyboardCode keycode, bool shift) { ...@@ -637,14 +634,12 @@ int GdkNativeKeyCodeForWindowsKeyCode(KeyboardCode keycode, bool shift) {
KeyboardCode KeyboardCodeFromGdkEventKey(GdkEventKey* event) { KeyboardCode KeyboardCodeFromGdkEventKey(GdkEventKey* event) {
KeyboardCode keycode = WindowsKeyCodeForGdkKeyCode(event->keyval); KeyboardCode keycode = WindowsKeyCodeForGdkKeyCode(event->keyval);
#ifdef USE_X11
// Gtk's key values are same as X11's keysyms. // Gtk's key values are same as X11's keysyms.
if (keycode == VKEY_UNKNOWN) { if (keycode == VKEY_UNKNOWN) {
unsigned int keyval = unsigned int keyval =
DefaultXKeysymFromHardwareKeycode(event->hardware_keycode); DefaultXKeysymFromHardwareKeycode(event->hardware_keycode);
keycode = WindowsKeyCodeForGdkKeyCode(keyval); keycode = WindowsKeyCodeForGdkKeyCode(keyval);
} }
#endif
return keycode; return keycode;
} }
......
...@@ -6,9 +6,11 @@ ...@@ -6,9 +6,11 @@
#include <X11/keysym.h> #include <X11/keysym.h>
#include <X11/Xlib.h> #include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/utf_string_conversions.h"
namespace ui { namespace ui {
...@@ -289,6 +291,16 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { ...@@ -289,6 +291,16 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) {
return VKEY_UNKNOWN; return VKEY_UNKNOWN;
} }
unsigned int DefaultSymbolFromXEvent(XEvent* xev) {
char buf[6];
int bytes_written = XLookupString(&xev->xkey, buf, 6, NULL, NULL);
DCHECK_LE(bytes_written, 6);
string16 result;
return (bytes_written > 0 && UTF8ToUTF16(buf, bytes_written, &result) &&
result.length() == 1) ? result[0] : 0;
}
unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int hardware_code) { unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int hardware_code) {
static const unsigned int kHardwareKeycodeMap[] = { static const unsigned int kHardwareKeycodeMap[] = {
0, // 0x00: 0, // 0x00:
......
...@@ -16,8 +16,11 @@ UI_EXPORT KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev); ...@@ -16,8 +16,11 @@ UI_EXPORT KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev);
UI_EXPORT KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym); UI_EXPORT KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym);
// Converts a hardware keycode into a key symbol on a standard US PC keyboard. // Returns a key symbol on a standard US PC keyboard from an XEvent.
UI_EXPORT unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int keycode); UI_EXPORT unsigned int DefaultSymbolFromXEvent(XEvent* xev);
// Converts an X keycode into an X KeySym.
unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int keycode);
} // namespace ui } // namespace ui
......
...@@ -20,16 +20,6 @@ namespace views { ...@@ -20,16 +20,6 @@ namespace views {
namespace { namespace {
uint16 GetCharacterFromXKeyEvent(XKeyEvent* key) {
char buf[6];
int bytes_written = XLookupString(key, buf, 6, NULL, NULL);
DCHECK_LE(bytes_written, 6);
string16 result;
return (bytes_written > 0 && UTF8ToUTF16(buf, bytes_written, &result) &&
result.length() == 1) ? result[0] : 0;
}
// The following two functions are copied from event_gtk.cc. These will be // The following two functions are copied from event_gtk.cc. These will be
// removed when GTK dependency is removed. // removed when GTK dependency is removed.
#if defined(TOOLKIT_USES_GTK) #if defined(TOOLKIT_USES_GTK)
...@@ -72,7 +62,7 @@ uint16 KeyEvent::GetCharacter() const { ...@@ -72,7 +62,7 @@ uint16 KeyEvent::GetCharacter() const {
DCHECK(native_event()->type == KeyPress || DCHECK(native_event()->type == KeyPress ||
native_event()->type == KeyRelease); native_event()->type == KeyRelease);
uint16 ch = GetCharacterFromXKeyEvent(&native_event()->xkey); uint16 ch = ui::DefaultSymbolFromXEvent(native_event());
return ch ? ch : GetCharacterFromKeyCode(key_code_, flags()); return ch ? ch : GetCharacterFromKeyCode(key_code_, flags());
} }
...@@ -110,15 +100,15 @@ uint16 KeyEvent::GetUnmodifiedCharacter() const { ...@@ -110,15 +100,15 @@ uint16 KeyEvent::GetUnmodifiedCharacter() const {
DCHECK(native_event()->type == KeyPress || DCHECK(native_event()->type == KeyPress ||
native_event()->type == KeyRelease); native_event()->type == KeyRelease);
XKeyEvent key = native_event()->xkey; XKeyEvent *key = &native_event()->xkey;
static const unsigned int kIgnoredModifiers = ControlMask | LockMask | static const unsigned int kIgnoredModifiers = ControlMask | LockMask |
Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask; Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask;
// We can't use things like (key.state & ShiftMask), as it may mask out bits // We can't use things like (key.state & ShiftMask), as it may mask out bits
// used by X11 internally. // used by X11 internally.
key.state &= ~kIgnoredModifiers; key->state &= ~kIgnoredModifiers;
uint16 ch = GetCharacterFromXKeyEvent(&key); uint16 ch = ui::DefaultSymbolFromXEvent(native_event());
return ch ? ch : return ch ? ch :
GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN); GetCharacterFromKeyCode(key_code_, flags() & ui::EF_SHIFT_DOWN);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment