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.
223 lines
5.6 KiB
223 lines
5.6 KiB
/**************************************************************************\
|
|
* Module Name: conime.c
|
|
*
|
|
* Copyright (c) 1985 - 1999, Microsoft Corporation
|
|
*
|
|
* client side receiveing stubs
|
|
*
|
|
* History:
|
|
* 19-Sep-1995 v-HirShi Created
|
|
* 12-Jun-1996 v-HirShi Attached to SUR
|
|
\**************************************************************************/
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
#define GUI_VKEY_MASK (0x00ff)
|
|
|
|
DWORD
|
|
ImmProcessKey(
|
|
HWND hWnd,
|
|
HKL hkl,
|
|
UINT uVKey,
|
|
LPARAM lParam,
|
|
DWORD dwHotKeyID
|
|
) ;
|
|
|
|
BOOL
|
|
ImmSetActiveContext(
|
|
HWND hWnd,
|
|
HIMC hIMC,
|
|
BOOL fFlag
|
|
) ;
|
|
|
|
DWORD
|
|
ImmCallImeConsoleIME(
|
|
HWND hWnd,
|
|
UINT Message,
|
|
WPARAM wParam,
|
|
LPARAM lParam,
|
|
PUINT puVKey
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Called by Console IME to convert Character
|
|
This routine copy from user\kernel\ntimm.c :: xxxImmProcessKey
|
|
for Console IME could not calls kernel function.
|
|
|
|
Arguments:
|
|
|
|
Return Value:
|
|
--*/
|
|
{
|
|
DWORD dwReturn ;
|
|
PIMC pImc ;
|
|
HIMC hImc ;
|
|
BOOL fDBERoman ;
|
|
PWND pwnd ;
|
|
PIMEDPI pImeDpi;
|
|
HKL hkl ;
|
|
|
|
dwReturn = 0;
|
|
pImc = NULL;
|
|
fDBERoman = FALSE;
|
|
|
|
//
|
|
// we're interested in only keyboard messages.
|
|
//
|
|
if ( Message != WM_KEYDOWN &&
|
|
Message != WM_SYSKEYDOWN &&
|
|
Message != WM_KEYUP &&
|
|
Message != WM_SYSKEYUP ) {
|
|
|
|
return dwReturn;
|
|
}
|
|
|
|
hkl = GetKeyboardLayout( GetWindowThreadProcessId(hWnd, NULL) );
|
|
pwnd = ValidateHwnd(hWnd);
|
|
if ( pwnd == NULL) {
|
|
return dwReturn;
|
|
}
|
|
hImc = ImmGetContext(hWnd);
|
|
if ( hImc == NULL_HIMC ){
|
|
return dwReturn;
|
|
}
|
|
|
|
*puVKey = (UINT)wParam & GUI_VKEY_MASK;
|
|
|
|
//
|
|
// Check input context
|
|
//
|
|
pImc = HMValidateHandle((HANDLE)hImc, TYPE_INPUTCONTEXT);
|
|
if ( pImc == NULL ) {
|
|
return dwReturn;
|
|
}
|
|
|
|
#ifdef LATER
|
|
//
|
|
// If there is an easy way to check the input context open/close status
|
|
// from the kernel side, IME_PROP_NO_KEYS_ON_CLOSE checking should be
|
|
// done here in kernel side. [ 3/10/96 takaok]
|
|
//
|
|
|
|
//
|
|
// Check IME_PROP_NO_KEYS_ON_CLOSE bit
|
|
//
|
|
// if the current imc is not open and IME doesn't need
|
|
// keys when being closed, we don't pass any keyboard
|
|
// input to ime except hotkey and keys that change
|
|
// the keyboard status.
|
|
//
|
|
if ( (piix->ImeInfo.fdwProperty & IME_PROP_NO_KEYS_ON_CLOSE) &&
|
|
(!pimc->fdwState & IMC_OPEN) &&
|
|
uVKey != VK_SHIFT && // 0x10
|
|
uVKey != VK_CONTROL && // 0x11
|
|
uVKey != VK_CAPITAL && // 0x14
|
|
uVKey != VK_KANA && // 0x15
|
|
uVKey != VK_NUMLOCK && // 0x90
|
|
uVKey != VK_SCROLL ) // 0x91
|
|
{
|
|
// Check if Korea Hanja conversion mode
|
|
if( !(pimc->fdwConvMode & IME_CMODE_HANJACONVERT) ) {
|
|
return dwReturn;
|
|
}
|
|
}
|
|
#endif
|
|
|
|
//
|
|
// if the IME doesn't need key up messages, we don't call ime.
|
|
//
|
|
pImeDpi = ImmLockImeDpi(hkl);
|
|
if ( pImeDpi == NULL ) {
|
|
return dwReturn;
|
|
}
|
|
|
|
if ( lParam & 0x80000000 && // set if key up, clear if key down
|
|
pImeDpi->ImeInfo.fdwProperty & IME_PROP_IGNORE_UPKEYS )
|
|
{
|
|
ImmUnlockImeDpi(pImeDpi);
|
|
return dwReturn;
|
|
}
|
|
|
|
//
|
|
// we don't want to handle sys keys since many functions for
|
|
// acceelerators won't work without this
|
|
//
|
|
fDBERoman = (BOOL)( (*puVKey == VK_DBE_ROMAN) ||
|
|
(*puVKey == VK_DBE_NOROMAN) ||
|
|
(*puVKey == VK_DBE_HIRAGANA) ||
|
|
(*puVKey == VK_DBE_KATAKANA) ||
|
|
(*puVKey == VK_DBE_CODEINPUT) ||
|
|
(*puVKey == VK_DBE_NOCODEINPUT) ||
|
|
(*puVKey == VK_DBE_IME_WORDREGISTER) ||
|
|
(*puVKey == VK_DBE_IME_DIALOG) );
|
|
|
|
if (Message == WM_SYSKEYDOWN || Message == WM_SYSKEYUP ) {
|
|
//
|
|
// IME may be waiting for VK_MENU, VK_F10 or VK_DBE_xxx
|
|
//
|
|
if ( *puVKey != VK_MENU && *puVKey != VK_F10 && !fDBERoman ) {
|
|
ImmUnlockImeDpi(pImeDpi);
|
|
return dwReturn;
|
|
}
|
|
}
|
|
|
|
//
|
|
// check if the IME doesn't need ALT key
|
|
//
|
|
|
|
if ( !(pImeDpi->ImeInfo.fdwProperty & IME_PROP_NEED_ALTKEY) ) {
|
|
//
|
|
// IME doesn't need ALT key
|
|
//
|
|
// we don't pass the ALT and ALT+xxx except VK_DBE_xxx keys.
|
|
//
|
|
if ( ! fDBERoman &&
|
|
(*puVKey == VK_MENU || (lParam & 0x20000000)) // KF_ALTDOWN
|
|
)
|
|
{
|
|
ImmUnlockImeDpi(pImeDpi);
|
|
return dwReturn;
|
|
}
|
|
}
|
|
|
|
|
|
dwReturn = ImmProcessKey(hWnd, hkl, *puVKey, lParam, IME_INVALID_HOTKEY ) ;
|
|
|
|
ImmUnlockImeDpi(pImeDpi);
|
|
return dwReturn;
|
|
}
|
|
|
|
BOOL
|
|
ImmSetActiveContextConsoleIME(
|
|
HWND hWnd,
|
|
BOOL fFlag
|
|
)
|
|
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Set this context as active one.
|
|
|
|
Arguments:
|
|
|
|
hWnd - the get focus window
|
|
fFlag - get focus or kill focus
|
|
|
|
Return Value:
|
|
|
|
--*/
|
|
|
|
{
|
|
HIMC hImc;
|
|
|
|
hImc = ImmGetContext(hWnd) ;
|
|
if (hImc == NULL_HIMC) {
|
|
return FALSE;
|
|
}
|
|
return(ImmSetActiveContext(hWnd, hImc, fFlag)) ;
|
|
|
|
}
|
|
|