/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* This Source Code Form is subject to the terms of the Mozilla Public * 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/. */
bool AssociateDefaultContext() { // We assume that there is only default IMC, no new IMC has been created. if (mIMC) { returnfalse;
} if (!::ImmAssociateContextEx(mWnd, nullptr, IACE_DEFAULT)) { returnfalse;
}
mIMC = ::ImmGetContext(mWnd); return (mIMC != nullptr);
}
#ifdef DEBUG /** * IsIMEAvailable() returns TRUE when current keyboard layout has IME. * Otherwise, FALSE.
*/ staticbool IsIMEAvailable() { return !!::ImmIsIME(::GetKeyboardLayout(0)); } #endif
// If aForce is TRUE, these methods doesn't check whether we have composition // or not. If you don't set it to TRUE, these method doesn't commit/cancel // the composition on uexpected window. staticvoid CommitComposition(nsWindow* aWindow, bool aForce = false); staticvoid CancelComposition(nsWindow* aWindow, bool aForce = false); staticvoid OnFocusChange(bool aFocus, nsWindow* aWindow); staticvoid OnUpdateComposition(nsWindow* aWindow); staticvoid OnSelectionChange(nsWindow* aWindow, const IMENotification& aIMENotification, bool aIsIMMActive);
// Returns NS_SUCCESS_EVENT_CONSUMED if the mouse button event is consumed by // IME. Otherwise, NS_OK. static nsresult OnMouseButtonEvent(nsWindow* aWindow, const IMENotification& aIMENotification);
// Japanese IMEs
DECL_IS_IME_ACTIVE(ATOK2006)
DECL_IS_IME_ACTIVE(ATOK2007)
DECL_IS_IME_ACTIVE(ATOK2008)
DECL_IS_IME_ACTIVE(ATOK2009)
DECL_IS_IME_ACTIVE(ATOK2010)
DECL_IS_IME_ACTIVE(GoogleJapaneseInput)
DECL_IS_IME_ACTIVE(Japanist2003)
#undef DECL_IS_IME_ACTIVE
/** * IsActiveIMEInBlockList() returns true if we know active keyboard layout's * IME has some crash bugs or something which make some damage to us. When * this returns true, IMC shouldn't be associated with any windows.
*/ staticbool IsActiveIMEInBlockList();
staticbool ShouldDrawCompositionStringOurselves(); staticbool IsVerticalWritingSupported(); // aWindow can be nullptr if it's called without receiving WM_INPUTLANGCHANGE. staticvoid InitKeyboardLayout(nsWindow* aWindow, HKL aKeyboardLayout); static UINT GetKeyboardCodePage();
/** * Checks whether the window is top level window of the composing window. * In this method, the top level window means in all windows, not only in all * OUR windows. I.e., if the aWindow is embedded, this always returns FALSE.
*/ staticbool IsTopLevelWindowOfComposition(nsWindow* aWindow);
// These message handlers don't use instance members, we should not create // the instance by the messages. So, they should be static. staticbool OnIMEChar(nsWindow* aWindow, WPARAM wParam, LPARAM lParam,
MSGResult& aResult); staticbool OnIMESetContext(nsWindow* aWindow, WPARAM wParam, LPARAM lParam,
MSGResult& aResult); staticbool OnIMECompositionFull(nsWindow* aWindow, MSGResult& aResult); staticbool OnIMENotify(nsWindow* aWindow, WPARAM wParam, LPARAM lParam,
MSGResult& aResult); staticbool OnIMESelect(nsWindow* aWindow, WPARAM wParam, LPARAM lParam,
MSGResult& aResult);
// The result of Handle* method mean "Processed" when it's TRUE. void HandleStartComposition(nsWindow* aWindow, const IMEContext& aContext); bool HandleComposition(nsWindow* aWindow, const IMEContext& aContext,
LPARAM lParam); // If aCommitString is null, this commits composition with the latest // dispatched data. Otherwise, commits composition with the value. void HandleEndComposition(nsWindow* aWindow, const nsAString* aCommitString = nullptr); bool HandleReconvert(nsWindow* aWindow, LPARAM lParam, LRESULT* oResult); bool HandleQueryCharPosition(nsWindow* aWindow, LPARAM lParam,
LRESULT* oResult); bool HandleDocumentFeed(nsWindow* aWindow, LPARAM lParam, LRESULT* oResult);
/** * When a window's IME context is activating but we have composition on * another window, we should commit our composition because IME context is * shared by all our windows (including plug-ins). * @param aWindow is a new activated window. * If aWindow is our composing window, this method does nothing. * Otherwise, this commits the composition on the previous window. * If this method did commit a composition, this returns TRUE.
*/ bool CommitCompositionOnPreviousWindow(nsWindow* aWindow);
/** * ResolveIMECaretPos * Convert the caret rect of a composition event to another widget's * coordinate system. * * @param aReferenceWidget The origin widget of aCursorRect. * Typically, this is mReferenceWidget of the * composing events. If the aCursorRect is in screen * coordinates, set nullptr. * @param aCursorRect The cursor rect. * @param aNewOriginWidget aOutRect will be in this widget's coordinates. If * this is nullptr, aOutRect will be in screen * coordinates. * @param aOutRect The converted cursor rect.
*/ void ResolveIMECaretPos(nsIWidget* aReferenceWidget,
mozilla::LayoutDeviceIntRect& aCursorRect,
nsIWidget* aNewOriginWidget,
mozilla::LayoutDeviceIntRect& aOutRect);
bool SetIMERelatedWindowsPos(nsWindow* aWindow, const IMEContext& aContext); /** * GetCharacterRectOfSelectedTextAt() returns character rect of the offset * from the selection start or the start of composition string if there is * a composition. * * @param aWindow The window which has focus. * @param aOffset Offset from the selection start or the start of * composition string when there is a composition. * This must be in the selection range or * the composition string. * @param aCharRect The result. * @param aWritingMode The writing mode of current selection. When this * is nullptr, this assumes that the selection is in * horizontal writing mode. * @return true if this succeeded to retrieve the rect. * Otherwise, false.
*/ bool GetCharacterRectOfSelectedTextAt(
nsWindow* aWindow, uint32_t aOffset,
mozilla::LayoutDeviceIntRect& aCharRect,
mozilla::WritingMode* aWritingMode = nullptr); /** * GetCaretRect() returns caret rect at current selection start. * * @param aWindow The window which has focus. * @param aCaretRect The result. * @param aWritingMode The writing mode of current selection. When this * is nullptr, this assumes that the selection is in * horizontal writing mode. * @return true if this succeeded to retrieve the rect. * Otherwise, false.
*/ bool GetCaretRect(nsWindow* aWindow, mozilla::LayoutDeviceIntRect& aCaretRect,
mozilla::WritingMode* aWritingMode = nullptr); void GetCompositionString(const IMEContext& aContext, DWORD aIndex,
nsAString& aCompositionString) const;
/** * AdjustCompositionFont() makes IME vertical writing mode if it's supported. * If aForceUpdate is true, it will update composition font even if writing * mode isn't being changed.
*/ void AdjustCompositionFont(nsWindow* aWindow, const IMEContext& aContext, const mozilla::WritingMode& aWritingMode, bool aForceUpdate = false);
/** * MaybeAdjustCompositionFont() calls AdjustCompositionFont() when the * locale of active IME is CJK. Note that this creates an instance even * when there is no composition but the locale is CJK.
*/ staticvoid MaybeAdjustCompositionFont(
nsWindow* aWindow, const mozilla::WritingMode& aWritingMode, bool aForceUpdate = false);
/** * Get the current target clause of composition string. * If there are one or more characters whose attribute is ATTR_TARGET_*, * this returns the first character's offset and its length. * Otherwise, e.g., the all characters are ATTR_INPUT, this returns * the composition string range because the all is the current target. * * aLength can be null (default), but aOffset must not be null. * * The aOffset value is offset in the contents. So, when you need offset * in the composition string, you need to subtract mCompositionStart from it.
*/ bool GetTargetClauseRange(uint32_t* aOffset, uint32_t* aLength = nullptr);
/** * DispatchEvent() dispatches aEvent if aWidget hasn't been destroyed yet.
*/ staticvoid DispatchEvent(nsWindow* aWindow, WidgetGUIEvent& aEvent);
/** * DispatchCompositionChangeEvent() dispatches eCompositionChange event * with clause information (it'll be retrieved by CreateTextRangeArray()). * I.e., this should be called only during composing. If a composition is * being committed, only HandleCompositionEnd() should be called. * * @param aWindow The window which has the composition. * @param aContext Native IME context which has the composition.
*/ void DispatchCompositionChangeEvent(nsWindow* aWindow, const IMEContext& aContext);
/** * When WM_IME_CHAR is received and passed to DefWindowProc, we need to * record the messages. In other words, we should record the messages * when we receive WM_IME_CHAR on windowless plug-in (if we have focus, * we always eat them). When focus is moved from a windowless plug-in to * our window during composition, WM_IME_CHAR messages were received when * the plug-in has focus. However, WM_CHAR messages are received after the * plug-in lost focus. So, we need to ignore the WM_CHAR messages because * they make unexpected text input events on us.
*/
nsTArray<MSG> mPassedIMEChar;
// mContentSelection stores the latest selection data only when sHasFocus is // true. Don't access mContentSelection directly. You should use // GetContentSelectionWithQueryIfNothing() for getting proper state.
Maybe<ContentSelection> mContentSelection;
const Maybe<ContentSelection>& GetContentSelectionWithQueryIfNothing(
nsWindow* aWindow) { // When IME has focus, mContentSelection is automatically updated by // NOTIFY_IME_OF_SELECTION_CHANGE. if (sHasFocus) { if (mContentSelection.isNothing()) { // But if this is the first access of mContentSelection, we need to // query selection now.
mContentSelection = QueryContentSelection(aWindow);
} return mContentSelection;
} // Otherwise, i.e., While IME doesn't have focus, we cannot observe // selection changes. So, in such case, we need to query selection // when it's necessary. static Maybe<ContentSelection> sTempContentSelection;
sTempContentSelection = QueryContentSelection(aWindow); return sTempContentSelection;
}
/** * Query content selection on aWindow with WidgetQueryContent event.
*/ static Maybe<ContentSelection> QueryContentSelection(nsWindow* aWindow);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.