Commit ce81fbd0 authored by oshima@chromium.org's avatar oshima@chromium.org

Convert keysym to keycode for modifiers

Set mask after sending modifier keys.
Print unknown keysym in hex and add warning for unknown keycode.

BUG=106630
TEST=All BrowserKeyEventsTest except for AccessKey will pass


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

git-svn-id: svn://svn.chromium.org/chrome/trunk/src@113456 0039d316-1c4b-4281-b951-d872f2087c98
parent 8ac3d7f3
...@@ -90,20 +90,24 @@ bool SendKeyPress(gfx::NativeWindow window, ...@@ -90,20 +90,24 @@ bool SendKeyPress(gfx::NativeWindow window,
window, key, control, shift, alt, command, base::Closure()); window, key, control, shift, alt, command, base::Closure());
} }
void SetMaskAndKeycodeThenSend(XEvent* xevent, void SetKeycodeAndSendThenMask(XEvent* xevent,
unsigned int mask, KeySym keysym,
unsigned int keycode) { unsigned int mask) {
xevent->xkey.state |= mask; xevent->xkey.keycode =
xevent->xkey.keycode = keycode; XKeysymToKeycode(base::MessagePumpX::GetDefaultXDisplay(),
keysym);
aura::RootWindow::GetInstance()->PostNativeEvent(xevent); aura::RootWindow::GetInstance()->PostNativeEvent(xevent);
xevent->xkey.state |= mask;
} }
void SetKeycodeAndSendThenUnmask(XEvent* xevent, void UnmaskAndSetKeycodeThenSend(XEvent* xevent,
unsigned int mask, unsigned int mask,
unsigned int keycode) { KeySym keysym) {
xevent->xkey.keycode = keycode;
aura::RootWindow::GetInstance()->PostNativeEvent(xevent);
xevent->xkey.state ^= mask; xevent->xkey.state ^= mask;
xevent->xkey.keycode =
XKeysymToKeycode(base::MessagePumpX::GetDefaultXDisplay(),
keysym);
aura::RootWindow::GetInstance()->PostNativeEvent(xevent);
} }
bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window,
...@@ -117,11 +121,11 @@ bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, ...@@ -117,11 +121,11 @@ bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window,
XEvent xevent = {0}; XEvent xevent = {0};
xevent.xkey.type = KeyPress; xevent.xkey.type = KeyPress;
if (control) if (control)
SetMaskAndKeycodeThenSend(&xevent, ControlMask, XK_Control_L); SetKeycodeAndSendThenMask(&xevent, XK_Control_L, ControlMask);
if (shift) if (shift)
SetMaskAndKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L); SetKeycodeAndSendThenMask(&xevent, XK_Shift_L, ShiftMask);
if (alt) if (alt)
SetMaskAndKeycodeThenSend(&xevent, Mod1Mask, XK_Alt_L); SetKeycodeAndSendThenMask(&xevent, XK_Alt_L, Mod1Mask);
xevent.xkey.keycode = xevent.xkey.keycode =
XKeysymToKeycode(base::MessagePumpX::GetDefaultXDisplay(), XKeysymToKeycode(base::MessagePumpX::GetDefaultXDisplay(),
ui::XKeysymForWindowsKeyCode(key, shift)); ui::XKeysymForWindowsKeyCode(key, shift));
...@@ -131,11 +135,11 @@ bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window, ...@@ -131,11 +135,11 @@ bool SendKeyPressNotifyWhenDone(gfx::NativeWindow window,
xevent.xkey.type = KeyRelease; xevent.xkey.type = KeyRelease;
aura::RootWindow::GetInstance()->PostNativeEvent(&xevent); aura::RootWindow::GetInstance()->PostNativeEvent(&xevent);
if (alt) if (alt)
SetKeycodeAndSendThenUnmask(&xevent, Mod1Mask, XK_Alt_L); UnmaskAndSetKeycodeThenSend(&xevent, Mod1Mask, XK_Alt_L);
if (shift) if (shift)
SetKeycodeAndSendThenUnmask(&xevent, ShiftMask, XK_Shift_L); UnmaskAndSetKeycodeThenSend(&xevent, ShiftMask, XK_Shift_L);
if (control) if (control)
SetKeycodeAndSendThenUnmask(&xevent, ControlMask, XK_Control_L); UnmaskAndSetKeycodeThenSend(&xevent, ControlMask, XK_Control_L);
DCHECK(!xevent.xkey.state); DCHECK(!xevent.xkey.state);
RunClosureAfterAllPendingUIEvents(closure); RunClosureAfterAllPendingUIEvents(closure);
return true; return true;
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "base/basictypes.h" #include "base/basictypes.h"
#include "base/logging.h" #include "base/logging.h"
#include "base/stringprintf.h"
#include "base/utf_string_conversions.h" #include "base/utf_string_conversions.h"
namespace ui { namespace ui {
...@@ -43,6 +44,7 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { ...@@ -43,6 +44,7 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) {
return VKEY_DELETE; return VKEY_DELETE;
case XK_Tab: case XK_Tab:
case XK_KP_Tab: case XK_KP_Tab:
case XK_ISO_Left_Tab:
return VKEY_TAB; return VKEY_TAB;
case XK_Linefeed: case XK_Linefeed:
case XK_Return: case XK_Return:
...@@ -313,8 +315,7 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) { ...@@ -313,8 +315,7 @@ KeyboardCode KeyboardCodeFromXKeysym(unsigned int keysym) {
// TODO(sad): some keycodes are still missing. // TODO(sad): some keycodes are still missing.
} }
DLOG(WARNING) << "Unknown keysym: " << StringPrintf("0x%x", keysym);
DLOG(WARNING) << "Unknown keycode: " << keysym;
return VKEY_UNKNOWN; return VKEY_UNKNOWN;
} }
...@@ -616,6 +617,7 @@ int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) { ...@@ -616,6 +617,7 @@ int XKeysymForWindowsKeyCode(KeyboardCode keycode, bool shift) {
return XK_F1 + (keycode - VKEY_F1); return XK_F1 + (keycode - VKEY_F1);
default: default:
LOG(WARNING) << "Unknown keycode:" << keycode;
return 0; return 0;
} }
} }
......
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