|
|
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
DDIS.c ++*/
#include <windows.h>
#include <immdev.h>
#include "imeattr.h"
#include "imedefs.h"
#include "imerc.h"
#if defined(UNIIME)
#include "uniime.h"
#endif
/**********************************************************************/ /* ImeInquire() / UniImeInquire() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ // initialized data structure of IME
#if defined(UNIIME)
BOOL WINAPI UniImeInquire( LPINSTDATAL lpInstL, LPIMEL lpImeL, #else
BOOL WINAPI ImeInquire( #endif
LPIMEINFO lpImeInfo, // IME specific data report to IMM
LPTSTR lpszWndCls, // the class name of UI
DWORD dwSystemInfoFlags) { if (!lpImeInfo) { return (FALSE); }
lpImeInfo->dwPrivateDataSize = sizeof(PRIVCONTEXT);
lpImeInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST| #if defined(UNICODE)
IME_PROP_UNICODE| #endif
#if !defined(DAYI)
IME_PROP_CANDLIST_START_FROM_1| #endif
IME_PROP_NEED_ALTKEY|IME_PROP_IGNORE_UPKEYS; lpImeInfo->fdwConversionCaps = IME_CMODE_NATIVE|IME_CMODE_FULLSHAPE| #if !defined(ROMANIME)
#if !defined(WINAR30)
IME_CMODE_SOFTKBD| #endif
#if !defined(WINIME) && !defined(UNICDIME)
IME_CMODE_EUDC| #endif
#endif
IME_CMODE_NOCONVERSION; #if defined(ROMANIME)
lpImeInfo->fdwSentenceCaps = 0; lpImeInfo->fdwSCSCaps = 0; lpImeInfo->fdwUICaps = UI_CAP_ROT90; #else
lpImeInfo->fdwSentenceCaps = IME_SMODE_PHRASEPREDICT; // composition string is the reading string for simple IME
lpImeInfo->fdwSCSCaps = SCS_CAP_COMPSTR|SCS_CAP_MAKEREAD; // IME will have different distance base multiple of 900 escapement
#if defined(WINAR30)
// if an IME want to draw soft keyboard by itself, it also can set this
// off
lpImeInfo->fdwUICaps = UI_CAP_ROT90; #else
lpImeInfo->fdwUICaps = UI_CAP_ROT90|UI_CAP_SOFTKBD; #endif
#endif
// IME want to decide conversion mode on ImeSelect
lpImeInfo->fdwSelectCaps = (DWORD) 0;
lstrcpy(lpszWndCls, lpImeL->szUIClassName);
return (TRUE); }
/**********************************************************************/ /* ImeDestroy() / UniImeDestroy */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ // this dll is unloaded
#if defined(UNIIME)
BOOL WINAPI UniImeDestroy( LPINSTDATAL lpInstL, LPIMEL lpImeL, #else
BOOL WINAPI ImeDestroy( #endif
UINT uReserved) { if (uReserved) { return (FALSE); }
#if !defined(ROMANIME)
// free the IME table or data base
FreeTable(lpInstL); #endif
return (TRUE); }
/**********************************************************************/ /* InitCompStr() */ /**********************************************************************/ void PASCAL InitCompStr( // init setting for composing string
LPCOMPOSITIONSTRING lpCompStr) { if (!lpCompStr) { return; }
lpCompStr->dwCompReadAttrLen = 0; lpCompStr->dwCompReadClauseLen = 0; lpCompStr->dwCompReadStrLen = 0;
lpCompStr->dwCompAttrLen = 0; lpCompStr->dwCompClauseLen = 0; lpCompStr->dwCompStrLen = 0;
lpCompStr->dwCursorPos = 0; lpCompStr->dwDeltaStart = 0;
lpCompStr->dwResultReadClauseLen = 0; lpCompStr->dwResultReadStrLen = 0;
lpCompStr->dwResultClauseLen = 0; lpCompStr->dwResultStrLen = 0;
return; }
/**********************************************************************/ /* ClearCompStr() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ #define NMAXKEY 8
BOOL PASCAL ClearCompStr( #if defined(UNIIME)
LPIMEL lpImeL, #endif
LPINPUTCONTEXT lpIMC) { HIMCC hMem; LPCOMPOSITIONSTRING lpCompStr; DWORD dwSize; LPBYTE lpbAttr; UINT i; LPDWORD lpdwClause; LPWSTR lpwStr;
if (!lpIMC) { return (FALSE); }
dwSize = // header length
sizeof(COMPOSITIONSTRING) + // composition reading attribute plus NULL terminator
NMAXKEY * sizeof(WCHAR) / sizeof(TCHAR) + sizeof(DWORD) + // composition reading clause
sizeof(DWORD) + sizeof(DWORD) + // composition reading string plus NULL terminator
NMAXKEY * sizeof(WCHAR) + sizeof(DWORD) + // result reading clause
sizeof(DWORD) + sizeof(DWORD) + // result reading string plus NULL terminateor
NMAXKEY * sizeof(WCHAR) + sizeof(DWORD) + // result clause
sizeof(DWORD) + sizeof(DWORD) + // result string plus NULL terminateor
MAXSTRLEN * sizeof(WCHAR) + sizeof(DWORD);
if (!lpIMC->hCompStr) { // it maybe free by other IME, init it
lpIMC->hCompStr = ImmCreateIMCC(dwSize); } else if (hMem = ImmReSizeIMCC(lpIMC->hCompStr, dwSize)) { lpIMC->hCompStr = hMem; } else { ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = ImmCreateIMCC(dwSize); return (FALSE); }
if (!lpIMC->hCompStr) { return (FALSE); }
lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr); if (!lpCompStr) { ImmDestroyIMCC(lpIMC->hCompStr); lpIMC->hCompStr = ImmCreateIMCC(dwSize); return (FALSE); }
lpCompStr->dwSize = dwSize;
// 1. composition (reading) string - simple IME
// 2. result reading string
// 3. result string
lpCompStr->dwCompReadAttrLen = 0; lpCompStr->dwCompReadAttrOffset = sizeof(COMPOSITIONSTRING);
lpbAttr = (LPBYTE)lpCompStr + lpCompStr->dwCompReadAttrOffset;
for (i = 0; i < NMAXKEY * sizeof(WCHAR) / sizeof(TCHAR); i++) { // for simple IMEs, we have no way to reconvert it
*lpbAttr++ = ATTR_TARGET_CONVERTED; }
*(LPDWORD)lpbAttr = 0;
lpCompStr->dwCompReadClauseLen = 0; lpCompStr->dwCompReadClauseOffset = lpCompStr->dwCompReadAttrOffset + NMAXKEY * sizeof(WCHAR) / sizeof(TCHAR) + sizeof(DWORD);
lpdwClause = (LPDWORD)((LPBYTE)lpCompStr + lpCompStr->dwCompReadClauseOffset); // clause start from 0
*lpdwClause++ = 0; // clause length is 0
*lpdwClause = 0;
lpCompStr->dwCompReadStrLen = 0; lpCompStr->dwCompReadStrOffset = lpCompStr->dwCompReadClauseOffset + sizeof(DWORD) + sizeof(DWORD);
// clean up the composition reading string
lpwStr = (LPWSTR)((LPBYTE)lpCompStr + lpCompStr->dwCompReadStrOffset);
for (i = 0; i < NMAXKEY; i++) { *lpwStr++ = 0; }
*(LPDWORD)((LPBYTE)lpCompStr + lpCompStr->dwCompReadStrOffset + NMAXKEY * sizeof(WCHAR)) = 0;
// composition string is the same with composition reading string
// for simple IMEs
lpCompStr->dwCompAttrLen = 0; lpCompStr->dwCompAttrOffset = lpCompStr->dwCompReadAttrOffset; lpCompStr->dwCompClauseLen = 0; lpCompStr->dwCompClauseOffset = lpCompStr->dwCompReadClauseOffset; lpCompStr->dwCompStrLen = 0; lpCompStr->dwCompStrOffset = lpCompStr->dwCompReadStrOffset;
lpCompStr->dwCursorPos = 0; lpCompStr->dwDeltaStart = 0;
lpCompStr->dwResultReadClauseLen = 0; lpCompStr->dwResultReadClauseOffset = lpCompStr->dwCompStrOffset + NMAXKEY * sizeof(WCHAR) + sizeof(DWORD);
lpdwClause = (LPDWORD)((LPBYTE)lpCompStr + lpCompStr->dwResultReadClauseOffset); // clause start from 0
*lpdwClause++ = 0; // clause length is 0
*lpdwClause = 0;
lpCompStr->dwResultReadStrLen = 0; lpCompStr->dwResultReadStrOffset = lpCompStr->dwResultReadClauseOffset + sizeof(DWORD) + sizeof(DWORD);
// clean up the result reading string
lpwStr = (LPWSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultReadStrOffset);
for (i = 0; i < NMAXKEY; i++) { *lpwStr++ = 0; }
*(LPDWORD)((LPBYTE)lpCompStr + lpCompStr->dwResultReadStrOffset + NMAXKEY * sizeof(WCHAR)) = 0;
lpCompStr->dwResultClauseLen = 0; lpCompStr->dwResultClauseOffset = lpCompStr->dwResultReadStrOffset + NMAXKEY * sizeof(WCHAR) + sizeof(DWORD);
lpdwClause = (LPDWORD)((LPBYTE)lpCompStr + lpCompStr->dwResultClauseOffset); // clause start from 0
*lpdwClause++ = 0; // clause length is 0
*lpdwClause = 0;
lpCompStr->dwResultStrOffset = 0; lpCompStr->dwResultStrOffset = lpCompStr->dwResultClauseOffset + sizeof(DWORD) + sizeof(DWORD);
// clean up the result string
lpwStr = (LPWSTR)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset);
for (i = 0; i < NMAXKEY; i++) { *lpwStr++ = 0; }
*(LPDWORD)((LPBYTE)lpCompStr + lpCompStr->dwResultStrOffset + NMAXKEY * sizeof(WCHAR)) = 0;
ImmUnlockIMCC(lpIMC->hCompStr); return (TRUE); }
/**********************************************************************/ /* ClearCand() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ BOOL PASCAL ClearCand( LPINPUTCONTEXT lpIMC) { HIMCC hMem; LPCANDIDATEINFO lpCandInfo; LPCANDIDATELIST lpCandList; DWORD dwSize = // header length
sizeof(CANDIDATEINFO) + sizeof(CANDIDATELIST) + // candidate string pointers
sizeof(DWORD) * (MAXCAND) + // string plus NULL terminator
(sizeof(WCHAR) + sizeof(TCHAR)) * MAXCAND;
if (!lpIMC) { return (FALSE); }
if (!lpIMC->hCandInfo) { // it maybe free by other IME, init it
lpIMC->hCandInfo = ImmCreateIMCC(dwSize); } else if (hMem = ImmReSizeIMCC(lpIMC->hCandInfo, dwSize)) { lpIMC->hCandInfo = hMem; } else { ImmDestroyIMCC(lpIMC->hCandInfo); lpIMC->hCandInfo = ImmCreateIMCC(dwSize); return (FALSE); }
if (!lpIMC->hCandInfo) { return (FALSE); }
lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo); if (!lpCandInfo) { ImmDestroyIMCC(lpIMC->hCandInfo); lpIMC->hCandInfo = ImmCreateIMCC(dwSize); return (FALSE); }
// ordering of strings are
// buffer size
lpCandInfo->dwSize = dwSize; lpCandInfo->dwCount = 0; lpCandInfo->dwOffset[0] = sizeof(CANDIDATEINFO); lpCandList = (LPCANDIDATELIST)((LPBYTE)lpCandInfo + lpCandInfo->dwOffset[0]); // whole candidate info size - header
lpCandList->dwSize = lpCandInfo->dwSize - sizeof(CANDIDATEINFO); lpCandList->dwStyle = IME_CAND_READ; lpCandList->dwCount = 0; lpCandList->dwPageStart = lpCandList->dwSelection = 0; lpCandList->dwPageSize = CANDPERPAGE; lpCandList->dwOffset[0] = sizeof(CANDIDATELIST) + sizeof(DWORD) * (MAXCAND - 1);
ImmUnlockIMCC(lpIMC->hCandInfo); return (TRUE); }
/**********************************************************************/ /* InitGuideLine() */ /**********************************************************************/ void PASCAL InitGuideLine( // init guide line
LPGUIDELINE lpGuideLine) { #if !defined(ROMANIME)
LPCANDIDATELIST lpCandList; #endif
if (!lpGuideLine) { return; }
lpGuideLine->dwLevel = GL_LEVEL_NOGUIDELINE; lpGuideLine->dwIndex = GL_ID_UNKNOWN; lpGuideLine->dwStrLen = 0; lpGuideLine->dwStrOffset = sizeof(GUIDELINE);
lpGuideLine->dwPrivateOffset = sizeof(GUIDELINE); #if defined(ROMANIME)
lpGuideLine->dwPrivateSize = sizeof(lpGuideLine->dwPrivateSize) + sizeof(lpGuideLine->dwPrivateOffset); #else
lpGuideLine->dwPrivateSize = lpGuideLine->dwSize - sizeof(GUIDELINE) - sizeof(lpGuideLine->dwPrivateSize) - sizeof(lpGuideLine->dwPrivateOffset); lpCandList = (LPCANDIDATELIST)((LPBYTE)lpGuideLine + lpGuideLine->dwPrivateOffset);
lpCandList->dwSize = lpGuideLine->dwSize - sizeof(GUIDELINE); lpCandList->dwStyle = IME_CAND_READ; lpCandList->dwCount = 0; lpCandList->dwSelection = 0; lpCandList->dwPageSize = CANDPERPAGE; lpCandList->dwOffset[0] = sizeof(CANDIDATELIST) + sizeof(DWORD) * (MAX_COMP_BUF - 1); #endif
return; }
/**********************************************************************/ /* ClearGuideLine() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ BOOL PASCAL ClearGuideLine( #if defined(UNIIME)
LPIMEL lpImeL, #endif
LPINPUTCONTEXT lpIMC) { HIMCC hMem; LPGUIDELINE lpGuideLine; DWORD dwSize = // header length
sizeof(GUIDELINE) + // string for status error
#if defined(ROMANIME)
0; #else
// private header length
sizeof(CANDIDATELIST) + // candidate string pointers
sizeof(DWORD) * MAX_COMP_BUF + // string plus NULL terminator
(sizeof(WCHAR) * lpImeL->nRevMaxKey + sizeof(TCHAR)) * MAX_COMP_BUF; #endif
if (!lpIMC->hGuideLine) { // it maybe free by IME
lpIMC->hGuideLine = ImmCreateIMCC(dwSize); } else if (hMem = ImmReSizeIMCC(lpIMC->hGuideLine, dwSize)) { lpIMC->hGuideLine = hMem; } else { ImmDestroyIMCC(lpIMC->hGuideLine); lpIMC->hGuideLine = ImmCreateIMCC(dwSize); }
lpGuideLine = (LPGUIDELINE)ImmLockIMCC(lpIMC->hGuideLine); if (!lpGuideLine) { return (FALSE); }
lpGuideLine->dwSize = dwSize;
InitGuideLine(lpGuideLine);
ImmUnlockIMCC(lpIMC->hGuideLine);
return (TRUE); }
/**********************************************************************/ /* InitContext() */ /**********************************************************************/ void PASCAL InitContext( #if defined(UNIIME)
LPIMEL lpImeL, #endif
LPINPUTCONTEXT lpIMC, LPPRIVCONTEXT lpImcP) { if (lpIMC->fdwInit & INIT_STATUSWNDPOS) { } else if (!lpIMC->hWnd) { #if 0 // MultiMonitor support
} else if (lpImcP->fdwInit & INIT_STATUSWNDPOS) { #endif
} else { #if 0 // MultiMonitor support
POINT ptWnd;
ptWnd.x = 0; ptWnd.y = 0; ClientToScreen(lpIMC->hWnd, &ptWnd);
if (ptWnd.x > sImeG.rcWorkArea.right / 3) { ptWnd.x = sImeG.rcWorkArea.right / 3; }
if (ptWnd.x < sImeG.rcWorkArea.left) { lpIMC->ptStatusWndPos.x = sImeG.rcWorkArea.left; } else if (ptWnd.x + lpImeL->xStatusWi > sImeG.rcWorkArea.right) { lpIMC->ptStatusWndPos.x = sImeG.rcWorkArea.right - lpImeL->xStatusWi; } else { lpIMC->ptStatusWndPos.x = ptWnd.x; }
lpIMC->ptStatusWndPos.y = sImeG.rcWorkArea.bottom - lpImeL->yStatusHi - 2 * UI_MARGIN;
lpImcP->fdwInit |= INIT_STATUSWNDPOS; #else
RECT rcWorkArea;
rcWorkArea = ImeMonitorWorkAreaFromWindow(lpIMC->hWnd);
lpIMC->ptStatusWndPos.x = rcWorkArea.left + 2 * UI_MARGIN;
lpIMC->ptStatusWndPos.y = rcWorkArea.bottom - lpImeL->yStatusHi - 2 * UI_MARGIN; #endif
}
#if !defined(ROMANIME)
if (!(lpIMC->fdwInit & INIT_COMPFORM)) { lpIMC->cfCompForm.dwStyle = CFS_DEFAULT; }
if (lpIMC->cfCompForm.dwStyle != CFS_DEFAULT) { } else if (!lpIMC->hWnd) { } else if (lpImcP->fdwInit & INIT_COMPFORM) { } else { if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { lpIMC->cfCompForm.ptCurrentPos.x = lpIMC->ptStatusWndPos.x + lpImeL->rcStatusText.right + lpImeL->cxCompBorder * 2 + UI_MARGIN;
if (lpIMC->cfCompForm.ptCurrentPos.x + (lpImeL->nRevMaxKey * sImeG.xChiCharWi) > sImeG.rcWorkArea.right) { lpIMC->cfCompForm.ptCurrentPos.x = lpIMC->ptStatusWndPos.x - lpImeL->nRevMaxKey * sImeG.xChiCharWi - lpImeL->cxCompBorder * 3; } } else { lpIMC->cfCompForm.ptCurrentPos.x = lpIMC->ptStatusWndPos.x + lpImeL->xStatusWi + UI_MARGIN;
if (lpIMC->cfCompForm.ptCurrentPos.x + lpImeL->xCompWi > sImeG.rcWorkArea.right) { lpIMC->cfCompForm.ptCurrentPos.x = lpIMC->ptStatusWndPos.x - lpImeL->xCompWi - lpImeL->cxCompBorder * 2 - UI_MARGIN; } }
lpIMC->cfCompForm.ptCurrentPos.y = sImeG.rcWorkArea.bottom - lpImeL->yCompHi - 2 * UI_MARGIN;
ScreenToClient(lpIMC->hWnd, &lpIMC->cfCompForm.ptCurrentPos);
lpImcP->fdwInit |= INIT_COMPFORM; } #endif
return; }
/**********************************************************************/ /* Select() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ BOOL PASCAL Select( #if defined(UNIIME)
LPIMEL lpImeL, #endif
LPINPUTCONTEXT lpIMC, BOOL fSelect) { LPPRIVCONTEXT lpImcP;
if (fSelect) { // init "every" fields of hPrivate, please!!!
if (!ClearCompStr( #if defined(UNIIME)
lpImeL, #endif
lpIMC)) { return (FALSE); }
if (!ClearCand(lpIMC)) { return (FALSE); }
ClearGuideLine( #if defined(UNIIME)
lpImeL, #endif
lpIMC); }
if (lpIMC->cfCandForm[0].dwIndex != 0) { lpIMC->cfCandForm[0].dwStyle = CFS_DEFAULT; }
// We add this hack for switching from other IMEs, this IME has a bug.
// Before this bug fixed in this IME, it depends on this hack.
if (lpIMC->cfCandForm[0].dwStyle == CFS_DEFAULT) { lpIMC->cfCandForm[0].dwIndex = (DWORD)-1; }
if (!lpIMC->hPrivate) { return (FALSE); }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { return (FALSE); }
if (fSelect) { // init "every" fields of hPrivate, please!!!
#if !defined(ROMANIME)
lpImcP->iImeState = CST_INIT; // init the IME state machine
lpImcP->fdwImeMsg = 0; // no message be generated now
lpImcP->dwCompChar = 0; lpImcP->fdwGcsFlag = 0; lpImcP->fdwInit = 0;
*(LPDWORD)lpImcP->bSeq = 0; #if defined(CHAJEI) || defined(QUICK) || defined(WINAR30) || defined(UNIIME)
*(LPDWORD)&lpImcP->bSeq[4] = 0; #endif
#endif
lpIMC->fOpen = TRUE;
if (!(lpIMC->fdwInit & INIT_CONVERSION)) { lpIMC->fdwConversion = (lpIMC->fdwConversion & IME_CMODE_SOFTKBD) | IME_CMODE_NATIVE; lpIMC->fdwInit |= INIT_CONVERSION; }
#if !defined(ROMANIME)
if (lpIMC->fdwConversion & IME_CMODE_SOFTKBD) { lpImcP->fdwImeMsg |= MSG_ALREADY_SOFTKBD; }
if (lpIMC->fdwInit & INIT_SENTENCE) { } else if (lpImeL->fdwModeConfig & MODE_CONFIG_PREDICT) { *(LPWORD)&lpIMC->fdwSentence |= IME_SMODE_PHRASEPREDICT; } else { } #endif
if (!(lpIMC->fdwInit & INIT_LOGFONT)) { HDC hDC; HGDIOBJ hSysFont;
hDC = GetDC(NULL); hSysFont = GetCurrentObject(hDC, OBJ_FONT); GetObject(hSysFont, sizeof(LOGFONT), &lpIMC->lfFont.A); ReleaseDC(NULL, hDC);
lpIMC->fdwInit |= INIT_LOGFONT; }
// if this IME is run under Chicago Simplified Chinese version
lpIMC->lfFont.A.lfCharSet = NATIVE_CHARSET;
InitContext( #if defined(UNIIME)
lpImeL, #endif
lpIMC, lpImcP); }
ImmUnlockIMCC(lpIMC->hPrivate);
return (TRUE); }
/**********************************************************************/ /* ImeSelect() / UniImeSelect() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ #if defined(UNIIME)
BOOL WINAPI UniImeSelect( LPINSTDATAL lpInstL, LPIMEL lpImeL, #else
BOOL WINAPI ImeSelect( #endif
HIMC hIMC, BOOL fSelect) { LPINPUTCONTEXT lpIMC; BOOL fRet;
if (!hIMC) { return (TRUE); }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return (FALSE); }
#if !defined(ROMANIME)
// to load/free IME table
if (fSelect) { if (!lpInstL->cRefCount++) { LoadTable(lpInstL, lpImeL); } } else { if (!--lpInstL->cRefCount) { FreeTable(lpInstL); } } #endif
fRet = Select( #if defined(UNIIME)
lpImeL, #endif
lpIMC, fSelect);
ImmUnlockIMC(hIMC);
return (fRet); }
/**********************************************************************/ /* ImeSetActiveContext() / UniImeSetActiveContext() */ /* Return Value: */ /* TRUE - successful, FALSE - failure */ /**********************************************************************/ #if defined(UNIIME)
BOOL WINAPI UniImeSetActiveContext( LPINSTDATAL lpInstL, LPIMEL lpImeL, #else
BOOL WINAPI ImeSetActiveContext( #endif
HIMC hIMC, BOOL fOn) { if (!fOn) { } else if (!hIMC) { } else { LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP;
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { goto SetActSyncDic; }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { goto SetActUnlockIMC; }
InitContext( #if defined(UNIIME)
lpImeL, #endif
lpIMC, lpImcP);
ImmUnlockIMCC(lpIMC->hPrivate); SetActUnlockIMC: ImmUnlockIMC(hIMC);
SetActSyncDic: ; // NULL statement for goto
#if !defined(ROMANIME) && !defined(WINIME) && !defined(UNICDIME)
if (lpImeL->szUsrDic[0]) { if (lpInstL->hUsrDicMem) { } else if (lpImeL->fdwErrMsg & (ERRMSG_LOAD_USRDIC| ERRMSG_MEM_USRDIC)) { } else if (lpInstL->fdwTblLoad != TBL_LOADED) { } else { LoadUsrDicFile(lpInstL, lpImeL); } } else { if (lpInstL->hUsrDicMem) { CloseHandle(lpInstL->hUsrDicMem); lpInstL->hUsrDicMem = (HANDLE)NULL; } } #endif
}
return (TRUE); }
|