/*
 *	private header for implementing IMM.
 *
 *	Copyright 2000 Hidenori Takeshima
 */

typedef struct IMM32_tagTHREADDATA	IMM32_THREADDATA;

struct IMM32_tagTHREADDATA
{
	HWND		hwndIME;
	HIMC		hIMC;
};

typedef struct IMM32_tagMOVEABLEMEM	IMM32_MOVEABLEMEM;

/* IME APIs */

typedef BOOL WINAPI (*IMM32_pImeInquireA)(LPIMEINFO, LPSTR, LPCSTR);
typedef BOOL WINAPI (*IMM32_pImeInquireW)(LPIMEINFO, LPWSTR, LPCWSTR);

typedef  BOOL WINAPI (*IMM32_pImeConfigureA)(HKL, HWND, DWORD, LPVOID);
typedef  BOOL WINAPI (*IMM32_pImeConfigureW)(HKL, HWND, DWORD, LPVOID);
typedef  DWORD WINAPI (*IMM32_pImeConversionListA)
	(HIMC, LPCSTR, LPCANDIDATELIST, DWORD, UINT);
typedef  DWORD WINAPI (*IMM32_pImeConversionListW)
	(HIMC, LPCWSTR, LPCANDIDATELIST, DWORD, UINT);
typedef  BOOL WINAPI (*IMM32_pImeDestroy)(UINT);
typedef  UINT WINAPI (*IMM32_pImeEnumRegisterWordA)
	(REGISTERWORDENUMPROCA, LPCSTR, DWORD, LPCSTR, LPVOID);
typedef  UINT WINAPI (*IMM32_pImeEnumRegisterWordW)
	(REGISTERWORDENUMPROCW, LPCWSTR, DWORD, LPCWSTR, LPVOID);
typedef UINT WINAPI (*IMM32_pImeGetRegisterWordStyleA)(UINT, LPSTYLEBUFA);
typedef UINT WINAPI (*IMM32_pImeGetRegisterWordStyleW)(UINT, LPSTYLEBUFW);
typedef LRESULT WINAPI (*IMM32_pImeEscapeA)(HIMC, UINT, LPVOID);
typedef LRESULT WINAPI (*IMM32_pImeEscapeW)(HIMC, UINT, LPVOID);
typedef BOOL WINAPI (*IMM32_pImeProcessKey)(HIMC, UINT, LPARAM, CONST LPBYTE);
typedef BOOL WINAPI (*IMM32_pImeRegisterWordA)(LPCSTR, DWORD, LPCSTR);
typedef BOOL WINAPI (*IMM32_pImeRegisterWordW)(LPCWSTR, DWORD, LPCWSTR);
typedef BOOL WINAPI (*IMM32_pImeSelect)(HIMC, BOOL);
typedef BOOL WINAPI (*IMM32_pImeSetActiveContext)(HIMC, BOOL);
typedef BOOL WINAPI (*IMM32_pImeSetCompositionStringA)
	(HIMC, DWORD, LPCVOID, DWORD, LPCVOID, DWORD);
typedef BOOL WINAPI (*IMM32_pImeSetCompositionStringW)
	(HIMC, DWORD, LPCVOID, DWORD, LPCVOID, DWORD);
typedef UINT WINAPI (*IMM32_pImeToAsciiEx)
	(UINT, UINT, CONST LPBYTE, LPDWORD, UINT, HIMC);
typedef BOOL WINAPI (*IMM32_pImeUnregisterWordA)(LPCSTR, DWORD, LPCSTR);
typedef BOOL WINAPI (*IMM32_pImeUnregisterWordW)(LPCWSTR, DWORD, LPCWSTR);
typedef BOOL WINAPI (*IMM32_pNotifyIME)(HIMC, DWORD, DWORD, DWORD);

/* for Win98 and later */
typedef DWORD WINAPI (*IMM32_pImeGetImeMenuItemsA)
	(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOA, LPIMEMENUITEMINFOA, DWORD);
typedef DWORD WINAPI (*IMM32_pImeGetImeMenuItemsW)
	(HIMC, DWORD, DWORD, LPIMEMENUITEMINFOW, LPIMEMENUITEMINFOW, DWORD);

struct IMM32_IME_EXPORTED_HANDLERS
{
	union
	{
		IMM32_pImeInquireA		A;
		IMM32_pImeInquireW		W;
	}				pImeInquire;

	union
	{
		IMM32_pImeConfigureA		A;
		IMM32_pImeConfigureW		W;
	}				pImeConfigure;
	union
	{
		IMM32_pImeConversionListA	A;
		IMM32_pImeConversionListW	W;
	}				pImeConversionList;
	IMM32_pImeDestroy		pImeDestroy;
	union
	{
		IMM32_pImeEnumRegisterWordA	A;
		IMM32_pImeEnumRegisterWordW	W;
	}				pImeEnumRegisterWord;
	union
	{
		IMM32_pImeGetRegisterWordStyleA	A;
		IMM32_pImeGetRegisterWordStyleW	W;
	}				pImeGetRegisterWordStyle;
	union
	{
		IMM32_pImeEscapeA		A;
		IMM32_pImeEscapeW		W;
	}				pImeEscape;
	IMM32_pImeProcessKey		pImeProcessKey;
	union
	{
		IMM32_pImeRegisterWordA		A;
		IMM32_pImeRegisterWordW		W;
	}			pImeRegisterWord;
	IMM32_pImeSelect		pImeSelect;
	IMM32_pImeSetActiveContext	pImeSetActiveContext;
	union
	{
		IMM32_pImeSetCompositionStringA	A;
		IMM32_pImeSetCompositionStringW	W;
	}				pImeSetCompositionString;
	IMM32_pImeToAsciiEx		pImeToAsciiEx;
	union
	{
		IMM32_pImeUnregisterWordA	A;
		IMM32_pImeUnregisterWordW	W;
	}				pImeUnregisterWord;
	IMM32_pNotifyIME		pNotifyIME;

	/* for Win98 and later */
	union
	{
		IMM32_pImeGetImeMenuItemsA	A;
		IMM32_pImeGetImeMenuItemsW	W;
	}				pImeGetImeMenuItems;
};

typedef struct IMM32_tagIMEKL	IMM32_IMEKL;
typedef struct IMM32_tagIMC	IMM32_IMC;

/* Win9x DDK says the UI class name can be up to 16 TCHARs. */
#define	IMM32_UICLASSNAME_MAX		16

struct IMM32_tagIMEKL
{
	IMM32_IMEKL*				pNext;
	HKL					hkl;
	BOOL					fUnicode;
	HINSTANCE				hInstIME;
	LPSTR					pszIMEFileName;
	IMEINFO					imeinfo;
	struct IMM32_IME_EXPORTED_HANDLERS	handlers;
	union
	{
		CHAR				A[IMM32_UICLASSNAME_MAX];
		WCHAR				W[IMM32_UICLASSNAME_MAX];
	}					UIClassName;
};

struct IMM32_tagIMC
{
	INPUTCONTEXT		context;
	const IMM32_IMEKL*	pkl;
	BOOL			fSelected;
};





/* main.c */
LPVOID IMM32_HeapAlloc( DWORD dwFlags, DWORD dwSize );
LPVOID IMM32_HeapReAlloc( DWORD dwFlags, LPVOID lpv, DWORD dwSize );
void IMM32_HeapFree( LPVOID lpv );
IMM32_THREADDATA* IMM32_GetThreadData( void );
HIMC IMM32_GetDefaultContext( void );
HWND IMM32_GetDefaultIMEWnd( void );
void IMM32_Lock( void );
void IMM32_Unlock( void );

/* memory.c */
IMM32_MOVEABLEMEM* IMM32_MoveableAlloc( DWORD dwHeapFlags, DWORD dwHeapSize );
void IMM32_MoveableFree( IMM32_MOVEABLEMEM* lpMoveable );
BOOL IMM32_MoveableReAlloc( IMM32_MOVEABLEMEM* lpMoveable,
			    DWORD dwHeapFlags, DWORD dwHeapSize );
LPVOID IMM32_MoveableLock( IMM32_MOVEABLEMEM* lpMoveable );
BOOL IMM32_MoveableUnlock( IMM32_MOVEABLEMEM* lpMoveable );
DWORD IMM32_MoveableGetLockCount( IMM32_MOVEABLEMEM* lpMoveable );
DWORD IMM32_MoveableGetSize( IMM32_MOVEABLEMEM* lpMoveable );

/* string.c */
INT IMM32_strlenAtoW( LPCSTR lpstr );
INT IMM32_strlenWtoA( LPCWSTR lpwstr );
LPWSTR IMM32_strncpyAtoW( LPWSTR lpwstr, LPCSTR lpstr, INT wbuflen );
LPSTR IMM32_strncpyWtoA( LPSTR lpstr, LPCWSTR lpwstr, INT abuflen );
LPWSTR IMM32_strdupAtoW( LPCSTR lpstr );
LPSTR IMM32_strdupWtoA( LPCWSTR lpwstr );

/* imewnd.c */
BOOL IMM32_RegisterIMEWndClass( HINSTANCE hInstDLL );
void IMM32_UnregisterIMEWndClass( HINSTANCE hInstDLL );
HWND IMM32_CreateDefaultIMEWnd( void );

/* imekl.c */
const IMM32_IMEKL* IMM32_GetIME( HKL hkl );
void IMM32_UnloadAllIMEs( void );

/* imc.c */
IMM32_IMC* IMM32_LockIMC( HIMC hIMC );
BOOL IMM32_UnlockIMC( HIMC hIMC );


