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::OnKeyDown(ITfContext *pContext, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { *pfEaten = _IsKeyEaten(pContext, wParam); if (*pfEaten) { _InvokeKeyHandler(pContext, wParam, lParam); } return S_OK; }
STDAPI CTextService::OnKeyDown(ITfContext *pic, WPARAM wParam, LPARAM lParam, BOOL *pfEaten) { if(pfEaten == NULL) { return E_INVALIDARG; } *pfEaten = _IsKeyEaten(pic, wParam); if(*pfEaten) { _InvokeKeyHandler(pic, wParam, lParam, SKK_NULL); } return S_OK; }
HRESULT CCandidateWindow::_OnKeyDown(UINT uVKey) { UINT i, page, index; WCHAR ch; BYTE sf; if(_pCandidateWindow != NULL && !_preEnd) { return _pCandidateWindow->_OnKeyDown(uVKey); } //辞書登録モード if(regword) { _OnKeyDownRegword(uVKey); return S_OK; } _GetChSf(uVKey, ch, sf); //複数補完/複数動的補完 if(_comp) { switch(sf) { case SKK_NEXT_COMP: if(candidx == (size_t)-1) { candidx = 0; _InvokeSfHandler(SKK_NEXT_COMP); } else { _NextComp(); } break; case SKK_PREV_COMP: if(candidx != (size_t)-1) { _PrevComp(); } break; default: _InvokeKeyHandler(uVKey); break; } return S_OK; } //候補選択 switch(sf) { case SKK_CANCEL: if(_pCandidateList != NULL) { if(!regword) { if(_pCandidateWindowParent == NULL) { _InvokeSfHandler(SKK_CANCEL); } else { if(_reg) { _RestoreStatusReg(); } _PreEndReq(); _HandleKey(0, SKK_CANCEL); _EndReq(); } } else { _HandleKey(0, SKK_CANCEL); _Update(); } } break; case SKK_BACK: case SKK_PREV_CAND: _PrevPage(); break; case SKK_NEXT_CAND: _NextPage(); break; default: _GetChSf(uVKey, ch, sf, VK_KANA); for(i = 0; i < MAX_SELKEY_C; i++) { if(ch == (L'1' + i) || (ch == _pTextService->selkey[i][0][0] && _pTextService->selkey[i][0][0] != L'\0') || (ch == _pTextService->selkey[i][1][0] && _pTextService->selkey[i][1][0] != L'\0')) { GetCurrentPage(&page); if(i < _CandCount[page]) { index = (UINT)(_pTextService->cx_untilcandlist - 1) + _PageIndex[page] + i; if(index < _pTextService->candidates.size()) { if(!regword) { if(_pCandidateWindowParent == NULL) { _pTextService->candidx = index; _InvokeSfHandler(SKK_ENTER); } else { if(_reg) { _RestoreStatusReg(); } _PreEndReq(); _pTextService->candidx = index; _HandleKey(0, SKK_ENTER); _EndReq(); } } else { _pTextService->candidx = index; _HandleKey(0, SKK_ENTER); _Update(); } break; } } } } break; } return S_OK; }
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; }