From 8163cd89abc6681d5ed3a26f1027a639d92630b5 Mon Sep 17 00:00:00 2001 From: Pwiz Date: Sun, 2 Apr 2023 23:52:06 +0800 Subject: [PATCH] Fix IME position bug for Mac and Windows (#1154) --- ..._editor_state_text_input_client_mixin.dart | 34 ++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart b/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart index 5eced2bf..5f98d56a 100644 --- a/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart +++ b/lib/src/widgets/raw_editor/raw_editor_state_text_input_client_mixin.dart @@ -63,12 +63,44 @@ mixin RawEditorStateTextInputClientMixin on EditorState ); _updateSizeAndTransform(); + //update IME position for Windows + _updateComposingRectIfNeeded(); + //update IME position for Macos + _updateCaretRectIfNeeded(); _textInputConnection!.setEditingState(_lastKnownRemoteTextEditingValue!); } - _textInputConnection!.show(); } + void _updateComposingRectIfNeeded() { + final composingRange = _lastKnownRemoteTextEditingValue?.composing ?? + textEditingValue.composing; + if (hasConnection) { + assert(mounted); + final offset = composingRange.isValid ? composingRange.start : 0; + final composingRect = + renderEditor.getLocalRectForCaret(TextPosition(offset: offset)); + _textInputConnection!.setComposingRect(composingRect); + SchedulerBinding.instance + .addPostFrameCallback((_) => _updateComposingRectIfNeeded()); + } + } + + void _updateCaretRectIfNeeded() { + if (hasConnection) { + if (renderEditor.selection.isValid && + renderEditor.selection.isCollapsed) { + final currentTextPosition = + TextPosition(offset: renderEditor.selection.baseOffset); + final caretRect = + renderEditor.getLocalRectForCaret(currentTextPosition); + _textInputConnection!.setCaretRect(caretRect); + } + SchedulerBinding.instance + .addPostFrameCallback((_) => _updateCaretRectIfNeeded()); + } + } + /// Closes input connection if it's currently open. Otherwise does nothing. void closeConnectionIfNeeded() { if (!hasConnection) {