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