Some borken memory monitoring programs divide by dwTotalPageFile,
[wine/testsucceed.git] / dlls / imm32 / main.c
blob88753f59da30533afb29eabaf7ce72f9bb64222b
1 /*
2 * The entry point of IMM32.DLL.
4 * Copyright 2000 Hidenori Takeshima
5 */
7 #include "config.h"
9 #include "winbase.h"
10 #include "windef.h"
11 #include "wingdi.h"
12 #include "winuser.h"
13 #include "winerror.h"
14 #include "immddk.h"
16 #include "debugtools.h"
17 DEFAULT_DEBUG_CHANNEL(imm);
19 #include "imm_private.h"
21 static DWORD IMM32_dwProcessAttached = 0;
22 static HANDLE IMM32_hHeap;
23 static DWORD IMM32_dwTLSIndex;
24 static CRITICAL_SECTION IMM32_csIMM;
26 static BOOL IMM32_InitProcessMem( void );
27 static void IMM32_CleanupProcessMem( void );
28 static void IMM32_InitThreadData( void );
29 static void IMM32_CleanupThreadData( void );
32 /***********************************************************************
33 * IMM32_DllMain
35 BOOL WINAPI IMM32_DllMain(
36 HINSTANCE hInstDLL,
37 DWORD fdwReason,
38 LPVOID lpvReserved )
40 switch ( fdwReason )
42 case DLL_PROCESS_ATTACH:
43 if ( IMM32_dwProcessAttached > 0 )
45 ERR( "cannot attach to two or more processes.\n" );
46 return FALSE;
48 IMM32_dwProcessAttached ++;
50 IMM32_InitProcessMem();
51 IMM32_RegisterIMEWndClass( hInstDLL );
52 break;
53 case DLL_PROCESS_DETACH:
54 IMM32_UnloadAllIMEs();
55 IMM32_UnregisterIMEWndClass( hInstDLL );
56 IMM32_CleanupProcessMem();
58 IMM32_dwProcessAttached --;
59 break;
60 case DLL_THREAD_ATTACH:
61 IMM32_InitThreadData();
62 break;
63 case DLL_THREAD_DETACH:
64 IMM32_CleanupThreadData();
65 break;
68 return TRUE;
71 static BOOL IMM32_InitProcessMem( void )
73 IMM32_hHeap = (HANDLE)NULL;
74 IMM32_dwTLSIndex = (DWORD)0xffffffff;
76 IMM32_hHeap = HeapCreate( 0, 0x10000, 0 );
77 if ( IMM32_hHeap == (HANDLE)NULL )
79 ERR( "cannot allocate heap for IMM32.\n" );
80 return FALSE;
83 IMM32_dwTLSIndex = TlsAlloc();
84 if ( IMM32_dwTLSIndex == (DWORD)0xffffffff )
86 ERR( "cannot allocate a TLS for IMM.\n" );
87 return FALSE;
90 InitializeCriticalSection( &IMM32_csIMM );
92 return TRUE;
95 static void IMM32_CleanupProcessMem( void )
97 DeleteCriticalSection( &IMM32_csIMM );
99 if ( IMM32_dwTLSIndex != (DWORD)0xffffffff )
101 TlsFree( IMM32_dwTLSIndex );
102 IMM32_dwTLSIndex = (DWORD)0xffffffff;
105 if ( IMM32_hHeap != (HANDLE)NULL )
107 (void)HeapDestroy( IMM32_hHeap );
108 IMM32_hHeap = (HANDLE)NULL;
112 LPVOID IMM32_HeapAlloc( DWORD dwFlags, DWORD dwSize )
114 return HeapAlloc( IMM32_hHeap, dwFlags, dwSize );
117 LPVOID IMM32_HeapReAlloc( DWORD dwFlags, LPVOID lpv, DWORD dwSize )
119 return HeapReAlloc( IMM32_hHeap, dwFlags, lpv, dwSize );
122 void IMM32_HeapFree( LPVOID lpv )
124 if ( lpv != NULL )
125 HeapFree( IMM32_hHeap, 0, lpv );
129 static void IMM32_InitThreadData( void )
131 TlsSetValue( IMM32_dwTLSIndex, NULL );
134 static void IMM32_CleanupThreadData( void )
136 IMM32_THREADDATA* pData;
138 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
139 if ( pData != NULL )
141 /* Destroy Thread-local Data. */
142 if ( pData->hwndIME != (HWND)NULL )
143 DestroyWindow( pData->hwndIME );
144 if ( pData->hIMC != NULLIMC )
145 ImmDestroyContext( pData->hIMC );
147 IMM32_HeapFree( pData );
148 TlsSetValue( IMM32_dwTLSIndex, NULL );
152 IMM32_THREADDATA* IMM32_GetThreadData( void )
154 IMM32_THREADDATA* pData;
156 pData = (IMM32_THREADDATA*)TlsGetValue( IMM32_dwTLSIndex );
157 if ( pData != NULL )
158 return pData;
160 pData = (IMM32_THREADDATA*)
161 IMM32_HeapAlloc( 0, sizeof(IMM32_THREADDATA) );
162 if ( pData == NULL )
163 return NULL;
165 /* Initialize Thread-local Data. */
166 pData->hwndIME = (HWND)NULL;
167 pData->hIMC = NULLIMC;
169 TlsSetValue( IMM32_dwTLSIndex, pData );
171 return pData;
174 HIMC IMM32_GetDefaultContext( void )
176 IMM32_THREADDATA* pData;
178 pData = IMM32_GetThreadData();
179 if ( pData == NULL )
180 return NULLIMC;
181 if ( pData->hIMC == NULLIMC )
182 pData->hIMC = ImmCreateContext();
184 return pData->hIMC;
187 HWND IMM32_GetDefaultIMEWnd( void )
189 IMM32_THREADDATA* pData;
191 pData = IMM32_GetThreadData();
192 if ( pData == NULL )
193 return NULLIMC;
194 if ( pData->hwndIME == (HWND)NULL )
195 pData->hwndIME = IMM32_CreateDefaultIMEWnd();
197 return pData->hwndIME;
201 void IMM32_Lock( void )
203 EnterCriticalSection( &IMM32_csIMM );
206 void IMM32_Unlock( void )
208 LeaveCriticalSection( &IMM32_csIMM );