From 01cb22f16ab84046e1e3f5f4fdd3d2b17d5a585a Mon Sep 17 00:00:00 2001 From: Henrik Rydgard Date: Sun, 29 Jun 2014 23:29:49 +0200 Subject: [PATCH] Windows: Add WM_CHAR input support (not used for anything yet). Some unicode cleanup. --- Windows/EmuThread.cpp | 5 +++-- Windows/RawInput.cpp | 41 +++++++++++++++++++++++++++++++-------- Windows/RawInput.h | 2 ++ Windows/WndMainWindow.cpp | 6 +++++- Windows/main.cpp | 2 +- 5 files changed, 44 insertions(+), 12 deletions(-) diff --git a/Windows/EmuThread.cpp b/Windows/EmuThread.cpp index 35d7cd2633..29a3294e78 100644 --- a/Windows/EmuThread.cpp +++ b/Windows/EmuThread.cpp @@ -3,6 +3,7 @@ #include "base/timeutil.h" #include "base/NativeApp.h" #include "base/mutex.h" +#include "util/text/utf8.h" #include "Common/Log.h" #include "Common/StringUtils.h" #include "../Globals.h" @@ -99,7 +100,7 @@ unsigned int WINAPI TheThread(void *) u32 colour_depth = GetDeviceCaps(dc, BITSPIXEL); ReleaseDC(NULL, dc); if (colour_depth != 32){ - MessageBoxA(0, "Please switch your display to 32-bit colour mode", "OpenGL Error", MB_OK); + MessageBox(0, L"Please switch your display to 32-bit colour mode", L"OpenGL Error", MB_OK); ExitProcess(1); } @@ -107,7 +108,7 @@ unsigned int WINAPI TheThread(void *) if (!host->InitGL(&error_string)) { Reporting::ReportMessage("OpenGL init error: %s", error_string.c_str()); std::string full_error = StringFromFormat( "Failed initializing OpenGL. Try upgrading your graphics drivers.\n\nError message:\n\n%s", error_string.c_str()); - MessageBoxA(0, full_error.c_str(), "OpenGL Error", MB_OK | MB_ICONERROR); + MessageBox(0, ConvertUTF8ToWString(full_error).c_str(), L"OpenGL Error", MB_OK | MB_ICONERROR); ERROR_LOG(BOOT, full_error.c_str()); // No safe way out without OpenGL. diff --git a/Windows/RawInput.cpp b/Windows/RawInput.cpp index 1646d2294a..babcf69876 100644 --- a/Windows/RawInput.cpp +++ b/Windows/RawInput.cpp @@ -91,25 +91,41 @@ namespace WindowsRawInput { } static int GetTrueVKey(const RAWKEYBOARD &kb) { + int vKey = kb.VKey; switch (kb.VKey) { case VK_SHIFT: - return MapVirtualKey(kb.MakeCode, MAPVK_VSC_TO_VK_EX); + vKey = MapVirtualKey(kb.MakeCode, MAPVK_VSC_TO_VK_EX); + break; case VK_CONTROL: if (kb.Flags & RI_KEY_E0) - return VK_RCONTROL; + vKey = VK_RCONTROL; else - return VK_LCONTROL; + vKey = VK_LCONTROL; + break; case VK_MENU: if (kb.Flags & RI_KEY_E0) - return VK_RMENU; // Right Alt / AltGr + vKey = VK_RMENU; // Right Alt / AltGr else - return VK_LMENU; // Left Alt + vKey = VK_LMENU; // Left Alt + + //case VK_RETURN: + // if (kb.Flags & RI_KEY_E0) + // vKey = VK_RETURN; // Numeric return - no code for this. Can special case. + // break; + + // Source: http://molecularmusings.wordpress.com/2011/09/05/properly-handling-keyboard-input/ + case VK_NUMLOCK: + // correct PAUSE/BREAK and NUM LOCK silliness, and set the extended bit + vKey = MapVirtualKey(kb.VKey, MAPVK_VK_TO_VSC) | 0x100; + break; default: - return kb.VKey; + break; } + + return windowsTransTable[vKey]; } void ProcessKeyboard(RAWINPUT *raw, bool foreground) { @@ -123,7 +139,7 @@ namespace WindowsRawInput { if (raw->data.keyboard.Message == WM_KEYDOWN || raw->data.keyboard.Message == WM_SYSKEYDOWN) { key.flags = KEY_DOWN; - key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; + key.keyCode = GetTrueVKey(raw->data.keyboard); if (key.keyCode) { NativeKey(key); @@ -131,7 +147,7 @@ namespace WindowsRawInput { } } else if (raw->data.keyboard.Message == WM_KEYUP) { key.flags = KEY_UP; - key.keyCode = windowsTransTable[GetTrueVKey(raw->data.keyboard)]; + key.keyCode = GetTrueVKey(raw->data.keyboard); if (key.keyCode) { NativeKey(key); @@ -143,6 +159,15 @@ namespace WindowsRawInput { } } + LRESULT ProcessChar(HWND hWnd, WPARAM wParam, LPARAM lParam) { + KeyInput key; + key.keyCode = wParam; // Note that this is NOT a NKCODE but a Unicode character! + key.flags = KEY_CHAR; + key.deviceId = DEVICE_ID_KEYBOARD; + NativeKey(key); + return 0; + } + void ProcessMouse(RAWINPUT *raw, bool foreground) { if (menuActive && UpdateMenuActive()) { // Ignore mouse input while a menu is active, it's probably interacting with the menu. diff --git a/Windows/RawInput.h b/Windows/RawInput.h index c662ccd2d2..b5a95a55ca 100644 --- a/Windows/RawInput.h +++ b/Windows/RawInput.h @@ -20,6 +20,8 @@ namespace WindowsRawInput { void Init(); LRESULT Process(HWND hWnd, WPARAM wParam, LPARAM lParam); + // Not actually RawInput but it kinda belongs here anyway. + LRESULT ProcessChar(HWND hWnd, WPARAM wParam, LPARAM lParam); void LoseFocus(); void NotifyMenu(); void Shutdown(); diff --git a/Windows/WndMainWindow.cpp b/Windows/WndMainWindow.cpp index fa83d8cde8..79f44b8730 100644 --- a/Windows/WndMainWindow.cpp +++ b/Windows/WndMainWindow.cpp @@ -1595,6 +1595,10 @@ namespace MainWindow // TODO: Could do something useful with WM_INPUT_DEVICE_CHANGE? + // Not sure why we are actually getting WM_CHAR even though we use RawInput, but alright.. + case WM_CHAR: + return WindowsRawInput::ProcessChar(hWnd, wParam, lParam); + case WM_VERYSLEEPY_MSG: switch (wParam) { case VERYSLEEPY_WPARAM_SUPPORTED: @@ -1930,7 +1934,7 @@ namespace MainWindow HWND versionBox = GetDlgItem(hDlg, IDC_VERSION); char temp[256]; sprintf(temp, "PPSSPP %s", PPSSPP_GIT_VERSION); - SetWindowTextA(versionBox, temp); + SetWindowText(versionBox, ConvertUTF8ToWString(temp).c_str()); } return TRUE; diff --git a/Windows/main.cpp b/Windows/main.cpp index 1207911c07..b670b4a564 100644 --- a/Windows/main.cpp +++ b/Windows/main.cpp @@ -181,7 +181,7 @@ void EnableCrashingOnCrashes() typedef BOOL (WINAPI *tSetPolicy)(DWORD dwFlags); const DWORD EXCEPTION_SWALLOWING = 0x1; - HMODULE kernel32 = LoadLibraryA("kernel32.dll"); + HMODULE kernel32 = LoadLibrary(L"kernel32.dll"); tGetPolicy pGetPolicy = (tGetPolicy)GetProcAddress(kernel32, "GetProcessUserModeExceptionPolicy"); tSetPolicy pSetPolicy = (tSetPolicy)GetProcAddress(kernel32,