Changeset View
Changeset View
Standalone View
Standalone View
intern/ghost/intern/GHOST_SystemWin32.cpp
| Show First 20 Lines • Show All 92 Lines • ▼ Show 20 Lines | |||||
| key = GHOST_kKeyMediaStop; | key = GHOST_kKeyMediaStop; | ||||
| break; | break; | ||||
| case VK_MEDIA_PREV_TRACK: | case VK_MEDIA_PREV_TRACK: | ||||
| key = GHOST_kKeyMediaFirst; | key = GHOST_kKeyMediaFirst; | ||||
| break; | break; | ||||
| case VK_MEDIA_NEXT_TRACK: | case VK_MEDIA_NEXT_TRACK: | ||||
| key = GHOST_kKeyMediaLast; | key = GHOST_kKeyMediaLast; | ||||
| break; | break; | ||||
| case VK_PROCESSKEY: | |||||
| key = GHOST_kKeyProcessKey; | |||||
| break; | |||||
| default: | default: | ||||
| key = GHOST_kKeyUnknown; | key = GHOST_kKeyUnknown; | ||||
| break; | break; | ||||
| } | } | ||||
| } | } | ||||
| return key; | return key; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | |||||
| #ifdef WITH_INPUT_IME | #ifdef WITH_INPUT_IME | ||||
| GHOST_Event *GHOST_SystemWin32::processImeEvent(GHOST_TEventType type, | GHOST_Event *GHOST_SystemWin32::processImeEvent(GHOST_TEventType type, | ||||
| GHOST_WindowWin32 *window, | GHOST_WindowWin32 *window, | ||||
| GHOST_TEventImeData *data) | GHOST_TEventImeData *data) | ||||
| { | { | ||||
| GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); | GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); | ||||
| return new GHOST_EventIME(system->getMilliSeconds(), type, window, data); | return new GHOST_EventIME(system->getMilliSeconds(), type, window, data); | ||||
| } | } | ||||
| GHOST_Event *GHOST_SystemWin32::processImeKeyEvent(GHOST_WindowWin32 *window, | |||||
| WPARAM wParam, | |||||
| LPARAM lParam) | |||||
| { | |||||
| RAWINPUT raw; | |||||
| raw.data.keyboard.MakeCode = (lParam >> 16) & 0xFF; | |||||
| raw.data.keyboard.Flags = RI_KEY_MAKE | ((lParam >> 24) & 0x1 ? RI_KEY_E0 : 0); | |||||
| raw.data.keyboard.VKey = wParam; | |||||
| raw.data.keyboard.Message = WM_KEYDOWN; | |||||
| return processKeyEvent(window, raw); | |||||
| } | |||||
| #endif | #endif | ||||
| GHOST_TSuccess GHOST_SystemWin32::pushDragDropEvent(GHOST_TEventType eventType, | GHOST_TSuccess GHOST_SystemWin32::pushDragDropEvent(GHOST_TEventType eventType, | ||||
| GHOST_TDragnDropTypes draggedObjectType, | GHOST_TDragnDropTypes draggedObjectType, | ||||
| GHOST_WindowWin32 *window, | GHOST_WindowWin32 *window, | ||||
| int mouseX, | int mouseX, | ||||
| int mouseY, | int mouseY, | ||||
| void *data) | void *data) | ||||
| ▲ Show 20 Lines • Show All 101 Lines • ▼ Show 20 Lines | |||||
| LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | LRESULT WINAPI GHOST_SystemWin32::s_wndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) | ||||
| { | { | ||||
| GHOST_Event *event = NULL; | GHOST_Event *event = NULL; | ||||
| bool eventHandled = false; | bool eventHandled = false; | ||||
| LRESULT lResult = 0; | LRESULT lResult = 0; | ||||
| GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); | GHOST_SystemWin32 *system = (GHOST_SystemWin32 *)getSystem(); | ||||
| #ifdef WITH_INPUT_IME | |||||
| GHOST_EventManager *eventManager = system->getEventManager(); | |||||
| #endif | |||||
| GHOST_ASSERT(system, "GHOST_SystemWin32::s_wndProc(): system not initialized"); | GHOST_ASSERT(system, "GHOST_SystemWin32::s_wndProc(): system not initialized"); | ||||
| if (hwnd) { | if (hwnd) { | ||||
| if (msg == WM_NCCREATE) { | if (msg == WM_NCCREATE) { | ||||
| // Tell Windows to automatically handle scaling of non-client areas | // Tell Windows to automatically handle scaling of non-client areas | ||||
| // such as the caption bar. EnableNonClientDpiScaling was introduced in Windows 10 | // such as the caption bar. EnableNonClientDpiScaling was introduced in Windows 10 | ||||
| HMODULE m_user32 = ::LoadLibrary("User32.dll"); | HMODULE m_user32 = ::LoadLibrary("User32.dll"); | ||||
| Show All 25 Lines | |||||
| RAWINPUT raw; | RAWINPUT raw; | ||||
| RAWINPUT *raw_ptr = &raw; | RAWINPUT *raw_ptr = &raw; | ||||
| UINT rawSize = sizeof(RAWINPUT); | UINT rawSize = sizeof(RAWINPUT); | ||||
| GetRawInputData((HRAWINPUT)lParam, RID_INPUT, raw_ptr, &rawSize, sizeof(RAWINPUTHEADER)); | GetRawInputData((HRAWINPUT)lParam, RID_INPUT, raw_ptr, &rawSize, sizeof(RAWINPUTHEADER)); | ||||
| switch (raw.header.dwType) { | switch (raw.header.dwType) { | ||||
| case RIM_TYPEKEYBOARD: | case RIM_TYPEKEYBOARD: | ||||
| #ifdef WITH_INPUT_IME | |||||
| /* Cancel the WM_KEYDOWN message to receive a VK_PROCESSKEY key | |||||
| * which isn't provided here. | |||||
| */ | |||||
| if (raw.data.keyboard.Message == WM_KEYDOWN && window->getImeInput()->is_enabled()) { | |||||
| break; | |||||
| } | |||||
| #endif | |||||
| event = processKeyEvent(window, raw); | event = processKeyEvent(window, raw); | ||||
| if (!event) { | if (!event) { | ||||
| GHOST_PRINT("GHOST_SystemWin32::wndProc: key event "); | GHOST_PRINT("GHOST_SystemWin32::wndProc: key event "); | ||||
| GHOST_PRINT(msg); | GHOST_PRINT(msg); | ||||
| GHOST_PRINT(" key ignored\n"); | GHOST_PRINT(" key ignored\n"); | ||||
| } | } | ||||
| break; | break; | ||||
| #ifdef WITH_INPUT_NDOF | #ifdef WITH_INPUT_NDOF | ||||
| Show All 15 Lines | |||||
| ime->SetInputLanguage(); | ime->SetInputLanguage(); | ||||
| ime->CreateImeWindow(hwnd); | ime->CreateImeWindow(hwnd); | ||||
| ime->CleanupComposition(hwnd); | ime->CleanupComposition(hwnd); | ||||
| ime->CheckFirst(hwnd); | ime->CheckFirst(hwnd); | ||||
| break; | break; | ||||
| } | } | ||||
| case WM_IME_STARTCOMPOSITION: { | case WM_IME_STARTCOMPOSITION: { | ||||
| GHOST_ImeWin32 *ime = window->getImeInput(); | GHOST_ImeWin32 *ime = window->getImeInput(); | ||||
| eventHandled = true; | |||||
| /* remove input event before start comp event, avoid redundant input */ | |||||
| eventManager->removeTypeEvents(GHOST_kEventKeyDown, window); | |||||
| ime->CreateImeWindow(hwnd); | ime->CreateImeWindow(hwnd); | ||||
| ime->ResetComposition(hwnd); | ime->ResetComposition(hwnd); | ||||
| event = processImeEvent(GHOST_kEventImeCompositionStart, window, &ime->eventImeData); | BOOL handled = FALSE; | ||||
| ime->SetImeWindowStyle(hwnd, msg, wParam, lParam, &handled); | |||||
| eventHandled = (bool)handled; | |||||
| event = new GHOST_Event( | |||||
| system->getMilliSeconds(), GHOST_kEventImeCompositionStart, window); | |||||
| break; | break; | ||||
| } | } | ||||
| case WM_IME_COMPOSITION: { | case WM_IME_COMPOSITION: { | ||||
| GHOST_ImeWin32 *ime = window->getImeInput(); | GHOST_ImeWin32 *ime = window->getImeInput(); | ||||
| eventHandled = true; | |||||
| ime->UpdateImeWindow(hwnd); | ime->UpdateImeWindow(hwnd); | ||||
| ime->UpdateInfo(hwnd); | GHOST_TEventImeData *imeData = ime->UpdateInfo(hwnd, lParam); | ||||
| if (ime->eventImeData.result_len) { | BOOL handled = FALSE; | ||||
| /* remove redundant IME event */ | ime->SetImeWindowStyle(hwnd, msg, wParam, lParam, &handled); | ||||
| eventManager->removeTypeEvents(GHOST_kEventImeComposition, window); | eventHandled = (bool)handled; | ||||
| } | event = processImeEvent(GHOST_kEventImeComposition, window, imeData); | ||||
| event = processImeEvent(GHOST_kEventImeComposition, window, &ime->eventImeData); | |||||
| break; | break; | ||||
| } | } | ||||
| case WM_IME_ENDCOMPOSITION: { | case WM_IME_ENDCOMPOSITION: { | ||||
| GHOST_ImeWin32 *ime = window->getImeInput(); | GHOST_ImeWin32 *ime = window->getImeInput(); | ||||
| eventHandled = true; | |||||
| /* remove input event after end comp event, avoid redundant input */ | |||||
| eventManager->removeTypeEvents(GHOST_kEventKeyDown, window); | |||||
| ime->ResetComposition(hwnd); | ime->ResetComposition(hwnd); | ||||
| ime->DestroyImeWindow(hwnd); | ime->DestroyImeWindow(hwnd); | ||||
| event = processImeEvent(GHOST_kEventImeCompositionEnd, window, &ime->eventImeData); | BOOL handled = FALSE; | ||||
| ime->SetImeWindowStyle(hwnd, msg, wParam, lParam, &handled); | |||||
| eventHandled = (bool)handled; | |||||
| event = new GHOST_Event( | |||||
| system->getMilliSeconds(), GHOST_kEventImeCompositionEnd, window); | |||||
| break; | |||||
| } | |||||
| case WM_IME_KEYDOWN: { | |||||
| /* The WM_IME_KEYDOWN message is sent when a WM_IME_ENDCOMPOSITION message | |||||
| * is called to reflect the character following the IME input | |||||
| */ | |||||
| break; | |||||
| eventHandled = true; | |||||
| event = processImeKeyEvent(window, wParam, lParam); | |||||
| break; | |||||
| } | |||||
| case WM_KEYDOWN: { | |||||
| /* The WM_KEYDOWN message is processed here when IME is enabled. | |||||
| * It will replace a redundant input with a VK_PROCESSKEY key. | |||||
| */ | |||||
| if (!window->getImeInput()->is_enabled()) { | |||||
| break; | |||||
| } | |||||
| eventHandled = true; | |||||
| event = processImeKeyEvent(window, wParam, lParam); | |||||
| break; | break; | ||||
| } | } | ||||
| #endif /* WITH_INPUT_IME */ | #endif /* WITH_INPUT_IME */ | ||||
| //////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////// | ||||
| // Keyboard events, ignored | // Keyboard events, ignored | ||||
| //////////////////////////////////////////////////////////////////////// | //////////////////////////////////////////////////////////////////////// | ||||
| case WM_KEYDOWN: | |||||
| case WM_SYSKEYDOWN: | case WM_SYSKEYDOWN: | ||||
| case WM_KEYUP: | case WM_KEYUP: | ||||
| case WM_SYSKEYUP: | case WM_SYSKEYUP: | ||||
| /* These functions were replaced by WM_INPUT*/ | /* These functions were replaced by WM_INPUT*/ | ||||
| case WM_CHAR: | case WM_CHAR: | ||||
| /* The WM_CHAR message is posted to the window with the keyboard focus when | /* The WM_CHAR message is posted to the window with the keyboard focus when | ||||
| * a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR | * a WM_KEYDOWN message is translated by the TranslateMessage function. WM_CHAR | ||||
| * contains the character code of the key that was pressed. | * contains the character code of the key that was pressed. | ||||
| ▲ Show 20 Lines • Show All 92 Lines • Show Last 20 Lines | |||||