This commit is contained in:
2026-06-19 03:09:53 +08:00
Unverified
commit d32882443f
49 changed files with 19399 additions and 0 deletions

46
src/main.rs Normal file
View File

@@ -0,0 +1,46 @@
// 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;
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(())
}