/*
 * Copyright 2008 Aric Stewart, CodeWeavers
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 */

#ifndef DO_NO_IMPORTS
import "oaidl.idl";
import "comcat.idl";
import "textstor.idl";
/* import "ctfutb.idl"; */
#endif
cpp_quote("#include <winuser.h>")

cpp_quote("#define TF_E_STACKFULL MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0501)")
cpp_quote("#define TF_E_DISCONNECTED    MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0504)")
cpp_quote("#define TF_E_ALREADY_EXISTS  MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0506)")
cpp_quote("#define TF_E_NOLOCK          MAKE_HRESULT(SEVERITY_ERROR, FACILITY_ITF, 0x0201)")

cpp_quote("HRESULT WINAPI TF_CreateThreadMgr(ITfThreadMgr **pptim);")
cpp_quote("HRESULT WINAPI TF_GetThreadMgr(ITfThreadMgr **pptim);")
cpp_quote("HRESULT WINAPI TF_CreateInputProcessorProfiles(ITfInputProcessorProfiles **ppipr);")

cpp_quote("EXTERN_C const CLSID CLSID_TF_ThreadMgr;")
cpp_quote("EXTERN_C const CLSID CLSID_TF_InputProcessorProfiles;")
cpp_quote("EXTERN_C const CLSID CLSID_TF_CategoryMgr;")

/* GUIDs for Compartments */
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_KEYBOARD_DISABLED;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_KEYBOARD_OPENCLOSE;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_HANDWRITING_OPENCLOSE;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_SPEECH_DISABLED;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_SPEECH_OPENCLOSE;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_SPEECH_GLOBALSTATE;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_PERSISTMENUENABLED;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_EMPTYCONTEXT;")
cpp_quote("EXTERN_C const GUID GUID_COMPARTMENT_TIPUISTATUS;")

/* GUIDs for Categories */
cpp_quote("EXTERN_C const GUID GUID_TFCAT_TIP_KEYBOARD;")
cpp_quote("EXTERN_C const GUID GUID_TFCAT_TIP_SPEECH;")
cpp_quote("EXTERN_C const GUID GUID_TFCAT_TIP_HANDWRITING;")
cpp_quote("EXTERN_C const GUID GUID_TFCAT_DISPLAYATTRIBUTEPROVIDER;")

typedef [uuid(7213778c-7bb0-4270-b050-6189ee594e97)]  DWORD TfEditCookie;
typedef [uuid(de403c21-89fd-4f85-8b87-64584d063fbc)] DWORD TfClientId;
typedef [uuid(88a9c478-f3ec-4763-8345-cd9250443f8d)] DWORD TfGuidAtom;

cpp_quote("#define TF_MOD_ALT                   0x0001")
cpp_quote("#define TF_MOD_CONTROL               0x0002")
cpp_quote("#define TF_MOD_SHIFT                 0x0004")
cpp_quote("#define TF_MOD_RALT                  0x0008")
cpp_quote("#define TF_MOD_RCONTROL              0x0010")
cpp_quote("#define TF_MOD_RSHIFT                0x0020")
cpp_quote("#define TF_MOD_LALT                  0x0040")
cpp_quote("#define TF_MOD_LCONTROL              0x0080")
cpp_quote("#define TF_MOD_LSHIFT                0x0100")
cpp_quote("#define TF_MOD_ON_KEYUP              0x0200")
cpp_quote("#define TF_MOD_IGNORE_ALL_MODIFIER   0x0400")

interface ITfDocumentMgr;
interface ITfContext;
interface IEnumTfDocumentMgrs;
interface IEnumTfContexts;
interface ITfFunctionProvider;
interface IEnumTfFunctionProviders;
interface ITfCompartmentMgr;
interface ITfEditSession;
interface ITfRange;
interface ITfContextView;
interface IEnumTfContextViews;
interface ITfProperty;
interface ITfReadOnlyProperty;
interface IEnumTfProperties;
interface ITfRangeBackup;
interface IEnumTfLanguageProfiles;
interface ITfEditRecord;
interface ITfCompositionView;
interface ITfKeyEventSink;

typedef [uuid(e1b5808d-1e46-4c19-84dc-68c5f5978cc8)] struct TF_LANGUAGEPROFILE
{
    CLSID clsid;
    LANGID langid;
    GUID catid;
    BOOL fActive;
    GUID guidProfile;
} TF_LANGUAGEPROFILE;

typedef [uuid(77c12f95-b783-450d-879f-1cd2362c6521)] struct TF_PRESERVEDKEY
{
    UINT uVKey;
    UINT uModifiers;
} TF_PRESERVEDKEY;

typedef [uuid(5a886226-ae9a-489b-b991-2b1e25ee59a9)]  enum { TF_ANCHOR_START = 0, TF_ANCHOR_END = 1 } TfAnchor;

[
    object,
    uuid(aa80e801-2021-11d2-93e0-0060b067b86e),
    pointer_default(unique)
]
interface ITfThreadMgr: IUnknown
{
    HRESULT Activate(
        [out] TfClientId *ptid);

    HRESULT Deactivate();

    HRESULT CreateDocumentMgr(
        [out] ITfDocumentMgr **ppdim);

    HRESULT EnumDocumentMgrs(
        [out] IEnumTfDocumentMgrs **ppEnum);

    HRESULT GetFocus(
        [out] ITfDocumentMgr **ppdimFocus);

    HRESULT SetFocus(
        [in] ITfDocumentMgr *pdimFocus);

    HRESULT AssociateFocus(
        [in] HWND hwnd,
        [in, unique] ITfDocumentMgr *pdimNew,
        [out] ITfDocumentMgr **ppdimPrev);

    HRESULT IsThreadFocus(
        [out] BOOL *pfThreadFocus);

    HRESULT GetFunctionProvider(
        [in] REFCLSID clsid,
        [out] ITfFunctionProvider **ppFuncProv);

    HRESULT EnumFunctionProviders(
        [out] IEnumTfFunctionProviders **ppEnum);

    HRESULT GetGlobalCompartment(
        [out] ITfCompartmentMgr **ppCompMgr);
};


[
    object,
    uuid(aa80e7f4-2021-11d2-93e0-0060b067b86e),
    pointer_default(unique)
]
interface ITfDocumentMgr: IUnknown
{
    HRESULT CreateContext(
        [in] TfClientId tidOwner,
        [in] DWORD dwFlags,
        [in, unique] IUnknown *punk,
        [out] ITfContext **ppic,
        [out] TfEditCookie *pecTextStore);

    HRESULT Push(
        [in] ITfContext *pic);

    const DWORD TF_POPF_ALL = 0x0001;

    HRESULT Pop(
        [in] DWORD dwFlags);

    HRESULT GetTop(
        [out] ITfContext **ppic);

    HRESULT GetBase(
        [out] ITfContext **ppic);

    HRESULT EnumContexts(
        [out] IEnumTfContexts **ppEnum);
};

[
    object,
    uuid(aa80e7fd-2021-11d2-93e0-0060b067b86e),
    pointer_default(unique)
]
interface ITfContext : IUnknown
{
    const DWORD TF_ES_ASYNCDONTCARE = 0x0;
    const DWORD TF_ES_SYNC          = 0x1;
    const DWORD TF_ES_READ          = 0x2;
    const DWORD TF_ES_READWRITE     = 0x6;
    const DWORD TF_ES_ASYNC         = 0x8;

    HRESULT RequestEditSession(
        [in] TfClientId tid,
        [in] ITfEditSession *pes,
        [in] DWORD dwFlags,
        [out] HRESULT *phrSession);

    HRESULT InWriteSession(
        [in] TfClientId tid,
        [out] BOOL *pfWriteSession);

    typedef [uuid(1690be9b-d3e9-49f6-8d8b-51b905af4c43)] enum { TF_AE_NONE, TF_AE_START, TF_AE_END } TfActiveSelEnd;

    typedef [uuid(36ae42a4-6989-4bdc-b48a-6137b7bf2e42)] struct TF_SELECTIONSTYLE
    {
        TfActiveSelEnd ase;
        BOOL fInterimChar;
    } TF_SELECTIONSTYLE;

    typedef [uuid(75eb22f2-b0bf-46a8-8006-975a3b6efcf1)] struct TF_SELECTION
    {
        ITfRange *range;
        TF_SELECTIONSTYLE style;
    } TF_SELECTION;

    const ULONG TF_DEFAULT_SELECTION =  TS_DEFAULT_SELECTION;

    HRESULT GetSelection(
        [in] TfEditCookie ec,
        [in] ULONG ulIndex,
        [in] ULONG ulCount,
        [out, size_is(ulCount), length_is(*pcFetched)] TF_SELECTION *pSelection,
        [out] ULONG *pcFetched);

    HRESULT SetSelection(
        [in] TfEditCookie ec,
        [in] ULONG ulCount,
        [in, size_is(ulCount)] const TF_SELECTION *pSelection);

    HRESULT GetStart(
        [in] TfEditCookie ec,
        [out] ITfRange **ppStart);

    HRESULT GetEnd(
        [in] TfEditCookie ec,
        [out] ITfRange **ppEnd);

    typedef [uuid(bc7d979a-846a-444d-afef-0a9bfa82b961)] TS_STATUS TF_STATUS;
    const DWORD TF_SD_READONLY    = TS_SD_READONLY;
    const DWORD TF_SD_LOADING     = TS_SD_LOADING;
    const DWORD TF_SS_DISJOINTSEL = TS_SS_DISJOINTSEL;
    const DWORD TF_SS_REGIONS     = TS_SS_REGIONS;
    const DWORD TF_SS_TRANSITORY  = TS_SS_TRANSITORY;


    HRESULT GetActiveView(
        [out] ITfContextView **ppView);

    HRESULT EnumViews(
        [out] IEnumTfContextViews **ppEnum);

    HRESULT GetStatus(
        [out] TF_STATUS *pdcs);

    HRESULT GetProperty(
        [in] REFGUID guidProp,
        [out] ITfProperty **ppProp);

    HRESULT GetAppProperty(
        [in] REFGUID guidProp,
        [out] ITfReadOnlyProperty **ppProp);

    HRESULT TrackProperties(
        [in, size_is(cProp)] const GUID **prgProp,
        [in] ULONG cProp,
        [in, size_is(cAppProp)] const GUID **prgAppProp,
        [in] ULONG cAppProp,
        [out] ITfReadOnlyProperty **ppProperty);

    HRESULT EnumProperties(
        [out] IEnumTfProperties **ppEnum);

    HRESULT GetDocumentMgr(
        [out] ITfDocumentMgr **ppDm);

    HRESULT CreateRangeBackup(
        [in] TfEditCookie ec,
        [in] ITfRange *pRange,
        [out] ITfRangeBackup **ppBackup);

};

[
  object,
  uuid(4ea48a35-60ae-446f-8fd6-e6a8d82459f7),
  pointer_default(unique)
]
interface ITfSource : IUnknown
{
    HRESULT AdviseSink(
        [in] REFIID riid,
        [in, iid_is(riid)] IUnknown *punk,
        [out] DWORD *pdwCookie);

    HRESULT UnadviseSink(
        [in] DWORD dwCookie);
};

[
  object,
  local,
  uuid(1F02B6C5-7842-4EE6-8A0B-9A24183A95CA),
  pointer_default(unique)
]
interface ITfInputProcessorProfiles : IUnknown
{
    HRESULT Register(
        [in] REFCLSID rclsid);

    HRESULT Unregister(
        [in] REFCLSID rclsid);

    HRESULT AddLanguageProfile(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile,
        [in, size_is(cchDesc)] const WCHAR *pchDesc,
        [in] ULONG cchDesc,
        [in, size_is(cchFile)] const WCHAR *pchIconFile,
        [in] ULONG cchFile,
        [in] ULONG uIconIndex);

    HRESULT RemoveLanguageProfile(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile);

    HRESULT EnumInputProcessorInfo(
        [out] IEnumGUID **ppEnum);

    HRESULT GetDefaultLanguageProfile(
        [in] LANGID langid,
        [in] REFGUID catid,
        [out] CLSID *pclsid,
        [out] GUID *pguidProfile);

    HRESULT SetDefaultLanguageProfile(
        [in] LANGID langid,
        [in] REFCLSID rclsid,
        [in] REFGUID guidProfiles);

    HRESULT ActivateLanguageProfile(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfiles);

    HRESULT GetActiveLanguageProfile(
        [in] REFCLSID rclsid,
        [out] LANGID *plangid,
        [out] GUID *pguidProfile);

    HRESULT GetLanguageProfileDescription(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile,
        [out] BSTR *pbstrProfile);

    HRESULT GetCurrentLanguage(
        [out] LANGID *plangid);

    HRESULT ChangeCurrentLanguage(
        [in] LANGID langid);

    HRESULT GetLanguageList(
        [out] LANGID **ppLangId,
        [out] ULONG *pulCount);

    HRESULT EnumLanguageProfiles(
        [in] LANGID langid,
        [out] IEnumTfLanguageProfiles **ppEnum);

    HRESULT EnableLanguageProfile(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile,
        [in] BOOL fEnable);

    HRESULT IsEnabledLanguageProfile(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile,
        [out] BOOL *pfEnable);

    HRESULT EnableLanguageProfileByDefault(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile,
        [in] BOOL fEnable);

    HRESULT SubstituteKeyboardLayout(
        [in] REFCLSID rclsid,
        [in] LANGID langid,
        [in] REFGUID guidProfile,
        [in] HKL hKL);
};

[
  object,
  local,
  uuid(c3acefb5-f69d-4905-938f-fcadcf4be830),
  pointer_default(unique)
]
interface ITfCategoryMgr : IUnknown
{
    HRESULT RegisterCategory([in] REFCLSID rclsid,
                             [in] REFGUID rcatid,
                             [in] REFGUID rguid);

    HRESULT UnregisterCategory([in] REFCLSID rclsid,
                               [in] REFGUID rcatid,
                               [in] REFGUID rguid);

    HRESULT EnumCategoriesInItem([in] REFGUID rguid,
                                 [out] IEnumGUID **ppEnum);

    HRESULT EnumItemsInCategory([in] REFGUID rcatid,
                                [out] IEnumGUID **ppEnum);

    HRESULT FindClosestCategory([in] REFGUID rguid,
                                [out] GUID *pcatid,
                                [in, size_is(ulCount)] const GUID **ppcatidList,
                                [in] ULONG ulCount);

    HRESULT RegisterGUIDDescription([in] REFCLSID rclsid,
                                    [in] REFGUID rguid,
                                    [in, size_is(cch)] const WCHAR *pchDesc,
                                    [in] ULONG cch);

    HRESULT UnregisterGUIDDescription([in] REFCLSID rclsid,
                                      [in] REFGUID rguid);

    HRESULT GetGUIDDescription([in] REFGUID rguid,
                               [out] BSTR *pbstrDesc);

    HRESULT RegisterGUIDDWORD([in] REFCLSID rclsid,
                              [in] REFGUID rguid,
                              [in] DWORD dw);

    HRESULT UnregisterGUIDDWORD([in] REFCLSID rclsid,
                                [in] REFGUID rguid);

    HRESULT GetGUIDDWORD([in] REFGUID rguid,
                         [out] DWORD *pdw);

    HRESULT RegisterGUID([in] REFGUID rguid,
                         [out] TfGuidAtom *pguidatom);

    HRESULT GetGUID([in] TfGuidAtom guidatom,
                    [out] GUID *pguid);

    HRESULT IsEqualTfGuidAtom([in] TfGuidAtom guidatom,
                              [in] REFGUID rguid,
                              [out] BOOL *pfEqual);
};

[
  object,
  uuid(8127d409-ccd3-4683-967a-b43d5b482bf7),
  pointer_default(unique)
]
interface ITfTextEditSink : IUnknown
{
    HRESULT OnEndEdit(
        [in] ITfContext *pic,
        [in] TfEditCookie ecReadOnly,
        [in] ITfEditRecord *pEditRecord);
};

[
    object,
    uuid(5F20AA40-B57A-4F34-96AB-3576F377CC79),
    pointer_default(unique)
]
interface ITfContextOwnerCompositionSink : IUnknown
{
    HRESULT OnStartComposition(
        [in] ITfCompositionView *pComposition,
        [out] BOOL *pfOk);

    HRESULT OnUpdateComposition(
        [in] ITfCompositionView *pComposition,
        [in] ITfRange *pRangeNew);

    HRESULT OnEndComposition(
        [in] ITfCompositionView *pComposition);
};

[
  object,
  uuid(3d61bf11-ac5f-42c8-a4cb-931bcc28c744),
  pointer_default(unique)
]
interface IEnumTfLanguageProfiles : IUnknown
{
    HRESULT Clone(
        [out] IEnumTfLanguageProfiles **ppEnum);

    HRESULT Next(
        [in] ULONG ulCount,
        [out, size_is(ulCount), length_is(*pcFetch)] TF_LANGUAGEPROFILE *pProfile,
        [out] ULONG *pcFetch);

    HRESULT Reset();

    HRESULT Skip(
        [in] ULONG ulCount);
};

[
  object,
  local,
  uuid(aa80e7f7-2021-11d2-93e0-0060b067b86e),
  pointer_default(unique)
]
interface ITfTextInputProcessor : IUnknown
{
    HRESULT Activate(
        [in] ITfThreadMgr *ptim,
        [in] TfClientId tid);

    HRESULT Deactivate();
};

[
  object,
  uuid(aa80e80e-2021-11d2-93e0-0060b067b86e),
  pointer_default(unique)
]
interface ITfThreadMgrEventSink : IUnknown
{
    HRESULT OnInitDocumentMgr(
        [in] ITfDocumentMgr *pdim);

    HRESULT OnUninitDocumentMgr(
        [in] ITfDocumentMgr *pdim);

    HRESULT OnSetFocus(
        [in] ITfDocumentMgr *pdimFocus,
        [in] ITfDocumentMgr *pdimPrevFocus);

    HRESULT OnPushContext(
        [in] ITfContext *pic);

    HRESULT OnPopContext(
        [in] ITfContext *pic);
};

[
  object,
  local,
  uuid(aa80e7f0-2021-11d2-93e0-0060b067b86e),
  pointer_default(unique)
]
interface ITfKeystrokeMgr : IUnknown
{
    HRESULT AdviseKeyEventSink(
        [in] TfClientId tid,
        [in] ITfKeyEventSink *pSink,
        [in] BOOL fForeground);

    HRESULT UnadviseKeyEventSink(
        [in] TfClientId tid);

    HRESULT GetForeground(
        [out] CLSID *pclsid);

    HRESULT TestKeyDown(
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT TestKeyUp(
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT KeyDown(
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT KeyUp(
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT GetPreservedKey(
        [in] ITfContext *pic,
        [in] const TF_PRESERVEDKEY *pprekey,
        [out] GUID *pguid);

    HRESULT IsPreservedKey(
        [in] REFGUID rguid,
        [in] const TF_PRESERVEDKEY *pprekey,
        [out] BOOL *pfRegistered);

    HRESULT PreserveKey(
        [in] TfClientId tid,
        [in] REFGUID rguid,
        [in] const TF_PRESERVEDKEY *prekey,
        [in, size_is(cchDesc)] const WCHAR *pchDesc,
        [in] ULONG cchDesc);

    HRESULT UnpreserveKey(
        [in] REFGUID rguid,
        [in] const TF_PRESERVEDKEY *pprekey);

    HRESULT SetPreservedKeyDescription(
        [in] REFGUID rguid,
        [in, size_is(cchDesc)] const WCHAR *pchDesc,
        [in] ULONG cchDesc);

    HRESULT GetPreservedKeyDescription(
        [in] REFGUID rguid,
        [out] BSTR *pbstrDesc);

    HRESULT SimulatePreservedKey(
        [in] ITfContext *pic,
        [in] REFGUID rguid,
        [out] BOOL *pfEaten);
};

[
  object,
  local,
  uuid(aa80e7f5-2021-11d2-93e0-0060b067b86e),
  pointer_default(unique)
]
interface ITfKeyEventSink : IUnknown
{
    HRESULT OnSetFocus(
        [in] BOOL fForeground);

    HRESULT OnTestKeyDown(
        [in] ITfContext *pic,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT OnTestKeyUp(
        [in] ITfContext *pic,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT OnKeyDown(
        [in] ITfContext *pic,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT OnKeyUp(
        [in] ITfContext *pic,
        [in] WPARAM wParam,
        [in] LPARAM lParam,
        [out] BOOL *pfEaten);

    HRESULT OnPreservedKey(
        [in] ITfContext *pic,
        [in] REFGUID rguid,
        [out] BOOL *pfEaten);
};

[
  object,
  local,
  uuid(8f1b8ad8-0b6b-4874-90c5-bd76011e8f7c),
  pointer_default(unique)
]
interface ITfMessagePump : IUnknown
{
    HRESULT PeekMessageA(
        [out] LPMSG pMsg,
        [in] HWND hwnd,
        [in] UINT wMsgFilterMin,
        [in] UINT wMsgFilterMax,
        [in] UINT wRemoveMsg,
        [out] BOOL *pfResult);

    HRESULT GetMessageA(
        [out] LPMSG pMsg,
        [in] HWND hwnd,
        [in] UINT wMsgFilterMin,
        [in] UINT wMsgFilterMax,
        [out] BOOL *pfResult);

    HRESULT PeekMessageW(
        [out] LPMSG pMsg,
        [in] HWND hwnd,
        [in] UINT wMsgFilterMin,
        [in] UINT wMsgFilterMax,
        [in] UINT wRemoveMsg,
        [out] BOOL *pfResult);

    HRESULT GetMessageW(
        [out] LPMSG pMsg,
        [in] HWND hwnd,
        [in] UINT wMsgFilterMin,
        [in] UINT wMsgFilterMax,
        [out] BOOL *pfResult);
};

[
  object,
  local,
  uuid(d60a7b49-1b9f-4be2-b702-47e9dc05dec3),
  pointer_default(unique)
]
interface ITfClientId : IUnknown
{
    HRESULT GetClientId(
        [in] REFCLSID rclsid,
        [out] TfClientId *ptid);
};

[
  object,
  uuid(43c9fe15-f494-4c17-9de2-b8a4ac350aa8),
  pointer_default(unique)
]
interface ITfLanguageProfileNotifySink : IUnknown
{
    HRESULT OnLanguageChange(
        [in] LANGID langid,
        [out] BOOL *pfAccept);

    HRESULT OnLanguageChanged();
}

[
  object,
  uuid(aa80e803-2021-11d2-93e0-0060b067b86e),
  pointer_default(unique)
]
interface ITfEditSession : IUnknown
{
    HRESULT DoEditSession(
        [in] TfEditCookie ec);
}

[
  object,
  uuid(aa80e7ff-2021-11d2-93e0-0060b067b86e),
  pointer_default(unique)
]
interface ITfRange : IUnknown
{
    const WCHAR TF_CHAR_EMBEDDED     = TS_CHAR_EMBEDDED;

    typedef [uuid(cf610f06-2882-46f6-abe5-298568b664c4)] enum { TF_GRAVITY_BACKWARD = 0, TF_GRAVITY_FORWARD = 1 } TfGravity;

    typedef [uuid(1e512533-bbdc-4530-9a8e-a1dc0af67468)] enum { TF_SD_BACKWARD = 0, TF_SD_FORWARD = 1 } TfShiftDir;

    const DWORD TF_HF_OBJECT         = 1;
    const DWORD TF_TF_MOVESTART      = 1;
    const DWORD TF_TF_IGNOREEND      = 2;
    const DWORD TF_ST_CORRECTION     = 1;
    const DWORD TF_IE_CORRECTION     = 1;

    typedef [uuid(49930d51-7d93-448c-a48c-fea5dac192b1)] struct  TF_HALTCOND
    {
        ITfRange *pHaltRange;
        TfAnchor aHaltPos;
        DWORD dwFlags;
    } TF_HALTCOND;

    HRESULT GetText(
        [in] TfEditCookie ec,
        [in] DWORD dwFlags,
        [out, size_is(cchMax), length_is(*pcch)] WCHAR *pchText,
        [in] ULONG cchMax,
        [out] ULONG *pcch);

    HRESULT SetText(
        [in] TfEditCookie ec,
        [in] DWORD dwFlags,
        [in, size_is(cch), unique] const WCHAR *pchText,
        [in] LONG cch);

    HRESULT GetFormattedText(
        [in] TfEditCookie ec,
        [out] IDataObject **ppDataObject);

    HRESULT GetEmbedded(
        [in] TfEditCookie ec,
        [in] REFGUID rguidService,
        [in] REFIID riid,
        [out, iid_is(riid)] IUnknown **ppunk);

    HRESULT InsertEmbedded(
        [in] TfEditCookie ec,
        [in] DWORD dwFlags,
        [in] IDataObject *pDataObject);

    HRESULT ShiftStart(
        [in] TfEditCookie ec,
        [in] LONG cchReq,
        [out] LONG *pcch,
        [in, unique] const TF_HALTCOND *pHalt);

    HRESULT ShiftEnd(
        [in] TfEditCookie ec,
        [in] LONG cchReq,
        [out] LONG *pcch,
        [in, unique] const TF_HALTCOND *pHalt);

    HRESULT ShiftStartToRange(
        [in] TfEditCookie ec,
        [in] ITfRange *pRange,
        [in] TfAnchor aPos);

    HRESULT ShiftEndToRange(
        [in] TfEditCookie ec,
        [in] ITfRange *pRange,
        [in] TfAnchor aPos);

    HRESULT ShiftStartRegion(
        [in] TfEditCookie ec,
        [in] TfShiftDir dir,
        [out] BOOL *pfNoRegion);

    HRESULT ShiftEndRegion(
        [in] TfEditCookie ec,
        [in] TfShiftDir dir,
        [out] BOOL *pfNoRegion);

    HRESULT IsEmpty(
        [in] TfEditCookie ec,
        [out] BOOL *pfEmpty);

    HRESULT Collapse(
        [in] TfEditCookie ec,
        [in] TfAnchor aPos);

    HRESULT IsEqualStart(
        [in] TfEditCookie ec,
        [in] ITfRange *pWith,
        [in] TfAnchor aPos,
        [out] BOOL *pfEqual);

    HRESULT IsEqualEnd(
        [in] TfEditCookie ec,
        [in] ITfRange *pWith,
        [in] TfAnchor aPos,
        [out] BOOL *pfEqual);

    HRESULT CompareStart(
        [in] TfEditCookie ec,
        [in] ITfRange *pWith,
        [in] TfAnchor aPos,
        [out] LONG *plResult);

    HRESULT CompareEnd(
        [in] TfEditCookie ec,
        [in] ITfRange *pWith,
        [in] TfAnchor aPos,
        [out] LONG *plResult);

    HRESULT AdjustForInsert(
        [in] TfEditCookie ec,
        [in] ULONG cchInsert,
        [out] BOOL *pfInsertOk);

    HRESULT GetGravity(
        [out] TfGravity *pgStart,
        [out] TfGravity *pgEnd);

    HRESULT SetGravity(
        [in] TfEditCookie ec,
        [in] TfGravity gStart,
        [in] TfGravity gEnd);

    HRESULT Clone(
        [out] ITfRange **ppClone);

    HRESULT GetContext(
        [out] ITfContext **ppContext);
};

[
    object,
    uuid(55ce16ba-3014-41c1-9ceb-fade1446ac6c),
    pointer_default(unique)
]
interface ITfInsertAtSelection : IUnknown
{
    const DWORD TF_IAS_NOQUERY   = 0x1;
    const DWORD TF_IAS_QUERYONLY = 0x2;
    const DWORD TF_IAS_NO_DEFAULT_COMPOSITION = 0x80000000;

    HRESULT InsertTextAtSelection(
        [in] TfEditCookie ec,
        [in] DWORD dwFlags,
        [in, size_is(cch)] const WCHAR *pchText,
        [in] LONG cch,
        [out] ITfRange **ppRange);

    HRESULT InsertEmbeddedAtSelection(
        [in] TfEditCookie ec,
        [in] DWORD dwFlags,
        [in] IDataObject *pDataObject,
        [out] ITfRange **ppRange);
};

[
  object,
  uuid(bb08f7a9-607a-4384-8623-056892b64371),
  pointer_default(unique)
]
interface ITfCompartment : IUnknown
{
    HRESULT SetValue(
        [in] TfClientId tid,
        [in] const VARIANT *pvarValue);

    HRESULT GetValue(
        [out] VARIANT *pvarValue);
};

[
  object,
  uuid(7dcf57ac-18ad-438b-824d-979bffb74b7c),
  pointer_default(unique)
]
interface ITfCompartmentMgr : IUnknown
{
    HRESULT GetCompartment(
        [in] REFGUID rguid,
        [out] ITfCompartment **ppcomp);

    HRESULT ClearCompartment(
        [in] TfClientId tid,
        [in] REFGUID rguid);

    HRESULT EnumCompartments(
        [out] IEnumGUID **ppEnum);
};

[
  object,
  uuid(743abd5f-f26d-48df-8cc5-238492419b64),
  pointer_default(unique)
]
interface ITfCompartmentEventSink : IUnknown
{
    HRESULT OnChange(
        [in] REFGUID rguid);
}

[
  object,
  uuid(8f1a7ea6-1654-4502-a86e-b2902344d507),
  pointer_default(unique)
]
interface IEnumTfContexts : IUnknown
{
    HRESULT Clone(
        [out] IEnumTfContexts **ppEnum);

    HRESULT Next(
        [in] ULONG ulCount,
        [out, size_is(ulCount), length_is(*pcFetched)] ITfContext **rgContext,
        [out] ULONG *pcFetched);

    HRESULT Reset();

    HRESULT Skip(
        [in] ULONG ulCount);
};
