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 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 /***********************************************************************
35 BOOL WINAPI
IMM32_DllMain(
42 case DLL_PROCESS_ATTACH
:
43 if ( IMM32_dwProcessAttached
> 0 )
45 ERR( "cannot attach to two or more processes.\n" );
48 IMM32_dwProcessAttached
++;
50 IMM32_InitProcessMem();
51 IMM32_RegisterIMEWndClass( hInstDLL
);
53 case DLL_PROCESS_DETACH
:
54 IMM32_UnloadAllIMEs();
55 IMM32_UnregisterIMEWndClass( hInstDLL
);
56 IMM32_CleanupProcessMem();
58 IMM32_dwProcessAttached
--;
60 case DLL_THREAD_ATTACH
:
61 IMM32_InitThreadData();
63 case DLL_THREAD_DETACH
:
64 IMM32_CleanupThreadData();
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" );
83 IMM32_dwTLSIndex
= TlsAlloc();
84 if ( IMM32_dwTLSIndex
== (DWORD
)0xffffffff )
86 ERR( "cannot allocate a TLS for IMM.\n" );
90 InitializeCriticalSection( &IMM32_csIMM
);
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
)
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
);
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
);
160 pData
= (IMM32_THREADDATA
*)
161 IMM32_HeapAlloc( 0, sizeof(IMM32_THREADDATA
) );
165 /* Initialize Thread-local Data. */
166 pData
->hwndIME
= (HWND
)NULL
;
167 pData
->hIMC
= NULLIMC
;
169 TlsSetValue( IMM32_dwTLSIndex
, pData
);
174 HIMC
IMM32_GetDefaultContext( void )
176 IMM32_THREADDATA
* pData
;
178 pData
= IMM32_GetThreadData();
181 if ( pData
->hIMC
== NULLIMC
)
182 pData
->hIMC
= ImmCreateContext();
187 HWND
IMM32_GetDefaultIMEWnd( void )
189 IMM32_THREADDATA
* pData
;
191 pData
= IMM32_GetThreadData();
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
);