You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
527 lines
18 KiB
527 lines
18 KiB
/*++
|
|
|
|
Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved
|
|
|
|
Module Name:
|
|
|
|
UISTATE.C
|
|
|
|
++*/
|
|
|
|
/**********************************************************************/
|
|
#include "windows.h"
|
|
#include "immdev.h"
|
|
#include "fakeime.h"
|
|
#include "resource.h"
|
|
|
|
/**********************************************************************/
|
|
/* */
|
|
/* StatusWndProc() */
|
|
/* IME UI window procedure */
|
|
/* */
|
|
/**********************************************************************/
|
|
LRESULT CALLBACK StatusWndProc( hWnd, message, wParam, lParam )
|
|
HWND hWnd;
|
|
UINT message;
|
|
WPARAM wParam;
|
|
LPARAM lParam;
|
|
{
|
|
PAINTSTRUCT ps;
|
|
HWND hUIWnd;
|
|
HDC hDC;
|
|
HBITMAP hbmpStatus;
|
|
|
|
switch (message)
|
|
{
|
|
case WM_UI_UPDATE:
|
|
InvalidateRect(hWnd,NULL,FALSE);
|
|
break;
|
|
|
|
case WM_PAINT:
|
|
hDC = BeginPaint(hWnd,&ps);
|
|
PaintStatus(hWnd,hDC,NULL,0);
|
|
EndPaint(hWnd,&ps);
|
|
break;
|
|
|
|
case WM_MOUSEMOVE:
|
|
case WM_SETCURSOR:
|
|
case WM_LBUTTONUP:
|
|
case WM_RBUTTONUP:
|
|
ButtonStatus(hWnd,message,wParam,lParam);
|
|
if ((message == WM_SETCURSOR) &&
|
|
(HIWORD(lParam) != WM_LBUTTONDOWN) &&
|
|
(HIWORD(lParam) != WM_RBUTTONDOWN))
|
|
return DefWindowProc(hWnd,message,wParam,lParam);
|
|
if ((message == WM_LBUTTONUP) || (message == WM_RBUTTONUP))
|
|
{
|
|
SetWindowLong(hWnd,FIGWL_MOUSE,0L);
|
|
SetWindowLong(hWnd,FIGWL_PUSHSTATUS,0L);
|
|
}
|
|
break;
|
|
|
|
case WM_MOVE:
|
|
hUIWnd = (HWND)GetWindowLongPtr(hWnd,FIGWL_SVRWND);
|
|
if (IsWindow(hUIWnd))
|
|
SendMessage(hUIWnd,WM_UI_STATEMOVE,wParam,lParam);
|
|
break;
|
|
|
|
case WM_CREATE:
|
|
hbmpStatus = LoadBitmap(hInst,TEXT("STATUSBMP"));
|
|
SetWindowLongPtr(hWnd,FIGWL_STATUSBMP,(LONG_PTR)hbmpStatus);
|
|
hbmpStatus = LoadBitmap(hInst,TEXT("CLOSEBMP"));
|
|
SetWindowLongPtr(hWnd,FIGWL_CLOSEBMP,(LONG_PTR)hbmpStatus);
|
|
break;
|
|
|
|
case WM_DESTROY:
|
|
hbmpStatus = (HBITMAP)GetWindowLongPtr(hWnd,FIGWL_STATUSBMP);
|
|
DeleteObject(hbmpStatus);
|
|
hbmpStatus = (HBITMAP)GetWindowLongPtr(hWnd,FIGWL_CLOSEBMP);
|
|
DeleteObject(hbmpStatus);
|
|
break;
|
|
|
|
default:
|
|
if (!MyIsIMEMessage(message))
|
|
return DefWindowProc(hWnd,message,wParam,lParam);
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**********************************************************************/
|
|
/* */
|
|
/* CheckPushedStatus() */
|
|
/* */
|
|
/**********************************************************************/
|
|
DWORD PASCAL CheckPushedStatus( HWND hStatusWnd, LPPOINT lppt)
|
|
{
|
|
POINT pt;
|
|
RECT rc;
|
|
|
|
if (lppt)
|
|
{
|
|
pt = *lppt;
|
|
ScreenToClient(hStatusWnd,&pt);
|
|
GetClientRect(hStatusWnd,&rc);
|
|
if (!PtInRect(&rc,pt))
|
|
return 0;
|
|
|
|
if (pt.y > GetSystemMetrics(SM_CYSMCAPTION))
|
|
{
|
|
if (pt.x < BTX)
|
|
return PUSHED_STATUS_HDR;
|
|
else if (pt.x < (BTX * 2))
|
|
return PUSHED_STATUS_MODE;
|
|
else if (pt.x < (BTX * 3))
|
|
return PUSHED_STATUS_ROMAN;
|
|
}
|
|
else
|
|
{
|
|
rc.left = STCLBT_X;
|
|
rc.top = STCLBT_Y;
|
|
rc.right = STCLBT_X + STCLBT_DX;
|
|
rc.bottom = STCLBT_Y + STCLBT_DY;
|
|
if (PtInRect(&rc,pt))
|
|
return PUSHED_STATUS_CLOSE;
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/**********************************************************************/
|
|
/* */
|
|
/* BTXFromCmode() */
|
|
/* */
|
|
/**********************************************************************/
|
|
int PASCAL BTXFromCmode( DWORD dwCmode)
|
|
{
|
|
if (dwCmode & IME_CMODE_FULLSHAPE)
|
|
{
|
|
if (!(dwCmode & IME_CMODE_LANGUAGE))
|
|
return BTFALPH;
|
|
else if ((dwCmode & IME_CMODE_LANGUAGE) == IME_CMODE_NATIVE)
|
|
return BTFHIRA;
|
|
else
|
|
return BTFKATA;
|
|
}
|
|
else
|
|
{
|
|
if ((dwCmode & IME_CMODE_LANGUAGE) == IME_CMODE_ALPHANUMERIC)
|
|
return BTHALPH;
|
|
else
|
|
return BTHKATA;
|
|
}
|
|
|
|
}
|
|
/**********************************************************************/
|
|
/* */
|
|
/* PaintStatus() */
|
|
/* */
|
|
/**********************************************************************/
|
|
void PASCAL PaintStatus( HWND hStatusWnd , HDC hDC, LPPOINT lppt, DWORD dwPushedStatus)
|
|
{
|
|
HIMC hIMC;
|
|
LPINPUTCONTEXT lpIMC;
|
|
HDC hMemDC;
|
|
HBITMAP hbmpOld;
|
|
int x;
|
|
HWND hSvrWnd;
|
|
|
|
hSvrWnd = (HWND)GetWindowLongPtr(hStatusWnd,FIGWL_SVRWND);
|
|
|
|
if (hIMC = (HIMC)GetWindowLongPtr(hSvrWnd,IMMGWLP_IMC))
|
|
{
|
|
HBITMAP hbmpStatus;
|
|
HBRUSH hOldBrush,hBrush;
|
|
int nCyCap = GetSystemMetrics(SM_CYSMCAPTION);
|
|
RECT rc;
|
|
|
|
lpIMC = ImmLockIMC(hIMC);
|
|
hMemDC = CreateCompatibleDC(hDC);
|
|
|
|
// Paint Caption.
|
|
hBrush = CreateSolidBrush(GetSysColor(COLOR_ACTIVECAPTION));
|
|
hOldBrush = SelectObject(hDC,hBrush);
|
|
rc.top = rc.left = 0;
|
|
rc.right = BTX*3;
|
|
rc.bottom = nCyCap;
|
|
FillRect(hDC,&rc,hBrush);
|
|
SelectObject(hDC,hOldBrush);
|
|
DeleteObject(hBrush);
|
|
|
|
// Paint CloseButton.
|
|
hbmpStatus = (HBITMAP)GetWindowLongPtr(hStatusWnd,FIGWL_CLOSEBMP);
|
|
hbmpOld = SelectObject(hMemDC,hbmpStatus);
|
|
|
|
if (!(dwPushedStatus & PUSHED_STATUS_CLOSE))
|
|
BitBlt(hDC,STCLBT_X,STCLBT_Y,STCLBT_DX,STCLBT_DY,
|
|
hMemDC,0,0,SRCCOPY);
|
|
else
|
|
BitBlt(hDC,STCLBT_X,STCLBT_Y,STCLBT_DX,STCLBT_DY,
|
|
hMemDC,STCLBT_DX,0,SRCCOPY);
|
|
|
|
|
|
hbmpStatus = (HBITMAP)GetWindowLongPtr(hStatusWnd,FIGWL_STATUSBMP);
|
|
SelectObject(hMemDC,hbmpStatus);
|
|
|
|
// Paint HDR.
|
|
x = BTEMPT;
|
|
if (lpIMC->fOpen)
|
|
x = 0;
|
|
|
|
if (!(dwPushedStatus & PUSHED_STATUS_HDR))
|
|
BitBlt(hDC,0,nCyCap,BTX,BTY,hMemDC,x,0,SRCCOPY);
|
|
else
|
|
BitBlt(hDC,0,nCyCap,BTX,BTY,hMemDC,x,BTY,SRCCOPY);
|
|
|
|
// Paint MODE.
|
|
x = BTXFromCmode(lpIMC->fdwConversion);
|
|
|
|
if (!(dwPushedStatus & PUSHED_STATUS_MODE))
|
|
BitBlt(hDC,BTX,nCyCap,BTX,BTY,hMemDC,x,0,SRCCOPY);
|
|
else
|
|
BitBlt(hDC,BTX,nCyCap,BTX,BTY,hMemDC,x,BTY,SRCCOPY);
|
|
|
|
// Paint Roman MODE.
|
|
x = BTEMPT;
|
|
if (lpIMC->fdwConversion & IME_CMODE_ROMAN)
|
|
x = BTROMA;
|
|
|
|
if (!(dwPushedStatus & PUSHED_STATUS_ROMAN))
|
|
BitBlt(hDC,BTX*2,nCyCap,BTX,BTY,hMemDC,x,0,SRCCOPY);
|
|
else
|
|
BitBlt(hDC,BTX*2,nCyCap,BTX,BTY,hMemDC,x,BTY,SRCCOPY);
|
|
|
|
SelectObject(hMemDC,hbmpOld);
|
|
DeleteDC(hMemDC);
|
|
ImmUnlockIMC(hIMC);
|
|
}
|
|
|
|
|
|
}
|
|
|
|
/**********************************************************************/
|
|
/* */
|
|
/* GetUINextMode(hWnd,message,wParam,lParam) */
|
|
/* */
|
|
/**********************************************************************/
|
|
DWORD PASCAL GetUINextMode( DWORD fdwConversion, DWORD dwPushed)
|
|
{
|
|
DWORD dwTemp;
|
|
BOOL fFullShape = ((fdwConversion & IME_CMODE_FULLSHAPE) != 0);
|
|
|
|
//
|
|
// When the mode button is pushed, the convmode will be chage as follow
|
|
// rotation.
|
|
//
|
|
// FULLSHAPE,HIRAGANA ->
|
|
// FULLSHAPE,KATAKANA ->
|
|
// FULLSHAPE,ALPHANUMERIC ->
|
|
// HALFSHAPE,KATAKANA ->
|
|
// HALFSHAPE,ALPHANUMERIC ->
|
|
// FULLSHAPE,HIRAGANA
|
|
//
|
|
if (dwPushed == PUSHED_STATUS_MODE)
|
|
{
|
|
dwTemp = fdwConversion & IME_CMODE_LANGUAGE;
|
|
|
|
if ((fFullShape) && (dwTemp == IME_CMODE_NATIVE))
|
|
return (fdwConversion & ~IME_CMODE_LANGUAGE) | IME_CMODE_KATAKANA | IME_CMODE_NATIVE;
|
|
|
|
if ((fFullShape) && (dwTemp == (IME_CMODE_KATAKANA | IME_CMODE_NATIVE)))
|
|
return (fdwConversion & ~IME_CMODE_LANGUAGE);
|
|
|
|
if ((fFullShape) && (dwTemp == 0))
|
|
{
|
|
fdwConversion &= ~IME_CMODE_FULLSHAPE;
|
|
return (fdwConversion & ~IME_CMODE_LANGUAGE)
|
|
| IME_CMODE_KATAKANA | IME_CMODE_NATIVE;
|
|
}
|
|
|
|
if ((!fFullShape) && (dwTemp == (IME_CMODE_KATAKANA | IME_CMODE_NATIVE)))
|
|
return (fdwConversion & ~IME_CMODE_LANGUAGE);
|
|
|
|
if ((!fFullShape) && (!dwTemp))
|
|
{
|
|
fdwConversion |= IME_CMODE_FULLSHAPE;
|
|
return (fdwConversion & ~IME_CMODE_LANGUAGE) | IME_CMODE_NATIVE;
|
|
}
|
|
}
|
|
if (dwPushed == PUSHED_STATUS_ROMAN)
|
|
{
|
|
if (fdwConversion & IME_CMODE_ROMAN)
|
|
return fdwConversion & ~IME_CMODE_ROMAN;
|
|
else
|
|
return fdwConversion | IME_CMODE_ROMAN;
|
|
}
|
|
return fdwConversion;
|
|
|
|
}
|
|
/**********************************************************************/
|
|
/* */
|
|
/* ButtonStatus(hStatusWnd,message,wParam,lParam) */
|
|
/* */
|
|
/**********************************************************************/
|
|
void PASCAL ButtonStatus( HWND hStatusWnd, UINT message, WPARAM wParam, LPARAM lParam)
|
|
{
|
|
POINT pt;
|
|
HDC hDC;
|
|
DWORD dwMouse;
|
|
DWORD dwPushedStatus;
|
|
DWORD dwTemp;
|
|
DWORD fdwConversion;
|
|
HIMC hIMC;
|
|
HWND hSvrWnd;
|
|
BOOL fOpen;
|
|
HMENU hMenu;
|
|
static POINT ptdif;
|
|
static RECT drc;
|
|
static RECT rc;
|
|
static DWORD dwCurrentPushedStatus;
|
|
|
|
hDC = GetDC(hStatusWnd);
|
|
switch (message)
|
|
{
|
|
case WM_SETCURSOR:
|
|
if ( HIWORD(lParam) == WM_LBUTTONDOWN
|
|
|| HIWORD(lParam) == WM_RBUTTONDOWN )
|
|
{
|
|
GetCursorPos( &pt );
|
|
SetCapture(hStatusWnd);
|
|
GetWindowRect(hStatusWnd,&drc);
|
|
ptdif.x = pt.x - drc.left;
|
|
ptdif.y = pt.y - drc.top;
|
|
rc = drc;
|
|
rc.right -= rc.left;
|
|
rc.bottom -= rc.top;
|
|
SetWindowLong(hStatusWnd,FIGWL_MOUSE,FIM_CAPUTURED);
|
|
SetWindowLong(hStatusWnd, FIGWL_PUSHSTATUS, dwPushedStatus = CheckPushedStatus(hStatusWnd,&pt));
|
|
PaintStatus(hStatusWnd,hDC,&pt, dwPushedStatus);
|
|
dwCurrentPushedStatus = dwPushedStatus;
|
|
}
|
|
break;
|
|
|
|
case WM_MOUSEMOVE:
|
|
dwMouse = GetWindowLong(hStatusWnd,FIGWL_MOUSE);
|
|
if (!(dwPushedStatus = GetWindowLong(hStatusWnd, FIGWL_PUSHSTATUS)))
|
|
{
|
|
if (dwMouse & FIM_MOVED)
|
|
{
|
|
DrawUIBorder(&drc);
|
|
GetCursorPos( &pt );
|
|
drc.left = pt.x - ptdif.x;
|
|
drc.top = pt.y - ptdif.y;
|
|
drc.right = drc.left + rc.right;
|
|
drc.bottom = drc.top + rc.bottom;
|
|
DrawUIBorder(&drc);
|
|
}
|
|
else if (dwMouse & FIM_CAPUTURED)
|
|
{
|
|
DrawUIBorder(&drc);
|
|
SetWindowLong(hStatusWnd,FIGWL_MOUSE,dwMouse | FIM_MOVED);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
GetCursorPos(&pt);
|
|
dwTemp = CheckPushedStatus(hStatusWnd,&pt);
|
|
if ((dwTemp ^ dwCurrentPushedStatus) & dwPushedStatus)
|
|
PaintStatus(hStatusWnd,hDC,&pt, dwPushedStatus & dwTemp);
|
|
dwCurrentPushedStatus = dwTemp;
|
|
}
|
|
break;
|
|
|
|
case WM_RBUTTONUP:
|
|
dwMouse = GetWindowLong(hStatusWnd,FIGWL_MOUSE);
|
|
if (dwMouse & FIM_CAPUTURED)
|
|
{
|
|
ReleaseCapture();
|
|
if (dwMouse & FIM_MOVED)
|
|
{
|
|
DrawUIBorder(&drc);
|
|
GetCursorPos( &pt );
|
|
MoveWindow(hStatusWnd,pt.x - ptdif.x,
|
|
pt.y - ptdif.y,
|
|
rc.right,
|
|
rc.bottom,TRUE);
|
|
}
|
|
}
|
|
PaintStatus(hStatusWnd,hDC,NULL,0);
|
|
|
|
hSvrWnd = (HWND)GetWindowLongPtr(hStatusWnd,FIGWL_SVRWND);
|
|
|
|
hMenu = LoadMenu(hInst, TEXT("RIGHTCLKMENU"));
|
|
if (hMenu && (hIMC = (HIMC)GetWindowLongPtr(hSvrWnd,IMMGWLP_IMC)))
|
|
{
|
|
int cmd;
|
|
HMENU hSubMenu = GetSubMenu(hMenu, 0);
|
|
|
|
pt.x = (int)LOWORD(lParam),
|
|
pt.y = (int)HIWORD(lParam),
|
|
|
|
ClientToScreen(hStatusWnd, &pt);
|
|
|
|
cmd = TrackPopupMenu(hSubMenu,
|
|
TPM_RETURNCMD,
|
|
pt.x,
|
|
pt.y,
|
|
0,
|
|
hStatusWnd,
|
|
NULL);
|
|
switch (cmd)
|
|
{
|
|
case IDM_RECONVERT:
|
|
{
|
|
DWORD dwSize = (DWORD) MyImmRequestMessage(hIMC, IMR_RECONVERTSTRING, 0);
|
|
if (dwSize)
|
|
{
|
|
LPRECONVERTSTRING lpRS;
|
|
|
|
lpRS = (LPRECONVERTSTRING)GlobalAlloc(GPTR, dwSize);
|
|
lpRS->dwSize = dwSize;
|
|
|
|
if (dwSize = (DWORD) MyImmRequestMessage(hIMC, IMR_RECONVERTSTRING, (LPARAM)lpRS)) {
|
|
|
|
#ifdef DEBUG
|
|
{
|
|
TCHAR szDev[80];
|
|
LPMYSTR lpDump= (LPMYSTR)(((LPSTR)lpRS) + lpRS->dwStrOffset);
|
|
*(LPMYSTR)(lpDump + lpRS->dwStrLen) = MYTEXT('\0');
|
|
|
|
OutputDebugString(TEXT("IMR_RECONVERTSTRING\r\n"));
|
|
wsprintf(szDev, TEXT("dwSize %x\r\n"), lpRS->dwSize);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwVersion %x\r\n"), lpRS->dwVersion);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwStrLen %x\r\n"), lpRS->dwStrLen);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwStrOffset %x\r\n"), lpRS->dwStrOffset);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwCompStrLen %x\r\n"), lpRS->dwCompStrLen);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwCompStrOffset %x\r\n"), lpRS->dwCompStrOffset);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwTargetStrLen %x\r\n"), lpRS->dwTargetStrLen);
|
|
OutputDebugString(szDev);
|
|
wsprintf(szDev, TEXT("dwTargetStrOffset %x\r\n"), lpRS->dwTargetStrOffset);
|
|
OutputDebugString(szDev);
|
|
MyOutputDebugString(lpDump);
|
|
OutputDebugString(TEXT("\r\n"));
|
|
}
|
|
#endif
|
|
MyImmRequestMessage(hIMC, IMR_CONFIRMRECONVERTSTRING, (LPARAM)lpRS);
|
|
}
|
|
#ifdef DEBUG
|
|
else
|
|
OutputDebugString(TEXT("ImmRequestMessage returned 0\r\n"));
|
|
#endif
|
|
GlobalFree((HANDLE)lpRS);
|
|
}
|
|
break;
|
|
}
|
|
|
|
case IDM_ABOUT:
|
|
ImmConfigureIME(GetKeyboardLayout(0), NULL, IME_CONFIG_GENERAL, 0);
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
}
|
|
if (hMenu)
|
|
DestroyMenu(hMenu);
|
|
|
|
break;
|
|
|
|
case WM_LBUTTONUP:
|
|
dwMouse = GetWindowLong(hStatusWnd,FIGWL_MOUSE);
|
|
if (dwMouse & FIM_CAPUTURED)
|
|
{
|
|
ReleaseCapture();
|
|
if (dwMouse & FIM_MOVED)
|
|
{
|
|
DrawUIBorder(&drc);
|
|
GetCursorPos( &pt );
|
|
MoveWindow(hStatusWnd,pt.x - ptdif.x,
|
|
pt.y - ptdif.y,
|
|
rc.right,
|
|
rc.bottom,TRUE);
|
|
}
|
|
}
|
|
hSvrWnd = (HWND)GetWindowLongPtr(hStatusWnd,FIGWL_SVRWND);
|
|
|
|
if (hIMC = (HIMC)GetWindowLongPtr(hSvrWnd,IMMGWLP_IMC))
|
|
{
|
|
GetCursorPos(&pt);
|
|
dwPushedStatus = GetWindowLong(hStatusWnd, FIGWL_PUSHSTATUS);
|
|
dwPushedStatus &= CheckPushedStatus(hStatusWnd,&pt);
|
|
if (!dwPushedStatus) {
|
|
} else if (dwPushedStatus == PUSHED_STATUS_CLOSE) {
|
|
} else if (dwPushedStatus == PUSHED_STATUS_HDR)
|
|
{
|
|
fOpen = ImmGetOpenStatus(hIMC);
|
|
fOpen = !fOpen;
|
|
ImmSetOpenStatus(hIMC,fOpen);
|
|
}
|
|
else
|
|
{
|
|
ImmGetConversionStatus(hIMC,&fdwConversion,&dwTemp);
|
|
fdwConversion = GetUINextMode(fdwConversion,dwPushedStatus);
|
|
ImmSetConversionStatus(hIMC,fdwConversion,dwTemp);
|
|
}
|
|
}
|
|
PaintStatus(hStatusWnd,hDC,NULL,0);
|
|
break;
|
|
}
|
|
ReleaseDC(hStatusWnd,hDC);
|
|
}
|
|
/**********************************************************************/
|
|
/* */
|
|
/* UpdateStatusWindow(lpUIExtra) */
|
|
/* */
|
|
/**********************************************************************/
|
|
void PASCAL UpdateStatusWindow(LPUIEXTRA lpUIExtra)
|
|
{
|
|
if (IsWindow(lpUIExtra->uiStatus.hWnd))
|
|
SendMessage(lpUIExtra->uiStatus.hWnd,WM_UI_UPDATE,0,0L);
|
|
}
|