// Entry point. Wires the Slint UI to the config store, system sampler and // SSH session manager. #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] mod app; mod config; mod debug_log; mod i18n; mod keychain; mod known_hosts; mod proxy; mod serial; mod sftp; mod ssh; mod ssh_config; mod system; mod telnet; mod webdav; fn main() -> anyhow::Result<()> { let log_path = debug_log::init(); // ── IME policy ─────────────────────────────────────────────────────────── // NOTE: We deliberately DO **NOT** call `ImmDisableIME` here. // // An earlier version disabled the IME for the whole Slint event-loop thread // to work around a vim `:q!` glitch (Chinese IMEs intercept letter keys and, // on a Shift press, discard the in-flight pinyin). But disabling the IME // also makes 中文输入 completely impossible — there is no composition window // at all, which is exactly the "无法输入任何中文" bug. // // Chinese input now flows through the hidden `ime-input` TextInput in // terminal_view.slint: composition happens there, and committed text is // forwarded to the PTY via the `edited` callback. The vim/Shift side-effects // are handled instead by the C0-marker + 3-layer Backspace filters in // `app::on_send_key`, so we no longer need (and must not use) ImmDisableIME. if let Err(err) = app::run() { tracing::error!(error = %format!("{err:#}"), "application exited with error"); return Err(err); } if let Some(path) = log_path.filter(|_| debug_log::log_paths_enabled()) { tracing::debug!(log = %path.display(), "application exited normally"); } Ok(()) }