2 * The entry point of IMM32.DLL.
4 * Copyright 2000 Hidenori Takeshima
16 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(imm);
19 #include "imm_private.h"
21 static HANDLE IMM32_hHeap;
22 static DWORD IMM32_dwTLSIndex;
23 static CRITICAL_SECTION IMM32_csIMM;
25 static BOOL IMM32_InitProcessMem( void );
26 static void IMM32_CleanupProcessMem( void );
27 static void IMM32_InitThreadData( void );
28 static void IMM32_CleanupThreadData( void );
31 /***********************************************************************
34 BOOL WINAPI IMM32_DllMain(
41 case DLL_PROCESS_ATTACH:
42 IMM32_InitProcessMem();
43 IMM32_RegisterIMEWndClass( hInstDLL );
45 case DLL_PROCESS_DETACH:
46 IMM32_UnloadAllIMEs();
47 IMM32_UnregisterIMEWndClass( hInstDLL );
48 IMM32_CleanupProcessMem();
50 case DLL_THREAD_ATTACH:
51 IMM32_InitThreadData();
53 case DLL_THREAD_DETACH:
54 IMM32_CleanupThreadData();
61 static BOOL IMM32_InitProcessMem( void )
63 IMM32_hHeap = (HANDLE)NULL;
64 IMM32_dwTLSIndex = (DWORD)0xffffffff;
66 IMM32_hHeap = HeapCreate( 0, 0x10000, 0 );
67 if ( IMM32_hHeap == (HANDLE)NULL )
69 ERR( "cannot allocate heap for IMM32.\n" );
73 IMM32_dwTLSIndex = TlsAlloc();
74 if ( IMM32_dwTLSIndex == (DWORD)0xffffffff )
76 ERR( "cannot allocate a TLS for IMM.\n" );
80 InitializeCriticalSection( &IMM32_csIMM );
85 static void IMM32_CleanupProcessMem( void )
87 DeleteCriticalSection( &IMM32_csIMM );
89 if ( IMM32_dwTLSIndex != (DWORD)0xffffffff )
91 TlsFree( IMM32_dwTLSIndex );
92 IMM32_dwTLSIndex = (DWORD)0xffffffff;
95 if ( IMM32_hHeap != (HANDLE)NULL )
97 (void)HeapDestroy( IMM32_hHeap );
98 IMM32_hHeap = (HANDLE)NULL;
102 LPVOID IMM32_HeapAlloc( DWORD dwFlags, DWORD dwSize )
104 return HeapAlloc( IMM32_hHeap, dwFlags, dwSize );
107 LPVOID IMM32_HeapReAlloc( DWORD dwFlags, LPVOID lpv, DWORD dwSize )
109 return HeapReAlloc( IMM32_hHeap, dwFlags, lpv, dwSize );
112 void IMM32_HeapFree( LPVOID lpv )
115 HeapFree( IMM32_hHeap, 0, lpv );
119 static void IMM32_InitThreadData( void )
121 TlsSetValue( IMM32_dwTLSIndex, NULL );
124 static void IMM32_CleanupThreadData( void )
126 IMM32_THREADDATA* pData;
128 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
131 /* Destroy Thread-local Data. */
132 if ( pData->hwndIME != (HWND)NULL )
133 DestroyWindow( pData->hwndIME );
134 if ( pData->hIMC != NULLIMC )
135 ImmDestroyContext( pData->hIMC );
137 IMM32_HeapFree( pData );
138 TlsSetValue( IMM32_dwTLSIndex, NULL );
142 IMM32_THREADDATA* IMM32_GetThreadData( void )
144 IMM32_THREADDATA* pData;
146 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
150 pData = (IMM32_THREADDATA*)
151 IMM32_HeapAlloc( 0, sizeof(IMM32_THREADDATA) );
155 /* Initialize Thread-local Data. */
156 pData->hwndIME = (HWND)NULL;
157 pData->hIMC = NULLIMC;
159 TlsSetValue( IMM32_dwTLSIndex, pData );
164 HIMC IMM32_GetDefaultContext( void )
166 IMM32_THREADDATA* pData;
168 pData = IMM32_GetThreadData();
171 if ( pData->hIMC == NULLIMC )
172 pData->hIMC = ImmCreateContext();
177 HWND IMM32_GetDefaultIMEWnd( void )
179 IMM32_THREADDATA* pData;
181 pData = IMM32_GetThreadData();
184 if ( pData->hwndIME == (HWND)NULL )
185 pData->hwndIME = IMM32_CreateDefaultIMEWnd();
187 return pData->hwndIME;
191 void IMM32_Lock( void )
193 EnterCriticalSection( &IMM32_csIMM );
196 void IMM32_Unlock( void )
198 LeaveCriticalSection( &IMM32_csIMM );