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