/*
 * 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),
    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);
}

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