From faa379faaeff4ca4e440c0f654aec5d23a7437a4 Mon Sep 17 00:00:00 2001 From: fanlusky <1730976608@qq.com> Date: Sun, 5 Jul 2026 17:56:00 +0800 Subject: [PATCH] Fix the lag when committing with number keys. --- src/IME/MetasequoiaIME.cpp | 28 ++++++++++++++++++++++++++++ src/IME/MetasequoiaIME.h | 1 + src/Key/KeyEventSink.cpp | 18 ++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/src/IME/MetasequoiaIME.cpp b/src/IME/MetasequoiaIME.cpp index c89b2489..93e4feec 100644 --- a/src/IME/MetasequoiaIME.cpp +++ b/src/IME/MetasequoiaIME.cpp @@ -1001,6 +1001,34 @@ LRESULT CALLBACK CMetasequoiaIME_WindowProc(HWND hWnd, UINT message, WPARAM wPar .c_str()); break; } + case WM_AsyncNumberCandidateCommit: { + PerfTimer timer; + ITfDocumentMgr *pDocMgrFocus = nullptr; + ITfContext *pContext = nullptr; + + if (SUCCEEDED(pIME->_GetThreadMgr()->GetFocus(&pDocMgrFocus)) && pDocMgrFocus) + { + if (SUCCEEDED(pDocMgrFocus->GetTop(&pContext)) && pContext) + { + _KEYSTROKE_STATE KeystrokeState; + KeystrokeState.Category = CATEGORY_CANDIDATE; + KeystrokeState.Function = FUNCTION_SELECT_BY_NUMBER; + OutputDebugString(fmt::format( + L"[msime-perf] WM_AsyncNumberCandidateCommit begin elapsed=0ms keycode={}", + static_cast(wParam)) + .c_str()); + pIME->_InvokeKeyHandler(pContext, static_cast(wParam), static_cast(lParam), 0, + KeystrokeState); + pContext->Release(); + } + pDocMgrFocus->Release(); + } + OutputDebugString(fmt::format( + L"[msime-perf] WM_AsyncNumberCandidateCommit end elapsed={:.3f}ms keycode={}", + timer.ElapsedMs(), static_cast(wParam)) + .c_str()); + break; + } case WM_CleanupCandidatePresenter: { pIME->_DrainPendingCandidatePresenterCleanup(); break; diff --git a/src/IME/MetasequoiaIME.h b/src/IME/MetasequoiaIME.h index 32178da7..62c8ed7c 100644 --- a/src/IME/MetasequoiaIME.h +++ b/src/IME/MetasequoiaIME.h @@ -25,6 +25,7 @@ const DWORD WM_CommitCandidate = WM_USER + 9; const DWORD WM_CleanupCandidatePresenter = WM_USER + 10; const DWORD WM_AsyncFinalizeCandidate = WM_USER + 11; const DWORD WM_AsyncPunctuationCommit = WM_USER + 12; +const DWORD WM_AsyncNumberCandidateCommit = WM_USER + 13; LRESULT CALLBACK CMetasequoiaIME_WindowProc(HWND wndHandle, UINT uMsg, WPARAM wParam, LPARAM lParam); class CMetasequoiaIME : public ITfTextInputProcessorEx, diff --git a/src/Key/KeyEventSink.cpp b/src/Key/KeyEventSink.cpp index 39edef75..2742ab29 100644 --- a/src/Key/KeyEventSink.cpp +++ b/src/Key/KeyEventSink.cpp @@ -501,6 +501,24 @@ STDAPI CMetasequoiaIME::OnKeyDown(ITfContext *pContext, WPARAM wParam, LPARAM lP .c_str()); return S_OK; } + + if (KeystrokeState.Function == FUNCTION_SELECT_BY_NUMBER && _msgWndHandle) + { + OutputDebugString(fmt::format( + L"[msime-perf] OnKeyDown post async select-by-number elapsed_from_begin={:.3f}ms keycode={} category={} function={}", + onKeyDownTimer.ElapsedMs(), code, + static_cast(KeystrokeState.Category), + static_cast(KeystrokeState.Function)) + .c_str()); + PostMessage(_msgWndHandle, WM_AsyncNumberCandidateCommit, code, static_cast(wch)); + OutputDebugString(fmt::format( + L"[msime-perf] OnKeyDown end total={:.3f}ms eaten={} keycode={} category={} function={} async_select_by_number=1", + onKeyDownTimer.ElapsedMs(), *pIsEaten, code, + static_cast(KeystrokeState.Category), + static_cast(KeystrokeState.Function)) + .c_str()); + return S_OK; + } } if (*pIsEaten)