diff --git a/WeaselIPC/WeaselClientImpl.cpp b/WeaselIPC/WeaselClientImpl.cpp index 26122ad50a..56511885b2 100644 --- a/WeaselIPC/WeaselClientImpl.cpp +++ b/WeaselIPC/WeaselClientImpl.cpp @@ -126,15 +126,24 @@ void ClientImpl::UpdateInputPosition(RECT const& rc) { int height = max(0, min(127, (rc.bottom - rc.top) >> hi_res)); DWORD compressed_rect = ((hi_res & 0x01) << 31) | ((height & 0x7f) << 24) | ((top & 0xfff) << 12) | (left & 0xfff); + if (has_last_input_position && last_input_position_session == session_id && + last_input_position_rect == compressed_rect) { + return; + } + has_last_input_position = true; + last_input_position_session = session_id; + last_input_position_rect = compressed_rect; _SendMessage(WEASEL_IPC_UPDATE_INPUT_POS, compressed_rect, session_id); } void ClientImpl::FocusIn() { + has_last_input_position = false; DWORD client_caps = 0; /* TODO */ _SendMessage(WEASEL_IPC_FOCUS_IN, client_caps, session_id); } void ClientImpl::FocusOut() { + has_last_input_position = false; _SendMessage(WEASEL_IPC_FOCUS_OUT, 0, session_id); } @@ -149,21 +158,25 @@ void ClientImpl::StartSession() { _WriteClientInfo(); UINT ret = _SendMessage(WEASEL_IPC_START_SESSION, 0, 0); session_id = ret; + has_last_input_position = false; } void ClientImpl::EndSession() { _SendMessage(WEASEL_IPC_END_SESSION, 0, session_id); session_id = 0; + has_last_input_position = false; } void ClientImpl::StartMaintenance() { _SendMessage(WEASEL_IPC_START_MAINTENANCE, 0, 0); session_id = 0; + has_last_input_position = false; } void ClientImpl::EndMaintenance() { _SendMessage(WEASEL_IPC_END_MAINTENANCE, 0, 0); session_id = 0; + has_last_input_position = false; } bool ClientImpl::Echo() { diff --git a/WeaselIPC/WeaselClientImpl.h b/WeaselIPC/WeaselClientImpl.h index 7602792869..b9ecfb9806 100644 --- a/WeaselIPC/WeaselClientImpl.h +++ b/WeaselIPC/WeaselClientImpl.h @@ -42,8 +42,11 @@ class ClientImpl { UINT session_id; std::wstring app_name; bool is_ime; + bool has_last_input_position = false; + UINT last_input_position_session = 0; + DWORD last_input_position_rect = 0; PipeChannel channel; }; -} // namespace weasel \ No newline at end of file +} // namespace weasel diff --git a/WeaselTSF/Composition.cpp b/WeaselTSF/Composition.cpp index 62852bc7f8..e27aea3e12 100644 --- a/WeaselTSF/Composition.cpp +++ b/WeaselTSF/Composition.cpp @@ -72,6 +72,7 @@ STDAPI CStartCompositionEditSession::DoEditSession(TfEditCookie ec) { void WeaselTSF::_StartComposition(com_ptr pContext, BOOL fCUASWorkaroundEnabled) { + _hasLastCompositionPosition = FALSE; com_ptr pStartCompositionEditSession; pStartCompositionEditSession.Attach(new CStartCompositionEditSession( this, pContext, fCUASWorkaroundEnabled, _cand->style().inline_preedit)); @@ -239,6 +240,17 @@ void WeaselTSF::_SetCompositionPosition(const RECT& rc) { return; } } + BOOL same_position = _hasLastCompositionPosition && + _lastCompositionPosition.left == rc.left && + _lastCompositionPosition.top == rc.top && + _lastCompositionPosition.right == rc.right && + _lastCompositionPosition.bottom == rc.bottom; + if (same_position) { + return; + } + _lastCompositionPosition = rc; + _hasLastCompositionPosition = TRUE; + RECT _rc; _rc.left = _rc.right = rc.left; _rc.top = _rc.bottom = rc.bottom; @@ -404,6 +416,7 @@ STDAPI WeaselTSF::OnCompositionTerminated(TfEditCookie ecWrite, } void WeaselTSF::_AbortComposition(bool clear) { + _hasLastCompositionPosition = FALSE; m_client.ClearComposition(); if (_IsComposing()) { _EndComposition(_pEditSessionContext, clear); diff --git a/WeaselTSF/KeyEventSink.cpp b/WeaselTSF/KeyEventSink.cpp index c885dddf94..16ab8af4ac 100644 --- a/WeaselTSF/KeyEventSink.cpp +++ b/WeaselTSF/KeyEventSink.cpp @@ -63,6 +63,7 @@ void WeaselTSF::_ProcessKeyEvent(WPARAM wParam, LPARAM lParam, BOOL* pfEaten) { } STDAPI WeaselTSF::OnSetFocus(BOOL fForeground) { + _hasLastCompositionPosition = false; if (fForeground) m_client.FocusIn(); else { diff --git a/WeaselTSF/WeaselTSF.h b/WeaselTSF/WeaselTSF.h index 696d3cce4b..7e6bc96c79 100644 --- a/WeaselTSF/WeaselTSF.h +++ b/WeaselTSF/WeaselTSF.h @@ -233,4 +233,6 @@ class WeaselTSF : public ITfTextInputProcessorEx, BOOL _async_edit = false; BOOL _committed = false; BOOL _isToOpenClose = false; + BOOL _hasLastCompositionPosition = false; + RECT _lastCompositionPosition = {0, 0, 0, 0}; };