示例#1
0
STDAPI CTextService::OnTestKeyDown(ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten)
{
	if(pfEaten == NULL)
	{
		return E_INVALIDARG;
	}

	int eaten = _IsKeyEaten(pic, wParam, lParam, TRUE, TRUE);
	if(eaten == -1)
	{
		*pfEaten = TRUE;
		return S_OK;
	}
	*pfEaten = (eaten == TRUE);

	_EndInputModeWindow();

	if(!_IsKeyboardDisabled() && _IsKeyboardOpen() && !_IsComposing())
	{
		WCHAR ch = _GetCh((BYTE)wParam);
		if(_IsKeyVoid(ch, (BYTE)wParam))
		{
			_GetActiveFlags();
			_UpdateLanguageBar();
		}
	}

	return S_OK;
}
示例#2
0
BOOL CTextService::_IsKeyEaten(ITfContext *pContext, WPARAM wParam)
{
    // if the keyboard is disabled, keys are not consumed.
    if (_IsKeyboardDisabled())
        return FALSE;

    // if the keyboard is closed, keys are not consumed.
    if (!_IsKeyboardOpen())
        return FALSE;

    //
    // The text service key handler does not do anything while the candidate
    // window is shown.
    // The candidate list handles the keys through ITfContextKeyEventSink.
    //
    if (_pCandidateList &&
        _pCandidateList->_IsContextCandidateWindow(pContext))
    {
        return FALSE;
    }

    // eat only keys that CKeyHandlerEditSession can hadles.
    switch (wParam)
    {
        case VK_LEFT:
        case VK_RIGHT:
        case VK_RETURN:
		case VK_SPACE:
		case VK_BACK:
			if (_IsComposing())
                return TRUE;
			return FALSE;
		case 0xC0:
		case 0xBD:
		case 0xBB:
		case 0xDB:
		case 0xDD:
		case 0xDC:
		case 0xBA:
		case 0xDE:
		case 0xBC:
		case 0xBE:
		case 0xBF:
			return TRUE;		
	}
	if (GetKeyState(VK_MENU) & 0x8000)
		return FALSE;
	else if (GetKeyState(VK_CONTROL) & 0x8000)
		return FALSE;
	else if (wParam >= VK_NUMPAD0 && wParam <= VK_NUMPAD9)
		return FALSE;
	else if ( (wParam >= '0' && wParam <= '9') || (wParam >= 'A' && wParam <= 'Z') )
		return TRUE;

    return FALSE;
}
BOOL CTextService::_IsKeyEaten(WPARAM wParam)
{
    // if the keyboard is disabled, we don't eat keys.
    if (_IsKeyboardDisabled())
        return FALSE;

    // if the keyboard is closed, we don't eat keys.
    if (!_IsKeyboardOpen())
        return FALSE;

    // we're only interested in VK_A - VK_Z, when this is open.
    // is on
    return (wParam >= 'A') && (wParam <= 'Z');
}
示例#4
0
STDAPI CTextService::OnPreservedKey(ITfContext *pic, REFGUID rguid, BOOL *pfEaten)
{
	if(pic == NULL || pfEaten == NULL)
	{
		return E_INVALIDARG;
	}

	BOOL fOpen = _IsKeyboardOpen();

	if(IsEqualGUID(rguid, c_guidPreservedKeyOn))
	{
		if(fOpen)
		{
			//入力途中のシーケンスはそのまま確定
			_InvokeKeyHandler(pic, 0, 0, SKK_ENTER);
			_ClearComposition();
			postbuf.clear();
		}
		else
		{
			_UpdateLanguageBar();
		}
		inputmode = im_disable;
		_SetKeyboardOpen(TRUE);
		*pfEaten = TRUE;
	}
	else if(IsEqualGUID(rguid, c_guidPreservedKeyOff))
	{
		if(fOpen)
		{
			_InvokeKeyHandler(pic, 0, 0, SKK_ENTER);
			_ClearComposition();
			postbuf.clear();
		}
		else
		{
			_UpdateLanguageBar();
		}
		_SetKeyboardOpen(FALSE);
		*pfEaten = TRUE;
	}
	else
	{
		*pfEaten = FALSE;
	}

	return S_OK;
}
STDAPI CTextService::OnPreservedKey(ITfContext *pContext, REFGUID rguid, BOOL *pfEaten)
{

    if (IsEqualGUID(rguid, GUID_PRESERVEDKEY_ONOFF))
    {
        BOOL fOpen = _IsKeyboardOpen();
        _SetKeyboardOpen(fOpen ? FALSE : TRUE);
        *pfEaten = TRUE;
    }
    else
    {
        *pfEaten = FALSE;
    }

    return S_OK;
}
示例#6
0
STDAPI CTextService::OnPreservedKey(ITfContext *pic, REFGUID rguid, BOOL *pfEaten)
{
	if(pic == NULL || pfEaten == NULL)
	{
		return E_INVALIDARG;
	}

	BOOL fOpen = _IsKeyboardOpen();

	if(IsEqualGUID(rguid, c_guidPreservedKeyOn))
	{
		if(!fOpen)
		{
			inputmode = im_disable;

			_SetKeyboardOpen(TRUE);
		}
		else
		{
			_UpdateLanguageBar();
		}

		*pfEaten = TRUE;
	}
	else if(IsEqualGUID(rguid, c_guidPreservedKeyOff))
	{
		if(fOpen)
		{
			_ClearComposition();

			_SetKeyboardOpen(FALSE);
		}
		else
		{
			_UpdateLanguageBar();
		}

		*pfEaten = TRUE;
	}
	else
	{
		*pfEaten = FALSE;
	}

	return S_OK;
}
BOOL CTextService::_IsKeyEaten(ITfContext *pContext, WPARAM wParam)
{
    // if the keyboard is disabled, we don't eat keys.
    if (_IsKeyboardDisabled())
        return FALSE;

    // if the keyboard is closed, we don't eat keys.
    if (!_IsKeyboardOpen())
        return FALSE;

    //
    // The text service key handler does not do anything while the candidate
    // window is shown.
    // The candidate list handles the keys through ITfContextKeyEventSink.
    //
    if (_pCandidateList &&
        _pCandidateList->_IsContextCandidateWindow(pContext))
    {
        return FALSE;
    }

    // eat only keys that CKeyHandlerEditSession can hadles.
    switch (wParam)
    {
        case VK_LEFT:
        case VK_RIGHT:
        case VK_RETURN:
        case VK_SPACE:
            if (_IsComposing())
                return TRUE;
            return FALSE;
    }

    if (wParam >= 'A' && wParam <= 'Z')
        return TRUE;

    return FALSE;
}
示例#8
0
BOOL CTextService::_IsKeyEaten(ITfContext *pContext, WPARAM wParam)
{
    // if the keyboard is disabled, keys are not consumed.
    if (_IsKeyboardDisabled())
        return FALSE;

    // if the keyboard is closed, keys are not consumed.
    if (!_IsKeyboardOpen())
        return FALSE;

    //
    // The text service key handler does not do anything while the candidate
    // window is shown.
    // The candidate list handles the keys through ITfContextKeyEventSink.
    //
    if (_pCandidateList &&
        _pCandidateList->_IsContextCandidateWindow(pContext))
    {
        return FALSE;
    }

    return TRUE;
}
示例#9
0
STDAPI CTextService::OnPreservedKey(ITfContext *pic, REFGUID rguid, BOOL *pfEaten)
{
	if(IsEqualGUID(rguid, c_guidPreservedKeyOnOff))
	{
		BOOL fOpen = _IsKeyboardOpen();
		if(!fOpen)
		{
			inputmode = im_disable;
		}
		else
		{
			_ClearComposition();
		}
		_SetKeyboardOpen(fOpen ? FALSE : TRUE);
		*pfEaten = TRUE;
	}
	else
	{
		*pfEaten = FALSE;
	}

	return S_OK;
}
示例#10
0
STDAPI CTextService::ActivateEx(ITfThreadMgr *ptim, TfClientId tid, DWORD dwFlags)
{
	_pThreadMgr = ptim;
	_pThreadMgr->AddRef();
	_ClientId = tid;

	if (!_IsKeyboardOpen())
	{
		_KeyboardSetDefaultMode();
	}

	if(!_InitThreadMgrEventSink())
	{
		goto exit;
	}

	if(!_InitThreadFocusSink())
	{
		goto exit;
	}

	if(!_InitCompartmentEventSink())
	{
		goto exit;
	}

	{
		ITfDocumentMgr* pDocumentMgr = nullptr;
		if (SUCCEEDED(_pThreadMgr->GetFocus(&pDocumentMgr)) && (pDocumentMgr != nullptr))
		{
			_InitTextEditSink(pDocumentMgr);
			SafeRelease(&pDocumentMgr);
		}
	}

	if(!_InitLanguageBar())
	{
		goto exit;
	}

	if(!_InitKeyEventSink())
	{
		goto exit;
	}

	if(!_InitDisplayAttributeGuidAtom())
	{
		goto exit;
	}

	if(!_InitFunctionProvider())
	{
		goto exit;
	}

	_KeyboardOpenCloseChanged(FALSE);

	return S_OK;

exit:
	Deactivate();
	return E_FAIL;
}
示例#11
0
int CTextService::_IsKeyEaten(ITfContext *pContext, WPARAM wParam, LPARAM lParam, bool isKeyDown, bool isTest)
{
	if(_IsKeyboardDisabled())
	{
		return FALSE;
	}

	if(!_IsKeyboardOpen())
	{
		return FALSE;
	}

	//カーソル直前文字列削除をBSを送って消す場合のDeleter用処理。
	//(TSFによるカーソル直前文字列削除ができなかった場合用。)
	//mozcのwin32/tip/tip_keyevent_handler.ccから。
	bool is_key_down = isKeyDown;
	if(isTest)
	{
		const mozc::win32::LParamKeyInfo key_info(lParam);
		is_key_down = key_info.IsKeyDownInImeProcessKey();
	}
	const mozc::win32::VKBackBasedDeleter::ClientAction vk_back_action =
		deleter.OnKeyEvent(wParam, is_key_down, isTest);

	switch(vk_back_action)
	{
	case mozc::win32::VKBackBasedDeleter::DO_DEFAULT_ACTION:
		// do nothing.
		break;
	case mozc::win32::VKBackBasedDeleter::CALL_END_DELETION_THEN_DO_DEFAULT_ACTION:
		deleter.EndDeletion();
		break;
	case mozc::win32::VKBackBasedDeleter::SEND_KEY_TO_APPLICATION:
		if(is_key_down && isTest && !postbuf.empty())
		{
			postbuf.pop_back();
		}
		return FALSE; // Do not consume this key.
	case mozc::win32::VKBackBasedDeleter::CONSUME_KEY_BUT_NEVER_SEND_TO_SERVER:
		return -1; // Consume this key but do not send this key to server.
	case mozc::win32::VKBackBasedDeleter::CALL_END_DELETION_BUT_NEVER_SEND_TO_SERVER:
		if(!isTest)
		{
			deleter.EndDeletion();
			return -1;
		}
		else
		{
			return FALSE;
		}
	case mozc::win32::VKBackBasedDeleter::APPLY_PENDING_STATUS:
		if(!isTest)
		{
			_InvokeKeyHandler(pContext, wParam, lParam, SKK_AFTER_DELETER);
			return -1;
		}
		else
		{
			return FALSE;
		}
	default:
		break;
	}

	if(_pCandidateList && _pCandidateList->_IsContextCandidateWindow(pContext))
	{
		return FALSE;
	}

	if(_IsComposing() || !cx_showromancomp && !roman.empty())
	{
		if(inputmode != im_ascii)
		{
			return TRUE;
		}
	}

	SHORT vk_ctrl = GetKeyState(VK_CONTROL) & 0x8000;
	SHORT vk_kana = GetKeyState(VK_KANA) & 0x0001;

	WCHAR ch = _GetCh((BYTE)wParam);
	BYTE sf = _GetSf((BYTE)wParam, ch);

	//確定状態で処理する機能
	switch(inputmode)
	{
	case im_jlatin:
	case im_ascii:
		switch(sf)
		{
		case SKK_JMODE:
		case SKK_OTHERIME:
			return TRUE;
			break;
		default:
			break;
		}
		break;
	case im_hiragana:
	case im_katakana:
		switch(sf)
		{
		case SKK_CONV_POINT:
		case SKK_KANA:
		case SKK_CONV_CHAR:
		case SKK_JLATIN:
		case SKK_ASCII:
		case SKK_ABBREV:
		case SKK_OTHERIME:
			return TRUE;
			break;
		case SKK_VIESC:
			inputmode = im_ascii;
			_UpdateLanguageBar();
			postbuf.clear();
			return FALSE;
			break;
		default:
			break;
		}
		break;
	case im_katakana_ank:
		switch(sf)
		{
		case SKK_KANA:
		case SKK_CONV_CHAR:
		case SKK_JLATIN:
		case SKK_ASCII:
		case SKK_OTHERIME:
			return TRUE;
			break;
		case SKK_VIESC:
			inputmode = im_ascii;
			_UpdateLanguageBar();
			postbuf.clear();
			return FALSE;
		default:
			break;
		}
		break;
	default:
		break;
	}

	//無効
	if(_IsKeyVoid(ch, (BYTE)wParam))
	{
		return TRUE;
	}

	//処理しないCtrlキー
	if(vk_ctrl != 0)
	{
		postbuf.clear();
		return FALSE;
	}

	//ASCIIモード、かなキーロックOFF
	if(inputmode == im_ascii && vk_kana == 0)
	{
		return FALSE;
	}

	if(ch >= L'\x20')
	{
		return TRUE;
	}

	if(!postbuf.empty())
	{
		if((wParam == VK_BACK || wParam == VK_LEFT) && is_key_down && isTest)
		{
			postbuf.pop_back();
		}
		else
		{
			switch(wParam)
			{
			//case VK_LEFT:
			case VK_RIGHT:
			case VK_UP:
			case VK_DOWN:
			case VK_HOME:
			case VK_END:
			case VK_PRIOR:
			case VK_NEXT:
				if(is_key_down && isTest)
				{
					postbuf.clear();
				}
				break;
			default:
				break;
			}
		}
	}

	return FALSE;
}
示例#12
0
BOOL CTextService::_IsKeyEaten(ITfContext *pContext, WPARAM wParam)
{
	if(_IsKeyboardDisabled())
	{
		return FALSE;
	}

	if(!_IsKeyboardOpen())
	{
		return FALSE;
	}

	if(_pCandidateList && _pCandidateList->_IsContextCandidateWindow(pContext))
	{
		return FALSE;
	}

	if(_IsComposing())
	{
		if(inputmode != im_ascii && !_pInputModeWindow)
		{
			return TRUE;
		}
	}

	SHORT vk_ctrl = GetKeyState(VK_CONTROL) & 0x8000;
	SHORT vk_kana = GetKeyState(VK_KANA) & 0x0001;

	WCHAR ch = _GetCh((BYTE)wParam);
	BYTE sf = _GetSf((BYTE)wParam, ch);

	//確定状態で処理する機能
	switch(inputmode)
	{
	case im_jlatin:
	case im_ascii:
		switch(sf)
		{
		case SKK_JMODE:
			return TRUE;
			break;
		default:
			break;
		}
		break;
	case im_hiragana:
	case im_katakana:
		switch(sf)
		{
		case SKK_CONV_POINT:
		case SKK_KANA:
		case SKK_CONV_CHAR:
		case SKK_JLATIN:
		case SKK_ASCII:
		case SKK_ABBREV:
			return TRUE;
			break;
		default:
			break;
		}
		break;
	case im_katakana_ank:
		switch(sf)
		{
		case SKK_KANA:
		case SKK_CONV_CHAR:
		case SKK_JLATIN:
		case SKK_ASCII:
			return TRUE;
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}

	//無効
	if(_IsKeyVoid(ch, (BYTE)wParam))
	{
		return TRUE;
	}

	//処理しないCtrlキー
	if(vk_ctrl)
	{
		return FALSE;
	}

	//ASCIIモード、かなキーロック
	if(inputmode == im_ascii && !vk_kana)
	{
		return FALSE;
	}

	if(ch >= L'\x20')
	{
		return TRUE;
	}

	return FALSE;
}
示例#13
0
BOOL CTextService::_IsKeyEaten(ITfContext *pContext, WPARAM wParam)
{
	if(_IsKeyboardDisabled())
	{
		return FALSE;
	}

	if(!_IsKeyboardOpen())
	{
		return FALSE;
	}

	if(_pCandidateList && _pCandidateList->_IsContextCandidateWindow(pContext))
	{
		return FALSE;
	}

	if(_IsComposing())
	{
		return TRUE;
	}

	SHORT vk_ctrl = GetKeyState(VK_CONTROL) & 0x8000;
	SHORT vk_kana = GetKeyState(VK_KANA) & 0x0001;

	WCHAR ch = _GetCh((BYTE)wParam);
	BYTE sf = _GetSf((BYTE)wParam, ch);

	//確定状態で処理する機能
	switch(inputmode)
	{
	case im_hiragana:
		switch(sf)
		{
		case SKK_CONV_POINT:
			return TRUE;
			break;
		default:
			break;
		}
		break;
	default:
		break;
	}

	//無効
	if(_IsKeyVoid(ch, (BYTE)wParam))
	{
		return TRUE;
	}

	//処理しないCtrlキー
	if(vk_ctrl != 0)
	{
		return FALSE;
	}

	if(ch >= L'\x20')
	{
		return TRUE;
	}

	return FALSE;
}