/*
 * Copyright 2007 Jacek Caban for 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 "unknwn.idl";
#endif

cpp_quote("#include <imm.h>")

cpp_quote("#if 0")

typedef struct {
    LPSTR lpReading;
    LPSTR lpWord;
} REGISTERWORDA;

typedef struct {
    LPWSTR lpReading;
    LPWSTR lpWord;
} REGISTERWORDW;

#define LF_FACESIZE         32

typedef struct {
    LONG lfHeight;
    LONG lfWidth;
    LONG lfEscapement;
    LONG lfOrientation;
    LONG lfWeight;
    BYTE lfItalic;
    BYTE lfUnderline;
    BYTE lfStrikeOut;
    BYTE lfCharSet;
    BYTE lfOutPrecision;
    BYTE lfClipPrecision;
    BYTE lfQuality;
    BYTE lfPitchAndFamily;
    CHAR lfFaceName[LF_FACESIZE];
} LOGFONTA;

typedef struct {
    LONG  lfHeight;
    LONG  lfWidth;
    LONG  lfEscapement;
    LONG  lfOrientation;
    LONG  lfWeight;
    BYTE  lfItalic;
    BYTE  lfUnderline;
    BYTE  lfStrikeOut;
    BYTE  lfCharSet;
    BYTE  lfOutPrecision;
    BYTE  lfClipPrecision;
    BYTE  lfQuality;
    BYTE  lfPitchAndFamily;
    WCHAR lfFaceName[LF_FACESIZE];
} LOGFONTW;

typedef DWORD HIMC;
typedef DWORD HIMCC;

typedef struct {
    DWORD dwIndex;
    DWORD dwStyle;
    POINT ptCurrentPos;
    RECT  rcArea;
} CANDIDATEFORM;

typedef struct {
    DWORD dwStyle;
    POINT ptCurrentPos;
    RECT  rcArea;
} COMPOSITIONFORM;

typedef struct {
    DWORD dwSize;
    DWORD dwStyle;
    DWORD dwCount;
    DWORD dwSelection;
    DWORD dwPageStart;
    DWORD dwPageSize;
    DWORD dwOffset[1];
} CANDIDATELIST;

#define STYLE_DESCRIPTION_SIZE  32

typedef struct {
    DWORD dwStyle;
    CHAR  szDescription[STYLE_DESCRIPTION_SIZE];
} STYLEBUFA;

typedef struct {
    DWORD dwStyle;
    WCHAR szDescription[STYLE_DESCRIPTION_SIZE];
} STYLEBUFW;

typedef WORD ATOM;

#define IMEMENUITEM_STRING_SIZE 80

typedef struct {
    UINT    cbSize;
    UINT    fType;
    UINT    fState;
    UINT    wID;
    HBITMAP hbmpChecked;
    HBITMAP hbmpUnchecked;
    DWORD   dwItemData;
    CHAR    szString[IMEMENUITEM_STRING_SIZE];
    HBITMAP hbmpItem;
} IMEMENUITEMINFOA;

typedef struct {
    UINT    cbSize;
    UINT    fType;
    UINT    fState;
    UINT    wID;
    HBITMAP hbmpChecked;
    HBITMAP hbmpUnchecked;
    DWORD   dwItemData;
    WCHAR   szString[IMEMENUITEM_STRING_SIZE];
    HBITMAP hbmpItem;
} IMEMENUITEMINFOW;

cpp_quote("#endif")

[
    object,
    uuid(08c03412-f96b-11d0-a475-00aa006bcc59),
    pointer_default(unique)
]
interface IEnumRegisterWordA : IUnknown
{
    HRESULT Clone(
            [out] IEnumRegisterWordA **ppEnum);

    HRESULT Next(
            [in]  ULONG ulCount,
            [out] REGISTERWORDA *rgRegisterword,
            [out] ULONG *pcFetched);

    HRESULT Reset();

    HRESULT Skip(
            [in]  ULONG ulCount);
}

[
    object,
    uuid(4955dd31-b159-11d0-8fcf-00aa006bcc59),
    pointer_default(unique)
]
interface IEnumRegisterWordW : IUnknown
{
    HRESULT Clone(
            [out] IEnumRegisterWordW **ppEnum);

    HRESULT Next(
            [in]  ULONG ulCount,
            [out] REGISTERWORDW *rgRegisterword,
            [out] ULONG *pcFetched);

    HRESULT Reset();

    HRESULT Skip(
            [in]  ULONG ulCount);
}

[
    object,
    uuid(09b5eab0-f997-11d1-93d4-0060b067b86e),
    pointer_default(unique),
    local
]
interface IEnumInputContext : IUnknown
{
    HRESULT Clone(
            [out] IEnumInputContext **ppEnum);

    HRESULT Next(
            [in]  ULONG ulCount,
            [out] HIMC *rgInputContext,
            [out] ULONG *pcFetched);

    HRESULT Reset();

    HRESULT Skip(
            [in]  ULONG ulCount);
}

[
    object,
    uuid(08c0e040-62d1-11d1-9326-0060b067b86e),
    pointer_default(unique),
    local
]
interface IActiveIMMApp : IUnknown
{
    HRESULT AssociateContext(
            [in]  HWND hWnd,
            [in]  HIMC hIME,
            [out] HIMC *phPrev);

    HRESULT ConfigureIMEA(
            [in]  HKL hKL,
            [in]  HWND hwnd,
            [in]  DWORD dwMode,
            [in]  REGISTERWORDA *pData);

    HRESULT ConfigureIMEW(
            [in]  HKL hKL,
            [in]  HWND hWnd,
            [in]  DWORD dwMode,
            [in]  REGISTERWORDW *pData);

    HRESULT CreateContext(
            [out] HIMC *phIMC);

    HRESULT DestroyContext(
            [in]  HIMC hIME);

    HRESULT EnumRegisterWordA(
            [in]  HKL hKL,
            [in]  LPSTR szReading,
            [in]  DWORD dwStyle,
            [in]  LPSTR szRegister,
            [in]  LPVOID pData,
            [out] IEnumRegisterWordA **pEnum);

    HRESULT EnumRegisterWordW(
            [in]  HKL hKL,
            [in]  LPWSTR szReading,
            [in]  DWORD dwStyle,
            [in]  LPWSTR szRegister,
            [in]  LPVOID pData,
            [out] IEnumRegisterWordW **pEnum);

    HRESULT EscapeA(
            [in]  HKL hKL,
            [in]  HIMC hIMC,
            [in]  UINT uEscape,
            [in, out] LPVOID pData,
            [out] LRESULT *plResult);

    HRESULT EscapeW(
            [in]  HKL hKL,
            [in]  HIMC hIMC,
            [in]  UINT uEscape,
            [in, out] LPVOID pData,
            [out] LRESULT *plResult);

    HRESULT GetCandidateListA(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  UINT uBufLen,
            [out] CANDIDATELIST *pCandList,
            [out] UINT *puCopied);

    HRESULT GetCandidateListW(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  UINT uBufLen,
            [out] CANDIDATELIST *pCandList,
            [out] UINT *puCopied);

    HRESULT GetCandidateListCountA(
            [in]  HIMC hIMC,
            [out] DWORD *pdwListSize,
            [out] DWORD *pdwBufLen);

    HRESULT GetCandidateListCountW(
            [in]  HIMC hIMC,
            [out] DWORD *pdwListSize,
            [out] DWORD *pdwBufLen);

    HRESULT GetCandidateWindow(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [out] CANDIDATEFORM *pCandidate);

    HRESULT GetCompositionFontA(
            [in]  HIMC hIMC,
            [out] LOGFONTA *plf);

    HRESULT GetCompositionFontW(
            [in]  HIMC hIMC,
            [out] LOGFONTW *plf);

    HRESULT GetCompositionStringA(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  DWORD dwBufLen,
            [out] LONG *plCopied,
            [out] LPVOID pBuf);

    HRESULT GetCompositionStringW(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  DWORD dwBufLen,
            [out] LONG *plCopied,
            [out] LPVOID pBuf);

    HRESULT GetCompositionWindow(
            [in]  HIMC hIMC,
            [out] COMPOSITIONFORM *pCompForm);

    HRESULT GetContext(
            [in]  HWND hwnd,
            [out] HIMC *phIMC);

    HRESULT GetConversionListA(
            [in]  HKL hKL,
            [in]  HIMC hIMC,
            [in]  LPSTR pSrc,
            [in]  UINT uBufLen,
            [in]  UINT uFlag,
            [out] CANDIDATELIST *pDst,
            [out] UINT *puCopied);

    HRESULT GetConversionListW(
            [in]  HKL hKL,
            [in]  HIMC hIMC,
            [in]  LPWSTR pSrc,
            [in]  UINT uBufLen,
            [in]  UINT uFlag,
            [out] CANDIDATELIST *pDst,
            [out] UINT *puCopied);

    HRESULT GetConversionStatus(
            [in] HIMC hIMC,
            [out] DWORD *pfdwConversion,
            [out] DWORD *pfdwSentence);

    HRESULT GetDefaultIMEWnd(
            [in] HWND hWnd,
            [out] HWND *phDefWnd);

    HRESULT GetDescriptionA(
            [in]  HKL hKL,
            [in]  UINT uBufLen,
            [out] LPSTR szDescription,
            [out] UINT *puCopied);

    HRESULT GetDescriptionW(
            [in]  HKL hKL,
            [in]  UINT uBufLen,
            [out] LPWSTR szDescription,
            [out] UINT *puCopied);

    HRESULT GetGuideLineA(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  DWORD dwBufLen,
            [out] LPSTR pBuf,
            [out] DWORD *pdwResult);

    HRESULT GetGuideLineW(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  DWORD dwBufLen,
            [out] LPWSTR pBuf,
            [out] DWORD *pdwResult);

    HRESULT GetIMEFileNameA(
            [in]  HKL hKL,
            [in]  UINT uBufLen,
            [out] LPSTR szFileName,
            [out] UINT *puCopied);

    HRESULT GetIMEFileNameW(
            [in]  HKL hKL,
            [in]  UINT uBufLen,
            [out] LPWSTR szFileName,
            [out] UINT *puCopied);

    HRESULT GetOpenStatus(
            [in]  HIMC hIMC);

    HRESULT GetProperty(
            [in]  HKL hKL,
            [in]  DWORD fdwIndex,
            [out] DWORD *pdwProperty);

    HRESULT GetRegisterWordStyleA(
            [in]  HKL hKL,
            [in]  UINT nItem,
            [out] STYLEBUFA *pStyleBuf,
            [out] UINT *puCopied);

    HRESULT GetRegisterWordStyleW(
            [in]  HKL hKL,
            [in]  UINT nItem,
            [out] STYLEBUFW *pStyleBuf,
            [out] UINT *puCopied);

    HRESULT GetStatusWindowPos(
            [in]  HIMC hIMC,
            [out] POINT *pptPos);

    HRESULT GetVirtualKey(
            [in]  HWND hWnd,
            [out] UINT *puVirtualKey);

    HRESULT InstallIMEA(
            [in]  LPSTR szIMEFileName,
            [in]  LPSTR szLayoutText,
            [out] HKL *phKL);

    HRESULT InstallIMEW(
            [in]  LPWSTR szIMEFileName,
            [in]  LPWSTR szLayoutText,
            [out] HKL *phKL);

    HRESULT IsIME(
            [in]  HKL hKL);

    HRESULT IsUIMessageA(
            [in]  HWND hWndIME,
            [in]  UINT msg,
            [in]  WPARAM wParam,
            [in]  LPARAM lParam);

    HRESULT IsUIMessageW(
            [in]  HWND hWndIME,
            [in]  UINT msg,
            [in]  WPARAM wParam,
            [in]  LPARAM lParam);

    HRESULT NotifyIME(
            [in]  HIMC hIMC,
            [in]  DWORD dwAction,
            [in]  DWORD dwIndex,
            [in]  DWORD dwValue);

    HRESULT RegisterWordA(
            [in]  HKL hKL,
            [in]  LPSTR szReading,
            [in]  DWORD dwStyle,
            [in]  LPSTR szRegister);

    HRESULT RegisterWordW(
            [in]  HKL hKL,
            [in]  LPWSTR szReading,
            [in]  DWORD dwStyle,
            [in]  LPWSTR szRegister);

    HRESULT ReleaseContext(
            [in]  HWND hWnd,
            [in]  HIMC hIMC);

    HRESULT SetCandidateWindow(
            [in]  HIMC hIMC,
            [in]  CANDIDATEFORM *pCandidate);

    HRESULT SetCompositionFontA(
            [in]  HIMC hIMC,
            [in]  LOGFONTA *plf);

    HRESULT SetCompositionFontW(
            [in]  HIMC hIMC,
            [in]  LOGFONTW *plf);

    HRESULT SetCompositionStringA(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  LPVOID pComp,
            [in]  DWORD dwCompLen,
            [in]  LPVOID pRead,
            [in]  DWORD dwReadLen);

    HRESULT SetCompositionStringW(
            [in]  HIMC hIMC,
            [in]  DWORD dwIndex,
            [in]  LPVOID pComp,
            [in]  DWORD dwCompLen,
            [in]  LPVOID pRead,
            [in]  DWORD dwReadLen);

    HRESULT SetCompositionWindow(
            [in]  HIMC hIMC,
            [in]  COMPOSITIONFORM *pCompForm);

    HRESULT SetConversionStatus(
            [in]  HIMC hIMC,
            [in]  DWORD fdwConversion,
            [in]  DWORD fdwSentence);

    HRESULT SetOpenStatus(
            [in]  HIMC hIMC,
            [in]  BOOL fOpen);

    HRESULT SetStatusWindowPos(
            [in]  HIMC hIMC,
            [in]  POINT *pptPos);

    HRESULT SimulateHotKey(
            [in]  HWND hwnd,
            [in]  DWORD dwHotKeyID);

    HRESULT UnregisterWordA(
            [in]  HKL hKL,
            [in]  LPSTR szReading,
            [in]  DWORD dwStyle,
            [in]  LPSTR szUnregister);

    HRESULT UnregisterWordW(
            [in]  HKL hKL,
            [in]  LPWSTR szReading,
            [in]  DWORD dwStyle,
            [in]  LPWSTR szUnregister);

    HRESULT Activate(
            [in]  BOOL fRestoreLayout);

    HRESULT Deactivate();

    HRESULT OnDefWindowProc(
            [in]  HWND hWnd,
            [in]  UINT Msg,
            [in]  WPARAM wParam,
            [in]  LPARAM lParam,
            [out] LRESULT *plResult);

    HRESULT FilterClientWindows(
            [in]  ATOM *aaClassList,
            [in]  UINT uSize);

    HRESULT GetCodePageA(
            [in]  HKL hKL,
            [out] UINT *uCodePage);

    HRESULT GetLangId(
            [in]  HKL hKL,
            [out] LANGID *plid);

    HRESULT AssociateContextEx(
            [in]  HWND hWnd,
            [in]  HIMC hIMC,
            [in]  DWORD dwFlags);

    HRESULT DisableIME(
            [in]  DWORD idThread);

    HRESULT GetImeMenuItemsA(
            [in]  HIMC hIMC,
            [in]  DWORD dwFlags,
            [in]  DWORD dwType,
            [in]  IMEMENUITEMINFOA *pImeParentMenu,
            [out] IMEMENUITEMINFOA *pImeMenu,
            [in]  DWORD dwSize,
            [out] DWORD *pdwResult);

    HRESULT GetImeMenuItemsW(
            [in]  HIMC hIMC,
            [in]  DWORD dwFlags,
            [in]  DWORD dwType,
            [in]  IMEMENUITEMINFOW *pImeParentMenu,
            [out] IMEMENUITEMINFOW *pImeMenu,
            [in]  DWORD dwSize,
            [out] DWORD *pdwResult);

    HRESULT EnumInputContext(
            [in]  DWORD idThread,
            [out] IEnumInputContext **ppEnum);
}

[
    object,
    uuid(b5cf2cfa-8aeb-11d1-9364-0060b067b86e),
    pointer_default(unique)
]
interface IActiveIMMMessagePumpOwner : IUnknown
{
    HRESULT Start();
    HRESULT End();
    HRESULT OnTranslateMessage([in] const MSG *msg);
    HRESULT Pause([out] DWORD *cookie);
    HRESULT Resume([in] DWORD cookie);
}

[
    uuid(4955dd33-b159-11d0-8fcf-00aa006bcc59)
]
coclass CActiveIMM
{
    [default] interface IActiveIMMApp;
    /* interface IActiveIMMIME; */
    /* interface IActiveIMMRegistrar; */
    interface IActiveIMMMessagePumpOwner;
}