From 31045f7871668cf216048ae667be0dfb54ca3cf3 Mon Sep 17 00:00:00 2001 From: millionart Date: Mon, 4 May 2026 00:18:26 +0800 Subject: [PATCH] fix: preserve IME snapshot on activation failure --- .../app/src-tauri/src/windows_ime_session.rs | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/openless-all/app/src-tauri/src/windows_ime_session.rs b/openless-all/app/src-tauri/src/windows_ime_session.rs index e43dafb3..85334ffd 100644 --- a/openless-all/app/src-tauri/src/windows_ime_session.rs +++ b/openless-all/app/src-tauri/src/windows_ime_session.rs @@ -46,8 +46,15 @@ impl PreparedWindowsImeSession { } } + pub fn activation_failed(saved_profile: ImeProfileSnapshot) -> Self { + Self { + saved_profile: Some(saved_profile), + openless_activated: false, + } + } + pub fn is_ready_for_tsf_submit(&self) -> bool { - self.saved_profile.is_some() && self.openless_activated + self.has_saved_profile() && self.openless_was_activated() } pub fn has_saved_profile(&self) -> bool { @@ -59,7 +66,7 @@ impl PreparedWindowsImeSession { } pub fn should_restore_when_active_profile_check_fails(&self) -> bool { - self.has_saved_profile() && self.openless_was_activated() + self.has_saved_profile() } } @@ -96,7 +103,7 @@ impl WindowsImeSessionController { Err(error) => { let error = WindowsImeSessionError::Profile(error.to_string()); log::warn!("[windows-ime] activate OpenLess profile failed: {error}"); - PreparedWindowsImeSession::unavailable() + PreparedWindowsImeSession::activation_failed(saved_profile) } } } @@ -211,14 +218,29 @@ mod tests { } #[test] - fn active_profile_check_failure_restores_only_prepared_active_session() { + fn active_profile_check_failure_restores_any_session_with_saved_profile() { let prepared = PreparedWindowsImeSession { saved_profile: Some(ImeProfileSnapshot::keyboard_layout(0x0409, 0x0409_0409)), openless_activated: true, }; + let activation_failed = PreparedWindowsImeSession::activation_failed( + ImeProfileSnapshot::keyboard_layout(0x0409, 0x0409_0409), + ); assert!(prepared.should_restore_when_active_profile_check_fails()); + assert!(activation_failed.should_restore_when_active_profile_check_fails()); assert!(!PreparedWindowsImeSession::unavailable() .should_restore_when_active_profile_check_fails()); } + + #[test] + fn activation_failed_session_keeps_snapshot_but_cannot_submit() { + let prepared = PreparedWindowsImeSession::activation_failed( + ImeProfileSnapshot::keyboard_layout(0x0409, 0x0409_0409), + ); + + assert!(prepared.has_saved_profile()); + assert!(!prepared.openless_was_activated()); + assert!(!prepared.is_ready_for_tsf_submit()); + } }