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; }
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'); }
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; }
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; }
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; }
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; }
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; }
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; }
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; }
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; }