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.
 
 
 
 
 
 

276 lines
7.3 KiB

/*++
Copyright (c) 1985 - 1999, Microsoft Corporation
Module Name:
imewnd.cpp
Abstract:
This file implements the Default IME window Class.
Author:
Revision History:
Notes:
--*/
#include "private.h"
#include "cdimm.h"
#include "globals.h"
#include "defs.h"
#include "imewnd.h"
#include "imewndhd.h"
BOOL
CDefaultIMEWindow::_CreateDefaultIMEWindow(
HIMC hDefIMC
)
{
#ifndef CICERO_4678
//
// If m_hDefaultIMEWnd's owner is IMM32, then this value always valid hWnd.
// For CICERO_4678, we should remove this code because subclass window hook
// never start after Deactivate() and Activate().
// In Trident and go to another Web page, Trident calls Deactivate() and Activate(),
// first Deactivate() calls CDefaultIMEWindow::Stop() and
// next Activate() calls here, however m_hDefaultIMEWnd already exist, then
// returns immediately. Never calls CDefaultIMEWindow::Start().
// Note: Cicero bug d/b #4678
//
if (m_hDefaultIMEWnd)
/*
* already exist IME window.
*/
return TRUE;
#endif
if (IsOnImm()) {
//
// Create dummy default IME window.
//
// When the IsOnImm() is TRUE, this function could get the default IME window handle
// by using imm32.Imm32_GetDefaultIMEWnd() function.
// Imm32's GetDefaultIMEWnd might be return no IME window when no any parent window
// in this thread.
// However, we can assume that GetDefaultIMEWnd must return a valid IME window.
// Because, _CreateIMEWindow() function always create a dummy default IME
// window.
//
if (m_hDummyDefaultIMEWnd == NULL) {
m_hDummyDefaultIMEWnd = _CreateIMEWindow(NULL);
}
#ifdef CICERO_4678
if (m_hDefaultIMEWnd == NULL) {
Imm32_GetDefaultIMEWnd(NULL, &m_hDefaultIMEWnd);
}
#else
Imm32_GetDefaultIMEWnd(NULL, &m_hDefaultIMEWnd);
#endif
if (IsWindow(m_hDefaultIMEWnd) &&
//
// Set subclass window procedure.
//
Start()
) {
CIMEWindowHandler* pimeui = GetImeWndHandler(m_hDefaultIMEWnd, TRUE);
if (pimeui == NULL)
return FALSE;
pimeui->ImeWndCreateHandler(GetWindowLong(m_hDefaultIMEWnd, GWL_STYLE),
hDefIMC);
}
}
else {
/*
* NT5 have a IME class.
*/
if (! IsOnNT5()) {
WNDCLASSEX wcWndCls;
wcWndCls.cbSize = sizeof(WNDCLASSEX);
wcWndCls.cbClsExtra = 0;
wcWndCls.cbWndExtra = 0;
wcWndCls.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wcWndCls.hInstance = g_hInst;
wcWndCls.hCursor = LoadCursor(NULL, IDC_ARROW);
wcWndCls.hbrBackground = (HBRUSH)GetStockObject(NULL_BRUSH);
wcWndCls.lpszMenuName = (LPTSTR)NULL;
wcWndCls.hIconSm = NULL;
wcWndCls.style = CS_GLOBALCLASS;
wcWndCls.lpfnWndProc = ImeWndProcA;
wcWndCls.lpszClassName = "IME";
if (! RegisterClassEx(&wcWndCls)) {
return FALSE;
}
m_bMyRegisterClass = TRUE;
}
if (m_hDefaultIMEWnd == NULL) {
m_hDefaultIMEWnd = _CreateIMEWindow(hDefIMC);
if (m_hDefaultIMEWnd)
m_bMyCreateWindow = TRUE;
else
return FALSE;
}
if (IsOnNT5() && IsWindow(m_hDefaultIMEWnd) && ! m_bMyRegisterClass &&
//
// Set subclass window procedure.
//
Start()
) {
CIMEWindowHandler* pimeui = GetImeWndHandler(m_hDefaultIMEWnd, TRUE);
if (pimeui == NULL)
return FALSE;
pimeui->ImeWndCreateHandler(GetWindowLong(m_hDefaultIMEWnd, GWL_STYLE),
hDefIMC);
}
}
if (m_hDefaultIMEWnd == NULL)
return FALSE;
else
return TRUE;
}
BOOL
CDefaultIMEWindow::_DestroyDefaultIMEWindow(
)
{
Stop();
if (IsWindow(m_hDummyDefaultIMEWnd)) {
DestroyWindow(m_hDummyDefaultIMEWnd);
}
if (m_bMyCreateWindow) {
DestroyWindow(m_hDefaultIMEWnd);
m_bMyCreateWindow = FALSE;
m_hDefaultIMEWnd = NULL;
}
else if (IsWindow(m_hDefaultIMEWnd)) {
//
// This DefaultIMEWnd is owned by IMM32.
// If still exist DefaultIMEWnd, then DIMM12 never receive WM_NCDESTROY message
// in CIMEWindowHandler::ImeWndProcWorker.
// We need clean up memory of CIMEWindowHandler.
//
CIMEWindowHandler* pimeui = GetImeWndHandler(m_hDefaultIMEWnd);
if (pimeui == NULL)
return FALSE;
pimeui->ImeWndFinalDestroyHandler();
}
if (m_bMyRegisterClass) {
UnregisterClass("IME", g_hInst);
m_bMyRegisterClass = FALSE;
}
return TRUE;
};
HWND
CDefaultIMEWindow::_CreateIMEWindow(
HIMC hDefIMC
)
{
return CreateWindow("IME",
"",
WS_DISABLED | WS_POPUP,
0, 0, 0, 0, // x, y, width, height
NULL, // parent
NULL, // menu
g_hInst,
hDefIMC); // lpParam
}
HRESULT
CDefaultIMEWindow::GetDefaultIMEWnd(
IN HWND hWnd,
OUT HWND *phDefWnd
)
{
if (IsOnImm()) {
Imm32_GetDefaultIMEWnd(hWnd, phDefWnd);
}
else {
if (hWnd == NULL) {
*phDefWnd = m_hDefaultIMEWnd;
}
else {
if (GetWindowThreadProcessId(hWnd, NULL) == GetCurrentThreadId()) {
*phDefWnd = m_hDefaultIMEWnd;
}
else {
return E_FAIL;
}
}
}
return S_OK;
}
LRESULT
CDefaultIMEWindow::CallWindowProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
if (m_SubclassWindowProc != 0) {
switch (uMsg) {
case WM_IME_SETCONTEXT:
case WM_IME_SELECT:
{
WNDPROC pfn = Stop();
LRESULT lRet = ::CallWindowProc(pfn, hWnd, uMsg, wParam, lParam);
Start();
return lRet;
}
}
return ::CallWindowProc((WNDPROC)m_SubclassWindowProc, hWnd, uMsg, wParam, lParam);
}
else {
return ::DefWindowProc(hWnd, uMsg, wParam, lParam);
}
}
LRESULT
ImeWndProcA(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
CIMEWindowHandler* pimeui = GetImeWndHandler(hwnd);
if (pimeui == NULL)
return 0L;
return pimeui->ImeWndProcWorker(uMsg, wParam, lParam, FALSE);
}
LRESULT
ImeWndProcW(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
CIMEWindowHandler* pimeui = GetImeWndHandler(hwnd);
if (pimeui == NULL)
return 0L;
return pimeui->ImeWndProcWorker(uMsg, wParam, lParam);
}