Leaked source code of windows server 2003
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

/**************************************************************************\
* 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)) ;
}