Bug 1019427 Log scancode -> virtual keycode table on Windows r=jimm

This commit is contained in:
Masayuki Nakano 2014-06-14 11:24:16 +09:00
Родитель f31b35e66b
Коммит 46b69fa08c
2 изменённых файлов: 132 добавлений и 1 удалений

Просмотреть файл

@ -3,6 +3,11 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifdef MOZ_LOGGING
#define FORCE_PR_LOG /* Allow logging in the release build */
#endif // MOZ_LOGGING
#include "prlog.h"
#include "mozilla/ArrayUtils.h"
#include "mozilla/DebugOnly.h"
#include "mozilla/MouseEvents.h"
@ -48,6 +53,98 @@
namespace mozilla {
namespace widget {
#ifdef PR_LOGGING
static const char* kVirtualKeyName[] = {
"NULL", "VK_LBUTTON", "VK_RBUTTON", "VK_CANCEL",
"VK_MBUTTON", "VK_XBUTTON1", "VK_XBUTTON2", "0x07",
"VK_BACK", "VK_TAB", "0x0A", "0x0B",
"VK_CLEAR", "VK_RETURN", "0x0E", "0x0F",
"VK_SHIFT", "VK_CONTROL", "VK_MENU", "VK_PAUSE",
"VK_CAPITAL", "VK_KANA, VK_HANGUL", "0x16", "VK_JUNJA",
"VK_FINAL", "VK_HANJA, VK_KANJI", "0x1A", "VK_ESCAPE",
"VK_CONVERT", "VK_NONCONVERT", "VK_ACCEPT", "VK_MODECHANGE",
"VK_SPACE", "VK_PRIOR", "VK_NEXT", "VK_END",
"VK_HOME", "VK_LEFT", "VK_UP", "VK_RIGHT",
"VK_DOWN", "VK_SELECT", "VK_PRINT", "VK_EXECUTE",
"VK_SNAPSHOT", "VK_INSERT", "VK_DELETE", "VK_HELP",
"VK_0", "VK_1", "VK_2", "VK_3",
"VK_4", "VK_5", "VK_6", "VK_7",
"VK_8", "VK_9", "0x3A", "0x3B",
"0x3C", "0x3D", "0x3E", "0x3F",
"0x40", "VK_A", "VK_B", "VK_C",
"VK_D", "VK_E", "VK_F", "VK_G",
"VK_H", "VK_I", "VK_J", "VK_K",
"VK_L", "VK_M", "VK_N", "VK_O",
"VK_P", "VK_Q", "VK_R", "VK_S",
"VK_T", "VK_U", "VK_V", "VK_W",
"VK_X", "VK_Y", "VK_Z", "VK_LWIN",
"VK_RWIN", "VK_APPS", "0x5E", "VK_SLEEP",
"VK_NUMPAD0", "VK_NUMPAD1", "VK_NUMPAD2", "VK_NUMPAD3",
"VK_NUMPAD4", "VK_NUMPAD5", "VK_NUMPAD6", "VK_NUMPAD7",
"VK_NUMPAD8", "VK_NUMPAD9", "VK_MULTIPLY", "VK_ADD",
"VK_SEPARATOR", "VK_SUBTRACT", "VK_DECIMAL", "VK_DIVIDE",
"VK_F1", "VK_F2", "VK_F3", "VK_F4",
"VK_F5", "VK_F6", "VK_F7", "VK_F8",
"VK_F9", "VK_F10", "VK_F11", "VK_F12",
"VK_F13", "VK_F14", "VK_F15", "VK_F16",
"VK_F17", "VK_F18", "VK_F19", "VK_F20",
"VK_F21", "VK_F22", "VK_F23", "VK_F24",
"0x88", "0x89", "0x8A", "0x8B",
"0x8C", "0x8D", "0x8E", "0x8F",
"VK_NUMLOCK", "VK_SCROLL", "VK_OEM_NEC_EQUAL, VK_OEM_FJ_JISHO",
"VK_OEM_FJ_MASSHOU",
"VK_OEM_FJ_TOUROKU", "VK_OEM_FJ_LOYA", "VK_OEM_FJ_ROYA", "0x97",
"0x98", "0x99", "0x9A", "0x9B",
"0x9C", "0x9D", "0x9E", "0x9F",
"VK_LSHIFT", "VK_RSHIFT", "VK_LCONTROL", "VK_RCONTROL",
"VK_LMENU", "VK_RMENU", "VK_BROWSER_BACK", "VK_BROWSER_FORWARD",
"VK_BROWSER_REFRESH", "VK_BROWSER_STOP", "VK_BROWSER_SEARCH",
"VK_BROWSER_FAVORITES",
"VK_BROWSER_HOME", "VK_VOLUME_MUTE", "VK_VOLUME_DOWN", "VK_VOLUME_UP",
"VK_MEDIA_NEXT_TRACK", "VK_MEDIA_PREV_TRACK", "VK_MEDIA_STOP",
"VK_MEDIA_PLAY_PAUSE",
"VK_LAUNCH_MAIL", "VK_LAUNCH_MEDIA_SELECT", "VK_LAUNCH_APP1",
"VK_LAUNCH_APP2",
"0xB8", "0xB9", "VK_OEM_1", "VK_OEM_PLUS",
"VK_OEM_COMMA", "VK_OEM_MINUS", "VK_OEM_PERIOD", "VK_OEM_2",
"VK_OEM_3", "VK_ABNT_C1", "VK_ABNT_C2", "0xC3",
"0xC4", "0xC5", "0xC6", "0xC7",
"0xC8", "0xC9", "0xCA", "0xCB",
"0xCC", "0xCD", "0xCE", "0xCF",
"0xD0", "0xD1", "0xD2", "0xD3",
"0xD4", "0xD5", "0xD6", "0xD7",
"0xD8", "0xD9", "0xDA", "VK_OEM_4",
"VK_OEM_5", "VK_OEM_6", "VK_OEM_7", "VK_OEM_8",
"0xE0", "VK_OEM_AX", "VK_OEM_102", "VK_ICO_HELP",
"VK_ICO_00", "VK_PROCESSKEY", "VK_ICO_CLEAR", "VK_PACKET",
"0xE8", "VK_OEM_RESET", "VK_OEM_JUMP", "VK_OEM_PA1",
"VK_OEM_PA2", "VK_OEM_PA3", "VK_OEM_WSCTRL", "VK_OEM_CUSEL",
"VK_OEM_ATTN", "VK_OEM_FINISH", "VK_OEM_COPY", "VK_OEM_AUTO",
"VK_OEM_ENLW", "VK_OEM_BACKTAB", "VK_ATTN", "VK_CRSEL",
"VK_EXSEL", "VK_EREOF", "VK_PLAY", "VK_ZOOM",
"VK_NONAME", "VK_PA1", "VK_OEM_CLEAR", "0xFF"
};
static_assert(sizeof(kVirtualKeyName) / sizeof(const char*) == 0x100,
"The virtual key name must be defined just 256 keys");
#endif // #ifdef PR_LOGGING
// Unique id counter associated with a keydown / keypress events. Used in
// identifing keypress events for removal from async event dispatch queue
// in metrofx after preventDefault is called on keydown events.
@ -1853,11 +1950,20 @@ NativeKey::DispatchKeyPressEventForFollowingCharMessage(
KeyboardLayout* KeyboardLayout::sInstance = nullptr;
nsIIdleServiceInternal* KeyboardLayout::sIdleService = nullptr;
#ifdef PR_LOGGING
PRLogModuleInfo* sKeyboardLayoutLogger = nullptr;
#endif // #ifdef PR_LOGGING
// static
KeyboardLayout*
KeyboardLayout::GetInstance()
{
if (!sInstance) {
#ifdef PR_LOGGING
if (!sKeyboardLayoutLogger) {
sKeyboardLayoutLogger = PR_NewLogModule("KeyboardLayoutWidgets");
}
#endif // #ifdef PR_LOGGING
sInstance = new KeyboardLayout();
nsCOMPtr<nsIIdleServiceInternal> idleService =
do_GetService("@mozilla.org/widget/idleservice;1");
@ -2146,6 +2252,31 @@ KeyboardLayout::LoadLayout(HKL aLayout)
}
::SetKeyboardState(originalKbdState);
#ifdef PR_LOGGING
if (PR_LOG_TEST(sKeyboardLayoutLogger, PR_LOG_DEBUG)) {
static const UINT kExtendedScanCode[] = { 0x0000, 0xE000 };
static const UINT kMapType =
IsVistaOrLater() ? MAPVK_VSC_TO_VK_EX : MAPVK_VSC_TO_VK;
PR_LOG(sKeyboardLayoutLogger, PR_LOG_DEBUG,
("Logging virtual keycode values for scancode (0x%08X)...",
reinterpret_cast<const uint32_t>(mKeyboardLayout)));
for (uint32_t i = 0; i < ArrayLength(kExtendedScanCode); i++) {
for (uint32_t j = 1; j <= 0xFF; j++) {
UINT scanCode = kExtendedScanCode[i] + j;
UINT virtualKeyCode =
::MapVirtualKeyEx(scanCode, kMapType, mKeyboardLayout);
PR_LOG(sKeyboardLayoutLogger, PR_LOG_DEBUG,
("0x%04X, %s", scanCode, kVirtualKeyName[virtualKeyCode]));
}
// XP and Server 2003 don't support 0xE0 prefix of the scancode.
// Therefore, we don't need to continue on them.
if (!IsVistaOrLater()) {
break;
}
}
}
#endif // #ifdef PR_LOGGING
}
inline int32_t

Просмотреть файл

@ -24,7 +24,6 @@ UNIFIED_SOURCES += [
'GfxInfo.cpp',
'IEnumFE.cpp',
'JumpListItem.cpp',
'KeyboardLayout.cpp',
'nsAppShell.cpp',
'nsClipboard.cpp',
'nsColorPicker.cpp',
@ -59,6 +58,7 @@ UNIFIED_SOURCES += [
# The following files cannot be built in unified mode because they force NSPR logging.
SOURCES += [
'KeyboardLayout.cpp',
'nsIMM32Handler.cpp',
'WinMouseScrollHandler.cpp',
'WinUtils.cpp',