//#define OV_DEBUG #include "OVIME.h" #include "AVKeyCode.h" #include "ExtraStructs.h" #include #include "ImmController.h" #include #include #include #include #include using namespace std; void MyGenerateMessage(HIMC hIMC, UINT msg, WPARAM wParam, LPARAM lParam) { LPINPUTCONTEXT lpIMC; if((lpIMC = ImmLockIMC(hIMC)) == NULL) return; if (IsWindow(lpIMC->hWnd)) { LPTRANSMSG lpTransMsg; if (!(lpIMC->hMsgBuf = ImmReSizeIMCC(lpIMC->hMsgBuf, (lpIMC->dwNumMsgBuf + 1) * sizeof(TRANSMSG)))) return; if (!(lpTransMsg = (LPTRANSMSG)ImmLockIMCC(lpIMC->hMsgBuf))) return; lpTransMsg += (lpIMC->dwNumMsgBuf); //lpTransMsg->uMsg = msg; lpTransMsg->uMsg = msg; lpTransMsg->wParam=wParam; lpTransMsg->lParam=lParam; ImmUnlockIMCC(lpIMC->hMsgBuf); lpIMC->dwNumMsgBuf++; ImmGenerateMessage(hIMC); } ImmUnlockIMC(hIMC); } BOOL MyGenerateMessageToTransKey(LPDWORD lpdwTransKey, UINT *uNumTranMsgs, UINT msg, WPARAM wParam, LPARAM lParam) { // This code is from FreePY. // It seems that the first byte is the number of bytes. LPDWORD lpdwTemp; if (((*uNumTranMsgs) + 1) >= (UINT)*lpdwTransKey) return FALSE; lpdwTemp = (LPDWORD)lpdwTransKey+1+(*uNumTranMsgs)*3; *(lpdwTemp++) = msg; *(lpdwTemp++) = (DWORD)wParam; *(lpdwTemp++) = (DWORD)lParam; (*uNumTranMsgs)++; return TRUE; } BOOL APIENTRY ImeInquire(LPIMEINFO lpIMEInfo, LPTSTR lpszUIClass, LPCTSTR lpszOption) { lpIMEInfo->dwPrivateDataSize = sizeof(MYPRIVATE); lpIMEInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST | IME_PROP_UNICODE; //IME_PROP_SPECIAL_UI; //IME_PROP_UNICODE lpIMEInfo->fdwConversionCaps = IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE; lpIMEInfo->fdwSentenceCaps = IME_SMODE_NONE; lpIMEInfo->fdwUICaps = UI_CAP_2700; lpIMEInfo->fdwSCSCaps = 0; lpIMEInfo->fdwSelectCaps = SELECT_CAP_CONVERSION; _tcscpy(lpszUIClass, UICLASSNAME); return TRUE; } BOOL APIENTRY ImeConfigure(HKL hKL,HWND hWnd, DWORD dwMode, LPVOID lpData) { if( IME_CONFIG_GENERAL == dwMode ) { TCHAR buf[MAX_PATH]; GetWindowsDirectory( buf, MAX_PATH ); _tcscat( buf, _T("\\OpenVanilla\\OVPreferences.exe")); ShellExecute( hWnd, _T("open"), buf, NULL, NULL, SW_SHOWNORMAL ); } InvalidateRect(hWnd,NULL,FALSE); return TRUE; } DWORD APIENTRY ImeConversionList(HIMC hIMC,LPCTSTR lpSource,LPCANDIDATELIST lpCandList,DWORD dwBufLen,UINT uFlag) { return 0; } BOOL APIENTRY ImeDestroy(UINT uForce) { return FALSE; } LRESULT APIENTRY ImeEscape(HIMC hIMC,UINT uSubFunc,LPVOID lpData) { return FALSE; } BOOL APIENTRY ImeProcessKey(HIMC hIMC, UINT uVKey, LPARAM lKeyData, CONST LPBYTE lpbKeyState) { BOOL isProcessed = FALSE; murmur("ImeProcessKey: %ud", uVKey); if (!hIMC) isProcessed; /*DWORD conv, sentence; ImmGetConversionStatus(hIMC, &conv, &sentence); //Alphanumeric mode if(!(conv & IME_CMODE_NATIVE)) return isProcessed;*/ ImmController* controller = ImmController::open(); int controlState = controller->onControlEvent(hIMC, uVKey, lKeyData, lpbKeyState); switch(controlState) { case 0: // CTRL/ALT/SHIFT, passed isProcessed = FALSE; break; case 1: // CTRL/ALT/SHIFT, processed isProcessed = TRUE; break; case 2: // normal isProcessed = controller->onTypingEvent(hIMC, uVKey, lKeyData, lpbKeyState); break; } // // NOT close ImmController because of counting for SHIFT pressed time. //ImmController::close(); // return isProcessed; } BOOL APIENTRY ImeSelect(HIMC hIMC, BOOL fSelect) { LPINPUTCONTEXT lpIMC; if (!hIMC) return TRUE; if (!fSelect) return TRUE; DWORD conv, sentence; ImmGetConversionStatus( hIMC, &conv, &sentence); if( isChinese ) conv |= IME_CMODE_NATIVE; else conv &= ~IME_CMODE_NATIVE; ImmSetConversionStatus( hIMC, conv, sentence); if (lpIMC = ImmLockIMC(hIMC)) { LPCOMPOSITIONSTRING lpCompStr; LPCANDIDATEINFO lpCandInfo; LPMYPRIVATE lpMyPrivate; lpIMC->fOpen = TRUE; // Resize of compsiting string of IMC lpIMC->hCompStr = ImmReSizeIMCC(lpIMC->hCompStr,sizeof(MYCOMPSTR)); if (lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr)) { InitCompStr(lpCompStr); ImmUnlockIMCC(lpIMC->hCompStr); } lpIMC->hCandInfo = ImmReSizeIMCC(lpIMC->hCandInfo,sizeof(MYCAND)); if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo)) { InitCandInfo(lpCandInfo); ImmUnlockIMCC(lpIMC->hCandInfo); } if ((lpMyPrivate = (LPMYPRIVATE)ImmLockIMCC(lpIMC->hPrivate)) != NULL) { for(int i = 0; i < MAXSTRSIZE; i++) lpMyPrivate->PreEditStr[i]='\0'; for(int i = 0; i < MAXSTRSIZE; i++) lpMyPrivate->CandStr[i]='\0'; ImmUnlockIMCC(lpIMC->hPrivate); } ImmUnlockIMC(hIMC); } return TRUE; } BOOL APIENTRY ImeSetActiveContext(HIMC hIMC,BOOL fFlag) { return TRUE; } UINT APIENTRY ImeToAsciiEx (UINT uVKey, UINT uScanCode, CONST LPBYTE lpbKeyState, LPDWORD lpdwTransKey, UINT fuState, HIMC hIMC) { //murmur("ImeToAsciiEx"); return 0; } BOOL APIENTRY NotifyIME(HIMC hIMC,DWORD dwAction,DWORD dwIndex,DWORD dwValue) { BOOL bRet = FALSE; //LPINPUTCONTEXT lpIMC; switch(dwAction) { case NI_OPENCANDIDATE: break; case NI_CLOSECANDIDATE: break; case NI_SELECTCANDIDATESTR: break; case NI_CHANGECANDIDATELIST: break; case NI_SETCANDIDATE_PAGESTART: break; case NI_SETCANDIDATE_PAGESIZE: break; /* case NI_CONTEXTUPDATED: switch (dwValue) { case IMC_SETCOMPOSITIONWINDOW: break; case IMC_SETCONVERSIONMODE: break; case IMC_SETSENTENCEMODE: break; case IMC_SETCANDIDATEPOS: break; case IMC_SETCOMPOSITIONFONT: break; case IMC_SETOPENSTATUS: lpIMC = ImmLockIMC(hIMC); if (lpIMC) { } bRet = TRUE; break; default: break; } break; */ case NI_COMPOSITIONSTR: switch (dwIndex) { case CPS_COMPLETE: break; case CPS_CONVERT: break; case CPS_REVERT: break; case CPS_CANCEL: break; default: break; } break; default: break; } return bRet; } BOOL APIENTRY ImeRegisterWord(LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr) { return FALSE; } BOOL APIENTRY ImeUnregisterWord(LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr) { return FALSE; } UINT APIENTRY ImeGetRegisterWordStyle(UINT nItem, LPSTYLEBUF lp) { return 0; } UINT APIENTRY ImeEnumRegisterWord(REGISTERWORDENUMPROC lpfn, LPCTSTR lpRead, DWORD dw, LPCTSTR lpStr, LPVOID lpData) { return 0; } BOOL APIENTRY ImeSetCompositionString(HIMC hIMC, DWORD dwIndex, LPCVOID lpComp, DWORD dwComp, LPCVOID lpRead, DWORD dwRead) { return FALSE; }