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
);