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