/*
 * 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 WORD LANGID;

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)
]
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)
]
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);
}

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