2 * The entry point of IMM32.DLL.
4 * Copyright 2000 Hidenori Takeshima
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "wine/debug.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(imm);
33 #include "imm_private.h"
35 static HANDLE IMM32_hHeap;
36 static DWORD IMM32_dwTLSIndex;
37 static CRITICAL_SECTION IMM32_csIMM;
39 static BOOL IMM32_InitProcessMem( void );
40 static void IMM32_CleanupProcessMem( void );
41 static void IMM32_InitThreadData( void );
42 static void IMM32_CleanupThreadData( void );
45 /***********************************************************************
48 BOOL WINAPI IMM32_DllMain(
55 case DLL_PROCESS_ATTACH:
56 IMM32_InitProcessMem();
57 IMM32_RegisterIMEWndClass( hInstDLL );
59 case DLL_PROCESS_DETACH:
60 IMM32_UnloadAllIMEs();
61 IMM32_UnregisterIMEWndClass( hInstDLL );
62 IMM32_CleanupProcessMem();
64 case DLL_THREAD_ATTACH:
65 IMM32_InitThreadData();
67 case DLL_THREAD_DETACH:
68 IMM32_CleanupThreadData();
75 static BOOL IMM32_InitProcessMem( void )
77 IMM32_hHeap = (HANDLE)NULL;
78 IMM32_dwTLSIndex = (DWORD)0xffffffff;
80 IMM32_hHeap = HeapCreate( 0, 0x10000, 0 );
81 if ( IMM32_hHeap == (HANDLE)NULL )
83 ERR( "cannot allocate heap for IMM32.\n" );
87 IMM32_dwTLSIndex = TlsAlloc();
88 if ( IMM32_dwTLSIndex == (DWORD)0xffffffff )
90 ERR( "cannot allocate a TLS for IMM.\n" );
94 InitializeCriticalSection( &IMM32_csIMM );
99 static void IMM32_CleanupProcessMem( void )
101 DeleteCriticalSection( &IMM32_csIMM );
103 if ( IMM32_dwTLSIndex != (DWORD)0xffffffff )
105 TlsFree( IMM32_dwTLSIndex );
106 IMM32_dwTLSIndex = (DWORD)0xffffffff;
109 if ( IMM32_hHeap != (HANDLE)NULL )
111 (void)HeapDestroy( IMM32_hHeap );
112 IMM32_hHeap = (HANDLE)NULL;
116 LPVOID IMM32_HeapAlloc( DWORD dwFlags, DWORD dwSize )
118 return HeapAlloc( IMM32_hHeap, dwFlags, dwSize );
121 LPVOID IMM32_HeapReAlloc( DWORD dwFlags, LPVOID lpv, DWORD dwSize )
123 return HeapReAlloc( IMM32_hHeap, dwFlags, lpv, dwSize );
126 void IMM32_HeapFree( LPVOID lpv )
129 HeapFree( IMM32_hHeap, 0, lpv );
133 static void IMM32_InitThreadData( void )
135 TlsSetValue( IMM32_dwTLSIndex, NULL );
138 static void IMM32_CleanupThreadData( void )
140 IMM32_THREADDATA* pData;
142 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
145 /* Destroy Thread-local Data. */
146 if ( pData->hwndIME != (HWND)NULL )
147 DestroyWindow( pData->hwndIME );
148 if ( pData->hIMC != NULLIMC )
149 ImmDestroyContext( pData->hIMC );
151 IMM32_HeapFree( pData );
152 TlsSetValue( IMM32_dwTLSIndex, NULL );
156 IMM32_THREADDATA* IMM32_GetThreadData( void )
158 IMM32_THREADDATA* pData;
160 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
164 pData = (IMM32_THREADDATA*)
165 IMM32_HeapAlloc( 0, sizeof(IMM32_THREADDATA) );
169 /* Initialize Thread-local Data. */
170 pData->hwndIME = (HWND)NULL;
171 pData->hIMC = NULLIMC;
173 TlsSetValue( IMM32_dwTLSIndex, pData );
178 HIMC IMM32_GetDefaultContext( void )
180 IMM32_THREADDATA* pData;
182 pData = IMM32_GetThreadData();
185 if ( pData->hIMC == NULLIMC )
186 pData->hIMC = ImmCreateContext();
191 HWND IMM32_GetDefaultIMEWnd( void )
193 IMM32_THREADDATA* pData;
195 pData = IMM32_GetThreadData();
198 if ( pData->hwndIME == (HWND)NULL )
199 pData->hwndIME = IMM32_CreateDefaultIMEWnd();
201 return pData->hwndIME;
205 void IMM32_Lock( void )
207 EnterCriticalSection( &IMM32_csIMM );
210 void IMM32_Unlock( void )
212 LeaveCriticalSection( &IMM32_csIMM );