|
|
/*++
Copyright (c) 1990-1999 Microsoft Corporation, All Rights Reserved
Module Name:
ui.c
++*/
#include <windows.h>
#include <immdev.h>
#include <imedefs.h>
#include <regstr.h>
/**********************************************************************/ /* CMenuDestryed() */ /**********************************************************************/ void PASCAL CMenuDestroyed( // context menu window
// already destroyed
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
lpUIPrivate->hCMenuWnd = NULL;
GlobalUnlock(hUIPrivate); } /**********************************************************************/ /* SoftkeyMenuDestroyed() */ /**********************************************************************/ void PASCAL SoftkeyMenuDestroyed( // context menu window
// already destroyed
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
lpUIPrivate->hSoftkeyMenuWnd = NULL;
GlobalUnlock(hUIPrivate); }
/**********************************************************************/ /* CreateUIWindow() */ /**********************************************************************/ void PASCAL CreateUIWindow( // create composition window
HWND hUIWnd) { HGLOBAL hUIPrivate;
// create storage for UI setting
hUIPrivate = GlobalAlloc(GHND, sizeof(UIPRIV)); if (!hUIPrivate) { 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);
return; }
/**********************************************************************/ /* DestroyUIWindow() */ /**********************************************************************/ void PASCAL DestroyUIWindow( // destroy composition window
HWND hUIWnd) { HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
//destroy ContextMenuWnd
if (lpUIPrivate->hCMenuWnd) { SetWindowLongPtr(lpUIPrivate->hCMenuWnd, CMENU_HUIWND,(LONG_PTR)0); PostMessage(lpUIPrivate->hCMenuWnd, WM_USER_DESTROY, 0, 0); } //destroy SoftkeyMenuWnd
if (lpUIPrivate->hSoftkeyMenuWnd) { SetWindowLongPtr(lpUIPrivate->hSoftkeyMenuWnd, SOFTKEYMENU_HUIWND,(LONG_PTR)0); PostMessage(lpUIPrivate->hSoftkeyMenuWnd, WM_USER_DESTROY, 0, 0); }
// composition window need to be destroyed
if (lpUIPrivate->hCompWnd) { DestroyWindow(lpUIPrivate->hCompWnd); }
// candidate window need to be destroyed
if (lpUIPrivate->hCandWnd) { DestroyWindow(lpUIPrivate->hCandWnd); }
// status window need to be destroyed
if (lpUIPrivate->hStatusWnd) { DestroyWindow(lpUIPrivate->hStatusWnd); }
// soft keyboard window need to be destroyed
if (lpUIPrivate->hSoftKbdWnd) { ImmDestroySoftKeyboard(lpUIPrivate->hSoftKbdWnd); }
GlobalUnlock(hUIPrivate);
// free storage for UI settings
GlobalFree(hUIPrivate);
return; }
/**********************************************************************/ /* ShowSoftKbd */ /**********************************************************************/ void PASCAL ShowSoftKbd( // Show the soft keyboard window
HWND hUIWnd, int nShowSoftKbdCmd, LPPRIVCONTEXT lpImcP) { 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; }
CheckMenuItem(lpImeL->hSKMenu, IDM_SKL1, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL2, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL3, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL4, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL5, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL6, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL7, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL8, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL9, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL10, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL11, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL12, MF_UNCHECKED); CheckMenuItem(lpImeL->hSKMenu, IDM_SKL13, MF_UNCHECKED);
if (!lpUIPrivate->hSoftKbdWnd) { // not in show status window mode
} else if (lpUIPrivate->nShowSoftKbdCmd != nShowSoftKbdCmd) { ImmShowSoftKeyboard(lpUIPrivate->hSoftKbdWnd, nShowSoftKbdCmd); lpUIPrivate->nShowSoftKbdCmd = nShowSoftKbdCmd; }
GlobalUnlock(hUIPrivate); return; }
/**********************************************************************/ /* CheckSoftKbdPosition() */ /**********************************************************************/ void PASCAL CheckSoftKbdPosition( LPUIPRIV lpUIPrivate, LPINPUTCONTEXT lpIMC) {
#ifndef MUL_MONITOR
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 //MUL_MONITOR
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( HWND hSoftKbdWnd, LPINPUTCONTEXT lpIMC) { int i; LPSOFTKBDDATA lpSoftKbdData; LPPRIVCONTEXT lpImcP;
HGLOBAL hsSoftKbdData;
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { return; } hsSoftKbdData = GlobalAlloc(GHND, sizeof(SOFTKBDDATA) * 2); if (!hsSoftKbdData) { ImmUnlockIMCC(lpIMC->hPrivate); return; }
lpSoftKbdData = (LPSOFTKBDDATA)GlobalLock(hsSoftKbdData); if (!lpSoftKbdData) { // can not draw soft keyboard window
ImmUnlockIMCC(lpIMC->hPrivate); return; }
lpSoftKbdData->uCount = 2;
for (i = 0; i < 48; i++) { BYTE bVirtKey;
bVirtKey = VirtKey48Map[i];
if (!bVirtKey) { continue; }
{ WORD CHIByte, CLOByte;
#ifdef UNICODE
lpSoftKbdData->wCode[0][bVirtKey] = SKLayout[lpImeL->dwSKWant][i]; lpSoftKbdData->wCode[1][bVirtKey] = SKLayoutS[lpImeL->dwSKWant][i]; #else
CHIByte = SKLayout[lpImeL->dwSKWant][i*2] & 0x00ff; CLOByte = SKLayout[lpImeL->dwSKWant][i*2 + 1] & 0x00ff; lpSoftKbdData->wCode[0][bVirtKey] = (CHIByte << 8) | CLOByte; CHIByte = SKLayoutS[lpImeL->dwSKWant][i*2] & 0x00ff; CLOByte = SKLayoutS[lpImeL->dwSKWant][i*2 + 1] & 0x00ff; lpSoftKbdData->wCode[1][bVirtKey] = (CHIByte << 8) | CLOByte; #endif
} }
SendMessage(hSoftKbdWnd, WM_IME_CONTROL, IMC_SETSOFTKBDDATA, (LPARAM)lpSoftKbdData);
GlobalUnlock(hsSoftKbdData);
// free storage for UI settings
GlobalFree(hsSoftKbdData); ImmUnlockIMCC(lpIMC->hPrivate); return; }
/**********************************************************************/ /* UpdateSoftKbd() */ /**********************************************************************/ void PASCAL UpdateSoftKbd( HWND hUIWnd) { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP; 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; }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { GlobalUnlock(hUIPrivate); 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, NULL); } } else { if (!lpUIPrivate->hSoftKbdWnd) { // create soft keyboard
lpUIPrivate->hSoftKbdWnd = ImmCreateSoftKeyboard(SOFTKEYBOARD_TYPE_C1, hUIWnd, 0, 0); }
if (!(lpIMC->fdwInit & INIT_SOFTKBDPOS)) { CheckSoftKbdPosition(lpUIPrivate, lpIMC); }
SetSoftKbdData(lpUIPrivate->hSoftKbdWnd, lpIMC);
lpUIPrivate->fdwSetContext |= ISC_SHOW_SOFTKBD;
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, lpImcP); } } }
ImmUnlockIMCC(lpIMC->hPrivate); 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) { return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return; }
lpUIPrivate->hSoftKbdWnd = NULL;
GlobalUnlock(hUIPrivate); }
/**********************************************************************/ /* StatusWndMsg() */ /**********************************************************************/ void PASCAL StatusWndMsg( // set the show hide state and
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 (!hIMC) { GlobalUnlock(hUIPrivate); return; }
if (fOn) { lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW;
if (!lpUIPrivate->hStatusWnd) { OpenStatus( hUIWnd); } } else { lpUIPrivate->fdwSetContext &= ~(ISC_OPEN_STATUS_WINDOW); }
hStatusWnd = lpUIPrivate->hStatusWnd;
GlobalUnlock(hUIPrivate);
if (!hStatusWnd) { return; }
if (!fOn) { register DWORD fdwSetContext;
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
if (fdwSetContext == ISC_HIDE_COMP_WINDOW) { ShowComp( hUIWnd, SW_HIDE); }
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICANDIDATEWINDOW|ISC_HIDE_CAND_WINDOW);
if (fdwSetContext == ISC_HIDE_CAND_WINDOW) { ShowCand( hUIWnd, SW_HIDE); }
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOW_SOFTKBD|ISC_HIDE_SOFTKBD);
if (fdwSetContext == ISC_HIDE_SOFTKBD) { lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_SOFTKBD); ShowSoftKbd(hUIWnd, SW_HIDE, NULL); }
ShowStatus( hUIWnd, SW_HIDE); } else if (hIMC) { ShowStatus( hUIWnd, SW_SHOWNOACTIVATE); } else { ShowStatus( hUIWnd, SW_HIDE); }
return; }
/**********************************************************************/ /* ShowUI() */ /**********************************************************************/ void PASCAL ShowUI( // show the sub windows
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(hUIWnd, nShowCmd); ShowComp(hUIWnd, nShowCmd); ShowCand(hUIWnd, nShowCmd); ShowSoftKbd(hUIWnd, nShowCmd, NULL); 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; }
lpUIPrivate->fdwSetContext |= ISC_SHOWUICOMPOSITIONWINDOW;
if ((lpUIPrivate->fdwSetContext & ISC_SHOWUICOMPOSITIONWINDOW) && (lpImcP->fdwImeMsg & MSG_ALREADY_START)) { if (lpUIPrivate->hCompWnd) {
if (lpUIPrivate->nShowCompCmd != SW_HIDE) { // some time the WM_NCPAINT is eaten by the app
RedrawWindow(lpUIPrivate->hCompWnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE|RDW_ERASE); }
if (sImeG.IC_Trace) { // modify 95.7.17
SendMessage(lpUIPrivate->hCompWnd, WM_IME_NOTIFY, IMN_SETCOMPOSITIONWINDOW, 0); }
if (lpUIPrivate->nShowCompCmd == SW_HIDE) { ShowComp(hUIWnd, nShowCmd); } } else { StartComp(hUIWnd); } } else if (lpUIPrivate->nShowCompCmd == SW_HIDE) { } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { lpUIPrivate->fdwSetContext |= ISC_HIDE_COMP_WINDOW; } else { ShowComp(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_NCPAINT is eaten by the app
RedrawWindow(lpUIPrivate->hCandWnd, NULL, NULL, RDW_FRAME|RDW_INVALIDATE|RDW_ERASE); }
if (sImeG.IC_Trace) { SendMessage(lpUIPrivate->hCandWnd, WM_IME_NOTIFY, IMN_SETCANDIDATEPOS, 0x0001); }
if (lpUIPrivate->nShowCandCmd == SW_HIDE) { ShowCand(hUIWnd, nShowCmd); } } else { OpenCand(hUIWnd); } } else if (lpUIPrivate->nShowCandCmd == SW_HIDE) { } else if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { lpUIPrivate->fdwSetContext |= ISC_HIDE_CAND_WINDOW; } else { ShowCand(hUIWnd, SW_HIDE); }
if (lpUIPrivate->fdwSetContext & ISC_OPEN_STATUS_WINDOW) { if (!lpUIPrivate->hStatusWnd) { OpenStatus(hUIWnd); } if (lpUIPrivate->nShowStatusCmd != SW_HIDE) { // some time the WM_NCPAINT 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(hUIWnd, nShowCmd); } else{ ShowStatus(hUIWnd, nShowCmd); } } else if (lpUIPrivate->hStatusWnd) { DestroyWindow(lpUIPrivate->hStatusWnd); }
if (!lpIMC->fOpen) { if (lpUIPrivate->nShowCompCmd != SW_HIDE) { ShowSoftKbd(hUIWnd, SW_HIDE, NULL); } } else if ((lpUIPrivate->fdwSetContext & ISC_SHOW_SOFTKBD) && (lpIMC->fdwConversion & IME_CMODE_SOFTKBD)) { if (!lpUIPrivate->hSoftKbdWnd) { UpdateSoftKbd(hUIWnd); } else if (lpUIPrivate->nShowSoftKbdCmd == SW_HIDE) { ShowSoftKbd(hUIWnd, nShowCmd, lpImcP); } else if (lpUIPrivate->hIMC != hIMC) { UpdateSoftKbd(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) { lpUIPrivate->fdwSetContext |= ISC_HIDE_SOFTKBD; } else { ShowSoftKbd(hUIWnd, SW_HIDE, NULL); }
// we switch to this hIMC
lpUIPrivate->hIMC = hIMC;
GlobalUnlock(hUIPrivate);
ShowUIUnlockIMCC: ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(hIMC);
return; }
/**********************************************************************/ /* ShowGuideLine */ /**********************************************************************/ void PASCAL ShowGuideLine( HWND hUIWnd) { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPGUIDELINE lpGuideLine;
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); } else { }
ImmUnlockIMCC(lpIMC->hGuideLine); ImmUnlockIMC(hIMC);
return; }
/**********************************************************************/ /* UpdateStatusWindow() */ /* Return Value: */ /* none */ /**********************************************************************/ BOOL UpdateStatusWindow( HWND hUIWnd) { HWND hStatusWnd;
if (!(hStatusWnd = GetStatusWnd(hUIWnd))) { return (FALSE); }
InvalidateRect(hStatusWnd, &(sImeG.rcStatusText), TRUE); UpdateWindow(hStatusWnd);
return (TRUE); }
/**********************************************************************/ /* NotifyUI() */ /**********************************************************************/ void PASCAL NotifyUI( HWND hUIWnd, WPARAM wParam, LPARAM lParam) { HWND hStatusWnd;
switch (wParam) { case IMN_OPENSTATUSWINDOW: //PostStatus(hUIWnd, TRUE);
StatusWndMsg(hUIWnd, TRUE); break; case IMN_CLOSESTATUSWINDOW: //PostStatus(hUIWnd, FALSE);
StatusWndMsg(hUIWnd, FALSE); break; case IMN_OPENCANDIDATE: if (lParam & 0x00000001) { OpenCand(hUIWnd); } break; case IMN_CHANGECANDIDATE: if (lParam & 0x00000001) { HDC hDC; HWND hCandWnd;
hCandWnd = GetCandWnd(hUIWnd); if (!hCandWnd) { return; }
hDC = GetDC(hCandWnd); PaintCandWindow(hCandWnd, hDC); ReleaseDC(hCandWnd, hDC); } break; case IMN_CLOSECANDIDATE: if (lParam & 0x00000001) { CloseCand(hUIWnd); } break; case IMN_SETSENTENCEMODE: break; case IMN_SETOPENSTATUS: case IMN_SETCONVERSIONMODE: hStatusWnd = GetStatusWnd(hUIWnd); if (!hStatusWnd) { return; }
{ RECT rcRect;
rcRect = sImeG.rcStatusText; // off by 1
rcRect.right += 1; rcRect.bottom += 1;
RedrawWindow(hStatusWnd, &rcRect, NULL, RDW_INVALIDATE); } break; case IMN_SETCOMPOSITIONFONT: // we are not going to change font, but an IME can do this if it want
break; case IMN_SETCOMPOSITIONWINDOW: { HWND hCompWnd;
hCompWnd = GetCompWnd(hUIWnd); if (!hCompWnd) { return; }
PostMessage(hCompWnd, WM_IME_NOTIFY, wParam, lParam); } break; case IMN_SETCANDIDATEPOS: { HWND hCandWnd;
hCandWnd = GetCandWnd(hUIWnd); if (!hCandWnd) { return; }
PostMessage(hCandWnd, WM_IME_NOTIFY, wParam, lParam); } break; case IMN_SETSTATUSWINDOWPOS: hStatusWnd = GetStatusWnd(hUIWnd); if (hStatusWnd) { PostMessage(hStatusWnd, WM_IME_NOTIFY, wParam, lParam); } else { } break; case IMN_GUIDELINE: ShowGuideLine(hUIWnd);
break; case IMN_PRIVATE: switch (lParam) { case IMN_PRIVATE_UPDATE_SOFTKBD: UpdateSoftKbd(hUIWnd); break; case IMN_PRIVATE_UPDATE_STATUS: UpdateStatusWindow(hUIWnd); break; case IMN_PRIVATE_DESTROYCANDWIN: SendMessage(GetCandWnd(hUIWnd), WM_DESTROY, (WPARAM)0, (LPARAM)0); break; case IMN_PRIVATE_CMENUDESTROYED: CMenuDestroyed(hUIWnd); break; case IMN_PRIVATE_SOFTKEYMENUDESTROYED: SoftkeyMenuDestroyed(hUIWnd); break; } break; case IMN_SOFTKBDDESTROYED: SoftKbdDestroyed(hUIWnd); break; default: break; }
return; }
/**********************************************************************/ /* SetContext() */ /**********************************************************************/ void PASCAL SetContext( // the context activated/deactivated
HWND hUIWnd, BOOL fOn, LPARAM lShowUI) { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP; HGLOBAL hUIPrivate; register LPUIPRIV lpUIPrivate; #if defined(COMBO_IME)
DWORD dwRegImeIndex; #endif
RECT rcWorkArea;
#ifdef MUL_MONITOR
rcWorkArea = ImeMonitorWorkAreaFromWindow(hUIWnd); #else
rcWorkArea = sImeG.rcWorkArea; #endif
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC);
if (!hIMC) { return ; }
// get lpIMC
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return; }
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { ImmUnlockIMC(hIMC); return; }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { ImmUnlockIMC(hIMC); return; }
if (fOn) { register DWORD fdwSetContext;
lpUIPrivate->fdwSetContext = lpUIPrivate->fdwSetContext & ~(ISC_SHOWUIALL|ISC_HIDE_SOFTKBD);
lpUIPrivate->fdwSetContext |= (lShowUI & ISC_SHOWUIALL) | ISC_SHOW_SOFTKBD;
{ HKEY hKey; DWORD bcData; char buf[256]; bcData=256; if(RegOpenKeyEx (HKEY_CURRENT_USER, TEXT("Control Panel\\Input Method"), 0, KEY_ENUMERATE_SUB_KEYS | KEY_EXECUTE | KEY_QUERY_VALUE, &hKey)){ goto SetShowStatus; } if(RegQueryValueEx (hKey, TEXT("show status"), NULL, NULL, //null-terminate string
(LPBYTE)buf, //&bData,
&bcData) != ERROR_SUCCESS){ // Set default as ON if no entry in registry
lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW; goto SetShowStatus; } if(strcmp(buf, "1")==0) lpUIPrivate->fdwSetContext |= ISC_OPEN_STATUS_WINDOW; else lpUIPrivate->fdwSetContext &= ~ISC_OPEN_STATUS_WINDOW; SetShowStatus: RegCloseKey(hKey); }
fdwSetContext = lpUIPrivate->fdwSetContext & (ISC_SHOWUICOMPOSITIONWINDOW|ISC_HIDE_COMP_WINDOW);
if (fdwSetContext == ISC_HIDE_COMP_WINDOW) { ShowComp( 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( hUIWnd, SW_HIDE); } else if (fdwSetContext & ISC_HIDE_CAND_WINDOW) { lpUIPrivate->fdwSetContext &= ~(ISC_HIDE_CAND_WINDOW); } else { }
if (lpIMC->cfCandForm[0].dwIndex != 0) { lpIMC->cfCandForm[0].dwStyle = CFS_DEFAULT; }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { GlobalUnlock(hUIPrivate); ImmUnlockIMC(hIMC); return; }
// init ime properties & reset context
{ HKEY hKeyCurrVersion; HKEY hKeyGB; DWORD ValueType; DWORD ValueSize; LONG retCode;
retCode = OpenReg_PathSetup(&hKeyCurrVersion); if (retCode) { TCHAR Buf[MAX_PATH]; wsprintf (Buf, TEXT("Error: RegOpenKeyEx = %d"), retCode); MessageBox (lpIMC->hWnd, Buf, szWarnTitle, MB_OK | MB_ICONINFORMATION); return; }
#if defined(COMBO_IME)
retCode = OpenReg_User (hKeyCurrVersion, szImeRegName, &hKeyGB); #else
retCode = OpenReg_User (hKeyCurrVersion, szImeName, &hKeyGB); #endif //COMBO_IME
// query �������� value
ValueSize = sizeof(DWORD); RegQueryValueEx (hKeyGB,szTrace , (DWORD)0, (LPDWORD)&ValueType, (LPBYTE)&sImeG.IC_Trace, (LPDWORD)&ValueSize); #ifdef CROSSREF
if(RegQueryValueEx (hKeyGB, szRegRevKL, NULL, NULL, //null-terminate string
(LPBYTE)&sImeG.hRevKL, //&bData,
&ValueSize) != ERROR_SUCCESS) sImeG.hRevKL = NULL; if(RegQueryValueEx (hKeyGB, szRegRevMaxKey, NULL, NULL, //null-terminate string
(LPBYTE)&sImeG.nRevMaxKey, //&bData,
&ValueSize) != ERROR_SUCCESS) sImeG.hRevKL = NULL; #endif
#if defined(COMBO_IME)
// query �������� value
ValueSize = sizeof(DWORD); RegQueryValueEx (hKeyGB, szRegImeIndex, (DWORD)0, (LPDWORD)&ValueType, (LPBYTE)&dwRegImeIndex, (LPDWORD)&ValueSize); #endif
RegCloseKey(hKeyGB); RegCloseKey(hKeyCurrVersion);
}
#if defined(COMBO_IME)
if(sImeL.dwRegImeIndex != dwRegImeIndex) { DWORD dwConvMode; int cxBorder, cyBorder;
//change current IME index
dwConvMode = lpIMC->fdwConversion ^ (IME_CMODE_INDEX_FIRST << sImeL.dwRegImeIndex); sImeL.dwRegImeIndex = dwRegImeIndex; szImeName = pszImeName[dwRegImeIndex]; dwConvMode |= (IME_CMODE_INDEX_FIRST << dwRegImeIndex); // re-caculate statusuidata
cxBorder = GetSystemMetrics(SM_CXBORDER); cyBorder = GetSystemMetrics(SM_CYBORDER); InitStatusUIData(cxBorder, cyBorder);
ImmSetConversionStatus(hIMC, dwConvMode, lpIMC->fdwSentence); } #endif //COMBO_IME
if(sImeG.IC_Trace != SaTC_Trace) { int UI_MODE;
lpImcP->iImeState = CST_INIT; CompCancel(hIMC, lpIMC); // init fields of hPrivate
lpImcP->fdwImeMsg = (DWORD)0; lpImcP->dwCompChar = (DWORD)0; lpImcP->fdwGcsFlag = (DWORD)0; lpImcP->uSYHFlg = 0x00000000; lpImcP->uDYHFlg = 0x00000000;
// change compwnd size
// init fields of hIMC
lpIMC->fOpen = TRUE;
SendMessage(GetCandWnd(hUIWnd), WM_DESTROY, (WPARAM)0, (LPARAM)0); // set cand window data
if(sImeG.IC_Trace) { UI_MODE = BOX_UI; } else { POINT ptSTFixPos; UI_MODE = LIN_UI; ptSTFixPos.x = 0; ptSTFixPos.y = rcWorkArea.bottom - sImeG.yStatusHi; ImmSetStatusWindowPos(hIMC, (LPPOINT)&ptSTFixPos); } InitCandUIData( GetSystemMetrics(SM_CXBORDER), GetSystemMetrics(SM_CYBORDER), UI_MODE); } SaTC_Trace = sImeG.IC_Trace;
// init Caps
{ BYTE lpbKeyState[256]; DWORD fdwConversion;
if (!GetKeyboardState(lpbKeyState)) lpbKeyState[VK_CAPITAL] = 0; if (lpbKeyState[VK_CAPITAL] & 0x01) { // 10.11 add
uCaps = 1; // change to alphanumeric mode
fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE | IME_CMODE_NATIVE | IME_CMODE_EUDC); } else { // change to native mode
if(uCaps == 1) { fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) & ~(IME_CMODE_CHARCODE | IME_CMODE_EUDC); } else { fdwConversion = lpIMC->fdwConversion; } uCaps = 0; } ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence); }
if ((lpIMC->cfCompForm.dwStyle & CFS_FORCE_POSITION) && (sImeG.IC_Trace)) { POINT ptNew; // new position of UI
POINT ptSTWPos;
ImmGetStatusWindowPos(hIMC, (LPPOINT)&ptSTWPos);
ptNew.x = ptSTWPos.x + sImeG.xStatusWi + UI_MARGIN; if((ptSTWPos.x + sImeG.xStatusWi + sImeG.xCandWi + lpImeL->xCompWi + 2 * UI_MARGIN) >= rcWorkArea.right) { ptNew.x = ptSTWPos.x - lpImeL->xCompWi - UI_MARGIN; } ptNew.x += lpImeL->cxCompBorder; ptNew.y = ptSTWPos.y + lpImeL->cyCompBorder; lpIMC->cfCompForm.ptCurrentPos = ptNew;
ScreenToClient(lpIMC->hWnd, &lpIMC->cfCompForm.ptCurrentPos); lpIMC->cfCompForm.dwStyle = CFS_DEFAULT; } } else { lpUIPrivate->fdwSetContext &= ~ISC_SETCONTEXT_UI; }
GlobalUnlock(hUIPrivate);
UIPaint(hUIWnd);
ImmUnlockIMC(hIMC); return; }
/**********************************************************************/ /* GetCompWindow() */ /**********************************************************************/ LRESULT PASCAL GetCompWindow( HWND hUIWnd, LPCOMPOSITIONFORM lpCompForm) { HWND hCompWnd; RECT rcCompWnd;
hCompWnd = GetCompWnd(hUIWnd);
if (!hCompWnd) { return (1L); }
if (!GetWindowRect(hCompWnd, &rcCompWnd)) { return (1L); }
lpCompForm->dwStyle = CFS_POINT|CFS_RECT; lpCompForm->ptCurrentPos = *(LPPOINT)&rcCompWnd; lpCompForm->rcArea = rcCompWnd;
return (0L); }
/**********************************************************************/ /* SelectIME() */ /**********************************************************************/ void PASCAL SelectIME( // switch IMEs
HWND hUIWnd, BOOL fSelect) { if (!fSelect) { ShowUI(hUIWnd, SW_HIDE); } else {
ShowUI(hUIWnd, SW_SHOWNOACTIVATE); }
return; }
/**********************************************************************/ /* UIPaint() */ /**********************************************************************/ LRESULT PASCAL UIPaint( HWND hUIWnd) { PAINTSTRUCT ps; MSG sMsg; HGLOBAL hUIPrivate; LPUIPRIV lpUIPrivate;
// for safety
BeginPaint(hUIWnd, &ps); EndPaint(hUIWnd, &ps);
// some application will not remove the WM_PAINT messages
PeekMessage(&sMsg, hUIWnd, WM_PAINT, WM_PAINT, PM_REMOVE|PM_NOYIELD);
hUIPrivate = (HGLOBAL)GetWindowLongPtr(hUIWnd, IMMGWLP_PRIVATE); if (!hUIPrivate) { return (0L); }
lpUIPrivate = (LPUIPRIV)GlobalLock(hUIPrivate); if (!lpUIPrivate) { return (0L); }
if (lpUIPrivate->fdwSetContext & ISC_SETCONTEXT_UI) { ShowUI(hUIWnd, SW_SHOWNOACTIVATE); } else { ShowUI(hUIWnd, SW_HIDE); }
GlobalUnlock(hUIPrivate);
return (0L); }
/**********************************************************************/ /* UIWndProc() */ /**********************************************************************/ LRESULT CALLBACK UIWndProc( HWND hUIWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {
switch (uMsg) { case WM_CREATE: CreateUIWindow(hUIWnd); break; case WM_DESTROY: DestroyUIWindow(hUIWnd); break; case WM_IME_STARTCOMPOSITION: // you can create a window as the composition window here
StartComp(hUIWnd); break; case WM_IME_COMPOSITION: if (!sImeG.IC_Trace) { } else if (lParam & GCS_RESULTSTR) { MoveDefaultCompPosition(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(hUIWnd); break; case WM_IME_NOTIFY: NotifyUI(hUIWnd, wParam, lParam); break; case WM_IME_SETCONTEXT: SetContext(hUIWnd, (BOOL)wParam, lParam); 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) { case IMC_GETCANDIDATEPOS: return (1L); // not implemented yet
case IMC_GETCOMPOSITIONFONT: return (1L); // not implemented yet
case IMC_GETCOMPOSITIONWINDOW: return GetCompWindow(hUIWnd, (LPCOMPOSITIONFORM)lParam); case IMC_GETSTATUSWINDOWPOS: { HWND hStatusWnd; RECT rcStatusWnd; LPARAM lRetVal;
hStatusWnd = GetStatusWnd(hUIWnd); if (!hStatusWnd) { return (0L); // fail, return (0, 0)?
}
if (!GetWindowRect(hStatusWnd, &rcStatusWnd)) { return (0L); // fail, return (0, 0)?
}
lRetVal = MAKELRESULT(rcStatusWnd.left, rcStatusWnd.top);
return (lRetVal); } return (0L); case IMC_SETSTATUSWINDOWPOS: { HIMC hIMC; LPINPUTCONTEXT lpIMC; LPPRIVCONTEXT lpImcP; //COMPOSITIONFORM CompForm;
POINT ptPos; RECT rcWorkArea;
#ifdef MUL_MONITOR
rcWorkArea = ImeMonitorWorkAreaFromWindow(hUIWnd); #else
rcWorkArea = sImeG.rcWorkArea; #endif
ptPos.x = ((LPPOINTS)&lParam)->x; ptPos.y = ((LPPOINTS)&lParam)->y;
hIMC = (HIMC)GetWindowLongPtr(hUIWnd, IMMGWLP_IMC); if (!hIMC) { return (1L); }
if(!ImmSetStatusWindowPos(hIMC, &ptPos)) { return (1L); }
// set comp window position when TraceCuer
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC); if (!lpIMC) { return (1L); }
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate); if (!lpImcP) { return (1L); }
if(!sImeG.IC_Trace) { lpIMC->cfCompForm.dwStyle = CFS_RECT; lpIMC->cfCompForm.ptCurrentPos.x = ptPos.x + sImeG.xStatusWi + UI_MARGIN; lpIMC->cfCompForm.ptCurrentPos.y = ptPos.y; CopyRect(&lpIMC->cfCompForm.rcArea, &rcWorkArea);
ScreenToClient(lpIMC->hWnd, &lpIMC->cfCompForm.ptCurrentPos); // set composition window to the new poosition
PostMessage(GetCompWnd(hUIWnd), WM_IME_NOTIFY, IMN_SETCOMPOSITIONWINDOW, 0);
}
ImmUnlockIMCC(lpIMC->hPrivate); ImmUnlockIMC(hIMC);
return (0L); } return (1L); default: return (1L); } break; case WM_IME_COMPOSITIONFULL: return (0L); case WM_IME_SELECT: //#if defined(LATER)
SetContext(hUIWnd, (BOOL)wParam, 0); //#else
// SelectIME(hUIWnd, (BOOL)wParam);
//#endif
return (0L); case WM_MOUSEACTIVATE: return (MA_NOACTIVATE); case WM_PAINT: return UIPaint(hUIWnd); default: return DefWindowProc(hUIWnd, uMsg, wParam, lParam); } return (0L); }
void DrawConvexRect(HDC hDC, int x1, int y1, int x2, int y2) { HPEN hPen, hOldPen; SelectObject(hDC, GetStockObject(LTGRAY_BRUSH)); SelectObject(hDC, GetStockObject(WHITE_PEN)); MoveToEx(hDC, x1, y1,NULL); LineTo(hDC, x2, y1); MoveToEx(hDC, x1, y1,NULL); LineTo(hDC, x1, y2); hPen = CreatePen(PS_SOLID, 1, RGB(128, 128, 128));
if ( hPen ) { hOldPen = SelectObject (hDC, hPen); MoveToEx(hDC, x2-1, y2-1,NULL); LineTo(hDC, x2-1, y1); MoveToEx(hDC, x2-1, y2-1,NULL); LineTo(hDC, x1, y2-1); SelectObject(hDC, hOldPen); DeleteObject(hPen); } }
void DrawConvexRectP(HDC hDC, int x1, int y1, int x2, int y2) { HPEN hPen, hOldPen; SelectObject(hDC, GetStockObject(LTGRAY_BRUSH)); SelectObject(hDC, GetStockObject(WHITE_PEN)); MoveToEx(hDC, x1, y1,NULL); LineTo(hDC, x2 - 1, y1); MoveToEx(hDC, x1, y1,NULL); LineTo(hDC, x1, y2 - 1); hPen = CreatePen(PS_SOLID, 1, RGB(0, 0, 0));
if ( hPen ) { hOldPen = SelectObject (hDC, hPen); MoveToEx(hDC, x2-1, y2-1,NULL); LineTo(hDC, x2-1, y1); MoveToEx(hDC, x2-1, y2-1,NULL); LineTo(hDC, x1, y2-1); SelectObject(hDC, hOldPen); DeleteObject(hPen); } }
void DrawConcaveRect(HDC hDC, int x1, int y1, int x2, int y2) { HPEN hLtPen = CreatePen(PS_SOLID, 1, 0x00808080);
if ( hLtPen != NULL ) { HPEN OldPen = SelectObject(hDC, hLtPen); MoveToEx(hDC, x1, y1,NULL); LineTo(hDC, x2, y1); MoveToEx(hDC, x1, y1,NULL); LineTo(hDC, x1, y2); SelectObject(hDC, GetStockObject(WHITE_PEN)); MoveToEx(hDC, x2 , y2,NULL); LineTo(hDC, x2 , y1-1); MoveToEx(hDC, x2 , y2,NULL); LineTo(hDC, x1-1, y2); SelectObject(hDC, OldPen); DeleteObject(hLtPen); } }
|