From dcd176f95c565d18be05099220c084360a13b82a Mon Sep 17 00:00:00 2001 From: fufesou Date: Tue, 30 Apr 2024 21:06:24 +0800 Subject: [PATCH] fix: keyboard input method, for flutter input (#7875) * fix: keyboard input method, for flutter input Signed-off-by: fufesou * comment Signed-off-by: fufesou --------- Signed-off-by: fufesou --- flutter/lib/models/input_model.dart | 16 ++++------------ flutter/lib/models/model.dart | 3 +++ src/ui_session_interface.rs | 2 ++ 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/flutter/lib/models/input_model.dart b/flutter/lib/models/input_model.dart index 4ad4f9073..f3c53f558 100644 --- a/flutter/lib/models/input_model.dart +++ b/flutter/lib/models/input_model.dart @@ -327,23 +327,15 @@ class InputModel { InputModel(this.parent) { sessionId = parent.target!.sessionId; - - // It is ok to call updateKeyboardMode() directly. - // Because `bind` is initialized in `PlatformFFI.init()` which is called very early. - // But we still wrap it in a Future.delayed() to make it more clear. - Future.delayed(Duration(milliseconds: 100), () { - updateKeyboardMode(); - }); } + // This function must be called after the peer info is received. + // Because `sessionGetKeyboardMode` relies on the peer version. updateKeyboardMode() async { // * Currently mobile does not enable map mode if (isDesktop || isWebDesktop) { - if (keyboardMode.isEmpty) { - keyboardMode = - await bind.sessionGetKeyboardMode(sessionId: sessionId) ?? - kKeyLegacyMode; - } + keyboardMode = await bind.sessionGetKeyboardMode(sessionId: sessionId) ?? + kKeyLegacyMode; } } diff --git a/flutter/lib/models/model.dart b/flutter/lib/models/model.dart index 486113eae..78ec0c018 100644 --- a/flutter/lib/models/model.dart +++ b/flutter/lib/models/model.dart @@ -725,6 +725,9 @@ class FfiModel with ChangeNotifier { /// Handle the peer info event based on [evt]. handlePeerInfo(Map evt, String peerId, bool isCache) async { + // This call is to ensuer the keyboard mode is updated depending on the peer version. + parent.target?.inputModel.updateKeyboardMode(); + // Map clone is required here, otherwise "evt" may be changed by other threads through the reference. // Because this function is asynchronous, there's an "await" in this function. cachedPeerData.peerInfo = {...evt}; diff --git a/src/ui_session_interface.rs b/src/ui_session_interface.rs index 3e5b66049..cc2efc08f 100644 --- a/src/ui_session_interface.rs +++ b/src/ui_session_interface.rs @@ -233,10 +233,12 @@ impl Session { } } + // Caution: This function must be called after peer info is received. pub fn get_keyboard_mode(&self) -> String { let mode = self.lc.read().unwrap().keyboard_mode.clone(); let keyboard_mode = KeyboardMode::from_str(&mode); + // Note: peer_version is 0 before peer info is received. let peer_version = self.get_peer_version(); let platform = self.peer_platform();