/****************************** Module Header ******************************\
* Module Name: immuser.h
*
* Copyright (c) 1985 - 1999, Microsoft Corporation
*
* This header file contains the internal IMM structure definitions for
* the user mode USER32/IMM32.
*
* History:
* 25-Mar-1996 TakaoK        Split from immstruc.h
\***************************************************************************/
#ifndef _IMMUSER_
#define _IMMUSER_

#include <imm.h>
#include <immp.h>
#include <ime.h>
#include <imep.h>

/*
 * Client side input context structure.
 */
typedef struct tagCLIENTIMC {
    HANDLE hInputContext;
    LONG   cLockObj;
    DWORD  dwFlags;
    DWORD  dwImeCompatFlags;    // win95 compatible application compat flags
    RTL_CRITICAL_SECTION cs;
    DWORD  dwCodePage;
    HKL    SelectedHKL;
#ifdef CUAS_ENABLE
    BOOL   fCtfImeContext;
#endif
} CLIENTIMC, *PCLIENTIMC;

#define InitImcCrit(pClientImc)     RtlInitializeCriticalSection(&pClientImc->cs)
#define DeleteImcCrit(pClientImc)   RtlDeleteCriticalSection(&pClientImc->cs)
#define EnterImcCrit(pClientImc)    RtlEnterCriticalSection(&pClientImc->cs)
#define LeaveImcCrit(pClientImc)    RtlLeaveCriticalSection(&pClientImc->cs)

/*
 * IME Dispatch Processing Interface
 */
typedef BOOL    (CALLBACK* PFNINQUIREA)(LPIMEINFO, LPSTR,  DWORD);
typedef BOOL    (CALLBACK* PFNINQUIREW)(LPIMEINFO, LPWSTR, DWORD);
typedef DWORD   (CALLBACK* PFNCONVLISTA)(HIMC, LPCSTR,  LPCANDIDATELIST, DWORD, UINT);
typedef DWORD   (CALLBACK* PFNCONVLISTW)(HIMC, LPCWSTR, LPCANDIDATELIST, DWORD, UINT);
typedef BOOL    (CALLBACK* PFNREGWORDA)(LPCSTR,  DWORD, LPCSTR);
typedef BOOL    (CALLBACK* PFNREGWORDW)(LPCWSTR, DWORD, LPCWSTR);
typedef BOOL    (CALLBACK* PFNUNREGWORDA)(LPCSTR,  DWORD, LPCSTR);
typedef BOOL    (CALLBACK* PFNUNREGWORDW)(LPCWSTR, DWORD, LPCWSTR);
typedef UINT    (CALLBACK* PFNGETREGWORDSTYA)(UINT, LPSTYLEBUFA);
typedef UINT    (CALLBACK* PFNGETREGWORDSTYW)(UINT, LPSTYLEBUFW);
typedef UINT    (CALLBACK* PFNENUMREGWORDA)(REGISTERWORDENUMPROCA, LPCSTR,  DWORD, LPCSTR,  LPVOID);
typedef UINT    (CALLBACK* PFNENUMREGWORDW)(REGISTERWORDENUMPROCW, LPCWSTR, DWORD, LPCWSTR, LPVOID);
typedef BOOL    (CALLBACK* PFNCONFIGURE)(HKL, HWND, DWORD, LPVOID);
typedef BOOL    (CALLBACK* PFNDESTROY)(UINT);
typedef LRESULT (CALLBACK* PFNESCAPE)(HIMC, UINT, LPVOID);
typedef BOOL    (CALLBACK* PFNPROCESSKEY)(HIMC, UINT, LPARAM, CONST LPBYTE);
typedef BOOL    (CALLBACK* PFNSELECT)(HIMC, BOOL);
typedef BOOL    (CALLBACK* PFNSETACTIVEC)(HIMC, BOOL);
typedef UINT    (CALLBACK* PFNTOASCEX)(UINT, UINT, CONST LPBYTE, PTRANSMSGLIST, UINT, HIMC);
typedef BOOL    (CALLBACK* PFNNOTIFY)(HIMC, DWORD, DWORD, DWORD);
typedef BOOL    (CALLBACK* PFNSETCOMPSTR)(HIMC, DWORD, LPCVOID, DWORD, LPCVOID, DWORD);
typedef DWORD   (CALLBACK* PFNGETIMEMENUITEMS)(HIMC, DWORD, DWORD, LPVOID, LPVOID, DWORD);

#ifdef CUAS_ENABLE
/*
 * IME Dispatch Processing Interface for Cicero Unaware Apps Support.
 */
typedef BOOL    (CALLBACK* PFNINQUIREEXW)(LPIMEINFO, LPWSTR, DWORD, HKL);
typedef HRESULT (CALLBACK* PFNSELECTEX)(HIMC, BOOL, HKL);
typedef LRESULT (CALLBACK* PFNESCAPEEX)(HIMC, UINT, LPVOID, HKL);
typedef HRESULT (CALLBACK* PFNGETGUIDATOM)(HIMC, BYTE, DWORD*);
typedef BOOL    (CALLBACK* PFNISGUIDMAPENABLE)(HIMC);
#endif // CUAS_ENABLE

#define IMEDPI_UNLOADED      1
#define IMEDPI_UNLOCKUNLOAD  2

typedef struct tagIMEDPI {
    struct tagIMEDPI   *pNext;
    HANDLE              hInst;
    HKL                 hKL;
    IMEINFO             ImeInfo;
    DWORD               dwCodePage;
    WCHAR               wszUIClass[IM_UI_CLASS_SIZE];
    DWORD               cLock;
    DWORD               dwFlag;

    struct _tagImeFunctions {
        union {PFNINQUIREA       a; PFNINQUIREW       w; PVOID t;} ImeInquire;
        union {PFNCONVLISTA      a; PFNCONVLISTW      w; PVOID t;} ImeConversionList;
        union {PFNREGWORDA       a; PFNREGWORDW       w; PVOID t;} ImeRegisterWord;
        union {PFNUNREGWORDA     a; PFNUNREGWORDW     w; PVOID t;} ImeUnregisterWord;
        union {PFNGETREGWORDSTYA a; PFNGETREGWORDSTYW w; PVOID t;} ImeGetRegisterWordStyle;
        union {PFNENUMREGWORDA   a; PFNENUMREGWORDW   w; PVOID t;} ImeEnumRegisterWord;
        PFNCONFIGURE                                               ImeConfigure;
        PFNDESTROY                                                 ImeDestroy;
        PFNESCAPE                                                  ImeEscape;
        PFNPROCESSKEY                                              ImeProcessKey;
        PFNSELECT                                                  ImeSelect;
        PFNSETACTIVEC                                              ImeSetActiveContext;
        PFNTOASCEX                                                 ImeToAsciiEx;
        PFNNOTIFY                                                  NotifyIME;
        PFNSETCOMPSTR                                              ImeSetCompositionString;
        PFNGETIMEMENUITEMS                                         ImeGetImeMenuItems;

#ifdef CUAS_ENABLE
        PFNINQUIREEXW                                              CtfImeInquireExW; // Unicode only
        PFNSELECTEX                                                CtfImeSelectEx;
        PFNESCAPEEX                                                CtfImeEscapeEx;
        PFNGETGUIDATOM                                             CtfImeGetGuidAtom;
        PFNISGUIDMAPENABLE                                         CtfImeIsGuidMapEnable;
#endif // CUAS_ENABLE

    } pfn;

} IMEDPI, *PIMEDPI;

/*
 * IME Mode Saver
 */

typedef struct tagIMEPRIVATESAVER {
    struct tagIMEPRIVATESAVER* next;
    HKL hkl;
    DWORD fdwSentence;
} IMEPRIVATEMODESAVER, *PIMEPRIVATEMODESAVER;

typedef struct tagIMEMODESAVER {
    struct tagIMEMODESAVER* next;
    USHORT langId;                  // Primary LangId
    BOOLEAN fOpen;
    DWORD fdwConversion;
    DWORD fdwSentence;
    DWORD fdwInit;
    PIMEPRIVATEMODESAVER pImePrivateModeSaver;
} IMEMODESAVER, *PIMEMODESAVER;


/*
 * Private client side routines in IMM32.DLL.
 */
BOOL ImmSetActiveContext(
    HWND hWnd,
    HIMC hImc,
    BOOL fActivate);

BOOL WINAPI ImmLoadIME(
    HKL hKL);

BOOL WINAPI ImmUnloadIME(
    HKL hKL);

BOOL WINAPI ImmFreeLayout(
    DWORD dwFlag);

BOOL WINAPI ImmActivateLayout(
    HKL    hSelKL);

BOOL WINAPI ImmLoadLayout(
    HKL        hKL,
    PIMEINFOEX piiex);

BOOL WINAPI ImmDisableIme(
    DWORD dwThreadId);

PCLIENTIMC WINAPI ImmLockClientImc(
    HIMC hImc);

VOID WINAPI ImmUnlockClientImc(
    PCLIENTIMC pClientImc);

PIMEDPI WINAPI ImmLockImeDpi(
    HKL hKL);

VOID WINAPI ImmUnlockImeDpi(
    PIMEDPI pImeDpi);

BOOL WINAPI ImmGetImeInfoEx(
    PIMEINFOEX piiex,
    IMEINFOEXCLASS SearchType,
    PVOID pvSearchKey);

DWORD WINAPI ImmProcessKey(
    HWND hWnd,
    HKL  hkl,
    UINT uVKey,
    LPARAM lParam,
    DWORD dwHotKeyID);

BOOL ImmTranslateMessage(
    HWND        hwnd,
    UINT        message,
    WPARAM      wParam,
    LPARAM      lParam);

VOID ImmInitializeHotKeys( BOOL bUserLoggedOn );

#ifdef CUAS_ENABLE

HRESULT CtfImmTIMActivate(HKL hKL);

HRESULT CtfImmCoInitialize();

void CtfImmCoUninitialize();

#endif // CUAS_ENABLE

#endif // _IMMUSER_