Author: winesync
Date: Fri Apr 4 08:20:27 2008
New Revision: 32844
URL:
http://svn.reactos.org/svn/reactos?rev=32844&view=rev
Log:
Autosyncing with Wine HEAD
Modified:
trunk/reactos/dll/win32/imm32/imm.c
trunk/reactos/dll/win32/imm32/imm32.rbuild
trunk/reactos/dll/win32/imm32/imm32.spec
Modified: trunk/reactos/dll/win32/imm32/imm.c
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/imm32/imm.c?rev=…
==============================================================================
--- trunk/reactos/dll/win32/imm32/imm.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/imm32/imm.c [iso-8859-1] Fri Apr 4 08:20:27 2008
@@ -30,6 +30,8 @@
#include "imm.h"
#include "ddk/imm.h"
#include "winnls.h"
+#include "winreg.h"
+#include "wine/list.h"
WINE_DEFAULT_DEBUG_CHANNEL(imm);
@@ -42,6 +44,35 @@
DWORD dwLock;
DWORD dwSize;
} IMCCInternal;
+
+#define MAKE_FUNCPTR(f) typeof(f) * p##f
+typedef struct _tagImmHkl{
+ struct list entry;
+ HKL hkl;
+ HMODULE hIME;
+ IMEINFO imeInfo;
+ WCHAR imeClassName[17]; /* 16 character max */
+ ULONG uSelected;
+
+ /* Function Pointers */
+ MAKE_FUNCPTR(ImeInquire);
+ MAKE_FUNCPTR(ImeConfigure);
+ MAKE_FUNCPTR(ImeDestroy);
+ MAKE_FUNCPTR(ImeEscape);
+ MAKE_FUNCPTR(ImeSelect);
+ MAKE_FUNCPTR(ImeSetActiveContext);
+ MAKE_FUNCPTR(ImeToAsciiEx);
+ MAKE_FUNCPTR(NotifyIME);
+ MAKE_FUNCPTR(ImeRegisterWord);
+ MAKE_FUNCPTR(ImeUnregisterWord);
+ MAKE_FUNCPTR(ImeEnumRegisterWord);
+ MAKE_FUNCPTR(ImeSetCompositionString);
+ MAKE_FUNCPTR(ImeConversionList);
+ MAKE_FUNCPTR(ImeProcessKey);
+ MAKE_FUNCPTR(ImeGetRegisterWordStyle);
+ MAKE_FUNCPTR(ImeGetImeMenuItems);
+} ImmHkl;
+#undef MAKE_FUNCPTR
typedef struct tagInputContextData
{
@@ -52,13 +83,23 @@
DWORD dwLock;
INPUTCONTEXT IMC;
+
+ ImmHkl *immKbd;
} InputContextData;
+
+typedef struct _tagTRANSMSG {
+ UINT message;
+ WPARAM wParam;
+ LPARAM lParam;
+} TRANSMSG, *LPTRANSMSG;
static InputContextData *root_context = NULL;
static HWND hwndDefault = NULL;
static HANDLE hImeInst;
static const WCHAR WC_IMECLASSNAME[] = {'I','M','E',0};
static ATOM atIMEClass = 0;
+
+static struct list ImmHklList = LIST_INIT(ImmHklList);
/* MSIME messages */
static UINT WM_MSIME_SERVICE;
@@ -69,15 +110,86 @@
static UINT WM_MSIME_QUERYPOSITION;
static UINT WM_MSIME_DOCUMENTFEED;
+static const WCHAR szwWineIMCProperty[] =
{'W','i','n','e','I','m','m','H','I','M','C','P','r','o','p','e','r','t','y',0};
/*
* prototypes
*/
static LRESULT WINAPI IME_WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam);
static void UpdateDataInDefaultIMEWindow(HWND hwnd, BOOL showable);
-static void ImmInternalPostIMEMessage(UINT, WPARAM, LPARAM);
+static void ImmInternalPostIMEMessage(InputContextData*, UINT, WPARAM, LPARAM);
static void ImmInternalSetOpenStatus(BOOL fOpen);
static HIMCC updateResultStr(HIMCC old, LPWSTR resultstr, DWORD len);
+
+/* ImmHkl loading and freeing */
+#define LOAD_FUNCPTR(f) if((ptr->p##f = (LPVOID)GetProcAddress(ptr->hIME, #f)) ==
NULL){WARN("Can't find function %s in ime\n", #f);}
+static ImmHkl *IMM_GetImmHkl(HKL hkl)
+{
+ ImmHkl *ptr;
+ WCHAR filename[MAX_PATH];
+
+ TRACE("Seeking ime for keyboard 0x%x\n",(unsigned)hkl);
+
+ LIST_FOR_EACH_ENTRY(ptr, &ImmHklList, ImmHkl, entry)
+ {
+ if (ptr->hkl == hkl)
+ return ptr;
+ }
+ /* not found... create it */
+
+ ptr = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(ImmHkl));
+
+ ptr->hkl = hkl;
+ if (ImmGetIMEFileNameW(hkl, filename, MAX_PATH)) ptr->hIME =
LoadLibraryW(filename);
+ if (ptr->hIME)
+ {
+ LOAD_FUNCPTR(ImeInquire);
+ LOAD_FUNCPTR(ImeDestroy);
+ LOAD_FUNCPTR(ImeSelect);
+ if (!ptr->pImeInquire || !ptr->pImeDestroy || !ptr->pImeSelect)
+ {
+ FreeLibrary(ptr->hIME);
+ ptr->hIME = NULL;
+ }
+ else
+ {
+ ptr->pImeInquire(&ptr->imeInfo, ptr->imeClassName, NULL);
+ LOAD_FUNCPTR(ImeConfigure);
+ LOAD_FUNCPTR(ImeEscape);
+ LOAD_FUNCPTR(ImeSetActiveContext);
+ LOAD_FUNCPTR(ImeToAsciiEx);
+ LOAD_FUNCPTR(NotifyIME);
+ LOAD_FUNCPTR(ImeRegisterWord);
+ LOAD_FUNCPTR(ImeUnregisterWord);
+ LOAD_FUNCPTR(ImeEnumRegisterWord);
+ LOAD_FUNCPTR(ImeSetCompositionString);
+ LOAD_FUNCPTR(ImeConversionList);
+ LOAD_FUNCPTR(ImeProcessKey);
+ LOAD_FUNCPTR(ImeGetRegisterWordStyle);
+ LOAD_FUNCPTR(ImeGetImeMenuItems);
+ }
+ }
+ list_add_head(&ImmHklList,&ptr->entry);
+
+ return ptr;
+}
+#undef LOAD_FUNCPTR
+
+static void IMM_FreeAllImmHkl(void)
+{
+ ImmHkl *ptr,*cursor2;
+
+ LIST_FOR_EACH_ENTRY_SAFE(ptr, cursor2, &ImmHklList, ImmHkl, entry)
+ {
+ list_remove(&ptr->entry);
+ if (ptr->hIME)
+ {
+ ptr->pImeDestroy(1);
+ FreeLibrary(ptr->hIME);
+ }
+ HeapFree(GetProcessHeap(),0,ptr);
+ }
+}
static VOID IMM_PostResult(InputContextData *data)
{
@@ -93,7 +205,7 @@
ResultStr = (LPWSTR)(compdata + compstr->dwResultStrOffset);
for (i = 0; i < compstr->dwResultStrLen; i++)
- ImmInternalPostIMEMessage (WM_IME_CHAR, ResultStr[i], 1);
+ ImmInternalPostIMEMessage (root_context, WM_IME_CHAR, ResultStr[i], 1);
ImmUnlockIMCC(root_context->IMC.hCompStr);
@@ -160,26 +272,27 @@
hwndDefault = 0;
}
IMM_Unregister();
+ IMM_FreeAllImmHkl();
break;
}
return TRUE;
}
/* for posting messages as the IME */
-static void ImmInternalPostIMEMessage(UINT msg, WPARAM wParam, LPARAM lParam)
+static void ImmInternalPostIMEMessage(InputContextData *data, UINT msg, WPARAM wParam,
LPARAM lParam)
{
HWND target = GetFocus();
if (!target)
- PostMessageW(root_context->IMC.hWnd,msg,wParam,lParam);
+ PostMessageW(data->IMC.hWnd,msg,wParam,lParam);
else
PostMessageW(target, msg, wParam, lParam);
}
-static LRESULT ImmInternalSendIMENotify(WPARAM notify, LPARAM lParam)
+static LRESULT ImmInternalSendIMENotify(InputContextData *data, WPARAM notify, LPARAM
lParam)
{
HWND target;
- target = root_context->IMC.hWnd;
+ target = data->IMC.hWnd;
if (!target) target = GetFocus();
if (target)
@@ -188,23 +301,33 @@
return 0;
}
+static HIMCC ImmCreateBlankCompStr(void)
+{
+ HIMCC rc;
+ LPCOMPOSITIONSTRING ptr;
+ rc = ImmCreateIMCC(sizeof(COMPOSITIONSTRING));
+ ptr = (LPCOMPOSITIONSTRING)ImmLockIMCC(rc);
+ memset(ptr,0,sizeof(COMPOSITIONSTRING));
+ ptr->dwSize = sizeof(COMPOSITIONSTRING);
+ ImmUnlockIMCC(rc);
+ return rc;
+}
+
static void ImmInternalSetOpenStatus(BOOL fOpen)
{
TRACE("Setting internal state to
%s\n",(fOpen)?"OPEN":"CLOSED");
- root_context->IMC.fOpen = fOpen;
- root_context->bInternalState = fOpen;
-
- if (fOpen == FALSE)
- {
+ if (root_context->IMC.fOpen && fOpen == FALSE)
+ {
ShowWindow(hwndDefault,SW_HIDE);
ImmDestroyIMCC(root_context->IMC.hCompStr);
- root_context->IMC.hCompStr = NULL;
- }
- else
- ShowWindow(hwndDefault, SW_SHOWNOACTIVATE);
-
- ImmInternalSendIMENotify(IMN_SETOPENSTATUS, 0);
+ root_context->IMC.hCompStr = ImmCreateBlankCompStr();
+ }
+
+ root_context->IMC.fOpen = fOpen;
+ root_context->bInternalState = fOpen;
+
+ ImmInternalSendIMENotify(root_context, IMN_SETOPENSTATUS, 0);
}
static int updateField(DWORD origLen, DWORD origOffset, DWORD currentOffset,
@@ -501,12 +624,10 @@
*/
HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
{
+ HIMC old = NULL;
InputContextData *data = (InputContextData*)hIMC;
- WARN("(%p, %p): semi-stub\n", hWnd, hIMC);
-
- if (!hIMC)
- return NULL;
+ TRACE("(%p, %p):\n", hWnd, hIMC);
/*
* WINE SPECIFIC! MAY CONFLICT
@@ -520,8 +641,29 @@
/*
* If already associated just return
*/
- if (data->IMC.hWnd == hWnd)
+ if (hIMC && data->IMC.hWnd == hWnd)
return hIMC;
+
+ if (hWnd)
+ {
+ old = (HIMC)RemovePropW(hWnd,szwWineIMCProperty);
+
+ if (old == NULL)
+ old = (HIMC)root_context;
+ else if (old == (HIMC)-1)
+ old = NULL;
+
+ if (hIMC != (HIMC)root_context)
+ {
+ if (hIMC == NULL) /* Meaning disable imm for that window*/
+ SetPropW(hWnd,szwWineIMCProperty,(HANDLE)-1);
+ else
+ SetPropW(hWnd,szwWineIMCProperty,(HANDLE)hIMC);
+ }
+ }
+
+ if (!hIMC)
+ return old;
if (IsWindow(data->IMC.hWnd))
{
@@ -541,11 +683,7 @@
SendMessageW(data->IMC.hWnd, WM_IME_SETCONTEXT, TRUE, ISC_SHOWUIALL);
}
- /*
- * TODO: We need to keep track of the old context associated
- * with a window and return it for now we will return NULL;
- */
- return NULL;
+ return old;
}
/***********************************************************************
@@ -593,6 +731,34 @@
new_context = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(InputContextData));
+ /* Load the IME */
+ new_context->immKbd = IMM_GetImmHkl(GetKeyboardLayout(0));
+
+ /*
+ * Once we depend on the IME for all the processing like we should
+ * these will become hard errors and result in creation failures
+ */
+ if (!new_context->immKbd->hIME)
+ TRACE("IME dll could not be loaded\n");
+
+ /* hCompStr is never NULL */
+ new_context->IMC.hCompStr = ImmCreateBlankCompStr();
+ new_context->IMC.hMsgBuf = ImmCreateIMCC(1);
+
+ /* Initialize the IME Private */
+ new_context->IMC.hPrivate =
ImmCreateIMCC(new_context->immKbd->imeInfo.dwPrivateDataSize);
+
+ if (new_context->immKbd->hIME &&
+ !new_context->immKbd->pImeSelect(new_context, TRUE))
+ {
+ TRACE("Selection of IME failed\n");
+ ImmDestroyContext(new_context);
+ return 0;
+ }
+
+ new_context->immKbd->uSelected++;
+ TRACE("Created context 0x%x\n",(UINT)new_context);
+
return (HIMC)new_context;
}
@@ -607,11 +773,15 @@
if (hIMC)
{
- ImmDestroyIMCC(root_context->IMC.hCompStr);
- ImmDestroyIMCC(root_context->IMC.hCandInfo);
- ImmDestroyIMCC(root_context->IMC.hGuideLine);
- ImmDestroyIMCC(root_context->IMC.hPrivate);
- ImmDestroyIMCC(root_context->IMC.hMsgBuf);
+ data->immKbd->uSelected --;
+ if (data->immKbd->hIME)
+ data->immKbd->pImeSelect(hIMC, FALSE);
+
+ ImmDestroyIMCC(data->IMC.hCompStr);
+ ImmDestroyIMCC(data->IMC.hCandInfo);
+ ImmDestroyIMCC(data->IMC.hGuideLine);
+ ImmDestroyIMCC(data->IMC.hPrivate);
+ ImmDestroyIMCC(data->IMC.hMsgBuf);
if (data->textfont)
{
@@ -763,9 +933,19 @@
*/
BOOL WINAPI ImmGetCompositionFontA(HIMC hIMC, LPLOGFONTA lplf)
{
- FIXME("(%p, %p): stub\n", hIMC, lplf);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ LOGFONTW lfW;
+ BOOL rc;
+
+ TRACE("(%p, %p):\n", hIMC, lplf);
+
+ rc = ImmGetCompositionFontW(hIMC,&lfW);
+ if (rc)
+ {
+ memcpy(lplf,&lfW,sizeof(LOGFONTA));
+ WideCharToMultiByte(CP_ACP, 0, lfW.lfFaceName, -1, lplf->lfFaceName,
+ LF_FACESIZE, NULL, NULL);
+ }
+ return rc;
}
/***********************************************************************
@@ -773,9 +953,16 @@
*/
BOOL WINAPI ImmGetCompositionFontW(HIMC hIMC, LPLOGFONTW lplf)
{
- FIXME("(%p, %p): stub\n", hIMC, lplf);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+ InputContextData *data = (InputContextData*)hIMC;
+
+ TRACE("(%p, %p):\n", hIMC, lplf);
+
+ if (!data)
+ return FALSE;
+
+ *lplf = data->IMC.lfFont.W;
+
+ return TRUE;
}
/***********************************************************************
@@ -995,7 +1182,7 @@
if (!data)
return FALSE;
- memcpy(lpCompForm,&(data->IMC.cfCompForm),sizeof(COMPOSITIONFORM));
+ *lpCompForm = data->IMC.cfCompForm;
return 1;
}
@@ -1005,13 +1192,24 @@
*/
HIMC WINAPI ImmGetContext(HWND hWnd)
{
+ HIMC rc = NULL;
+
TRACE("%p\n", hWnd);
- if (!root_context)
- return NULL;
-
- root_context->IMC.hWnd = hWnd;
- return (HIMC)root_context;
+ rc = (HIMC)GetPropW(hWnd,szwWineIMCProperty);
+ if (rc == (HIMC)-1)
+ rc = NULL;
+ else if (rc == NULL)
+ rc = (HIMC)root_context;
+
+ if (rc)
+ {
+ InputContextData *data = (InputContextData*)rc;
+ data->IMC.hWnd = hWnd;
+ }
+ TRACE("returning %p\n", rc);
+
+ return rc;
}
/***********************************************************************
@@ -1158,23 +1356,83 @@
/***********************************************************************
* ImmGetIMEFileNameA (IMM32.@)
*/
-UINT WINAPI ImmGetIMEFileNameA(
- HKL hKL, LPSTR lpszFileName, UINT uBufLen)
-{
- FIXME("(%p, %p, %d): stub\n", hKL, lpszFileName, uBufLen);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+UINT WINAPI ImmGetIMEFileNameA( HKL hKL, LPSTR lpszFileName, UINT uBufLen)
+{
+ LPWSTR bufW = NULL;
+ UINT wBufLen = uBufLen;
+ UINT rc;
+
+ if (uBufLen && lpszFileName)
+ bufW = HeapAlloc(GetProcessHeap(),0,uBufLen * sizeof(WCHAR));
+ else /* We need this to get the number of byte required */
+ {
+ bufW = HeapAlloc(GetProcessHeap(),0,MAX_PATH * sizeof(WCHAR));
+ wBufLen = MAX_PATH;
+ }
+
+ rc = ImmGetIMEFileNameW(hKL,bufW,wBufLen);
+
+ if (rc > 0)
+ {
+ if (uBufLen && lpszFileName)
+ rc = WideCharToMultiByte(CP_ACP, 0, bufW, -1, lpszFileName,
+ uBufLen, NULL, NULL);
+ else /* get the length */
+ rc = WideCharToMultiByte(CP_ACP, 0, bufW, -1, NULL, 0, NULL,
+ NULL);
+ }
+
+ HeapFree(GetProcessHeap(),0,bufW);
+ return rc;
}
/***********************************************************************
* ImmGetIMEFileNameW (IMM32.@)
*/
-UINT WINAPI ImmGetIMEFileNameW(
- HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
-{
- FIXME("(%p, %p, %d): stub\n", hKL, lpszFileName, uBufLen);
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return 0;
+UINT WINAPI ImmGetIMEFileNameW(HKL hKL, LPWSTR lpszFileName, UINT uBufLen)
+{
+ static const WCHAR szImeFileW[] = {'I','m','e','
','F','i','l','e',0};
+ static const WCHAR fmt[] =
{'S','y','s','t','e','m','\\','C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\','C','o','n','t','r','o','l','\\','K','e','y','b','o','a','r','d','
','L','a','y','o','u','t','s','\\','%','0','8','x',0};
+
+ HKEY hkey;
+ DWORD length;
+ DWORD rc;
+ WCHAR regKey[sizeof(fmt)/sizeof(WCHAR)+8];
+
+ wsprintfW( regKey, fmt, (unsigned)hKL );
+ rc = RegOpenKeyW( HKEY_LOCAL_MACHINE, regKey, &hkey);
+ if (rc != ERROR_SUCCESS)
+ {
+ SetLastError(rc);
+ return 0;
+ }
+
+ length = 0;
+ rc = RegGetValueW(hkey, NULL, szImeFileW, RRF_RT_REG_SZ, NULL, NULL, &length);
+
+ if (rc != ERROR_SUCCESS)
+ {
+ RegCloseKey(hkey);
+ SetLastError(rc);
+ return 0;
+ }
+ if (length > uBufLen * sizeof(WCHAR) || !lpszFileName)
+ {
+ RegCloseKey(hkey);
+ if (lpszFileName)
+ {
+ SetLastError(ERROR_INSUFFICIENT_BUFFER);
+ return 0;
+ }
+ else
+ return length / sizeof(WCHAR);
+ }
+
+ RegGetValueW(hkey, NULL, szImeFileW, RRF_RT_REG_SZ, NULL, lpszFileName,
&length);
+
+ RegCloseKey(hkey);
+
+ return length / sizeof(WCHAR);
}
/***********************************************************************
@@ -1407,17 +1665,20 @@
TRACE("%s -
%s\n","NI_COMPOSITIONSTR","CPS_CANCEL");
{
BOOL send;
+ LPCOMPOSITIONSTRING lpCompStr;
if (pX11DRV_ForceXIMReset)
pX11DRV_ForceXIMReset(root_context->IMC.hWnd);
- send = (root_context->IMC.hCompStr!=NULL);
+ lpCompStr = ImmLockIMCC(root_context->IMC.hCompStr);
+ send = (lpCompStr->dwCompStrLen != 0);
+ ImmUnlockIMCC(root_context->IMC.hCompStr);
ImmDestroyIMCC(root_context->IMC.hCompStr);
- root_context->IMC.hCompStr = NULL;
+ root_context->IMC.hCompStr = ImmCreateBlankCompStr();
if (send)
- ImmInternalPostIMEMessage(WM_IME_COMPOSITION, 0,
+ ImmInternalPostIMEMessage(root_context, WM_IME_COMPOSITION,
0,
GCS_COMPSTR);
rc = TRUE;
}
@@ -1458,15 +1719,15 @@
root_context->bRead = FALSE;
- ImmInternalPostIMEMessage(WM_IME_COMPOSITION, 0,
+ ImmInternalPostIMEMessage(root_context, WM_IME_COMPOSITION,
0,
GCS_COMPSTR);
- ImmInternalPostIMEMessage(WM_IME_COMPOSITION,
+ ImmInternalPostIMEMessage(root_context, WM_IME_COMPOSITION,
param,
GCS_RESULTSTR|GCS_RESULTCLAUSE);
}
- ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION, 0, 0);
+ ImmInternalPostIMEMessage(root_context, WM_IME_ENDCOMPOSITION, 0,
0);
root_context->bInComposition = FALSE;
}
break;
@@ -1569,7 +1830,7 @@
MultiByteToWideChar(CP_ACP, 0, lplf->lfFaceName, -1,
data->IMC.lfFont.W.lfFaceName,
LF_FACESIZE);
- ImmInternalSendIMENotify(IMN_SETCOMPOSITIONFONT, 0);
+ ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONFONT, 0);
if (data->textfont)
{
@@ -1592,8 +1853,8 @@
if (!data)
return FALSE;
- memcpy(&data->IMC.lfFont.W,lplf,sizeof(LOGFONTW));
- ImmInternalSendIMENotify(IMN_SETCOMPOSITIONFONT, 0);
+ data->IMC.lfFont.W = *lplf;
+ ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONFONT, 0);
if (data->textfont)
{
@@ -1682,7 +1943,7 @@
HIMCC newCompStr;
if (!root_context->bInComposition)
{
- ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION, 0, 0);
+ ImmInternalPostIMEMessage(root_context, WM_IME_STARTCOMPOSITION, 0, 0);
root_context->bInComposition = TRUE;
}
@@ -1707,7 +1968,7 @@
UpdateDataInDefaultIMEWindow(hwndDefault,FALSE);
- ImmInternalPostIMEMessage(WM_IME_COMPOSITION, wParam, flags);
+ ImmInternalPostIMEMessage(root_context, WM_IME_COMPOSITION, wParam, flags);
return TRUE;
}
@@ -1729,7 +1990,7 @@
if (!data)
return FALSE;
- memcpy(&data->IMC.cfCompForm,lpCompForm,sizeof(COMPOSITIONFORM));
+ data->IMC.cfCompForm = *lpCompForm;
if (IsWindowVisible(hwndDefault))
{
@@ -1742,7 +2003,7 @@
if (reshow)
ShowWindow(hwndDefault,SW_SHOWNOACTIVATE);
- ImmInternalSendIMENotify(IMN_SETCOMPOSITIONWINDOW, 0);
+ ImmInternalSendIMENotify(data, IMN_SETCOMPOSITIONWINDOW, 0);
return TRUE;
}
@@ -1776,7 +2037,7 @@
if (hIMC == (HIMC)FROM_IME)
{
ImmInternalSetOpenStatus(fOpen);
- ImmInternalSendIMENotify(IMN_SETOPENSTATUS, 0);
+ ImmInternalSendIMENotify(root_context, IMN_SETOPENSTATUS, 0);
return TRUE;
}
@@ -1789,17 +2050,17 @@
pX11DRV_ForceXIMReset(data->IMC.hWnd);
if (fOpen == FALSE)
- ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION,0,0);
+ ImmInternalPostIMEMessage(data, WM_IME_ENDCOMPOSITION,0,0);
else
- ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION,0,0);
+ ImmInternalPostIMEMessage(data, WM_IME_STARTCOMPOSITION,0,0);
ImmInternalSetOpenStatus(fOpen);
ImmInternalSetOpenStatus(!fOpen);
if (data->IMC.fOpen == FALSE)
- ImmInternalPostIMEMessage(WM_IME_ENDCOMPOSITION,0,0);
+ ImmInternalPostIMEMessage(data, WM_IME_ENDCOMPOSITION,0,0);
else
- ImmInternalPostIMEMessage(WM_IME_STARTCOMPOSITION,0,0);
+ ImmInternalPostIMEMessage(data, WM_IME_STARTCOMPOSITION,0,0);
return FALSE;
}
@@ -1993,6 +2254,31 @@
internal = (IMCCInternal*) imcc;
return internal->dwSize;
+}
+
+/***********************************************************************
+* ImmGenerateMessage(IMM32.@)
+*/
+BOOL WINAPI ImmGenerateMessage(HIMC hIMC)
+{
+ InputContextData *data = (InputContextData*)hIMC;
+
+ TRACE("%i messages queued\n",data->IMC.dwNumMsgBuf);
+ if (data->IMC.dwNumMsgBuf > 0)
+ {
+ LPTRANSMSG lpTransMsg;
+ INT i;
+
+ lpTransMsg = (LPTRANSMSG)ImmLockIMCC(data->IMC.hMsgBuf);
+ for (i = 0; i < data->IMC.dwNumMsgBuf; i++)
+ ImmInternalPostIMEMessage(data, lpTransMsg[i].message, lpTransMsg[i].wParam,
lpTransMsg[i].lParam);
+
+ ImmUnlockIMCC(data->IMC.hMsgBuf);
+
+ data->IMC.dwNumMsgBuf = 0;
+ }
+
+ return TRUE;
}
/*****
@@ -2052,7 +2338,6 @@
rect.top = cpt.y;
rect.right = rect.left + pt.x;
rect.bottom = rect.top + pt.y;
- offX=offY=10;
monitor = MonitorFromPoint(cpt, MONITOR_DEFAULTTOPRIMARY);
}
else /* CFS_DEFAULT */
Modified: trunk/reactos/dll/win32/imm32/imm32.rbuild
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/imm32/imm32.rbui…
==============================================================================
--- trunk/reactos/dll/win32/imm32/imm32.rbuild [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/imm32/imm32.rbuild [iso-8859-1] Fri Apr 4 08:20:27 2008
@@ -8,13 +8,14 @@
<define name="__WINESRC__" />
<define name="WINVER">0x600</define>
<define name="_WIN32_WINNT">0x600</define>
+ <file>imm.c</file>
+ <file>version.rc</file>
+ <file>imm32.spec</file>
<library>wine</library>
<library>user32</library>
<library>gdi32</library>
+ <library>advapi32</library>
<library>kernel32</library>
<library>ntdll</library>
- <file>imm.c</file>
- <file>version.rc</file>
- <file>imm32.spec</file>
</module>
</group>
Modified: trunk/reactos/dll/win32/imm32/imm32.spec
URL:
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/imm32/imm32.spec…
==============================================================================
--- trunk/reactos/dll/win32/imm32/imm32.spec [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/imm32/imm32.spec [iso-8859-1] Fri Apr 4 08:20:27 2008
@@ -17,7 +17,7 @@
@ stdcall ImmEscapeA(long long long ptr)
@ stdcall ImmEscapeW(long long long ptr)
@ stub ImmFreeLayout
-@ stub ImmGenerateMessage
+@ stdcall ImmGenerateMessage(ptr)
@ stdcall ImmGetCandidateListA(long long ptr long)
@ stdcall ImmGetCandidateListCountA(long ptr)
@ stdcall ImmGetCandidateListCountW(long ptr)