PlatformKeyboardEventQt.cpp [plain text]
#include "config.h"
#include "PlatformKeyboardEvent.h"
#include "NotImplemented.h"
#include "WindowsKeyboardCodes.h"
#include <QKeyEvent>
#include <ctype.h>
#include <wtf/CurrentTime.h>
namespace WebCore {
String keyIdentifierForQtKeyCode(int keyCode)
{
switch (keyCode) {
case Qt::Key_Menu:
case Qt::Key_Alt:
return ASCIILiteral("Alt");
case Qt::Key_Clear:
return ASCIILiteral("Clear");
case Qt::Key_Down:
return ASCIILiteral("Down");
case Qt::Key_End:
return ASCIILiteral("End");
case Qt::Key_Return:
case Qt::Key_Enter:
return ASCIILiteral("Enter");
case Qt::Key_Execute:
return ASCIILiteral("Execute");
case Qt::Key_F1:
return ASCIILiteral("F1");
case Qt::Key_F2:
return ASCIILiteral("F2");
case Qt::Key_F3:
return ASCIILiteral("F3");
case Qt::Key_F4:
return ASCIILiteral("F4");
case Qt::Key_F5:
return ASCIILiteral("F5");
case Qt::Key_F6:
return ASCIILiteral("F6");
case Qt::Key_F7:
return ASCIILiteral("F7");
case Qt::Key_F8:
return ASCIILiteral("F8");
case Qt::Key_F9:
return ASCIILiteral("F9");
case Qt::Key_F10:
return ASCIILiteral("F10");
case Qt::Key_F11:
return ASCIILiteral("F11");
case Qt::Key_F12:
return ASCIILiteral("F12");
case Qt::Key_F13:
return ASCIILiteral("F13");
case Qt::Key_F14:
return ASCIILiteral("F14");
case Qt::Key_F15:
return ASCIILiteral("F15");
case Qt::Key_F16:
return ASCIILiteral("F16");
case Qt::Key_F17:
return ASCIILiteral("F17");
case Qt::Key_F18:
return ASCIILiteral("F18");
case Qt::Key_F19:
return ASCIILiteral("F19");
case Qt::Key_F20:
return ASCIILiteral("F20");
case Qt::Key_F21:
return ASCIILiteral("F21");
case Qt::Key_F22:
return ASCIILiteral("F22");
case Qt::Key_F23:
return ASCIILiteral("F23");
case Qt::Key_F24:
return ASCIILiteral("F24");
case Qt::Key_Help:
return ASCIILiteral("Help");
case Qt::Key_Home:
return ASCIILiteral("Home");
case Qt::Key_Insert:
return ASCIILiteral("Insert");
case Qt::Key_Left:
return ASCIILiteral("Left");
case Qt::Key_PageDown:
return ASCIILiteral("PageDown");
case Qt::Key_PageUp:
return ASCIILiteral("PageUp");
case Qt::Key_Pause:
return ASCIILiteral("Pause");
case Qt::Key_Print:
return ASCIILiteral("PrintScreen");
case Qt::Key_Right:
return ASCIILiteral("Right");
case Qt::Key_Select:
return ASCIILiteral("Select");
case Qt::Key_Up:
return ASCIILiteral("Up");
case Qt::Key_Delete:
return ASCIILiteral("U+007F");
case Qt::Key_Backspace:
return ASCIILiteral("U+0008");
case Qt::Key_Tab:
return ASCIILiteral("U+0009");
case Qt::Key_Backtab:
return ASCIILiteral("U+0009");
default:
return String::format("U+%04X", toupper(keyCode));
}
}
int windowsKeyCodeForKeyEvent(unsigned int keycode, bool isKeypad)
{
if (isKeypad) {
switch (keycode) {
case Qt::Key_0:
return VK_NUMPAD0; case Qt::Key_1:
return VK_NUMPAD1; case Qt::Key_2:
return VK_NUMPAD2; case Qt::Key_3:
return VK_NUMPAD3; case Qt::Key_4:
return VK_NUMPAD4; case Qt::Key_5:
return VK_NUMPAD5; case Qt::Key_6:
return VK_NUMPAD6; case Qt::Key_7:
return VK_NUMPAD7; case Qt::Key_8:
return VK_NUMPAD8; case Qt::Key_9:
return VK_NUMPAD9; case Qt::Key_Asterisk:
return VK_MULTIPLY; case Qt::Key_Plus:
return VK_ADD; case Qt::Key_Minus:
return VK_SUBTRACT; case Qt::Key_Period:
return VK_DECIMAL; case Qt::Key_Slash:
return VK_DIVIDE; case Qt::Key_PageUp:
return VK_PRIOR; case Qt::Key_PageDown:
return VK_NEXT; case Qt::Key_End:
return VK_END; case Qt::Key_Home:
return VK_HOME; case Qt::Key_Left:
return VK_LEFT; case Qt::Key_Up:
return VK_UP; case Qt::Key_Right:
return VK_RIGHT; case Qt::Key_Down:
return VK_DOWN; case Qt::Key_Enter:
case Qt::Key_Return:
return VK_RETURN; case Qt::Key_Insert:
return VK_INSERT; case Qt::Key_Delete:
return VK_DELETE; default:
return 0;
}
} else
switch (keycode) {
case Qt::Key_Backspace:
return VK_BACK; case Qt::Key_Backtab:
case Qt::Key_Tab:
return VK_TAB; case Qt::Key_Clear:
return VK_CLEAR; case Qt::Key_Enter:
case Qt::Key_Return:
return VK_RETURN; case Qt::Key_Shift:
return VK_SHIFT; case Qt::Key_Control:
return VK_CONTROL; case Qt::Key_Menu:
case Qt::Key_Alt:
return VK_MENU;
case Qt::Key_F1:
return VK_F1;
case Qt::Key_F2:
return VK_F2;
case Qt::Key_F3:
return VK_F3;
case Qt::Key_F4:
return VK_F4;
case Qt::Key_F5:
return VK_F5;
case Qt::Key_F6:
return VK_F6;
case Qt::Key_F7:
return VK_F7;
case Qt::Key_F8:
return VK_F8;
case Qt::Key_F9:
return VK_F9;
case Qt::Key_F10:
return VK_F10;
case Qt::Key_F11:
return VK_F11;
case Qt::Key_F12:
return VK_F12;
case Qt::Key_F13:
return VK_F13;
case Qt::Key_F14:
return VK_F14;
case Qt::Key_F15:
return VK_F15;
case Qt::Key_F16:
return VK_F16;
case Qt::Key_F17:
return VK_F17;
case Qt::Key_F18:
return VK_F18;
case Qt::Key_F19:
return VK_F19;
case Qt::Key_F20:
return VK_F20;
case Qt::Key_F21:
return VK_F21;
case Qt::Key_F22:
return VK_F22;
case Qt::Key_F23:
return VK_F23;
case Qt::Key_F24:
return VK_F24;
case Qt::Key_Pause:
return VK_PAUSE; case Qt::Key_CapsLock:
return VK_CAPITAL; case Qt::Key_Kana_Lock:
case Qt::Key_Kana_Shift:
return VK_KANA; case Qt::Key_Hangul:
return VK_HANGUL; case Qt::Key_Hangul_Hanja:
return VK_HANJA; case Qt::Key_Kanji:
return VK_KANJI; case Qt::Key_Escape:
return VK_ESCAPE; case Qt::Key_Space:
return VK_SPACE; case Qt::Key_PageUp:
return VK_PRIOR; case Qt::Key_PageDown:
return VK_NEXT; case Qt::Key_End:
return VK_END; case Qt::Key_Home:
return VK_HOME; case Qt::Key_Left:
return VK_LEFT; case Qt::Key_Up:
return VK_UP; case Qt::Key_Right:
return VK_RIGHT; case Qt::Key_Down:
return VK_DOWN; case Qt::Key_Select:
return VK_SELECT; case Qt::Key_Print:
return VK_SNAPSHOT; case Qt::Key_Execute:
return VK_EXECUTE; case Qt::Key_Insert:
return VK_INSERT; case Qt::Key_Delete:
return VK_DELETE; case Qt::Key_Help:
return VK_HELP; case Qt::Key_0:
case Qt::Key_ParenLeft:
return VK_0; case Qt::Key_1:
return VK_1; case Qt::Key_2:
case Qt::Key_At:
return VK_2; case Qt::Key_3:
case Qt::Key_NumberSign:
return VK_3; case Qt::Key_4:
case Qt::Key_Dollar: return VK_4;
case Qt::Key_5:
case Qt::Key_Percent:
return VK_5; case Qt::Key_6:
case Qt::Key_AsciiCircum:
return VK_6; case Qt::Key_7:
case Qt::Key_Ampersand:
return VK_7; case Qt::Key_8:
case Qt::Key_Asterisk:
return VK_8; case Qt::Key_9:
case Qt::Key_ParenRight:
return VK_9; case Qt::Key_A:
return VK_A; case Qt::Key_B:
return VK_B; case Qt::Key_C:
return VK_C; case Qt::Key_D:
return VK_D; case Qt::Key_E:
return VK_E; case Qt::Key_F:
return VK_F; case Qt::Key_G:
return VK_G; case Qt::Key_H:
return VK_H; case Qt::Key_I:
return VK_I; case Qt::Key_J:
return VK_J; case Qt::Key_K:
return VK_K; case Qt::Key_L:
return VK_L; case Qt::Key_M:
return VK_M; case Qt::Key_N:
return VK_N; case Qt::Key_O:
return VK_O; case Qt::Key_P:
return VK_P; case Qt::Key_Q:
return VK_Q; case Qt::Key_R:
return VK_R; case Qt::Key_S:
return VK_S; case Qt::Key_T:
return VK_T; case Qt::Key_U:
return VK_U; case Qt::Key_V:
return VK_V; case Qt::Key_W:
return VK_W; case Qt::Key_X:
return VK_X; case Qt::Key_Y:
return VK_Y; case Qt::Key_Z:
return VK_Z; case Qt::Key_Meta:
return VK_LWIN;
case Qt::Key_NumLock:
return VK_NUMLOCK;
case Qt::Key_ScrollLock:
return VK_SCROLL;
case Qt::Key_VolumeMute:
return VK_VOLUME_MUTE; case Qt::Key_VolumeDown:
return VK_VOLUME_DOWN; case Qt::Key_VolumeUp:
return VK_VOLUME_UP; case Qt::Key_MediaNext:
return VK_MEDIA_NEXT_TRACK; case Qt::Key_MediaPrevious:
return VK_MEDIA_PREV_TRACK; case Qt::Key_MediaStop:
return VK_MEDIA_STOP; case Qt::Key_MediaTogglePlayPause:
return VK_MEDIA_PLAY_PAUSE;
case Qt::Key_Semicolon:
case Qt::Key_Colon:
return VK_OEM_1; case Qt::Key_Plus:
case Qt::Key_Equal:
return VK_OEM_PLUS; case Qt::Key_Comma:
case Qt::Key_Less:
return VK_OEM_COMMA; case Qt::Key_Minus:
case Qt::Key_Underscore:
return VK_OEM_MINUS; case Qt::Key_Period:
case Qt::Key_Greater:
return VK_OEM_PERIOD; case Qt::Key_Slash:
case Qt::Key_Question:
return VK_OEM_2; case Qt::Key_AsciiTilde:
case Qt::Key_QuoteLeft:
return VK_OEM_3; case Qt::Key_BracketLeft:
case Qt::Key_BraceLeft:
return VK_OEM_4; case Qt::Key_Backslash:
case Qt::Key_Bar:
return VK_OEM_5; case Qt::Key_BracketRight:
case Qt::Key_BraceRight:
return VK_OEM_6; case Qt::Key_QuoteDbl:
return VK_OEM_7;
case Qt::Key_AudioRewind:
return 0xE3; case Qt::Key_AudioForward:
return 0xE4;
default:
return 0;
}
}
static bool isVirtualKeyCodeRepresentingCharacter(int code)
{
switch (code) {
case VK_SPACE:
case VK_0:
case VK_1:
case VK_2:
case VK_3:
case VK_4:
case VK_5:
case VK_6:
case VK_7:
case VK_8:
case VK_9:
case VK_A:
case VK_B:
case VK_C:
case VK_D:
case VK_E:
case VK_F:
case VK_G:
case VK_H:
case VK_I:
case VK_J:
case VK_K:
case VK_L:
case VK_M:
case VK_N:
case VK_O:
case VK_P:
case VK_Q:
case VK_R:
case VK_S:
case VK_T:
case VK_U:
case VK_V:
case VK_W:
case VK_X:
case VK_Y:
case VK_Z:
case VK_NUMPAD0:
case VK_NUMPAD1:
case VK_NUMPAD2:
case VK_NUMPAD3:
case VK_NUMPAD4:
case VK_NUMPAD5:
case VK_NUMPAD6:
case VK_NUMPAD7:
case VK_NUMPAD8:
case VK_NUMPAD9:
case VK_MULTIPLY:
case VK_ADD:
case VK_SEPARATOR:
case VK_SUBTRACT:
case VK_DECIMAL:
case VK_DIVIDE:
case VK_OEM_1:
case VK_OEM_PLUS:
case VK_OEM_COMMA:
case VK_OEM_MINUS:
case VK_OEM_PERIOD:
case VK_OEM_2:
case VK_OEM_3:
case VK_OEM_4:
case VK_OEM_5:
case VK_OEM_6:
case VK_OEM_7:
return true;
default:
return false;
}
}
static String keyTextForKeyEvent(const QKeyEvent* event)
{
switch (event->key()) {
case Qt::Key_Tab:
case Qt::Key_Backtab:
if (event->text().isNull())
return ASCIILiteral("\t");
break;
case Qt::Key_Return:
case Qt::Key_Enter:
if (event->text().isNull())
return ASCIILiteral("\r");
}
return event->text();
}
PlatformKeyboardEvent::PlatformKeyboardEvent(QKeyEvent* event)
{
const int state = event->modifiers();
m_type = (event->type() == QEvent::KeyRelease) ? PlatformEvent::KeyUp : PlatformEvent::KeyDown;
m_modifiers = 0;
if ((state & Qt::ShiftModifier) || event->key() == Qt::Key_Backtab) m_modifiers |= ShiftKey;
if (state & Qt::ControlModifier)
m_modifiers |= CtrlKey;
if (state & Qt::AltModifier)
m_modifiers |= AltKey;
if (state & Qt::MetaModifier)
m_modifiers |= MetaKey;
m_text = keyTextForKeyEvent(event);
m_unmodifiedText = m_text; m_keyIdentifier = keyIdentifierForQtKeyCode(event->key());
m_autoRepeat = event->isAutoRepeat();
m_isKeypad = (state & Qt::KeypadModifier);
m_isSystemKey = false;
m_windowsVirtualKeyCode = windowsKeyCodeForKeyEvent(event->key(), m_isKeypad);
m_nativeVirtualKeyCode = event->nativeVirtualKey();
m_macCharCode = 0;
m_qtEvent = event;
m_timestamp = WTF::currentTime();
}
void PlatformKeyboardEvent::disambiguateKeyDownEvent(Type type, bool)
{
ASSERT(m_type == PlatformEvent::KeyDown);
m_type = type;
if (type == PlatformEvent::RawKeyDown) {
m_text = String();
m_unmodifiedText = String();
} else {
if (m_text.isEmpty() && m_windowsVirtualKeyCode && isVirtualKeyCodeRepresentingCharacter(m_windowsVirtualKeyCode))
m_text.append(UChar(m_windowsVirtualKeyCode));
m_keyIdentifier = String();
m_windowsVirtualKeyCode = 0;
}
}
bool PlatformKeyboardEvent::currentCapsLockState()
{
notImplemented();
return false;
}
void PlatformKeyboardEvent::getCurrentModifierState(bool& shiftKey, bool& ctrlKey, bool& altKey, bool& metaKey)
{
notImplemented();
shiftKey = false;
ctrlKey = false;
altKey = false;
metaKey = false;
}
uint32_t PlatformKeyboardEvent::nativeModifiers() const
{
ASSERT(m_qtEvent);
return m_qtEvent->nativeModifiers();
}
uint32_t PlatformKeyboardEvent::nativeScanCode() const
{
ASSERT(m_qtEvent);
return m_qtEvent->nativeScanCode();
}
}