From 23d8060cd8494bd7a57325d8a7df1edff341b6f7 Mon Sep 17 00:00:00 2001 From: Masayuki Nakano Date: Sat, 23 Mar 2013 23:18:52 +0900 Subject: [PATCH] Bug 849647 Get rid of message order optimization on Windows r=jimm --- widget/windows/WinIMEHandler.cpp | 13 ------ widget/windows/WinIMEHandler.h | 6 --- widget/windows/nsAppShell.cpp | 78 ++++++++++--------------------- widget/windows/nsIMM32Handler.cpp | 59 ++--------------------- widget/windows/nsIMM32Handler.h | 7 +-- widget/windows/nsTextStore.h | 6 --- 6 files changed, 29 insertions(+), 140 deletions(-) diff --git a/widget/windows/WinIMEHandler.cpp b/widget/windows/WinIMEHandler.cpp index c0e9b87b650..972c53ac861 100644 --- a/widget/windows/WinIMEHandler.cpp +++ b/widget/windows/WinIMEHandler.cpp @@ -71,19 +71,6 @@ IMEHandler::GetNativeData(uint32_t aDataType) #endif // #ifdef NS_ENABLE_TSF #else } -// static -bool -IMEHandler::CanOptimizeKeyAndIMEMessages() -{ -#ifdef NS_ENABLE_TSF - if (IsTSFAvailable()) { - return nsTextStore::CanOptimizeKeyAndIMEMessages(); - } -#endif // #ifdef NS_ENABLE_TSF - - return nsIMM32Handler::CanOptimizeKeyAndIMEMessages(); -} - // static bool IMEHandler::IsIMEEnabled(const InputContext& aInputContext) diff --git a/widget/windows/WinIMEHandler.h b/widget/windows/WinIMEHandler.h index 0f371e3b456..fe9facb3682 100644 --- a/widget/windows/WinIMEHandler.h +++ b/widget/windows/WinIMEHandler.h @@ -36,12 +36,6 @@ public: */ static void* GetNativeData(uint32_t aDataType); - /** - * Returns true if our message loop can optimize the message order for - * a key message or an IME message. Otherwise, false. - */ - static bool CanOptimizeKeyAndIMEMessages(); - /** * Returns true if the context or IME state is enabled. Otherwise, false. */ diff --git a/widget/windows/nsAppShell.cpp b/widget/windows/nsAppShell.cpp index e9596eb7fb8..00d01bd67f7 100644 --- a/widget/windows/nsAppShell.cpp +++ b/widget/windows/nsAppShell.cpp @@ -40,54 +40,6 @@ using mozilla::crashreporter::LSPAnnotate; //------------------------------------------------------------------------- -static bool PeekUIMessage(MSG* aMsg) -{ - // For avoiding deadlock between our process and plugin process by - // mouse wheel messages, we're handling actually when we receive one of - // following internal messages which is posted by native mouse wheel message - // handler. Any other events, especially native modifier key events, should - // not be handled between native message and posted internal message because - // it may make different modifier key state or mouse cursor position between - // them. - if (mozilla::widget::MouseScrollHandler::IsWaitingInternalMessage() && - WinUtils::PeekMessage(aMsg, NULL, MOZ_WM_MOUSEWHEEL_FIRST, - MOZ_WM_MOUSEWHEEL_LAST, PM_REMOVE)) { - return true; - } - - MSG keyMsg, imeMsg, mouseMsg, *pMsg = 0; - bool haveKeyMsg, haveIMEMsg, haveMouseMsg; - - haveKeyMsg = WinUtils::PeekMessage(&keyMsg, NULL, WM_KEYFIRST, - WM_IME_KEYLAST, PM_NOREMOVE); - haveIMEMsg = WinUtils::PeekMessage(&imeMsg, NULL, NS_WM_IMEFIRST, - NS_WM_IMELAST, PM_NOREMOVE); - haveMouseMsg = WinUtils::PeekMessage(&mouseMsg, NULL, WM_MOUSEFIRST, - WM_MOUSELAST, PM_NOREMOVE); - - if (haveKeyMsg) { - pMsg = &keyMsg; - } - if (haveIMEMsg && (!pMsg || imeMsg.time < pMsg->time)) { - pMsg = &imeMsg; - } - - if (pMsg && !mozilla::widget::IMEHandler::CanOptimizeKeyAndIMEMessages()) { - return false; - } - - if (haveMouseMsg && (!pMsg || mouseMsg.time < pMsg->time)) { - pMsg = &mouseMsg; - } - - if (!pMsg) { - return false; - } - - return WinUtils::PeekMessage(aMsg, NULL, pMsg->message, - pMsg->message, PM_REMOVE); -} - /*static*/ LRESULT CALLBACK nsAppShell::EventWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { @@ -226,12 +178,32 @@ nsAppShell::ProcessNextNativeEvent(bool mayWait) do { MSG msg; - bool uiMessage = PeekUIMessage(&msg); + bool uiMessage = false; - // Give priority to keyboard and mouse messages. - if (uiMessage || - WinUtils::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { - gotMessage = true; + // For avoiding deadlock between our process and plugin process by + // mouse wheel messages, we're handling actually when we receive one of + // following internal messages which is posted by native mouse wheel + // message handler. Any other events, especially native modifier key + // events, should not be handled between native message and posted + // internal message because it may make different modifier key state or + // mouse cursor position between them. + if (mozilla::widget::MouseScrollHandler::IsWaitingInternalMessage()) { + gotMessage = WinUtils::PeekMessage(&msg, NULL, MOZ_WM_MOUSEWHEEL_FIRST, + MOZ_WM_MOUSEWHEEL_LAST, PM_REMOVE); + NS_ASSERTION(gotMessage, + "waiting internal wheel message, but it has not come"); + uiMessage = gotMessage; + } + + if (!gotMessage) { + gotMessage = WinUtils::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE); + uiMessage = + (msg.message >= WM_KEYFIRST && msg.message <= WM_IME_KEYLAST) || + (msg.message >= NS_WM_IMEFIRST && msg.message <= NS_WM_IMELAST) || + (msg.message >= WM_MOUSEFIRST && msg.message <= WM_MOUSELAST); + } + + if (gotMessage) { if (msg.message == WM_QUIT) { ::PostQuitMessage(msg.wParam); Exit(); diff --git a/widget/windows/nsIMM32Handler.cpp b/widget/windows/nsIMM32Handler.cpp index 54688765133..7af1a02dbd2 100644 --- a/widget/windows/nsIMM32Handler.cpp +++ b/widget/windows/nsIMM32Handler.cpp @@ -41,9 +41,6 @@ static UINT sWM_MSIME_MOUSE = 0; // mouse message for MSIME 98/2000 #define IMEMOUSE_WUP 0x10 // wheel up #define IMEMOUSE_WDOWN 0x20 // wheel down -bool nsIMM32Handler::sIsIME = true; -bool nsIMM32Handler::sIsIMEOpening = false; - UINT nsIMM32Handler::sCodePage = 0; DWORD nsIMM32Handler::sIMEProperty = 0; @@ -124,10 +121,10 @@ nsIMM32Handler::InitKeyboardLayout(HKL aKeyboardLayout) LOCALE_IDEFAULTANSICODEPAGE | LOCALE_RETURN_NUMBER, (PWSTR)&sCodePage, sizeof(sCodePage) / sizeof(WCHAR)); sIMEProperty = ::ImmGetProperty(aKeyboardLayout, IGP_PROPERTY); - sIsIME = ::ImmIsIME(aKeyboardLayout); PR_LOG(gIMM32Log, PR_LOG_ALWAYS, - ("IMM32: InitKeyboardLayout, aKeyboardLayout=%08x, sCodePage=%lu, sIMEProperty=%08x sIsIME=%s\n", - aKeyboardLayout, sCodePage, sIMEProperty, sIsIME ? "TRUE" : "FALSE")); + ("IMM32: InitKeyboardLayout, aKeyboardLayout=%08x, sCodePage=%lu, " + "sIMEProperty=%08x", + aKeyboardLayout, sCodePage, sIMEProperty)); } /* static */ UINT @@ -136,18 +133,6 @@ nsIMM32Handler::GetKeyboardCodePage() return sCodePage; } -/* static */ bool -nsIMM32Handler::CanOptimizeKeyAndIMEMessages() -{ - // If IME is opening right now, we shouldn't optimize the key and IME message - // order because ATOK (Japanese IME of third party) has some problem with the - // optimization. When it finishes opening completely, it eats all key - // messages in the message queue. And it causes starting composition. So, - // we shouldn't eat the key messages before ATOK. - return !sIsIMEOpening; -} - - // used for checking the lParam of WM_IME_COMPOSITION #define IS_COMPOSING_LPARAM(lParam) \ ((lParam) & (GCS_COMPSTR | GCS_COMPATTR | GCS_COMPCLAUSE | GCS_CURSORPOS)) @@ -292,21 +277,6 @@ nsIMM32Handler::ProcessMessage(nsWindow* aWindow, UINT msg, // if the new window handle is not focused, probably, we should not start // the composition, however, such case should not be, it's just bad scenario. - if (sIsIMEOpening) { - switch (msg) { - case WM_INPUTLANGCHANGE: - case WM_IME_STARTCOMPOSITION: - case WM_IME_COMPOSITION: - case WM_IME_ENDCOMPOSITION: - case WM_IME_CHAR: - case WM_IME_SELECT: - case WM_IME_SETCONTEXT: - // For safety, we should reset sIsIMEOpening when we receive unexpected - // message. - sIsIMEOpening = false; - } - } - // When a plug-in has focus or compsition, we should dispatch the IME events // to the plug-in. if (aWindow->PluginHasFocus() || IsComposingOnPlugin()) { @@ -416,20 +386,6 @@ nsIMM32Handler::ProcessMessageForPlugin(nsWindow* aWindow, UINT msg, case WM_IME_SETCONTEXT: aEatMessage = OnIMESetContextOnPlugin(aWindow, wParam, lParam, aRetValue); return true; - case WM_IME_NOTIFY: - if (wParam == IMN_SETOPENSTATUS) { - // finished being opening - sIsIMEOpening = false; - } - return false; - case WM_KEYDOWN: - if (wParam == VK_PROCESSKEY) { - // If we receive when IME isn't open, it means IME is opening right now. - nsIMEContext IMEContext(aWindow->GetWindowHandle()); - sIsIMEOpening = IMEContext.IsValid() && - ::ImmGetOpenStatus(IMEContext.get()); - } - return false; case WM_CHAR: if (!gIMM32Handler) { return false; @@ -645,7 +601,6 @@ nsIMM32Handler::OnIMENotify(nsWindow* aWindow, aWindow->GetWindowHandle())); break; case IMN_SETOPENSTATUS: - sIsIMEOpening = false; PR_LOG(gIMM32Log, PR_LOG_ALWAYS, ("IMM32: OnIMENotify, hWnd=%08x, IMN_SETOPENSTATUS\n", aWindow->GetWindowHandle())); @@ -2058,14 +2013,6 @@ nsIMM32Handler::OnKeyDownEvent(nsWindow* aWindow, WPARAM wParam, LPARAM lParam, aWindow->GetWindowHandle(), wParam, lParam)); aEatMessage = false; switch (wParam) { - case VK_PROCESSKEY: - // If we receive when IME isn't open, it means IME is opening right now. - if (sIsIME) { - nsIMEContext IMEContext(aWindow->GetWindowHandle()); - sIsIMEOpening = - IMEContext.IsValid() && !::ImmGetOpenStatus(IMEContext.get()); - } - return false; case VK_TAB: case VK_PRIOR: case VK_NEXT: diff --git a/widget/windows/nsIMM32Handler.h b/widget/windows/nsIMM32Handler.h index 6da53143a7d..13538b195ff 100644 --- a/widget/windows/nsIMM32Handler.h +++ b/widget/windows/nsIMM32Handler.h @@ -122,14 +122,12 @@ public: return IsComposing() && IsComposingWindow(aWindow); } - static bool CanOptimizeKeyAndIMEMessages(); - #ifdef DEBUG /** * IsIMEAvailable() returns TRUE when current keyboard layout has IME. * Otherwise, FALSE. */ - static bool IsIMEAvailable() { return sIsIME; } + static bool IsIMEAvailable() { return !!::ImmIsIME(::GetKeyboardLayout(0)); } #endif // If aForce is TRUE, these methods doesn't check whether we have composition @@ -326,9 +324,6 @@ protected: bool mIsComposingOnPlugin; bool mNativeCaretIsCreated; - static bool sIsIME; - static bool sIsIMEOpening; - static UINT sCodePage; static DWORD sIMEProperty; }; diff --git a/widget/windows/nsTextStore.h b/widget/windows/nsTextStore.h index 0262f49216a..40922b04cb8 100644 --- a/widget/windows/nsTextStore.h +++ b/widget/windows/nsTextStore.h @@ -142,12 +142,6 @@ public: static nsIMEUpdatePreference GetIMEUpdatePreference(); - static bool CanOptimizeKeyAndIMEMessages() - { - // TODO: We need to implement this for ATOK. - return true; - } - // Returns the address of the pointer so that the TSF automatic test can // replace the system object with a custom implementation for testing. static void* GetNativeData(uint32_t aDataType)