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 "Alt";
case Qt::Key_Clear:
return "Clear";
case Qt::Key_Down:
return "Down";
case Qt::Key_End:
return "End";
case Qt::Key_Return:
case Qt::Key_Enter:
return "Enter";
case Qt::Key_Execute:
return "Execute";
case Qt::Key_F1:
return "F1";
case Qt::Key_F2:
return "F2";
case Qt::Key_F3:
return "F3";
case Qt::Key_F4:
return "F4";
case Qt::Key_F5:
return "F5";
case Qt::Key_F6:
return "F6";
case Qt::Key_F7:
return "F7";
case Qt::Key_F8:
return "F8";
case Qt::Key_F9:
return "F9";
case Qt::Key_F10:
return "F10";
case Qt::Key_F11:
return "F11";
case Qt::Key_F12:
return "F12";
case Qt::Key_F13:
return "F13";
case Qt::Key_F14:
return "F14";
case Qt::Key_F15:
return "F15";
case Qt::Key_F16:
return "F16";
case Qt::Key_F17:
return "F17";
case Qt::Key_F18:
return "F18";
case Qt::Key_F19:
return "F19";
case Qt::Key_F20:
return "F20";
case Qt::Key_F21:
return "F21";
case Qt::Key_F22:
return "F22";
case Qt::Key_F23:
return "F23";
case Qt::Key_F24:
return "F24";
case Qt::Key_Help:
return "Help";
case Qt::Key_Home:
return "Home";
case Qt::Key_Insert:
return "Insert";
case Qt::Key_Left:
return "Left";
case Qt::Key_PageDown:
return "PageDown";
case Qt::Key_PageUp:
return "PageUp";
case Qt::Key_Pause:
return "Pause";
case Qt::Key_Print:
return "PrintScreen";
case Qt::Key_Right:
return "Right";
case Qt::Key_Select:
return "Select";
case Qt::Key_Up:
return "Up";
case Qt::Key_Delete:
return "U+007F";
case Qt::Key_Backspace:
return "U+0008";
case Qt::Key_Tab:
return "U+0009";
case Qt::Key_Backtab:
return "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_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; 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 "\t";
break;
case Qt::Key_Enter:
if (event->text().isNull())
return "\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();
}
}