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) {
}
#endif
#if !defined(TOUCH_UI)
////////////////////////////////////////////////////////////////////////////////
// RenderWidgetHostViewAura, private:
......@@ -425,4 +424,3 @@ void RenderWidgetHostViewAura::UpdateCursorIfOverSelf() {
//NOTIMPLEMENTED();
// TODO(beng): See RenderWidgetHostViewWin.
}
#endif
......@@ -296,12 +296,10 @@ WebKit::WebKeyboardEvent MakeWebKeyboardEventFromAuraEvent(
webkit_event.windowsKeyCode = XKeyEventToWindowsKeyCode(native_key_event);
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';
} else {
webkit_event.unmodifiedText[0] =
ui::DefaultXKeysymFromHardwareKeycode(native_key_event->keycode);
}
else
webkit_event.unmodifiedText[0] = ui::DefaultSymbolFromXEvent(native_event);
if (webkit_event.modifiers & WebKit::WebInputEvent::ControlKey) {
webkit_event.text[0] =
......
......@@ -39,11 +39,8 @@
#include <gdk/gdkkeysyms.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"
#endif
#include "ui/base/keycodes/keyboard_codes_posix.h"
namespace ui {
......@@ -637,14 +634,12 @@ int GdkNativeKeyCodeForWindowsKeyCode(KeyboardCode keycode, bool shift) {
KeyboardCode KeyboardCodeFromGdkEventKey(GdkEventKey* event) {
KeyboardCode keycode = WindowsKeyCodeForGdkKeyCode(event->keyval);
#ifdef USE_X11
// Gtk's key values are same as X11's keysyms.
if (keycode == VKEY_UNKNOWN) {
unsigned int keyval =
DefaultXKeysymFromHardwareKeycode(event->hardware_keycode);
keycode = WindowsKeyCodeForGdkKeyCode(keyval);
}
#endif
return keycode;
}
......
......@@ -6,9 +6,11 @@
#include <X11/keysym.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include "base/basictypes.h"
#include "base/logging.h"
#include "base/utf_string_conversions.h"
namespace ui {
......@@ -289,6 +291,16 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) {
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) {
static const unsigned int kHardwareKeycodeMap[] = {
0, // 0x00:
......
......@@ -16,8 +16,11 @@ UI_EXPORT KeyboardCode KeyboardCodeFromXKeyEvent(XEvent* xev);
UI_EXPORT KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym);
// Converts a hardware keycode into a key symbol on a standard US PC keyboard.
UI_EXPORT unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int keycode);
// Returns a key symbol on a standard US PC keyboard from an XEvent.
UI_EXPORT unsigned int DefaultSymbolFromXEvent(XEvent* xev);
// Converts an X keycode into an X KeySym.
unsigned int DefaultXKeysymFromHardwareKeycode(unsigned int keycode);
} // namespace ui
......
......@@ -20,16 +20,6 @@ namespace views {
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
// removed when GTK dependency is removed.
#if defined(TOOLKIT_USES_GTK)
......@@ -72,7 +62,7 @@ uint16 KeyEvent::GetCharacter() const {
DCHECK(native_event()->type == KeyPress ||
native_event()->type == KeyRelease);
uint16 ch = GetCharacterFromXKeyEvent(&native_event()->xkey);
uint16 ch = ui::DefaultSymbolFromXEvent(native_event());
return ch ? ch : GetCharacterFromKeyCode(key_code_, flags());
}
......@@ -110,15 +100,15 @@ uint16 KeyEvent::GetUnmodifiedCharacter() const {
DCHECK(native_event()->type == KeyPress ||
native_event()->type == KeyRelease);
XKeyEvent key = native_event()->xkey;
XKeyEvent *key = &native_event()->xkey;
static const unsigned int kIgnoredModifiers = ControlMask | LockMask |
Mod1Mask | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask;
// We can't use things like (key.state & ShiftMask), as it may mask out bits
// used by X11 internally.
key.state &= ~kIgnoredModifiers;
uint16 ch = GetCharacterFromXKeyEvent(&key);
key->state &= ~kIgnoredModifiers;
uint16 ch = ui::DefaultSymbolFromXEvent(native_event());
return ch ? ch :
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