fix: preserve IME snapshot on activation failure

This commit is contained in:
millionart committed 2026-05-04 00:18:26 +08:00
1 parent f533f6ea05
commit 31045f7871
1 file changed
+26 -4
@@ -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());
}
}