void IME_SetCompositionStatus(BOOL fOpen) { HIMC imc; LPINPUTCONTEXT lpIMC; LPIMEPRIVATE myPrivate; imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) return; myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (fOpen && !myPrivate->bInComposition) { GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0); } else if (!fOpen && myPrivate->bInComposition) { ShowWindow(myPrivate->hwndDefault, SW_HIDE); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = ImeCreateBlankCompStr(); GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); } myPrivate->bInComposition = fOpen; ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(imc); }
void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen) { HIMC imc; LPINPUTCONTEXT lpIMC; HIMCC newCompStr; LPIMEPRIVATE myPrivate; imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) return; newCompStr = updateResultStr(lpIMC->hCompStr, lpResult, dwResultLen); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; myPrivate = ImmLockIMCC(lpIMC->hPrivate); if (!myPrivate->bInComposition) GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0); GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_RESULTSTR); if (!myPrivate->bInComposition) GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(imc); }
void IME_SetOpenStatus(BOOL fOpen) { HIMC imc; imc = RealIMC(FROM_X11); ImmSetOpenStatus(imc, fOpen); }
static void GenerateIMEMessage(HIMC hIMC, UINT msg, WPARAM wParam, LPARAM lParam) { LPINPUTCONTEXT lpIMC; LPTRANSMSG lpTransMsg; lpIMC = LockRealIMC(hIMC); if (lpIMC == NULL) return; lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + 1) * sizeof(TRANSMSG)); if (!lpIMC->hMsgBuf) return; lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf); if (!lpTransMsg) return; lpTransMsg += lpIMC->dwNumMsgBuf; lpTransMsg->message = msg; lpTransMsg->wParam = wParam; lpTransMsg->lParam = lParam; ImmUnlockIMCC(lpIMC->hMsgBuf); lpIMC->dwNumMsgBuf++; ImmGenerateMessage(RealIMC(hIMC)); UnlockRealIMC(hIMC); }
static BOOL UnlockRealIMC(HIMC hIMC) { HIMC real_imc = RealIMC(hIMC); if (real_imc) return ImmUnlockIMC(real_imc); else return FALSE; }
static LPINPUTCONTEXT LockRealIMC(HIMC hIMC) { HIMC real_imc = RealIMC(hIMC); if (real_imc) return ImmLockIMC(real_imc); else return NULL; }
void IME_UpdateAssociation(HWND focus) { ImmGetContext(focus); if (!focus || !hSelectedFrom) return; ImmAssociateContext(focus,RealIMC(FROM_X11)); }
void IME_SetResultString(LPWSTR lpResult, DWORD dwResultLen) { HIMC imc; LPINPUTCONTEXT lpIMC; HIMCC newCompStr; LPIMEPRIVATE myPrivate; BOOL inComp; imc = RealIMC(FROM_X11); lpIMC = ImmLockIMC(imc); if (lpIMC == NULL) return; newCompStr = updateCompStr(lpIMC->hCompStr, NULL, 0); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; newCompStr = updateResultStr(lpIMC->hCompStr, lpResult, dwResultLen); ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = newCompStr; myPrivate = ImmLockIMCC(lpIMC->hPrivate); inComp = myPrivate->bInComposition; ImmUnlockIMCC(lpIMC->hPrivate); if (!inComp) { ImmSetOpenStatus(imc, TRUE); GenerateIMEMessage(imc, WM_IME_STARTCOMPOSITION, 0, 0); } GenerateIMEMessage(imc, WM_IME_COMPOSITION, 0, GCS_COMPSTR); GenerateIMEMessage(imc, WM_IME_COMPOSITION, lpResult[0], GCS_RESULTSTR|GCS_RESULTCLAUSE); GenerateIMEMessage(imc, WM_IME_ENDCOMPOSITION, 0, 0); if (!inComp) ImmSetOpenStatus(imc, FALSE); ImmUnlockIMC(imc); }
static void GenerateIMECHARMessages(HIMC hIMC, LPWSTR String, DWORD length) { LPINPUTCONTEXT lpIMC; LPTRANSMSG lpTransMsg; DWORD i; if (length <= 0) return; lpIMC = LockRealIMC(hIMC); if (lpIMC == NULL) return; lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + length) * sizeof(TRANSMSG)); if (!lpIMC->hMsgBuf) return; lpTransMsg = ImmLockIMCC(lpIMC->hMsgBuf); if (!lpTransMsg) return; lpTransMsg += lpIMC->dwNumMsgBuf; for (i = 0; i < length; i++) { lpTransMsg->message = WM_IME_CHAR; lpTransMsg->wParam = String[i]; lpTransMsg->lParam = 1; lpTransMsg ++; } ImmUnlockIMCC(lpIMC->hMsgBuf); lpIMC->dwNumMsgBuf+=length; ImmGenerateMessage(RealIMC(hIMC)); UnlockRealIMC(hIMC); }
static LRESULT WINAPI IME_WindowProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { LRESULT rc = 0; HIMC hIMC; TRACE("Incoming Message 0x%x (0x%08lx, 0x%08lx)\n", msg, wParam, lParam); /* * Each UI window contains the current Input Context. * This Input Context can be obtained by calling GetWindowLong * with IMMGWL_IMC when the UI window receives a WM_IME_xxx message. * The UI window can refer to this Input Context and handles the * messages. */ hIMC = (HIMC)GetWindowLongPtrW(hwnd,IMMGWL_IMC); if (!hIMC) hIMC = RealIMC(FROM_X11); /* if we have no hIMC there are many messages we cannot process */ if (hIMC == NULL) { switch (msg) { case WM_IME_STARTCOMPOSITION: case WM_IME_ENDCOMPOSITION: case WM_IME_COMPOSITION: case WM_IME_NOTIFY: case WM_IME_CONTROL: case WM_IME_COMPOSITIONFULL: case WM_IME_SELECT: case WM_IME_CHAR: return 0L; default: break; } } switch(msg) { case WM_CREATE: { LPIMEPRIVATE myPrivate; LPINPUTCONTEXT lpIMC; SetWindowTextA(hwnd,"Wine Ime Active"); lpIMC = LockRealIMC(hIMC); if (lpIMC) { myPrivate = ImmLockIMCC(lpIMC->hPrivate); myPrivate->hwndDefault = hwnd; ImmUnlockIMCC(lpIMC->hPrivate); } UnlockRealIMC(hIMC); return TRUE; } case WM_PAINT: PaintDefaultIMEWnd(hIMC, hwnd); return FALSE; case WM_NCCREATE: return TRUE; case WM_SETFOCUS: if (wParam) SetFocus((HWND)wParam); else FIXME("Received focus, should never have focus\n"); break; case WM_IME_COMPOSITION: DefaultIMEComposition(hIMC, hwnd, lParam); break; case WM_IME_STARTCOMPOSITION: DefaultIMEStartComposition(hIMC, hwnd); break; case WM_IME_ENDCOMPOSITION: TRACE("IME message %s, 0x%lx, 0x%lx\n", "WM_IME_ENDCOMPOSITION", wParam, lParam); ShowWindow(hwnd,SW_HIDE); break; case WM_IME_SELECT: TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_IME_SELECT", wParam, lParam); break; case WM_IME_CONTROL: TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_IME_CONTROL", wParam, lParam); rc = 1; break; case WM_IME_NOTIFY: rc = ImeHandleNotify(hIMC,hwnd,msg,wParam,lParam); break; default: TRACE("Non-standard message 0x%x\n",msg); } /* check the MSIME messages */ if (msg == WM_MSIME_SERVICE) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_SERVICE", wParam, lParam); rc = FALSE; } else if (msg == WM_MSIME_RECONVERTOPTIONS) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_RECONVERTOPTIONS", wParam, lParam); } else if (msg == WM_MSIME_MOUSE) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_MOUSE", wParam, lParam); } else if (msg == WM_MSIME_RECONVERTREQUEST) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_RECONVERTREQUEST", wParam, lParam); } else if (msg == WM_MSIME_RECONVERT) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_RECONVERT", wParam, lParam); } else if (msg == WM_MSIME_QUERYPOSITION) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_QUERYPOSITION", wParam, lParam); } else if (msg == WM_MSIME_DOCUMENTFEED) { TRACE("IME message %s, 0x%lx, 0x%lx\n","WM_MSIME_DOCUMENTFEED", wParam, lParam); } /* DefWndProc if not an IME message */ if (!rc && !((msg >= WM_IME_STARTCOMPOSITION && msg <= WM_IME_KEYLAST) || (msg >= WM_IME_SETCONTEXT && msg <= WM_IME_KEYUP))) rc = DefWindowProcW(hwnd,msg,wParam,lParam); return rc; }