diff --git a/widget/windows/WinIMEHandler.cpp b/widget/windows/WinIMEHandler.cpp index 7ca312ec808b..d65d5560d270 100644 --- a/widget/windows/WinIMEHandler.cpp +++ b/widget/windows/WinIMEHandler.cpp @@ -96,6 +96,42 @@ IMEHandler::IsComposingOn(nsWindow* aWindow) return nsIMM32Handler::IsComposingOn(aWindow); } +// static +nsresult +IMEHandler::NotifyIME(nsWindow* aWindow, + NotificationToIME aNotification) +{ +#ifdef NS_ENABLE_TSF + if (sIsInTSFMode) { + switch (aNotification) { + case REQUEST_TO_COMMIT_COMPOSITION: + if (nsTextStore::IsComposingOn(aWindow)) { + nsTextStore::CommitComposition(false); + } + return NS_OK; + case REQUEST_TO_CANCEL_COMPOSITION: + if (nsTextStore::IsComposingOn(aWindow)) { + nsTextStore::CommitComposition(true); + } + return NS_OK; + default: + return NS_ERROR_NOT_IMPLEMENTED; + } + } +#endif //NS_ENABLE_TSF + + switch (aNotification) { + case REQUEST_TO_COMMIT_COMPOSITION: + nsIMM32Handler::CommitComposition(aWindow); + return NS_OK; + case REQUEST_TO_CANCEL_COMPOSITION: + nsIMM32Handler::CancelComposition(aWindow); + return NS_OK; + default: + return NS_ERROR_NOT_IMPLEMENTED; + } +} + #ifdef DEBUG // static bool diff --git a/widget/windows/WinIMEHandler.h b/widget/windows/WinIMEHandler.h index 63920320be56..0a69208b009d 100644 --- a/widget/windows/WinIMEHandler.h +++ b/widget/windows/WinIMEHandler.h @@ -7,6 +7,7 @@ #define WinIMEHandler_h_ #include "nscore.h" +#include "nsEvent.h" #include class nsWindow; @@ -47,6 +48,12 @@ public: */ static bool IsComposingOn(nsWindow* aWindow); + /** + * Notifies IME of the notification (a request or an event). + */ + static nsresult NotifyIME(nsWindow* aWindow, + NotificationToIME aNotification); + /** * "Kakutei-Undo" of ATOK or WXG (both of them are Japanese IME) causes * strange WM_KEYDOWN/WM_KEYUP/WM_CHAR message pattern. So, when this diff --git a/widget/windows/nsTextStore.h b/widget/windows/nsTextStore.h index 9fa14fff167f..b52bf877a901 100644 --- a/widget/windows/nsTextStore.h +++ b/widget/windows/nsTextStore.h @@ -101,7 +101,7 @@ public: static void CommitComposition(bool aDiscard) { - if (!sTsfTextStore) return; + NS_ENSURE_TRUE_VOID(sTsfTextStore); sTsfTextStore->CommitCompositionInternal(aDiscard); } diff --git a/widget/windows/nsWindow.cpp b/widget/windows/nsWindow.cpp index 33f01e7ef6ba..2412295b072f 100644 --- a/widget/windows/nsWindow.cpp +++ b/widget/windows/nsWindow.cpp @@ -7384,16 +7384,7 @@ nsWindow::OnSysColorChanged() NS_IMETHODIMP nsWindow::ResetInputState() { -#ifdef DEBUG_KBSTATE - PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("ResetInputState\n")); -#endif - -#ifdef NS_ENABLE_TSF - nsTextStore::CommitComposition(false); -#endif //NS_ENABLE_TSF - - nsIMM32Handler::CommitComposition(this); - return NS_OK; + return IMEHandler::NotifyIME(this, REQUEST_TO_COMMIT_COMPOSITION); } NS_IMETHODIMP_(void) @@ -7462,16 +7453,7 @@ nsWindow::GetInputContext() NS_IMETHODIMP nsWindow::CancelIMEComposition() { -#ifdef DEBUG_KBSTATE - PR_LOG(gWindowsLog, PR_LOG_ALWAYS, ("CancelIMEComposition\n")); -#endif - -#ifdef NS_ENABLE_TSF - nsTextStore::CommitComposition(true); -#endif //NS_ENABLE_TSF - - nsIMM32Handler::CancelComposition(this); - return NS_OK; + return IMEHandler::NotifyIME(this, REQUEST_TO_CANCEL_COMPOSITION); } NS_IMETHODIMP