|
|
// Copyright (c) 1985 - 1999, Microsoft Corporation
//
// MODULE: country3.c
//
// PURPOSE: Console IME control.
// FarEast country specific module for conime.
//
// PLATFORMS: Windows NT-FE 3.51
//
// FUNCTIONS:
// GetCompositionStr() - routine for Get Composition String
// ReDisplayCompositionStr() - foutine for re-Display Composition String
//
// History:
//
// 17.Jul.1996 v-HirShi (Hirotoshi Shimizu) Created for TAIWAN & KOREA & PRC
//
// COMMENTS:
//
#include "precomp.h"
#pragma hdrstop
//**********************************************************************
//
// void GetCompositionStr()
//
// This handles WM_IME_COMPOSITION message with GCS_COMPSTR flag on.
//
//**********************************************************************
void GetCompositionStr( HWND hwnd, LPARAM CompFlag, WPARAM CompChar ) { PCONSOLE_TABLE ConTbl;
DBGPRINT(("CONIME: GetCompositionStr\n"));
ConTbl = SearchConsole(LastConsole); if (ConTbl == NULL) { DBGPRINT(("CONIME: Error! Cannot found registed Console\n")); return; }
switch (ConTbl->ConsoleOutputCP) { case JAPAN_CODEPAGE: GetCompStrJapan(hwnd, ConTbl, CompFlag); break; case TAIWAN_CODEPAGE: GetCompStrTaiwan(hwnd, ConTbl, CompFlag); break; case PRC_CODEPAGE: GetCompStrPRC(hwnd, ConTbl, CompFlag); break; case KOREA_CODEPAGE: GetCompStrKorea(hwnd, ConTbl, CompFlag, CompChar); break; default: break; } return;
}
void GetCompStrJapan( HWND hwnd, PCONSOLE_TABLE ConTbl, LPARAM CompFlag ) { HIMC hIMC; // Input context handle.
LONG lBufLen; // Storage for len. of composition str
LONG lBufLenAttr; COPYDATASTRUCT CopyData; DWORD SizeToAlloc; PWCHAR TempBuf; PUCHAR TempBufA; DWORD i; DWORD CursorPos; LPCONIME_UICOMPMESSAGE lpCompStrMem;
//
// If fail to get input context handle then do nothing.
// Applications should call ImmGetContext API to get
// input context handle.
//
hIMC = ImmGetContext( hwnd ); if ( hIMC == 0 ) return;
if (CompFlag & GCS_COMPSTR) { //
// Determines how much memory space to store the composition string.
// Applications should call ImmGetCompositionString with
// GCS_COMPSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void FAR*)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } if ( CompFlag & GCS_COMPATTR ) { DBGPRINT((" GCS_COMPATTR\n")); lBufLenAttr = ImmGetCompositionString( hIMC, GCS_COMPATTR,( void FAR *)NULL, 0l ); if ( lBufLenAttr < 0 ) { lBufLenAttr = 0; } } else { lBufLenAttr = 0; } } else if (CompFlag & GCS_RESULTSTR) { //
// Determines how much memory space to store the result string.
// Applications should call ImmGetCompositionString with
// GCS_RESULTSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void FAR *)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } lBufLenAttr = 0; } else if (CompFlag == 0) { lBufLen = 0; lBufLenAttr = 0; }
SizeToAlloc = (UINT)( sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR) + lBufLenAttr + sizeof(BYTE) );
if ( ConTbl->lpCompStrMem != NULL && SizeToAlloc > ConTbl->lpCompStrMem->dwSize ) { LocalFree( ConTbl->lpCompStrMem ); ConTbl->lpCompStrMem = NULL; }
if (ConTbl->lpCompStrMem == NULL) { ConTbl->lpCompStrMem = (LPCONIME_UICOMPMESSAGE)LocalAlloc(LPTR, SizeToAlloc ); if ( ConTbl->lpCompStrMem == NULL) { ImmReleaseContext( hwnd, hIMC ); return; } ConTbl->lpCompStrMem->dwSize = SizeToAlloc; }
lpCompStrMem = ConTbl->lpCompStrMem; RtlZeroMemory(&lpCompStrMem->dwCompAttrLen, lpCompStrMem->dwSize - sizeof(lpCompStrMem->dwSize) );
TempBuf = (PWCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE)); TempBufA = (PUCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR));
CopyMemory(lpCompStrMem->CompAttrColor , ConTbl->CompAttrColor , 8 * sizeof(WCHAR));
CopyData.dwData = CI_CONIMECOMPOSITION; CopyData.cbData = lpCompStrMem->dwSize; CopyData.lpData = lpCompStrMem;
if (CompFlag & GCS_COMPSTR) { //
// Reads in the composition string.
//
ImmGetCompositionString( hIMC, GCS_COMPSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
//
// If GCS_COMPATTR flag is on, then we need to take care of it.
//
if ( lBufLenAttr != 0 ) { ImmGetCompositionString( hIMC, GCS_COMPATTR, TempBufA, lBufLenAttr ); TempBufA[ lBufLenAttr ] = (BYTE)0; }
CursorPos = ImmGetCompositionString( hIMC, GCS_CURSORPOS, NULL, 0 ); if (CursorPos == 0) TempBufA[ CursorPos ] |= (BYTE)0x20; else TempBufA[ CursorPos-1 ] |= (BYTE)0x10;
#ifdef DEBUG_INFO
//
// Display new composition chars.
//
xPos = (UINT)lBufLen; xPosLast = (UINT)lBufLen;
DisplayCompString( hwnd, lBufLen / sizeof(WCHAR), TempBuf, TempBufA ); #endif
lpCompStrMem->dwCompStrLen = lBufLen; if (lpCompStrMem->dwCompStrLen) lpCompStrMem->dwCompStrOffset = sizeof(CONIME_UICOMPMESSAGE);
lpCompStrMem->dwCompAttrLen = lBufLenAttr; if (lpCompStrMem->dwCompAttrLen) lpCompStrMem->dwCompAttrOffset = sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR); } else if (CompFlag & GCS_RESULTSTR) { //
// Reads in the result string.
//
ImmGetCompositionString( hIMC, GCS_RESULTSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
#ifdef DEBUG_INFO
//
// Displays the result string.
//
DisplayResultString( hwnd, TempBuf ); #endif
lpCompStrMem->dwResultStrLen = lBufLen; if (lpCompStrMem->dwResultStrLen) lpCompStrMem->dwResultStrOffset = sizeof(CONIME_UICOMPMESSAGE); } else if (CompFlag == 0) { TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0'); TempBufA[ lBufLenAttr ] = (BYTE)0; lpCompStrMem->dwResultStrLen = lBufLen; lpCompStrMem->dwCompStrLen = lBufLen; lpCompStrMem->dwCompAttrLen = lBufLenAttr; }
//
// send character to Console
//
ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData );
ImmReleaseContext( hwnd, hIMC );
}
void GetCompStrTaiwan( HWND hwnd, PCONSOLE_TABLE ConTbl, LPARAM CompFlag ) { HIMC hIMC; // Input context handle.
LONG lBufLen; // Storage for len. of composition str
LONG lBufLenAttr; DWORD SizeToAlloc; PWCHAR TempBuf; PUCHAR TempBufA; DWORD i; DWORD CursorPos; COPYDATASTRUCT CopyData; LPCONIME_UIMODEINFO lpModeInfo; LPCONIME_UICOMPMESSAGE lpCompStrMem;
//
// If fail to get input context handle then do nothing.
// Applications should call ImmGetContext API to get
// input context handle.
//
hIMC = ImmGetContext( hwnd ); if ( hIMC == 0 ) return;
lpModeInfo = (LPCONIME_UIMODEINFO)LocalAlloc(LPTR, sizeof(CONIME_UIMODEINFO) ); if ( lpModeInfo == NULL) { ImmReleaseContext( hwnd, hIMC ); return; }
if (CompFlag & GCS_COMPSTR) { //
// Determines how much memory space to store the composition string.
// Applications should call ImmGetCompositionString with
// GCS_COMPSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void FAR*)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } if ( CompFlag & GCS_COMPATTR ) { DBGPRINT((" GCS_COMPATTR\n")); lBufLenAttr = ImmGetCompositionString( hIMC, GCS_COMPATTR,( void FAR *)NULL, 0l ); if ( lBufLenAttr < 0 ) { lBufLenAttr = 0; } } else { lBufLenAttr = 0; } } else if (CompFlag & GCS_RESULTSTR) { //
// Determines how much memory space to store the result string.
// Applications should call ImmGetCompositionString with
// GCS_RESULTSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void FAR *)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } lBufLenAttr = 0; } else if (CompFlag == 0) { lBufLen = 0; lBufLenAttr = 0; }
SizeToAlloc = (UINT)( sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR) + lBufLenAttr + sizeof(BYTE) );
if ( ConTbl->lpCompStrMem != NULL && SizeToAlloc > ConTbl->lpCompStrMem->dwSize ) { LocalFree( ConTbl->lpCompStrMem ); ConTbl->lpCompStrMem = NULL; }
if (ConTbl->lpCompStrMem == NULL) { ConTbl->lpCompStrMem = (LPCONIME_UICOMPMESSAGE)LocalAlloc(LPTR, SizeToAlloc ); if ( ConTbl->lpCompStrMem == NULL) { ImmReleaseContext( hwnd, hIMC ); return; } ConTbl->lpCompStrMem->dwSize = SizeToAlloc; }
lpCompStrMem = ConTbl->lpCompStrMem; RtlZeroMemory(&lpCompStrMem->dwCompAttrLen, lpCompStrMem->dwSize - sizeof(lpCompStrMem->dwSize) );
TempBuf = (PWCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE)); TempBufA = (PUCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR));
CopyMemory(lpCompStrMem->CompAttrColor , ConTbl->CompAttrColor , 8 * sizeof(WCHAR));
if (CompFlag & GCS_COMPSTR) { //
// Reads in the composition string.
//
ImmGetCompositionString( hIMC, GCS_COMPSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
//
// If GCS_COMPATTR flag is on, then we need to take care of it.
//
if ( lBufLenAttr != 0 ) { ImmGetCompositionString( hIMC, GCS_COMPATTR, TempBufA, lBufLenAttr ); TempBufA[ lBufLenAttr ] = (BYTE)0; }
lpCompStrMem->dwCompStrLen = lBufLen; if (lpCompStrMem->dwCompStrLen) lpCompStrMem->dwCompStrOffset = sizeof(CONIME_UICOMPMESSAGE);
lpCompStrMem->dwCompAttrLen = lBufLenAttr; if (lpCompStrMem->dwCompAttrLen) lpCompStrMem->dwCompAttrOffset = sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR); //
// Display character to Console
//
CopyData.dwData = CI_CONIMEMODEINFO; CopyData.cbData = sizeof(CONIME_UIMODEINFO); CopyData.lpData = lpModeInfo;
if (MakeInfoStringTaiwan(ConTbl, lpModeInfo) ) { ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); } } else if (CompFlag & GCS_RESULTSTR) { //
// Reads in the result string.
//
ImmGetCompositionString( hIMC, GCS_RESULTSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
lpCompStrMem->dwResultStrLen = lBufLen; if (lpCompStrMem->dwResultStrLen) lpCompStrMem->dwResultStrOffset = sizeof(CONIME_UICOMPMESSAGE); //
// send character to Console
//
CopyData.dwData = CI_CONIMECOMPOSITION; CopyData.cbData = lpCompStrMem->dwSize; CopyData.lpData = lpCompStrMem; ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData );
} else if (CompFlag == 0) { TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0'); TempBufA[ lBufLenAttr ] = (BYTE)0; lpCompStrMem->dwResultStrLen = lBufLen; lpCompStrMem->dwCompStrLen = lBufLen; lpCompStrMem->dwCompAttrLen = lBufLenAttr; //
// Display character to Console
//
CopyData.dwData = CI_CONIMEMODEINFO; CopyData.cbData = sizeof(CONIME_UIMODEINFO); CopyData.lpData = lpModeInfo;
if (MakeInfoStringTaiwan(ConTbl, lpModeInfo) ) { ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); } }
LocalFree( lpModeInfo );
ImmReleaseContext( hwnd, hIMC ); return;
}
void GetCompStrPRC( HWND hwnd, PCONSOLE_TABLE ConTbl, LPARAM CompFlag ) { HIMC hIMC; // Input context handle.
LONG lBufLen; // Storage for len. of composition str
LONG lBufLenAttr; DWORD SizeToAlloc; PWCHAR TempBuf; PUCHAR TempBufA; DWORD i; DWORD CursorPos; COPYDATASTRUCT CopyData; LPCONIME_UIMODEINFO lpModeInfo; LPCONIME_UICOMPMESSAGE lpCompStrMem;
//
// If fail to get input context handle then do nothing.
// Applications should call ImmGetContext API to get
// input context handle.
//
hIMC = ImmGetContext( hwnd ); if ( hIMC == 0 ) return;
lpModeInfo = (LPCONIME_UIMODEINFO)LocalAlloc(LPTR, sizeof(CONIME_UIMODEINFO) ); if ( lpModeInfo == NULL) { ImmReleaseContext( hwnd, hIMC ); return; }
if (CompFlag & GCS_COMPSTR) { //
// Determines how much memory space to store the composition string.
// Applications should call ImmGetCompositionString with
// GCS_COMPSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void FAR*)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } if ( CompFlag & GCS_COMPATTR ) { DBGPRINT((" GCS_COMPATTR\n")); lBufLenAttr = ImmGetCompositionString( hIMC, GCS_COMPATTR,( void FAR *)NULL, 0l ); if ( lBufLenAttr < 0 ) { lBufLenAttr = 0; } } else { lBufLenAttr = 0; } } else if (CompFlag & GCS_RESULTSTR) { //
// Determines how much memory space to store the result string.
// Applications should call ImmGetCompositionString with
// GCS_RESULTSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void FAR *)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } lBufLenAttr = 0; } else if (CompFlag == 0) { lBufLen = 0; lBufLenAttr = 0; }
SizeToAlloc = (UINT)( sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR) + lBufLenAttr + sizeof(BYTE) );
if ( ConTbl->lpCompStrMem != NULL && SizeToAlloc > ConTbl->lpCompStrMem->dwSize ) { LocalFree( ConTbl->lpCompStrMem ); ConTbl->lpCompStrMem = NULL; }
if (ConTbl->lpCompStrMem == NULL) { ConTbl->lpCompStrMem = (LPCONIME_UICOMPMESSAGE)LocalAlloc(LPTR, SizeToAlloc ); if ( ConTbl->lpCompStrMem == NULL) { ImmReleaseContext( hwnd, hIMC ); return; } ConTbl->lpCompStrMem->dwSize = SizeToAlloc; }
lpCompStrMem = ConTbl->lpCompStrMem; RtlZeroMemory(&lpCompStrMem->dwCompAttrLen, lpCompStrMem->dwSize - sizeof(lpCompStrMem->dwSize) );
TempBuf = (PWCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE)); TempBufA = (PUCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR));
CopyMemory(lpCompStrMem->CompAttrColor , ConTbl->CompAttrColor , 8 * sizeof(WCHAR));
if (CompFlag & GCS_COMPSTR) { //
// Reads in the composition string.
//
ImmGetCompositionString( hIMC, GCS_COMPSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
//
// If GCS_COMPATTR flag is on, then we need to take care of it.
//
if ( lBufLenAttr != 0 ) { ImmGetCompositionString( hIMC, GCS_COMPATTR, TempBufA, lBufLenAttr ); TempBufA[ lBufLenAttr ] = (BYTE)0; }
lpCompStrMem->dwCompStrLen = lBufLen; if (lpCompStrMem->dwCompStrLen) lpCompStrMem->dwCompStrOffset = sizeof(CONIME_UICOMPMESSAGE);
lpCompStrMem->dwCompAttrLen = lBufLenAttr; if (lpCompStrMem->dwCompAttrLen) lpCompStrMem->dwCompAttrOffset = sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR); //
// Display character to Console
//
CopyData.dwData = CI_CONIMEMODEINFO; CopyData.cbData = sizeof(CONIME_UIMODEINFO); CopyData.lpData = lpModeInfo;
if (MakeInfoStringPRC(ConTbl, lpModeInfo) ) { ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); } } else if (CompFlag & GCS_RESULTSTR) { //
// Reads in the result string.
//
ImmGetCompositionString( hIMC, GCS_RESULTSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
lpCompStrMem->dwResultStrLen = lBufLen; if (lpCompStrMem->dwResultStrLen) lpCompStrMem->dwResultStrOffset = sizeof(CONIME_UICOMPMESSAGE); //
// send character to Console
//
CopyData.dwData = CI_CONIMECOMPOSITION; CopyData.cbData = lpCompStrMem->dwSize; CopyData.lpData = lpCompStrMem; ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData );
} else if (CompFlag == 0) { TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0'); TempBufA[ lBufLenAttr ] = (BYTE)0; lpCompStrMem->dwResultStrLen = lBufLen; lpCompStrMem->dwCompStrLen = lBufLen; lpCompStrMem->dwCompAttrLen = lBufLenAttr; //
// Display character to Console
//
CopyData.dwData = CI_CONIMEMODEINFO; CopyData.cbData = sizeof(CONIME_UIMODEINFO); CopyData.lpData = lpModeInfo;
if (MakeInfoStringPRC(ConTbl, lpModeInfo) ) { ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); } }
LocalFree( lpModeInfo );
ImmReleaseContext( hwnd, hIMC ); return;
}
void GetCompStrKorea( HWND hwnd, PCONSOLE_TABLE ConTbl, LPARAM CompFlag, WPARAM CompChar ) { HIMC hIMC; // Input context handle.
LONG lBufLen; // Storage for len. of composition str
LONG lBufLenAttr; COPYDATASTRUCT CopyData; DWORD SizeToAlloc; PWCHAR TempBuf; PUCHAR TempBufA; LONG i; DWORD CursorPos; LPCONIME_UICOMPMESSAGE lpCompStrMem;
//
// If fail to get input context handle then do nothing.
// Applications should call ImmGetContext API to get
// input context handle.
//
hIMC = ImmGetContext( hwnd ); if ( hIMC == 0 ) return;
// if (CompFlag & CS_INSERTCHAR)
// {
// lBufLen = 1;
// lBufLenAttr = 1;
// }
// else
if (CompFlag & GCS_COMPSTR) { //
// Determines how much memory space to store the composition string.
// Applications should call ImmGetCompositionString with
// GCS_COMPSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_COMPSTR, (void FAR*)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } if ( CompFlag & GCS_COMPATTR ) { DBGPRINT((" GCS_COMPATTR\n")); lBufLenAttr = ImmGetCompositionString( hIMC, GCS_COMPATTR,( void FAR *)NULL, 0l ); if ( lBufLenAttr < 0 ) { lBufLenAttr = 0; } } else { lBufLenAttr = lBufLen; } } else if (CompFlag & GCS_RESULTSTR) { //
// Determines how much memory space to store the result string.
// Applications should call ImmGetCompositionString with
// GCS_RESULTSTR flag on, buffer length zero, to get the bullfer
// length.
//
lBufLen = ImmGetCompositionString( hIMC, GCS_RESULTSTR, (void FAR *)NULL, 0l ); if ( lBufLen < 0 ) { ImmReleaseContext( hwnd, hIMC ); return; } lBufLenAttr = 0; } else if (CompFlag == 0) { lBufLen = 0; lBufLenAttr = 0; } else { return; }
SizeToAlloc = (UINT)( sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR) + lBufLenAttr + sizeof(BYTE) );
if ( ConTbl->lpCompStrMem != NULL && SizeToAlloc > ConTbl->lpCompStrMem->dwSize ) { LocalFree( ConTbl->lpCompStrMem ); ConTbl->lpCompStrMem = NULL; }
if (ConTbl->lpCompStrMem == NULL) { ConTbl->lpCompStrMem = (LPCONIME_UICOMPMESSAGE)LocalAlloc(LPTR, SizeToAlloc ); if ( ConTbl->lpCompStrMem == NULL) { ImmReleaseContext( hwnd, hIMC ); return; } ConTbl->lpCompStrMem->dwSize = SizeToAlloc; }
lpCompStrMem = ConTbl->lpCompStrMem; RtlZeroMemory(&lpCompStrMem->dwCompAttrLen, lpCompStrMem->dwSize - sizeof(lpCompStrMem->dwSize) );
TempBuf = (PWCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE)); TempBufA = (PUCHAR)((PUCHAR)lpCompStrMem + sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR));
CopyMemory(lpCompStrMem->CompAttrColor , ConTbl->CompAttrColor , 8 * sizeof(WCHAR));
CopyData.dwData = CI_CONIMECOMPOSITION; CopyData.cbData = lpCompStrMem->dwSize; CopyData.lpData = lpCompStrMem;
if (CompFlag & CS_INSERTCHAR) { *TempBuf = (WORD)CompChar; TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0'); *TempBufA = (BYTE)ATTR_TARGET_CONVERTED; TempBufA[ lBufLenAttr ] = (BYTE)0; } else if (CompFlag & GCS_COMPSTR) { //
// Reads in the composition string.
//
ImmGetCompositionString( hIMC, GCS_COMPSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
//
// If GCS_COMPATTR flag is on, then we need to take care of it.
//
if ( lBufLenAttr != 0 ) { if ( CompFlag & GCS_COMPATTR ) { ImmGetCompositionString( hIMC, GCS_COMPATTR, TempBufA, lBufLenAttr ); TempBufA[ lBufLenAttr ] = (BYTE)0; } else { for (i = 0; i <= lBufLenAttr; i++) TempBufA[ i ] = (BYTE)1; } }
// Korean NT does not need IME cursor. v-hirshi
// CursorPos = ImmGetCompositionString( hIMC, GCS_CURSORPOS, NULL, 0 );
// if (CursorPos == 0)
// TempBufA[ CursorPos ] |= (BYTE)0x20;
// else
// TempBufA[ CursorPos-1 ] |= (BYTE)0x10;
#ifdef DEBUG_INFO
//
// Display new composition chars.
//
xPos = (UINT)lBufLen; xPosLast = (UINT)lBufLen;
DisplayCompString( hwnd, lBufLen / sizeof(WCHAR), TempBuf, TempBufA ); #endif
lpCompStrMem->dwCompStrLen = lBufLen; if (lpCompStrMem->dwCompStrLen) lpCompStrMem->dwCompStrOffset = sizeof(CONIME_UICOMPMESSAGE);
lpCompStrMem->dwCompAttrLen = lBufLenAttr; if (lpCompStrMem->dwCompAttrLen) lpCompStrMem->dwCompAttrOffset = sizeof(CONIME_UICOMPMESSAGE) + lBufLen + sizeof(WCHAR); } else if (CompFlag & GCS_RESULTSTR) { //
// Reads in the result string.
//
ImmGetCompositionString( hIMC, GCS_RESULTSTR, TempBuf, lBufLen );
//
// Null terminated.
//
TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0');
#ifdef DEBUG_INFO
//
// Displays the result string.
//
DisplayResultString( hwnd, TempBuf ); #endif
lpCompStrMem->dwResultStrLen = lBufLen; if (lpCompStrMem->dwResultStrLen) lpCompStrMem->dwResultStrOffset = sizeof(CONIME_UICOMPMESSAGE); } else if (CompFlag == 0) { TempBuf[ lBufLen / sizeof(WCHAR) ] = TEXT('\0'); TempBufA[ lBufLenAttr ] = (BYTE)0; lpCompStrMem->dwResultStrLen = lBufLen; lpCompStrMem->dwCompStrLen = lBufLen; lpCompStrMem->dwCompAttrLen = lBufLenAttr; }
//
// send character to Console
//
ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData );
ImmReleaseContext( hwnd, hIMC );
}
VOID ReDisplayCompositionStr ( HWND hwnd ) { PCONSOLE_TABLE ConTbl;
ConTbl = SearchConsole(LastConsole); if (ConTbl == NULL) { DBGPRINT(("CONIME: Error! Cannot found registed Console\n")); return; }
if (! ConTbl->fInComposition) return;
switch ( HKL_TO_LANGID(ConTbl->hklActive)) { case LANG_ID_JAPAN: ReDisplayCompStrJapan(hwnd, ConTbl); break; case LANG_ID_TAIWAN: ReDisplayCompStrTaiwan(hwnd, ConTbl); break; case LANG_ID_PRC: ReDisplayCompStrPRC(hwnd, ConTbl); break; case LANG_ID_KOREA: ReDisplayCompStrKorea(hwnd, ConTbl); break; default: break; } return; }
VOID ReDisplayCompStrJapan( HWND hwnd, PCONSOLE_TABLE ConTbl ) { COPYDATASTRUCT CopyData; LPCONIME_UICOMPMESSAGE lpCompStrMem;
lpCompStrMem = ConTbl->lpCompStrMem; CopyData.dwData = CI_CONIMECOMPOSITION; CopyData.cbData = lpCompStrMem->dwSize; CopyData.lpData = lpCompStrMem; ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); }
VOID ReDisplayCompStrTaiwan( HWND hwnd, PCONSOLE_TABLE ConTbl ) { COPYDATASTRUCT CopyData; LPCONIME_UIMODEINFO lpModeInfo;
lpModeInfo = (LPCONIME_UIMODEINFO)LocalAlloc(LPTR, sizeof(CONIME_UIMODEINFO) ); if ( lpModeInfo == NULL) { return; } //
// Display character to Console
//
CopyData.dwData = CI_CONIMEMODEINFO; CopyData.cbData = sizeof(CONIME_UIMODEINFO); CopyData.lpData = lpModeInfo;
if (MakeInfoStringTaiwan(ConTbl, lpModeInfo) ) { ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); }
LocalFree( lpModeInfo ); }
VOID ReDisplayCompStrPRC( HWND hwnd, PCONSOLE_TABLE ConTbl ) { COPYDATASTRUCT CopyData; LPCONIME_UIMODEINFO lpModeInfo;
lpModeInfo = (LPCONIME_UIMODEINFO)LocalAlloc(LPTR, sizeof(CONIME_UIMODEINFO) ); if ( lpModeInfo == NULL) { return; } //
// Display character to Console
//
CopyData.dwData = CI_CONIMEMODEINFO; CopyData.cbData = sizeof(CONIME_UIMODEINFO); CopyData.lpData = lpModeInfo;
if (MakeInfoStringPRC(ConTbl, lpModeInfo) ) { ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData ); } LocalFree( lpModeInfo ); }
VOID ReDisplayCompStrKorea( HWND hwnd, PCONSOLE_TABLE ConTbl ) {
COPYDATASTRUCT CopyData; LPCONIME_UICOMPMESSAGE lpCompStrMem;
lpCompStrMem = ConTbl->lpCompStrMem; CopyData.dwData = CI_CONIMECOMPOSITION; CopyData.cbData = lpCompStrMem->dwSize; CopyData.lpData = lpCompStrMem; ConsoleImeSendMessage( ConTbl->hWndCon, (WPARAM)hwnd, (LPARAM)&CopyData );
}
|