- Implement Ime (only) class support. This is for the new synced class tests. Recommending Developers choice for testing real Imm32.dll support. Should include registry Loading of IMM via Win32k.
- Based on patch by Piotr Caban : Move IME window procedure to user32.

svn path=/trunk/; revision=65977
This commit is contained in:
James Tabor 2015-01-04 19:27:40 +00:00
parent b74720f96d
commit ee1b62f7f1
7 changed files with 337 additions and 102 deletions

View file

@ -1121,6 +1121,32 @@ typedef struct tagIMEINFOEX
};
} IMEINFOEX, *PIMEINFOEX;
typedef struct tagIMEUI
{
PWND spwnd;
HIMC hIMC;
HWND hwndIMC;
HKL hKL;
HWND hwndUI;
INT nCntInIMEProc;
struct {
UINT fShowStatus:1;
UINT fActivate:1;
UINT fDestroy:1;
UINT fDefault:1;
UINT fChildThreadDef:1;
UINT fCtrlShowStatus:1;
UINT fFreeActiveEvent:1;
};
} IMEUI, *PIMEUI;
// Window Extra data container.
typedef struct _IMEWND
{
WND;
PIMEUI pimeui;
} IMEWND, *PIMEWND;
DWORD
NTAPI

View file

@ -101,6 +101,12 @@ BOOL WINAPI RegisterSystemControls(VOID)
RegisterDefaultClasses |= ICLASS_TO_MASK(g_SysClasses[i].ClsId);
}
if ( //gpsi->dwSRVIFlags & SRVINFO_IMM32 && Not supported yet, need NlsMbCodePageTag working in Win32k.
!(RegisterDefaultClasses & ICLASS_TO_MASK(ICLS_IME))) // So, work like XP.
{
RegisterIMEClass();
}
return TRUE;
}
@ -170,8 +176,8 @@ BOOL WINAPI RegisterClientPFN(VOID)
pfnClientW.pfnMDIClientWndProc = MDIClientWndProcW;
pfnClientA.pfnStaticWndProc = StaticWndProcA;
pfnClientW.pfnStaticWndProc = StaticWndProcW;
pfnClientA.pfnImeWndProc = DefWindowProcA;
pfnClientW.pfnImeWndProc = DefWindowProcW;
pfnClientA.pfnImeWndProc = ImeWndProcA;
pfnClientW.pfnImeWndProc = ImeWndProcW;
pfnClientA.pfnGhostWndProc = DefWindowProcA;
pfnClientW.pfnGhostWndProc = DefWindowProcW;
pfnClientA.pfnHkINLPCWPSTRUCT = DefWindowProcA;
@ -195,7 +201,7 @@ BOOL WINAPI RegisterClientPFN(VOID)
pfnClientWorker.pfnListBoxWndProc = ListBoxWndProc_common;
pfnClientWorker.pfnMDIClientWndProc = MDIClientWndProc_common;
pfnClientWorker.pfnStaticWndProc = StaticWndProc_common;
pfnClientWorker.pfnImeWndProc = User32DefWindowProc;
pfnClientWorker.pfnImeWndProc = ImeWndProc_common;
pfnClientWorker.pfnGhostWndProc = User32DefWindowProc;
pfnClientWorker.pfnCtfHookProc = User32DefWindowProc;

View file

@ -41,3 +41,8 @@ extern const struct builtin_class_descr STATIC_builtin_class;
ATOM WINAPI RegisterClassExWOWW(WNDCLASSEXW *,LPDWORD,WORD,DWORD,BOOL);
BOOL FASTCALL VersionRegisterClass(PCWSTR,LPCWSTR,HANDLE,HMODULE *);
LRESULT WINAPI ImeWndProc_common(HWND,UINT,WPARAM,LPARAM,BOOL);
LRESULT WINAPI ImeWndProcA(HWND,UINT,WPARAM,LPARAM);
LRESULT WINAPI ImeWndProcW(HWND,UINT,WPARAM,LPARAM);
BOOL WINAPI RegisterIMEClass(VOID);

View file

@ -17,22 +17,49 @@
#include "resource.h"
#include "ntwrapper.h"
typedef struct
{
BOOL (WINAPI* pImmIsIME) (HKL);
LRESULT (WINAPI* pImmEscapeA) (HKL, HIMC, UINT, LPVOID);
LRESULT (WINAPI* pImmEscapeW) (HKL, HIMC, UINT, LPVOID);
LONG (WINAPI* pImmGetCompositionStringA) (HIMC, DWORD, LPVOID, DWORD);
LONG (WINAPI* pImmGetCompositionStringW) (HIMC, DWORD, LPVOID, DWORD);
BOOL (WINAPI* pImmGetCompositionFontA) (HIMC, LPLOGFONTA);
BOOL (WINAPI* pImmGetCompositionFontW) (HIMC, LPLOGFONTW);
BOOL (WINAPI* pImmSetCompositionFontA)(HIMC, LPLOGFONTA);
BOOL (WINAPI* pImmSetCompositionFontW)(HIMC, LPLOGFONTW);
BOOL (WINAPI* pImmGetCompositionWindow) (HIMC, LPCOMPOSITIONFORM);
BOOL (WINAPI* pImmSetCompositionWindow) (HIMC, LPCOMPOSITIONFORM);
HIMC (WINAPI* pImmAssociateContext) (HWND, HIMC);
BOOL (WINAPI* pImmReleaseContext) (HWND, HIMC);
HIMC (WINAPI* pImmGetContext) (HWND);
HWND (WINAPI* pImmGetDefaultIMEWnd) (HWND);
BOOL (WINAPI* pImmNotifyIME) (HIMC, DWORD, DWORD, DWORD);
BOOL (WINAPI* pImmRegisterClient) (PVOID, HINSTANCE);
UINT (WINAPI* pImmProcessKey) (HWND, HKL, UINT, LPARAM, DWORD);
} Imm32ApiTable;
/* global variables */
extern HINSTANCE User32Instance;
#define user32_module User32Instance
extern PPROCESSINFO g_ppi;
extern ULONG_PTR g_ulSharedDelta;
extern PSERVERINFO gpsi;
extern SHAREDINFO gSharedInfo;
extern BOOLEAN gfLogonProcess;
extern BOOLEAN gfServerProcess;
extern PUSER_HANDLE_TABLE gHandleTable;
extern PUSER_HANDLE_ENTRY gHandleEntries;
extern CRITICAL_SECTION U32AccelCacheLock;
extern HINSTANCE hImmInstance;
extern HINSTANCE ghImm32;
extern RTL_CRITICAL_SECTION gcsUserApiHook;
extern USERAPIHOOK guah;
extern HINSTANCE ghmodUserApiHook;
extern HICON hIconSmWindows, hIconWindows;
extern Imm32ApiTable gImmApiEntries;
#define IS_ATOM(x) \
(((ULONG_PTR)(x) > 0x0) && ((ULONG_PTR)(x) < 0x10000))
@ -105,5 +132,6 @@ HWND* WIN_ListChildren (HWND hWndparent);
VOID DeleteFrameBrushes(VOID);
BOOL WINAPI GdiValidateHandle(HGDIOBJ);
HANDLE FASTCALL UserGetProp(HWND hWnd, ATOM Atom);
BOOL WINAPI InitializeImmEntryTable(VOID);
/* EOF */

View file

@ -14,6 +14,7 @@ PPROCESSINFO g_ppi = NULL;
PUSER_HANDLE_TABLE gHandleTable = NULL;
PUSER_HANDLE_ENTRY gHandleEntries = NULL;
PSERVERINFO gpsi = NULL;
SHAREDINFO gSharedInfo = {0};
ULONG_PTR g_ulSharedDelta;
BOOLEAN gfLogonProcess = FALSE;
BOOLEAN gfServerProcess = FALSE;
@ -262,6 +263,7 @@ ClientThreadSetupHelper(BOOL IsCallback)
gpsi = SharedPtrToUser(UserCon.siClient.psi);
gHandleTable = SharedPtrToUser(UserCon.siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
gSharedInfo = UserCon.siClient;
// ERR("1 SI 0x%x : HT 0x%x : D 0x%x\n", UserCon.siClient.psi, UserCon.siClient.aheList, g_ulSharedDelta);
}
@ -414,6 +416,7 @@ Init(PUSERCONNECT UserCon /*PUSERSRV_API_CONNECTINFO*/)
gpsi = SharedPtrToUser(UserCon->siClient.psi);
gHandleTable = SharedPtrToUser(UserCon->siClient.aheList);
gHandleEntries = SharedPtrToUser(gHandleTable->handles);
gSharedInfo = UserCon->siClient;
}
// FIXME: Yet another hack... This call should normally not be done here, but
@ -518,13 +521,22 @@ DllMain(
if (!Init(&ConnectInfo))
return FALSE;
if (!gfServerProcess)
{
InitializeImmEntryTable();
//
// Wine is stub and throws an exception so save this for real Imm32.dll testing!!!!
//
//gImmApiEntries.pImmRegisterClient(&gSharedInfo, ghImm32);
}
break;
}
case DLL_PROCESS_DETACH:
{
if (hImmInstance)
FreeLibrary(hImmInstance);
if (ghImm32)
FreeLibrary(ghImm32);
Cleanup();
break;

View file

@ -13,38 +13,31 @@
#include <winnls32.h>
#include <wine/debug.h>
#include <strsafe.h>
WINE_DEFAULT_DEBUG_CHANNEL(user32);
#define IMM_INIT_MAGIC 0x19650412
typedef struct
Imm32ApiTable gImmApiEntries = {0};
HINSTANCE ghImm32 = NULL;
BOOL bImmInitializing = FALSE;
BOOL ImmApiTableZero = TRUE;
HRESULT WINAPI GetImmFileName(PWSTR lpBuffer, UINT uSize)
{
BOOL (WINAPI* pImmIsIME) (HKL);
LRESULT (WINAPI* pImmEscapeA) (HKL, HIMC, UINT, LPVOID);
LRESULT (WINAPI* pImmEscapeW) (HKL, HIMC, UINT, LPVOID);
LONG (WINAPI* pImmGetCompositionStringA) (HIMC, DWORD, LPVOID, DWORD);
LONG (WINAPI* pImmGetCompositionStringW) (HIMC, DWORD, LPVOID, DWORD);
BOOL (WINAPI* pImmGetCompositionFontA) (HIMC, LPLOGFONTA);
BOOL (WINAPI* pImmGetCompositionFontW) (HIMC, LPLOGFONTW);
BOOL (WINAPI* pImmSetCompositionFontA)(HIMC, LPLOGFONTA);
BOOL (WINAPI* pImmSetCompositionFontW)(HIMC, LPLOGFONTW);
BOOL (WINAPI* pImmGetCompositionWindow) (HIMC, LPCOMPOSITIONFORM);
BOOL (WINAPI* pImmSetCompositionWindow) (HIMC, LPCOMPOSITIONFORM);
HIMC (WINAPI* pImmAssociateContext) (HWND, HIMC);
BOOL (WINAPI* pImmReleaseContext) (HWND, HIMC);
HIMC (WINAPI* pImmGetContext) (HWND);
HWND (WINAPI* pImmGetDefaultIMEWnd) (HWND);
BOOL (WINAPI* pImmNotifyIME) (HIMC, DWORD, DWORD, DWORD);
} Imm32ApiTable;
UINT length;
STRSAFE_LPWSTR Safe = lpBuffer;
Imm32ApiTable *pImmApiTable = {0};
HINSTANCE hImmInstance = NULL;
static BOOL IsInitialized()
{
return (hImmInstance != NULL) ? TRUE : FALSE;
}
length = GetSystemDirectoryW(lpBuffer, uSize);
if ( length && length < uSize )
{
StringCchCatW(Safe, uSize, L"\\");
return StringCchCatW(Safe, uSize, L"IMM32.DLL");
}
return StringCchCopyW(Safe, uSize, L"IMM32.DLL");
}
/*
* This function should not be implemented, it is used,
@ -63,101 +56,276 @@ BOOL WINAPI IMM_ImmSetGetCompositionWindow(HIMC himc, LPCOMPOSITIONFORM lpcf) {
HIMC WINAPI IMM_ImmGetContext(HWND hwnd) { return 0; }
HWND WINAPI IMM_ImmGetDefaultIMEWnd(HWND hwnd) { return 0; }
BOOL WINAPI IMM_ImmNotifyIME(HIMC himc, DWORD dword1, DWORD dword2, DWORD dword3) { return 0; }
BOOL WINAPI IMM_ImmRegisterClient(PVOID ptr, HINSTANCE hMod) { return 0; }
UINT WINAPI IMM_ImmProcessKey(HWND hwnd, HKL hkl, UINT Vk, LPARAM lParam, DWORD HotKey) { return 0; }
/*
* @unimplemented
*/
BOOL WINAPI User32InitializeImmEntryTable(DWORD dwUnknown)
BOOL WINAPI IntInitializeImmEntryTable(VOID)
{
UNIMPLEMENTED;
WCHAR ImmFile[MAX_PATH];
HMODULE imm32 = ghImm32;;
if (dwUnknown != 0x19650412) /* FIXME */
return FALSE;
if (gImmApiEntries.pImmIsIME != 0)
{
ERR("Imm Api Table Init 1\n");
return TRUE;
}
if (IsInitialized())
GetImmFileName(ImmFile, sizeof(ImmFile));
TRACE("File %ws\n",ImmFile);
if (imm32 == NULL)
{
imm32 = GetModuleHandleW(ImmFile);
}
if (imm32 == NULL)
{
imm32 = ghImm32 = LoadLibraryW(ImmFile);
if (imm32 == NULL)
{
ERR("Did not load!\n");
return FALSE;
}
return TRUE;
}
hImmInstance = LoadLibraryW(L"imm32.dll");
if (!hImmInstance)
return FALSE;
if (ImmApiTableZero)
{
ImmApiTableZero = FALSE;
ZeroMemory(&gImmApiEntries, sizeof(Imm32ApiTable));
}
ZeroMemory(pImmApiTable, sizeof(Imm32ApiTable));
gImmApiEntries.pImmIsIME = (BOOL (WINAPI*)(HKL)) GetProcAddress(imm32, "ImmIsIME");
if (!gImmApiEntries.pImmIsIME)
gImmApiEntries.pImmIsIME = IMM_ImmIsIME;
pImmApiTable->pImmIsIME = (BOOL (WINAPI*)(HKL)) GetProcAddress(hImmInstance, "ImmIsIME");
if (!pImmApiTable->pImmIsIME)
pImmApiTable->pImmIsIME = IMM_ImmIsIME;
gImmApiEntries.pImmEscapeA = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(imm32, "ImmEscapeA");
if (!gImmApiEntries.pImmEscapeA)
gImmApiEntries.pImmEscapeA = IMM_ImmEscapeAW;
pImmApiTable->pImmEscapeA = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(hImmInstance, "ImmEscapeA");
if (!pImmApiTable->pImmEscapeA)
pImmApiTable->pImmEscapeA = IMM_ImmEscapeAW;
gImmApiEntries.pImmEscapeW = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(imm32, "ImmEscapeW");
if (!gImmApiEntries.pImmEscapeW)
gImmApiEntries.pImmEscapeW = IMM_ImmEscapeAW;
pImmApiTable->pImmEscapeW = (LRESULT (WINAPI*)(HKL, HIMC, UINT, LPVOID)) GetProcAddress(hImmInstance, "ImmEscapeW");
if (!pImmApiTable->pImmEscapeW)
pImmApiTable->pImmEscapeW = IMM_ImmEscapeAW;
gImmApiEntries.pImmGetCompositionStringA = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(imm32, "ImmGetCompositionStringA");
if (!gImmApiEntries.pImmGetCompositionStringA)
gImmApiEntries.pImmGetCompositionStringA = IMM_ImmGetCompositionStringAW;
pImmApiTable->pImmGetCompositionStringA = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(hImmInstance, "ImmGetCompositionStringA");
if (!pImmApiTable->pImmGetCompositionStringA)
pImmApiTable->pImmGetCompositionStringA = IMM_ImmGetCompositionStringAW;
gImmApiEntries.pImmGetCompositionStringW = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(imm32, "ImmGetCompositionStringW");
if (!gImmApiEntries.pImmGetCompositionStringW)
gImmApiEntries.pImmGetCompositionStringW = IMM_ImmGetCompositionStringAW;
pImmApiTable->pImmGetCompositionStringW = (LONG (WINAPI*)(HIMC, DWORD, LPVOID, DWORD)) GetProcAddress(hImmInstance, "ImmGetCompositionStringW");
if (!pImmApiTable->pImmGetCompositionStringW)
pImmApiTable->pImmGetCompositionStringW = IMM_ImmGetCompositionStringAW;
gImmApiEntries.pImmGetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(imm32, "ImmGetCompositionFontA");
if (!gImmApiEntries.pImmGetCompositionFontA)
gImmApiEntries.pImmGetCompositionFontA = IMM_ImmGetCompositionFontA;
pImmApiTable->pImmGetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(hImmInstance, "ImmGetCompositionFontA");
if (!pImmApiTable->pImmGetCompositionFontA)
pImmApiTable->pImmGetCompositionFontA = IMM_ImmGetCompositionFontA;
gImmApiEntries.pImmGetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(imm32, "ImmGetCompositionFontW");
if (!gImmApiEntries.pImmGetCompositionFontW)
gImmApiEntries.pImmGetCompositionFontW = IMM_ImmGetCompositionFontW;
pImmApiTable->pImmGetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(hImmInstance, "ImmGetCompositionFontW");
if (!pImmApiTable->pImmGetCompositionFontW)
pImmApiTable->pImmGetCompositionFontW = IMM_ImmGetCompositionFontW;
gImmApiEntries.pImmSetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(imm32, "ImmSetCompositionFontA");
if (!gImmApiEntries.pImmSetCompositionFontA)
gImmApiEntries.pImmSetCompositionFontA = IMM_ImmSetCompositionFontA;
pImmApiTable->pImmSetCompositionFontA = (BOOL (WINAPI*)(HIMC, LPLOGFONTA)) GetProcAddress(hImmInstance, "ImmSetCompositionFontA");
if (!pImmApiTable->pImmSetCompositionFontA)
pImmApiTable->pImmSetCompositionFontA = IMM_ImmSetCompositionFontA;
gImmApiEntries.pImmSetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(imm32, "ImmSetCompositionFontW");
if (!gImmApiEntries.pImmSetCompositionFontW)
gImmApiEntries.pImmSetCompositionFontW = IMM_ImmSetCompositionFontW;
pImmApiTable->pImmSetCompositionFontW = (BOOL (WINAPI*)(HIMC, LPLOGFONTW)) GetProcAddress(hImmInstance, "ImmSetCompositionFontW");
if (!pImmApiTable->pImmSetCompositionFontW)
pImmApiTable->pImmSetCompositionFontW = IMM_ImmSetCompositionFontW;
gImmApiEntries.pImmGetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(imm32, "ImmGetCompositionWindow");
if (!gImmApiEntries.pImmGetCompositionWindow)
gImmApiEntries.pImmGetCompositionWindow = IMM_ImmSetGetCompositionWindow;
pImmApiTable->pImmGetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(hImmInstance, "ImmGetCompositionWindow");
if (!pImmApiTable->pImmGetCompositionWindow)
pImmApiTable->pImmGetCompositionWindow = IMM_ImmSetGetCompositionWindow;
gImmApiEntries.pImmSetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(imm32, "ImmSetCompositionWindow");
if (!gImmApiEntries.pImmSetCompositionWindow)
gImmApiEntries.pImmSetCompositionWindow = IMM_ImmSetGetCompositionWindow;
pImmApiTable->pImmSetCompositionWindow = (BOOL (WINAPI*)(HIMC, LPCOMPOSITIONFORM)) GetProcAddress(hImmInstance, "ImmSetCompositionWindow");
if (!pImmApiTable->pImmSetCompositionWindow)
pImmApiTable->pImmSetCompositionWindow = IMM_ImmSetGetCompositionWindow;
gImmApiEntries.pImmAssociateContext = (HIMC (WINAPI*)(HWND, HIMC)) GetProcAddress(imm32, "ImmAssociateContext");
if (!gImmApiEntries.pImmAssociateContext)
gImmApiEntries.pImmAssociateContext = IMM_ImmAssociateContext;
pImmApiTable->pImmAssociateContext = (HIMC (WINAPI*)(HWND, HIMC)) GetProcAddress(hImmInstance, "ImmAssociateContext");
if (!pImmApiTable->pImmAssociateContext)
pImmApiTable->pImmAssociateContext = IMM_ImmAssociateContext;
gImmApiEntries.pImmReleaseContext = (BOOL (WINAPI*)(HWND, HIMC)) GetProcAddress(imm32, "ImmReleaseContext");
if (!gImmApiEntries.pImmReleaseContext)
gImmApiEntries.pImmReleaseContext = IMM_ImmReleaseContext;
pImmApiTable->pImmReleaseContext = (BOOL (WINAPI*)(HWND, HIMC)) GetProcAddress(hImmInstance, "ImmReleaseContext");
if (!pImmApiTable->pImmReleaseContext)
pImmApiTable->pImmReleaseContext = IMM_ImmReleaseContext;
gImmApiEntries.pImmGetContext = (HIMC (WINAPI*)(HWND)) GetProcAddress(imm32, "ImmGetContext");
if (!gImmApiEntries.pImmGetContext)
gImmApiEntries.pImmGetContext = IMM_ImmGetContext;
pImmApiTable->pImmGetContext = (HIMC (WINAPI*)(HWND)) GetProcAddress(hImmInstance, "ImmGetContext");
if (!pImmApiTable->pImmGetContext)
pImmApiTable->pImmGetContext = IMM_ImmGetContext;
gImmApiEntries.pImmGetDefaultIMEWnd = (HWND (WINAPI*)(HWND)) GetProcAddress(imm32, "ImmGetDefaultIMEWnd");
if (!gImmApiEntries.pImmGetDefaultIMEWnd)
gImmApiEntries.pImmGetDefaultIMEWnd = IMM_ImmGetDefaultIMEWnd;
pImmApiTable->pImmGetDefaultIMEWnd = (HWND (WINAPI*)(HWND)) GetProcAddress(hImmInstance, "ImmGetDefaultIMEWnd");
if (!pImmApiTable->pImmGetDefaultIMEWnd)
pImmApiTable->pImmGetDefaultIMEWnd = IMM_ImmGetDefaultIMEWnd;
pImmApiTable->pImmNotifyIME = (BOOL (WINAPI*)(HIMC, DWORD, DWORD, DWORD)) GetProcAddress(hImmInstance, "ImmNotifyIME");
if (!pImmApiTable->pImmNotifyIME)
pImmApiTable->pImmNotifyIME = IMM_ImmNotifyIME;
gImmApiEntries.pImmNotifyIME = (BOOL (WINAPI*)(HIMC, DWORD, DWORD, DWORD)) GetProcAddress(imm32, "ImmNotifyIME");
if (!gImmApiEntries.pImmNotifyIME)
gImmApiEntries.pImmNotifyIME = IMM_ImmNotifyIME;
/*
* TODO: Load more functions from imm32.dll
* Function like IMPSetIMEW, IMPQueryIMEW etc. call functions
* from imm32.dll through pointers in the structure pImmApiTable.
* from imm32.dll through pointers in the structure gImmApiEntries.
* I do not know whether it is necessary to initialize a table
* of functions to load user32 (DLL_PROCESS_ATTACH)
*/
gImmApiEntries.pImmRegisterClient = (BOOL (WINAPI*)(PVOID, HINSTANCE)) GetProcAddress(imm32, "ImmRegisterClient");
if (!gImmApiEntries.pImmRegisterClient)
gImmApiEntries.pImmRegisterClient = IMM_ImmRegisterClient;
gImmApiEntries.pImmProcessKey = (UINT (WINAPI*)(HWND, HKL, UINT, LPARAM, DWORD)) GetProcAddress(imm32, "ImmProcessKey");
if (!gImmApiEntries.pImmProcessKey)
gImmApiEntries.pImmProcessKey = IMM_ImmProcessKey;
return TRUE;
}
BOOL WINAPI InitializeImmEntryTable(VOID)
{
bImmInitializing = TRUE;
return IntInitializeImmEntryTable();
}
BOOL WINAPI User32InitializeImmEntryTable(DWORD magic)
{
TRACE("(%x)\n", magic);
if (magic != IMM_INIT_MAGIC)
return FALSE;
if (gImmApiEntries.pImmIsIME != 0)
{
ERR("Imm Api Table Init 2\n");
return TRUE;
}
IntInitializeImmEntryTable();
if (ghImm32 == NULL && !bImmInitializing)
{
WCHAR ImmFile[MAX_PATH];
ERR("IMM32 not installed!\n");
GetImmFileName(ImmFile, sizeof(ImmFile));
ERR("File %ws\n",ImmFile);
ghImm32 = LoadLibraryW(ImmFile);
if (ghImm32 == NULL)
{
ERR("Did not load! 2\n");
return FALSE;
}
}
#if 0 // For real Imm32.dll testing!!!!
if (ghImm32 && !gImmApiEntries.pImmRegisterClient(&gSharedInfo, ghImm32))
{
ERR("Wine is stubed!\n");
}
#endif
return TRUE;
}
LRESULT WINAPI ImeWndProc_common( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam, BOOL unicode ) // ReactOS
{
PWND pWnd;
PIMEUI pimeui;
pWnd = ValidateHwnd(hwnd);
if (pWnd)
{
if (!pWnd->fnid)
{
if (msg != WM_NCCREATE)
{
if (unicode)
return DefWindowProcW(hwnd, msg, wParam, lParam);
return DefWindowProcA(hwnd, msg, wParam, lParam);
}
NtUserSetWindowFNID(hwnd, FNID_IME);
pimeui = HeapAlloc( GetProcessHeap(), 0, sizeof(IMEUI) );
SetWindowLongPtrW(hwnd, 0, (LONG_PTR)pimeui);
}
else
{
if (pWnd->fnid != FNID_IME)
{
ERR("Wrong window class for Ime! fnId 0x%x\n",pWnd->fnid);
return 0;
}
pimeui = ((PIMEWND)pWnd)->pimeui;
if (pimeui == NULL)
{
ERR("Window is not set to IME!\n");
return 0;
}
}
}
if (msg==WM_CREATE || msg==WM_NCCREATE)
return TRUE;
if (msg==WM_NCDESTROY)
{
HeapFree( GetProcessHeap(), 0, pimeui );
SetWindowLongPtrW(hwnd, 0, 0);
NtUserSetWindowFNID(hwnd, FNID_DESTROY);
}
if (unicode)
return DefWindowProcW(hwnd, msg, wParam, lParam);
return DefWindowProcA(hwnd, msg, wParam, lParam);
}
LRESULT WINAPI ImeWndProcA( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
return ImeWndProc_common(hwnd, msg, wParam, lParam, FALSE);
}
LRESULT WINAPI ImeWndProcW( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
return ImeWndProc_common(hwnd, msg, wParam, lParam, TRUE);
}
static const WCHAR imeW[] = {'I','M','E',0};
BOOL
WINAPI
RegisterIMEClass(VOID)
{
WNDCLASSEXW WndClass;
ATOM atom;
ZeroMemory(&WndClass, sizeof(WndClass));
WndClass.cbSize = sizeof(WndClass);
WndClass.lpszClassName = imeW;
WndClass.style = CS_GLOBALCLASS;
WndClass.lpfnWndProc = ImeWndProcW;
WndClass.cbWndExtra = sizeof(LONG_PTR);
WndClass.hCursor = LoadCursorW(NULL, IDC_ARROW);
atom = RegisterClassExWOWW( &WndClass,
0,
FNID_IME,
0,
FALSE);
if (atom)
{
RegisterDefaultClasses |= ICLASS_TO_MASK(ICLS_IME);
return TRUE;
}
ERR("Failed to register IME Class!\n");
return FALSE;
}
/*
* @unimplemented
*/
BOOL WINAPI CliImmSetHotKey(DWORD dwID, UINT uModifiers, UINT uVirtualKey, HKL hKl)
{
UNIMPLEMENTED;
return FALSE;
}
/*
* @unimplemented
*/
@ -269,12 +437,11 @@ WINNLSGetEnableStatus(HWND hwnd)
}
/*
* @unimplemented
* @implemented
*/
UINT
WINAPI
WINNLSGetIMEHotkey(HWND hwnd)
{
UNIMPLEMENTED;
return FALSE;
}

View file

@ -476,15 +476,6 @@ BOOL WINAPI DdeGetQualityOfService(HWND hWnd, DWORD Reserved, PSECURITY_QUALITY_
return FALSE;
}
/*
* @unimplemented
*/
BOOL WINAPI CliImmSetHotKey(DWORD dwID, UINT uModifiers, UINT uVirtualKey, HKL hKl)
{
UNIMPLEMENTED;
return FALSE;
}
/*
* @implemented
*/