mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 12:13:10 +00:00
parent
a3c841f8e2
commit
ef003fa47d
1 changed files with 24 additions and 65 deletions
|
@ -169,87 +169,46 @@ static InputContextData* get_imc_data(HIMC hIMC)
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HIMC get_default_context( HWND hwnd )
|
|
||||||
{
|
|
||||||
FIXME("Don't use this function\n");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static BOOL IMM_IsCrossThreadAccess(HWND hWnd, HIMC hIMC)
|
|
||||||
{
|
|
||||||
InputContextData *data;
|
|
||||||
|
|
||||||
if (hWnd)
|
|
||||||
{
|
|
||||||
DWORD thread = GetWindowThreadProcessId(hWnd, NULL);
|
|
||||||
if (thread != GetCurrentThreadId()) return TRUE;
|
|
||||||
}
|
|
||||||
data = get_imc_data(hIMC);
|
|
||||||
if (data && data->threadID != GetCurrentThreadId())
|
|
||||||
return TRUE;
|
|
||||||
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* ImmAssociateContext (IMM32.@)
|
* ImmAssociateContext (IMM32.@)
|
||||||
*/
|
*/
|
||||||
HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
|
HIMC WINAPI ImmAssociateContext(HWND hWnd, HIMC hIMC)
|
||||||
{
|
{
|
||||||
HIMC old = NULL;
|
PWND pWnd;
|
||||||
InputContextData *data = get_imc_data(hIMC);
|
HWND hwndFocus;
|
||||||
|
DWORD dwValue;
|
||||||
|
HIMC hOldIMC;
|
||||||
|
|
||||||
TRACE("(%p, %p):\n", hWnd, hIMC);
|
TRACE("(%p, %p)\n", hWnd, hIMC);
|
||||||
|
|
||||||
if(hIMC && !data)
|
if (!Imm32IsImmMode())
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/*
|
pWnd = ValidateHwndNoErr(hWnd);
|
||||||
* If already associated just return
|
if (!pWnd)
|
||||||
*/
|
return NULL;
|
||||||
if (hIMC && data->IMC.hWnd == hWnd)
|
|
||||||
|
if (hIMC && Imm32IsCrossThreadAccess(hIMC))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
hOldIMC = pWnd->hImc;
|
||||||
|
if (hOldIMC == hIMC)
|
||||||
return hIMC;
|
return hIMC;
|
||||||
|
|
||||||
if (hIMC && IMM_IsCrossThreadAccess(hWnd, hIMC))
|
dwValue = NtUserAssociateInputContext(hWnd, hIMC, 0);
|
||||||
|
if (dwValue == 0)
|
||||||
|
return hOldIMC;
|
||||||
|
if (dwValue != 1)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (hWnd)
|
hwndFocus = (HWND)NtUserQueryWindow(hWnd, QUERY_WINDOW_FOCUS);
|
||||||
|
if (hwndFocus == hWnd)
|
||||||
{
|
{
|
||||||
HIMC defaultContext = get_default_context( hWnd );
|
ImmSetActiveContext(hWnd, hOldIMC, FALSE);
|
||||||
old = RemovePropW(hWnd,szwWineIMCProperty);
|
ImmSetActiveContext(hWnd, hIMC, TRUE);
|
||||||
|
|
||||||
if (old == NULL)
|
|
||||||
old = defaultContext;
|
|
||||||
else if (old == (HIMC)-1)
|
|
||||||
old = NULL;
|
|
||||||
|
|
||||||
if (hIMC != defaultContext)
|
|
||||||
{
|
|
||||||
if (hIMC == NULL) /* Meaning disable imm for that window*/
|
|
||||||
SetPropW(hWnd,szwWineIMCProperty,(HANDLE)-1);
|
|
||||||
else
|
|
||||||
SetPropW(hWnd,szwWineIMCProperty,hIMC);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (old)
|
|
||||||
{
|
|
||||||
InputContextData *old_data = (InputContextData *)old;
|
|
||||||
if (old_data->IMC.hWnd == hWnd)
|
|
||||||
old_data->IMC.hWnd = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!hIMC)
|
return hOldIMC;
|
||||||
return old;
|
|
||||||
|
|
||||||
if(GetActiveWindow() == data->IMC.hWnd)
|
|
||||||
{
|
|
||||||
SendMessageW(data->IMC.hWnd, WM_IME_SETCONTEXT, FALSE, ISC_SHOWUIALL);
|
|
||||||
data->IMC.hWnd = hWnd;
|
|
||||||
SendMessageW(data->IMC.hWnd, WM_IME_SETCONTEXT, TRUE, ISC_SHOWUIALL);
|
|
||||||
}
|
|
||||||
|
|
||||||
return old;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue