|
|
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
UI.c ++*/
#include <windows.h>
#include <immdev.h>
#include "imeattr.h"
#include "imedefs.h"
#if defined(UNIIME)
#include "uniime.h"
#endif
/**********************************************************************/ /* CreateUIWindow() */ /**********************************************************************/ void PASCAL CreateUIWindow( // create composition window
#if defined(UNIIME)
LPIMEL lpImeL, #endif
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
// create storage for UI setting
hUIPrivate = GlobalAlloc(GHND, sizeof(UIPRIV)); if (!hUIPrivate) { // Oh! Oh!
return; }
SetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE, (LONG_PTR)hUIPrivate);
// set the default position for UI window, it is hide now
SetWindowPos(hUIWnd, NULL, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOZORDER);
ShowWindow(hUIWnd, SW_SHOWNOACTIVATE);
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // can not draw candidate window
return; }
if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { lpUIPrivate->fdwSetContext |= ISC_OFF_CARET_UI; }
GlobalUnlock(hUIPrivate);
return; }
/**********************************************************************/ /* DestroyUIWindow() */ /**********************************************************************/ void PASCAL DestroyUIWindow( // destroy composition window
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // Oh! Oh!
return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // Oh! Oh!
return; }
if (lpUIPrivate->hCMenuWnd) { SetWindowLongPtr(lpUIPrivate->hCMenuWnd, CMENU_HUIWND,(LONG_PTR)0); PostMessage(lpUIPrivate->hCMenuWnd, WM_USER_DESTROY, 0, 0); }
#if !defined(ROMANIME)
// composition window need to be destroyed
if (lpUIPrivate->hCompWnd) { DestroyWindow(lpUIPrivate->hCompWnd); }
// candidate window need to be destroyed
if (lpUIPrivate->hCandWnd) { DestroyWindow(lpUIPrivate->hCandWnd); } #endif
// status window need to be destroyed
if (lpUIPrivate->hStatusWnd) { DestroyWindow(lpUIPrivate->hStatusWnd); }
#if !defined(ROMANIME) && !defined(WINAR30)
// soft keyboard window need to be destroyed
if (lpUIPrivate->hSoftKbdWnd) { ImmDestroySoftKeyboard(lpUIPrivate->hSoftKbdWnd); } #endif
GlobalUnlock(hUIPrivate);
// free storage for UI settings
GlobalFree(hUIPrivate);
return; }
#if !defined(ROMANIME) && !defined(WINAR30)
/**********************************************************************/ /* GetSoftKbdWnd */ /* Return Value : */ /* window handle of composition */ /**********************************************************************/ HWND PASCAL GetSoftKbdWnd( HWND hUIWnd) // UI window
{ HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate; HWND hSoftKbdWnd;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // can not darw candidate window
return (HWND)NULL; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // can not draw candidate window
return (HWND)NULL; }
hSoftKbdWnd = lpUIPrivate->hSoftKbdWnd;
GlobalUnlock(hUIPrivate); return (hSoftKbdWnd); }
/**********************************************************************/ /* ShowSoftKbd */ /**********************************************************************/ void PASCAL ShowSoftKbd( // Show the soft keyboard window
HWND hUIWnd, int nShowSoftKbdCmd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // can not darw status window
return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // can not draw status window
return; }
if (lpUIPrivate->nShowSoftKbdCmd == nShowSoftKbdCmd) { goto SwSftKbNoChange; }
if (nShowSoftKbdCmd == SW_HIDE) { lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_SOFTKBD); }
if (!lpUIPrivate->hSoftKbdWnd) { // not in show status window mode
} else { ImmShowSoftKeyboard(lpUIPrivate->hSoftKbdWnd, nShowSoftKbdCmd); lpUIPrivate->nShowSoftKbdCmd = nShowSoftKbdCmd; }
SwSftKbNoChange: GlobalUnlock(hUIPrivate); return; }
/**********************************************************************/ /* CheckSoftKbdPosition() */ /**********************************************************************/ void PASCAL CheckSoftKbdPosition( LPUIPRIV lpUIPrivate, LPINPUTCONTEXT lpIMC) { #if 0 // MultiMonitor support
UINT fPortionBits = 0; UINT fPortionTest; int xPortion, yPortion, nPortion; RECT rcWnd;
// portion of dispaly
// 0 1
// 2 3
if (lpUIPrivate->hCompWnd) { GetWindowRect(lpUIPrivate->hCompWnd, &rcWnd);
if (rcWnd.left > sImeG.rcWorkArea.right / 2) { xPortion = 1; } else { xPortion = 0; }
if (rcWnd.top > sImeG.rcWorkArea.bottom / 2) { yPortion = 1; } else { yPortion = 0; }
fPortionBits |= 0x0001 << (yPortion * 2 + xPortion); }
if (lpUIPrivate->hStatusWnd) { GetWindowRect(lpUIPrivate->hStatusWnd, &rcWnd);
if (rcWnd.left > sImeG.rcWorkArea.right / 2) { xPortion = 1; } else { xPortion = 0; }
if (rcWnd.top > sImeG.rcWorkArea.bottom / 2) { yPortion = 1; } else { yPortion = 0; }
fPortionBits |= 0x0001 << (yPortion * 2 + xPortion); }
GetWindowRect(lpUIPrivate->hSoftKbdWnd, &rcWnd);
// start from portion 3
for (nPortion = 3, fPortionTest = 0x0008; fPortionTest; nPortion--, fPortionTest >>= 1) { if (fPortionTest & fPortionBits) { // someone here!
continue; }
if (nPortion % 2) { lpIMC->ptSoftKbdPos.x = sImeG.rcWorkArea.right - (rcWnd.right - rcWnd.left) - UI_MARGIN; } else { lpIMC->ptSoftKbdPos.x = sImeG.rcWorkArea.left; }
if (nPortion / 2) { lpIMC->ptSoftKbdPos.y = sImeG.rcWorkArea.bottom - (rcWnd.bottom - rcWnd.top) - UI_MARGIN; } else { lpIMC->ptSoftKbdPos.y = sImeG.rcWorkArea.top; }
lpIMC->fdwInit |= INIT_SOFTKBDPOS;
break; } #else
RECT rcWorkArea, rcWnd;
GetWindowRect(lpUIPrivate->hSoftKbdWnd, &rcWnd);
rcWorkArea = ImeMonitorWorkAreaFromWindow(lpIMC->hWnd);
lpIMC->ptSoftKbdPos.x = rcWorkArea.right - (rcWnd.right - rcWnd.left) - UI_MARGIN;
lpIMC->ptSoftKbdPos.y = rcWorkArea.bottom - (rcWnd.bottom - rcWnd.top) - UI_MARGIN; #endif
return; }
/**********************************************************************/ /* SetSoftKbdData() */ /**********************************************************************/ void PASCAL SetSoftKbdData( #if defined(UNIIME)
LPIMEL lpImeL, #endif
HWND hSoftKbdWnd, LPINPUTCONTEXT lpIMC) { int i; SOFTKBDDATA sSoftKbdData;
sSoftKbdData.uCount = 1;
// initialize the char array to 0s
for (i = 0; i < sizeof(sSoftKbdData.wCode)/sizeof(WORD); i++) { sSoftKbdData.wCode[0][i] = 0; }
for (i = 0; i < 0x41; i++) { BYTE bVirtKey;
bVirtKey = bChar2VirtKey[i];
if (!bVirtKey) { continue; }
#if defined(ROMANIME) || defined(WINAR30)
{ #else
if (lpIMC->fdwConversion & IME_CMODE_SYMBOL) { sSoftKbdData.wCode[0][bVirtKey] = sImeG.wSymbol[i]; } else { #endif
#if defined(PHON)
BYTE bStandardChar; #endif
register short iSeq;
#if defined(PHON)
{ bStandardChar = bStandardLayout[lpImeL->nReadLayout][i]; }
iSeq = lpImeL->wChar2SeqTbl[bStandardChar - ' ']; #else
iSeq = lpImeL->wChar2SeqTbl[i]; #endif
if (!iSeq) { continue; }
sSoftKbdData.wCode[0][bVirtKey] = #ifdef UNICODE
lpImeL->wSeq2CompTbl[iSeq]; #else
HIBYTE(lpImeL->wSeq2CompTbl[iSeq]) | (LOBYTE(lpImeL->wSeq2CompTbl[iSeq]) << 8); #endif
} }
if (sImeG.fDiffSysCharSet) { LOGFONT lfFont;
GetObject(GetStockObject(SYSTEM_FONT), sizeof(lfFont), &lfFont);
lfFont.lfCharSet = NATIVE_CHARSET; lfFont.lfFaceName[0] = TEXT('\0');
SendMessage(hSoftKbdWnd, WM_IME_CONTROL, IMC_SETSOFTKBDFONT, (LPARAM)&lfFont); }
SendMessage(hSoftKbdWnd, WM_IME_CONTROL, IMC_SETSOFTKBDDATA, (LPARAM)&sSoftKbdData);
#if defined(PHON)
SendMessage(hSoftKbdWnd, WM_IME_CONTROL, IMC_SETSOFTKBDSUBTYPE, lpImeL->nReadLayout); #endif
return; }
/**********************************************************************/ /* UpdateSoftKbd() */ /**********************************************************************/ void PASCAL UpdateSoftKbd( #if defined(UNIIME)
LPIMEL lpImeL, #endif
HWND hUIWnd) { HIMC hIMC; LPINPUTCONTEXT lpIMC; HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC); if (!hIMC) { return; }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return; }
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // can not darw soft keyboard window
ImmUnlockIMC(hIMC); return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // can not draw soft keyboard window
ImmUnlockIMC(hIMC); return; }
if (!(lpIMC->fdwConversion & IME_CMODE_SOFTKBD)) { if (lpUIPrivate->hSoftKbdWnd) { ImmDestroySoftKeyboard(lpUIPrivate->hSoftKbdWnd); lpUIPrivate->hSoftKbdWnd = NULL; }
lpUIPrivate->nShowSoftKbdCmd = SW_HIDE; } else if (!lpIMC->fOpen) { if (lpUIPrivate->nShowSoftKbdCmd != SW_HIDE) { ShowSoftKbd(hUIWnd, SW_HIDE); } } else if ((lpIMC->fdwConversion & (IME_CMODE_NATIVE|IME_CMODE_CHARCODE| IME_CMODE_NOCONVERSION)) == IME_CMODE_NATIVE) { if (!lpUIPrivate->hSoftKbdWnd) { HWND hInsertWnd;
// create soft keyboard
lpUIPrivate->hSoftKbdWnd = ImmCreateSoftKeyboard(SOFTKEYBOARD_TYPE_T1, hUIWnd, 0, 0);
if (lpUIPrivate->hStatusWnd) { hInsertWnd = lpUIPrivate->hStatusWnd; } else if (lpUIPrivate->hCompWnd) { hInsertWnd = lpUIPrivate->hCompWnd; } else if (lpUIPrivate->hCandWnd) { hInsertWnd = lpUIPrivate->hCandWnd; } else { hInsertWnd = NULL; }
if (!hInsertWnd) { } else if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { // insert soft keyboard in front of other UI
SetWindowPos(hInsertWnd, lpUIPrivate->hSoftKbdWnd, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); } else { // insert soft keyboard behind other UI
SetWindowPos(lpUIPrivate->hSoftKbdWnd, hInsertWnd, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); } }
if (!(lpIMC->fdwInit & INIT_SOFTKBDPOS)) { CheckSoftKbdPosition(lpUIPrivate, lpIMC); }
SetSoftKbdData( #if defined(UNIIME)
lpImeL, #endif
lpUIPrivate->hSoftKbdWnd, lpIMC);
if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) { SetWindowPos(lpUIPrivate->hSoftKbdWnd, NULL, lpIMC->ptSoftKbdPos.x, lpIMC->ptSoftKbdPos.y, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOZORDER);
// only show, if the application want to show it
if (lpUIPrivate->fdwSetContext & ISC_SHOW_SOFTKBD) { ShowSoftKbd(hUIWnd, SW_SHOWNOACTIVATE); } } } else { if (lpUIPrivate->nShowSoftKbdCmd != SW_HIDE) { ShowSoftKbd(hUIWnd, SW_HIDE); } }
GlobalUnlock(hUIPrivate); ImmUnlockIMC(hIMC);
return; }
/**********************************************************************/ /* SoftKbdDestryed() */ /**********************************************************************/ void PASCAL SoftKbdDestroyed( // soft keyboard window
// already destroyed
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // Oh! Oh!
return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // Oh! Oh!
return; }
lpUIPrivate->hSoftKbdWnd = NULL;
GlobalUnlock(hUIPrivate); } #endif
/**********************************************************************/ /* StatusWndMsg() */ /**********************************************************************/ void PASCAL StatusWndMsg( // set the show hide state and
// show/hide the status window
#if defined(UNIIME)
LPINSTDATAL lpInstL, LPIMEL lpImeL, #endif
HWND hUIWnd, BOOL fOn) { HGLOBAL hUIPrivate; HIMC hIMC; HWND hStatusWnd;
register LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (fOn) { lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
if (!lpUIPrivate->hStatusWnd) { OpenStatus( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } } else { lpUIPrivate->fdwSetContext &= ~(ISC_OPEN_STATUS_WINDOW); }
hStatusWnd = lpUIPrivate->hStatusWnd;
GlobalUnlock(hUIPrivate);
if (!hStatusWnd) { return; }
if (!fOn) { #if !defined(ROMANIME)
register DWORD fdwSetContext;
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
if (fdwSetContext == ISC_HIDE_COMP_WINDOW) { ShowComp( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); }
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICANDIDATEWINDOW|ISC_HIDE_CAND_WINDOW);
if (fdwSetContext == ISC_HIDE_CAND_WINDOW) { ShowCand( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); }
#if !defined(WINAR30)
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOW_SOFTKBD|ISC_HIDE_SOFTKBD);
if (fdwSetContext == ISC_HIDE_SOFTKBD) { lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_SOFTKBD); ShowSoftKbd(hUIWnd, SW_HIDE); } #endif
#endif
ShowStatus( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); } else if (hIMC) { ShowStatus( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_SHOWNOACTIVATE); } else { ShowStatus( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); }
return; }
/**********************************************************************/ /* ShowUI() */ /**********************************************************************/ void PASCAL ShowUI( // show the sub windows
#if defined(UNIIME)
LPINSTDATAL lpInstL, LPIMEL lpImeL, #endif
HWND hUIWnd, int nShowCmd) { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP; HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
if (nShowCmd == SW_HIDE) { } else if (!(hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC))) { nShowCmd = SW_HIDE; } else if (!(lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC))) { nShowCmd = SW_HIDE; } else if (!(lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate))) { ImmUnlockIMC(hIMC); nShowCmd = SW_HIDE; } else { }
if (nShowCmd == SW_HIDE) { ShowStatus( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, nShowCmd);
#if !defined(ROMANIME)
ShowComp( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, nShowCmd);
ShowCand( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, nShowCmd);
#if !defined(WINAR30)
ShowSoftKbd(hUIWnd, nShowCmd); #endif
#endif
return; }
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // can not darw status window
goto ShowUIUnlockIMCC; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // can not draw status window
goto ShowUIUnlockIMCC; }
#if !defined(ROMANIME)
if ((lpUIPrivate->fdwSetContext & ISC_SHOWUICOMPOSITIONWINDOW) && (lpImcP->fdwImeMsg & MSG_ALREADY_START)) { if (lpUIPrivate->hCompWnd) { if ((UINT)GetWindowLong(lpUIPrivate->hCompWnd, UI_MOVE_XY) != lpImeL->nRevMaxKey) { ChangeCompositionSize( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); }
if (lpUIPrivate->nShowCompCmd != SW_HIDE) { // some time the WM_ERASEBKGND is eaten by the app
RedrawWindow(lpUIPrivate->hCompWnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE|RDW_ERASE); }
SendMessage(lpUIPrivate->hCompWnd, WM_IME_NOTIFY, IMN_SETCOMPOSITIONWINDOW, 0);
if (lpUIPrivate->nShowCompCmd == SW_HIDE) { ShowComp( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, nShowCmd); } } else { StartComp( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } } else if (lpUIPrivate->nShowCompCmd == SW_HIDE) { } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { // delay the hide with status window
lpUIPrivate->fdwSetContext |= ISC_HIDE_COMP_WINDOW; } else { ShowComp( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); }
if ((lpUIPrivate->fdwSetContext & ISC_SHOWUICANDIDATEWINDOW) && (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN)) { if (lpUIPrivate->hCandWnd) { if (lpUIPrivate->nShowCandCmd != SW_HIDE) { // some time the WM_ERASEBKGND is eaten by the app
RedrawWindow(lpUIPrivate->hCandWnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE|RDW_ERASE); }
SendMessage(lpUIPrivate->hCandWnd, WM_IME_NOTIFY, IMN_SETCANDIDATEPOS, 0x0001);
if (lpUIPrivate->nShowCandCmd == SW_HIDE) { ShowCand( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, nShowCmd); } } else { OpenCand( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } } else if (lpUIPrivate->nShowCandCmd == SW_HIDE) { } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { // delay the hide with status window
lpUIPrivate->fdwSetContext |= ISC_HIDE_CAND_WINDOW; } else { ShowCand( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); }
if (lpIMC->fdwInit & INIT_SENTENCE) { // app set the sentence mode so we should not change it
// with the configure option set by end user
} else if (lpImeL->fdwModeConfig & MODE_CONFIG_PREDICT) { if (!(lpIMC->fdwSentence & IME_SMODE_PHRASEPREDICT)) { DWORD fdwSentence;
fdwSentence = lpIMC->fdwSentence; *(LPWORD)&fdwSentence |= IME_SMODE_PHRASEPREDICT;
ImmSetConversionStatus(hIMC, lpIMC->fdwConversion, fdwSentence); } } else { if (lpIMC->fdwSentence & IME_SMODE_PHRASEPREDICT) { DWORD fdwSentence;
fdwSentence = lpIMC->fdwSentence; *(LPWORD)&fdwSentence &= ~(IME_SMODE_PHRASEPREDICT);
ImmSetConversionStatus(hIMC, lpIMC->fdwConversion, fdwSentence); } } #endif
if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { if (!lpUIPrivate->hStatusWnd) { OpenStatus( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); }
if (lpUIPrivate->nShowStatusCmd != SW_HIDE) { // some time the WM_ERASEBKGND is eaten by the app
RedrawWindow(lpUIPrivate->hStatusWnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE|RDW_ERASE); }
SendMessage(lpUIPrivate->hStatusWnd, WM_IME_NOTIFY, IMN_SETSTATUSWINDOWPOS, 0); if (lpUIPrivate->nShowStatusCmd == SW_HIDE) { ShowStatus( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, nShowCmd); } } else if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { if (!lpUIPrivate->hStatusWnd) { #if !defined(ROMANIME)
} else if (lpUIPrivate->hCompWnd || lpUIPrivate->hCandWnd) { int nCurrShowState; RECT rcRect;
nCurrShowState = lpUIPrivate->nShowCompCmd; nCurrShowState |= lpUIPrivate->nShowCandCmd;
if (nCurrShowState == SW_HIDE) { ShowStatus( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); }
rcRect = lpImeL->rcStatusText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
RedrawWindow(lpUIPrivate->hStatusWnd, &rcRect, NULL, RDW_FRAME|RDW_INVALIDATE);
DestroyStatusWindow(lpUIPrivate->hStatusWnd); #endif
} else { DestroyWindow(lpUIPrivate->hStatusWnd); } } else if (lpUIPrivate->hStatusWnd) { DestroyWindow(lpUIPrivate->hStatusWnd); } else { }
#if !defined(ROMANIME)
#if defined(WINAR30)
if (lpImcP->iImeState == CST_INIT) { } else if (lpImcP->iImeState == CST_CHOOSE) { } else if (lpImeL->fdwModeConfig & MODE_CONFIG_QUICK_KEY) { } else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { // turn off quick key candidate
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE|MSG_CHANGE_CANDIDATE); GenerateMessage(hIMC, lpIMC, lpImcP); } else if (lpImcP->fdwImeMsg & (MSG_OPEN_CANDIDATE|MSG_CHANGE_CANDIDATE)) { // turn off quick key candidate
lpImcP->fdwImeMsg &= ~(MSG_OPEN_CANDIDATE|MSG_CHANGE_CANDIDATE); } else { } #else
if (!lpIMC->fOpen) { if (lpUIPrivate->nShowCompCmd != SW_HIDE) { ShowSoftKbd(hUIWnd, SW_HIDE); } } else if ((lpUIPrivate->fdwSetContext & ISC_SHOW_SOFTKBD) && (lpIMC->fdwConversion & (IME_CMODE_NATIVE|IME_CMODE_CHARCODE| IME_CMODE_NOCONVERSION|IME_CMODE_SOFTKBD)) == (IME_CMODE_NATIVE|IME_CMODE_SOFTKBD)) { if (!lpUIPrivate->hSoftKbdWnd) { UpdateSoftKbd( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); #if defined(PHON)
} else if ((UINT)SendMessage(lpUIPrivate->hSoftKbdWnd, WM_IME_CONTROL, IMC_GETSOFTKBDSUBTYPE, 0) != lpImeL->nReadLayout) {
UpdateSoftKbd(hUIWnd); #endif
} else if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) { ShowSoftKbd(hUIWnd, nShowCmd); } else if (lpUIPrivate->hCacheIMC != hIMC) { UpdateSoftKbd( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); } else { RedrawWindow(lpUIPrivate->hSoftKbdWnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE); } } else if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) { } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { // delay the hide with status window
lpUIPrivate->fdwSetContext |= ISC_HIDE_SOFTKBD; } else { ShowSoftKbd(hUIWnd, SW_HIDE); } #endif
#endif
// we switch to this hIMC
lpUIPrivate->hCacheIMC = hIMC;
GlobalUnlock(hUIPrivate);
ShowUIUnlockIMCC: ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(hIMC);
return; }
/**********************************************************************/ /* ShowGuideLine */ /**********************************************************************/ void PASCAL ShowGuideLine( #if defined(UNIIME)
LPIMEL lpImeL, #endif
HWND hUIWnd) { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPGUIDELINE lpGuideLine; #if !defined(ROMANIME)
HWND hCompWnd; #endif
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC); if (!hIMC) { return; }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return; }
lpGuideLine = (LPGUIDELINE)ImmLockIMCC(lpIMC->hGuideLine);
if (!lpGuideLine) { } else if (lpGuideLine->dwLevel == GL_LEVEL_ERROR) { MessageBeep((UINT)-1); MessageBeep((UINT)-1); } else if (lpGuideLine->dwLevel == GL_LEVEL_WARNING) { MessageBeep((UINT)-1); #if !defined(ROMANIME)
} else if (hCompWnd = GetCompWnd(hUIWnd)) { RECT rcRect;
rcRect = lpImeL->rcCompText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
RedrawWindow(hCompWnd, &rcRect, NULL, RDW_INVALIDATE); #endif
} else { }
ImmUnlockIMCC(lpIMC->hGuideLine); ImmUnlockIMC(hIMC);
return; }
#if !defined(ROMANIME)
/**********************************************************************/ /* UpdatePhrasePrediction() */ /**********************************************************************/ void PASCAL UpdatePhrasePrediction( #if defined(UNIIME)
LPIMEL lpImeL, #endif
HWND hUIWnd) { HIMC hIMC; LPINPUTCONTEXT lpIMC;
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC); if (!hIMC) { return; }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return; }
if (lpImeL->fdwModeConfig & MODE_CONFIG_PREDICT) { if (!(lpIMC->fdwSentence & IME_SMODE_PHRASEPREDICT)) { DWORD fdwSentence;
fdwSentence = lpIMC->fdwSentence; *(LPWORD)&fdwSentence |= IME_SMODE_PHRASEPREDICT;
ImmSetConversionStatus(hIMC, lpIMC->fdwConversion, fdwSentence); } } else { if (lpIMC->fdwSentence & IME_SMODE_PHRASEPREDICT) { DWORD fdwSentence;
fdwSentence = lpIMC->fdwSentence; *(LPWORD)&fdwSentence &= ~(IME_SMODE_PHRASEPREDICT);
ImmSetConversionStatus(hIMC, lpIMC->fdwConversion, fdwSentence); } }
ImmUnlockIMC(hIMC);
return; }
#if defined(WINAR30)
/**********************************************************************/ /* UpdateQuickKey() */ /**********************************************************************/ void PASCAL UpdateQuickKey( HWND hUIWnd) { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP;
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC); if (!hIMC) { return; }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return; }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (lpImcP) { if (lpImcP->iImeState == CST_INIT) { } else if (lpImcP->iImeState == CST_CHOOSE) { } else if (lpImeL->fdwModeConfig & MODE_CONFIG_QUICK_KEY) { } else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { // turn off quick key candidate
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) & ~(MSG_OPEN_CANDIDATE|MSG_CHANGE_CANDIDATE); GenerateMessage(hIMC, lpIMC, lpImcP); } else if (lpImcP->fdwImeMsg & (MSG_OPEN_CANDIDATE| MSG_CHANGE_CANDIDATE)) { // turn off quick key candidate
lpImcP->fdwImeMsg &= ~(MSG_OPEN_CANDIDATE|MSG_CHANGE_CANDIDATE); } else { }
ImmUnlockIMCC(lpIMC->hPrivate); }
ImmUnlockIMC(hIMC);
return; } #endif
#endif
/**********************************************************************/ /* CMenuDestryed() */ /**********************************************************************/ void PASCAL CMenuDestroyed( // context menu window
// already destroyed
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { // Oh! Oh!
return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { // Oh! Oh!
return; }
lpUIPrivate->hCMenuWnd = NULL;
GlobalUnlock(hUIPrivate); }
/**********************************************************************/ /* ToggleUI() */ /**********************************************************************/ void PASCAL ToggleUI( #if defined(UNIIME)
LPINSTDATAL lpInstL, LPIMEL lpImeL, #endif
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate; DWORD fdwFlag; HIMC hIMC; LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP; HWND hDestroyWnd;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
if (lpUIPrivate->fdwSetContext & ISC_OFF_CARET_UI) { if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { goto ToggleUIOvr; } else { fdwFlag = 0; } } else { if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { fdwFlag = ISC_OFF_CARET_UI; } else { goto ToggleUIOvr; } }
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC); if (!hIMC) { goto ToggleUIOvr; }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { goto ToggleUIOvr; }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { goto CreateUIOvr; }
if (fdwFlag & ISC_OFF_CARET_UI) { lpUIPrivate->fdwSetContext |= (ISC_OFF_CARET_UI); } else { lpUIPrivate->fdwSetContext &= ~(ISC_OFF_CARET_UI); }
hDestroyWnd = NULL;
// we need to dsetroy status first because lpUIPrivate->hStatusWnd
// may be NULL out in OffCreat UI destroy time
if (lpUIPrivate->hStatusWnd) { if (lpUIPrivate->hStatusWnd != hDestroyWnd) { hDestroyWnd = lpUIPrivate->hStatusWnd; DestroyWindow(lpUIPrivate->hStatusWnd); } lpUIPrivate->hStatusWnd = NULL; }
#if !defined(ROMANIME)
// destroy all off caret UI
if (lpUIPrivate->hCompWnd) { if (lpUIPrivate->hCompWnd != hDestroyWnd) { hDestroyWnd = lpUIPrivate->hCompWnd; DestroyWindow(lpUIPrivate->hCompWnd); } lpUIPrivate->hCompWnd = NULL; lpUIPrivate->nShowCompCmd = SW_HIDE; }
if (lpUIPrivate->hCandWnd) { if (lpUIPrivate->hCandWnd != hDestroyWnd) { hDestroyWnd = lpUIPrivate->hCandWnd; DestroyWindow(lpUIPrivate->hCandWnd); } lpUIPrivate->hCandWnd = NULL; lpUIPrivate->nShowCandCmd = SW_HIDE; } #endif
if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { OpenStatus( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); }
#if !defined(ROMANIME)
if (!(lpUIPrivate->fdwSetContext & ISC_SHOWUICOMPOSITIONWINDOW)) { } else if (lpImcP->fdwImeMsg & MSG_ALREADY_START) { StartComp( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } else { }
if (!(lpUIPrivate->fdwSetContext & ISC_SHOWUICANDIDATEWINDOW)) { } else if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) { if (!(fdwFlag & ISC_OFF_CARET_UI)) { #if defined(UNIIME)
UniNotifyIME(lpInstL, lpImeL, hIMC, NI_SETCANDIDATE_PAGESIZE, 0, CANDPERPAGE); #else
NotifyIME(hIMC, NI_SETCANDIDATE_PAGESIZE, 0, CANDPERPAGE); #endif
}
OpenCand( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } else { }
#if !defined(WINAR30)
if (!(lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI)) { } else if (!lpUIPrivate->hSoftKbdWnd) { } else { HWND hInsertWnd;
if (lpUIPrivate->hStatusWnd) { hInsertWnd = lpUIPrivate->hStatusWnd; } else if (lpUIPrivate->hCompWnd) { hInsertWnd = lpUIPrivate->hCompWnd; } else if (lpUIPrivate->hCandWnd) { hInsertWnd = lpUIPrivate->hCandWnd; } else { hInsertWnd = NULL; }
if (hInsertWnd) { // insert soft keyboard in front of other UI
SetWindowPos(hInsertWnd, lpUIPrivate->hSoftKbdWnd, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE); } } #endif
#endif
ImmUnlockIMCC(lpIMC->hPrivate);
CreateUIOvr: ImmUnlockIMC(hIMC);
ToggleUIOvr: GlobalUnlock(hUIPrivate); return; }
/**********************************************************************/ /* NotifyUI() */ /**********************************************************************/ void PASCAL NotifyUI( #if defined(UNIIME)
LPINSTDATAL lpInstL, LPIMEL lpImeL, #endif
HWND hUIWnd, WPARAM wParam, LPARAM lParam) { HWND hStatusWnd;
switch (wParam) { case IMN_OPENSTATUSWINDOW: StatusWndMsg( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, TRUE); break; case IMN_CLOSESTATUSWINDOW: StatusWndMsg( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, FALSE); break; #if !defined(ROMANIME)
case IMN_OPENCANDIDATE: if (lParam & 0x00000001) { OpenCand( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } break; case IMN_CHANGECANDIDATE: if (lParam & 0x00000001) { HWND hCandWnd; RECT rcRect;
hCandWnd = GetCandWnd(hUIWnd); if (!hCandWnd) { return; }
if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { CandPageSize(hUIWnd, TRUE); }
rcRect = lpImeL->rcCandText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
InvalidateRect(hCandWnd, &rcRect, FALSE);
rcRect = lpImeL->rcCandPrompt; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
InvalidateRect(hCandWnd, &rcRect, TRUE);
rcRect = lpImeL->rcCandPageText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
RedrawWindow(hCandWnd, &rcRect, NULL, RDW_INVALIDATE|RDW_ERASE); } break; case IMN_CLOSECANDIDATE: if (lParam & 0x00000001) { CloseCand( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); } break; case IMN_SETSENTENCEMODE: break; #endif
case IMN_SETOPENSTATUS: case IMN_SETCONVERSIONMODE: hStatusWnd = GetStatusWnd(hUIWnd); if (!hStatusWnd) { return; }
{ RECT rcRect;
rcRect = lpImeL->rcStatusText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
RedrawWindow(hStatusWnd, &rcRect, NULL, RDW_INVALIDATE); } break; #if !defined(ROMANIME)
case IMN_SETCOMPOSITIONFONT: // we are not going to change font, but an IME can do this if it want
break; case IMN_SETCOMPOSITIONWINDOW: if (!(lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI)) { HWND hCompWnd;
hCompWnd = GetCompWnd(hUIWnd); if (!hCompWnd) { return; }
PostMessage(hCompWnd, WM_IME_NOTIFY, wParam, lParam); } break; case IMN_SETCANDIDATEPOS: if (!(lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI)) { HWND hCandWnd;
hCandWnd = GetCandWnd(hUIWnd); if (!hCandWnd) { return; }
PostMessage(hCandWnd, WM_IME_NOTIFY, wParam, lParam); } break; #endif
case IMN_SETSTATUSWINDOWPOS: hStatusWnd = GetStatusWnd(hUIWnd); if (hStatusWnd) { PostMessage(hStatusWnd, WM_IME_NOTIFY, wParam, lParam); #if !defined(ROMANIME)
} else if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { if (hStatusWnd = GetCompWnd(hUIWnd)) { } else if (hStatusWnd = GetCandWnd(hUIWnd)) { } else { return; }
PostMessage(hStatusWnd, WM_IME_NOTIFY, wParam, lParam); #endif
} else { } break; case IMN_GUIDELINE: ShowGuideLine( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); break; case IMN_PRIVATE: switch (lParam) { #if !defined(ROMANIME)
case IMN_PRIVATE_COMPOSITION_SIZE: ChangeCompositionSize( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); break; case IMN_PRIVATE_UPDATE_PREDICT: UpdatePhrasePrediction( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); break; case IMN_PRIVATE_PAGEUP: if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { CandPageSize(hUIWnd, FALSE); } break; #if defined(WINAR30)
case IMN_PRIVATE_UPDATE_QUICK_KEY: UpdateQuickKey(hUIWnd); break; #else
case IMN_PRIVATE_UPDATE_SOFTKBD: UpdateSoftKbd( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); break; #endif
#endif
case IMN_PRIVATE_TOGGLE_UI: ToggleUI( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); break; case IMN_PRIVATE_CMENUDESTROYED: CMenuDestroyed(hUIWnd); break; default: break; } break; #if !defined(ROMANIME) && !defined(WINAR30)
case IMN_SOFTKBDDESTROYED: SoftKbdDestroyed(hUIWnd); break; #endif
default: break; }
return; }
/**********************************************************************/ /* UIChange() */ /**********************************************************************/ LRESULT PASCAL UIChange( #if defined(UNIIME)
LPINSTDATAL lpInstL, LPIMEL lpImeL, #endif
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return (0L); }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return (0L); }
if (lpUIPrivate->fdwSetContext & ISC_SHOW_UI_ALL) { if (lpUIPrivate->fdwSetContext & ISC_OFF_CARET_UI) { if (!(lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI)) { ToggleUI( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } } else { if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { ToggleUI( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); } }
ShowUI( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, SW_SHOWNOACTIVATE); } else { ShowUI( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, SW_HIDE); }
GlobalUnlock(hUIPrivate);
return (0L); }
/**********************************************************************/ /* SetContext() */ /**********************************************************************/ void PASCAL SetContext( // the context activated/deactivated
#if defined(UNIIME)
LPINSTDATAL lpInstL, LPIMEL lpImeL, #endif
HWND hUIWnd, BOOL fOn, LPARAM lShowUI) { HGLOBAL hUIPrivate;
register LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
if (fOn) { HIMC hIMC; LPINPUTCONTEXT lpIMC;
#if !defined(ROMANIME)
register DWORD fdwSetContext;
lpUIPrivate->fdwSetContext = lpUIPrivate->fdwSetContext & ~(ISC_SHOWUIALL|ISC_HIDE_SOFTKBD);
lpUIPrivate->fdwSetContext |= (lShowUI & ISC_SHOWUIALL) | ISC_SHOW_SOFTKBD;
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
if (fdwSetContext == ISC_HIDE_COMP_WINDOW) { ShowComp( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); } else if (fdwSetContext & ISC_HIDE_COMP_WINDOW) { lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_COMP_WINDOW); } else { }
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICANDIDATEWINDOW|ISC_HIDE_CAND_WINDOW);
if (fdwSetContext == ISC_HIDE_CAND_WINDOW) { ShowCand( #if defined(UNIIME)
lpImeL, #endif
hUIWnd, SW_HIDE); } else if (fdwSetContext & ISC_HIDE_CAND_WINDOW) { lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_CAND_WINDOW); } else { } #endif
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) { goto SetCxtUnlockUIPriv; }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { goto SetCxtUnlockUIPriv; }
if (lpIMC->cfCandForm[0].dwIndex != 0) { lpIMC->cfCandForm[0].dwStyle = CFS_DEFAULT; }
ImmUnlockIMC(hIMC); } else { lpUIPrivate->fdwSetContext &= ~ISC_SETCONTEXT_UI; }
SetCxtUnlockUIPriv: GlobalUnlock(hUIPrivate);
UIChange( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd);
return; }
#if !defined(ROMANIME)
/**********************************************************************/ /* GetCandPos() */ /**********************************************************************/ LRESULT PASCAL GetCandPos( HWND hUIWnd, LPCANDIDATEFORM lpCandForm) { HWND hCandWnd; RECT rcCandWnd; HIMC hIMC; LPINPUTCONTEXT lpIMC;
if (lpCandForm->dwIndex != 0) { return (1L); }
hCandWnd = GetCandWnd(hUIWnd);
if (!hCandWnd) { return (1L); }
if (!GetWindowRect(hCandWnd, &rcCandWnd)) { return (1L); }
lpCandForm->dwStyle = CFS_CANDIDATEPOS; lpCandForm->ptCurrentPos = *(LPPOINT)&rcCandWnd; lpCandForm->rcArea = rcCandWnd;
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) { return (1L); }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { return (1L); }
ScreenToClient(lpIMC->hWnd, &lpCandForm->ptCurrentPos);
lpCandForm->rcArea.right += lpCandForm->ptCurrentPos.x - lpCandForm->rcArea.left;
lpCandForm->rcArea.bottom += lpCandForm->ptCurrentPos.y - lpCandForm->rcArea.top;
*(LPPOINT)&lpCandForm->rcArea = lpCandForm->ptCurrentPos;
ImmUnlockIMC(hIMC);
return (0L); }
/**********************************************************************/ /* GetCompWindow() */ /**********************************************************************/ LRESULT PASCAL GetCompWindow( HWND hUIWnd, LPCOMPOSITIONFORM lpCompForm) { HWND hCompWnd; RECT rcCompWnd; HIMC hIMC; LPINPUTCONTEXT lpIMC;
hCompWnd = GetCompWnd(hUIWnd);
if (!hCompWnd) { return (1L); }
if (!GetWindowRect(hCompWnd, &rcCompWnd)) { return (1L); }
lpCompForm->dwStyle = CFS_RECT; lpCompForm->ptCurrentPos = *(LPPOINT)&rcCompWnd; lpCompForm->rcArea = rcCompWnd;
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) { return (1L); }
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) { return (1L); }
ScreenToClient(lpIMC->hWnd, &lpCompForm->ptCurrentPos);
lpCompForm->rcArea.right += lpCompForm->ptCurrentPos.x - lpCompForm->rcArea.left;
lpCompForm->rcArea.bottom += lpCompForm->ptCurrentPos.y - lpCompForm->rcArea.top;
*(LPPOINT)&lpCompForm->rcArea = lpCompForm->ptCurrentPos;
ImmUnlockIMC(hIMC);
return (0L); } #endif
#if 0 // try to use SetContext
/**********************************************************************/ /* SelectIME() */ /**********************************************************************/ void PASCAL SelectIME( // switch IMEs
HWND hUIWnd, BOOL fSelect) { #if !defined(ROMANIME)
if (!fSelect) { ShowUI(hUIWnd, SW_HIDE); } else { ShowUI(hUIWnd, SW_SHOWNOACTIVATE); } #endif
return; } #endif
/**********************************************************************/ /* UIWndProc() / UniUIWndProc() */ /**********************************************************************/ #if defined(UNIIME)
LRESULT WINAPI UniUIWndProc( LPINSTDATAL lpInstL, LPIMEL lpImeL, #else
LRESULT CALLBACK UIWndProc( #endif
HWND hUIWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CREATE: CreateUIWindow( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); break; case WM_DESTROY: DestroyUIWindow(hUIWnd); break; #if !defined(ROMANIME)
case WM_IME_STARTCOMPOSITION: // you can create a window as the composition window here
StartComp( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); break; case WM_IME_COMPOSITION: if (lpImeL->fdwModeConfig & MODE_CONFIG_OFF_CARET_UI) { } else if (lParam & GCS_RESULTSTR) { MoveDefaultCompPosition( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); } else { }
{ HWND hCompWnd;
hCompWnd = GetCompWnd(hUIWnd);
if (hCompWnd) { RECT rcRect;
rcRect = lpImeL->rcCompText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
RedrawWindow(hCompWnd, &rcRect, NULL, RDW_INVALIDATE); } } break; case WM_IME_ENDCOMPOSITION: // you can destroy the composition window here
EndComp( #if defined(UNIIME)
lpImeL, #endif
hUIWnd); break; #else
//We shouldn't pass messages below. For FullShape IME.
case WM_IME_STARTCOMPOSITION: case WM_IME_COMPOSITION: case WM_IME_ENDCOMPOSITION: return (0L); #endif
case WM_IME_NOTIFY: NotifyUI( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, wParam, lParam); break; case WM_IME_SETCONTEXT: SetContext( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, (BOOL)wParam, lParam); /*
// When dialog box is opened, IME is disappeded. Change IME Z-order again. bklee
if (wParam && GetWindowLongPtr(hUIWnd, IMMGWLP_IMC)) SetWindowPos(hUIWnd, NULL, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOACTIVATE|SWP_NOMOVE); */ break; case WM_IME_CONTROL: switch (wParam) { #if !defined(ROMANIME)
case IMC_GETCANDIDATEPOS: return GetCandPos(hUIWnd, (LPCANDIDATEFORM)lParam); case IMC_GETCOMPOSITIONWINDOW: return GetCompWindow(hUIWnd, (LPCOMPOSITIONFORM)lParam); #endif
case IMC_GETSOFTKBDPOS: case IMC_SETSOFTKBDPOS: #if !defined(ROMANIME) && !defined(WINAR30)
{ HWND hSoftKbdWnd;
hSoftKbdWnd = GetSoftKbdWnd(hUIWnd); if (!hSoftKbdWnd) { return (0L); // fail, return (0, 0)?
}
return SendMessage(hSoftKbdWnd, WM_IME_CONTROL, wParam, lParam); } #endif
return (0L); case IMC_GETSTATUSWINDOWPOS: #if !defined(ROMANIME)
{ HWND hStatusWnd; RECT rcStatusWnd; LPARAM lParam;
hStatusWnd = GetStatusWnd(hUIWnd); if (!hStatusWnd) { return (0L); // fail, return (0, 0)?
}
if (!GetWindowRect(hStatusWnd, &rcStatusWnd)) { return (0L); // fail, return (0, 0)?
}
lParam = MAKELRESULT(rcStatusWnd.left, rcStatusWnd.top);
return (lParam); } #endif
return (0L); default: return (1L); } break; case WM_IME_COMPOSITIONFULL: return (0L); case WM_IME_SELECT: // try to use SetContext
// SelectIME(hUIWnd, (BOOL)wParam);
SetContext( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd, (BOOL)wParam, 0); return (0L); case WM_MOUSEACTIVATE: return (MA_NOACTIVATE); case WM_USER_UICHANGE: return UIChange( #if defined(UNIIME)
lpInstL, lpImeL, #endif
hUIWnd); default: return DefWindowProc(hUIWnd, uMsg, wParam, lParam); } return (0L); }
|