From c0753183443e575791553d281b6073dabc452be9 Mon Sep 17 00:00:00 2001 From: Max Heimbrock <43608204+MaxHeimbrock@users.noreply.github.com> Date: Thu, 16 Jul 2026 14:34:30 +0200 Subject: [PATCH] persist connection info --- Cargo.lock | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 3 ++- src/connect.rs | 12 +++++++++- src/lib.rs | 20 ++++++++++++++++- src/main.rs | 3 +++ 5 files changed, 95 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d1c5eea..8bd1d61 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -24,6 +24,8 @@ version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" dependencies = [ + "enumn", + "serde", "uuid", ] @@ -155,6 +157,7 @@ dependencies = [ "cfg-if", "getrandom 0.3.4", "once_cell", + "serde", "version_check", "zerocopy", ] @@ -637,6 +640,9 @@ name = "bitflags" version = "2.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4388bee8683e3d04af747c73422af53102d2bd24d9eadb6cbc100baef4b43f8" +dependencies = [ + "serde_core", +] [[package]] name = "bitstream-io" @@ -1245,6 +1251,7 @@ checksum = "6758be723a3f298bbfda4db75748bc2ba0abafe096b6383c7c32da264764fbc3" dependencies = [ "bytemuck", "emath", + "serde", ] [[package]] @@ -1262,6 +1269,7 @@ dependencies = [ "egui_glow", "glutin", "glutin-winit", + "home", "image", "js-sys", "log", @@ -1273,6 +1281,8 @@ dependencies = [ "pollster", "profiling", "raw-window-handle", + "ron", + "serde", "static_assertions", "wasm-bindgen", "wasm-bindgen-futures", @@ -1298,6 +1308,8 @@ dependencies = [ "log", "nohash-hasher", "profiling", + "ron", + "serde", "smallvec", "unicode-segmentation", ] @@ -1338,6 +1350,7 @@ dependencies = [ "objc2-ui-kit 0.3.2", "profiling", "raw-window-handle", + "serde", "smithay-clipboard", "web-time", "webbrowser", @@ -1372,6 +1385,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cd4ec073c9898516584d8c6cfdcee95b530b3d941cd5031ef4050aa36812308b" dependencies = [ "bytemuck", + "serde", ] [[package]] @@ -1401,6 +1415,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "env_filter" version = "2.0.0" @@ -1442,6 +1467,7 @@ dependencies = [ "parking_lot", "profiling", "self_cell", + "serde", "skrifa", "smallvec", "unicode-general-category", @@ -1616,6 +1642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ "bytemuck", + "serde", ] [[package]] @@ -2108,6 +2135,15 @@ dependencies = [ "digest", ] +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + [[package]] name = "http" version = "1.4.2" @@ -4343,6 +4379,20 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.0", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + [[package]] name = "rtrb" version = "0.3.4" @@ -4363,6 +4413,7 @@ dependencies = [ "livekit-api", "log", "parking_lot", + "serde", "tokio", "wgpu", "winit", @@ -4745,6 +4796,9 @@ name = "smallvec" version = "1.15.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ed6a63f02c8539c91a8685a86f4099661ba3da017932f6ebbea6de3f0fa7c90" +dependencies = [ + "serde", +] [[package]] name = "smithay-client-toolkit" @@ -5267,6 +5321,12 @@ dependencies = [ "rustc-hash 2.1.2", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.20.1" diff --git a/Cargo.toml b/Cargo.toml index 9455279..f92a17e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ version = "0.1.0" edition = "2024" [dependencies] -eframe = { version = "0.35.0", features = ["default_fonts", "wgpu"] } +eframe = { version = "0.35.0", features = ["default_fonts", "wgpu", "persistence"] } egui = "0.35.0" egui-wgpu = "0.35.0" env_logger = "0.11" @@ -13,6 +13,7 @@ futures = "0.3" image = "0.25" log = "0.4" parking_lot = { version = "0.12", features = ["deadlock_detection"] } +serde = { version = "1", features = ["derive"] } tokio = { version = "1", features = ["full", "parking_lot"] } # egui-wgpu 0.35 requires wgpu ^29.0; "29.0" resolves to a compatible 29.0.x. wgpu = "29.0" diff --git a/src/connect.rs b/src/connect.rs index 597cb99..6a52589 100644 --- a/src/connect.rs +++ b/src/connect.rs @@ -52,7 +52,9 @@ pub struct ConnectSettings { } /// Which authentication method the connect form is editing. -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Default)] +#[derive( + Clone, Copy, Debug, PartialEq, Eq, Hash, Default, serde::Serialize, serde::Deserialize, +)] enum AuthMethod { #[default] ApiKey, @@ -62,6 +64,12 @@ enum AuthMethod { /// The root window: a welcome screen holding the only connect form in the app. /// Each successful Connect click spawns a dedicated room window. Inputs for both /// auth methods are kept so switching tabs doesn't lose what was typed. +/// +/// Persisted between runs via eframe storage (see `AppRoot`); `#[serde(default)]` +/// lets a stored blob from an older version fall back to `Default` (env-seeded) +/// for any missing field. +#[derive(serde::Serialize, serde::Deserialize)] +#[serde(default)] pub struct ConnectView { method: AuthMethod, url: String, @@ -74,6 +82,8 @@ pub struct ConnectView { auto_subscribe: bool, dynacast: bool, enable_e2ee: bool, + // Not persisted: secrets always start hidden on launch. + #[serde(skip)] show_secrets: bool, } diff --git a/src/lib.rs b/src/lib.rs index 0f97f01..9c027d7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -14,6 +14,9 @@ mod utils; pub static APP_NAME: &str = "LiveKit Client"; +/// eframe storage key under which the connect form is persisted between runs. +const CONNECT_STORAGE_KEY: &str = "connect"; + /// A room window, shown as a deferred viewport so it repaints independently of /// the connect screen and of other rooms. struct WindowEntry { @@ -45,8 +48,14 @@ impl AppRoot { .build() .unwrap(); + // Restore the last-used connect form; fall back to env-seeded defaults. + let connect = cc + .storage + .and_then(|storage| eframe::get_value::(storage, CONNECT_STORAGE_KEY)) + .unwrap_or_default(); + Self { - connect: ConnectView::default(), + connect, render_state: cc.wgpu_render_state.clone().unwrap(), async_runtime, next_window_id: 0, @@ -76,6 +85,15 @@ impl AppRoot { } impl eframe::App for AppRoot { + fn save(&mut self, storage: &mut dyn eframe::Storage) { + eframe::set_value(storage, CONNECT_STORAGE_KEY, &self.connect); + } + + /// Scope persistence to our own connect settings; don't persist egui memory. + fn persist_egui_memory(&self) -> bool { + false + } + fn ui(&mut self, ui: &mut egui::Ui, _frame: &mut eframe::Frame) { if let Some(request) = self.connect.ui(ui) { self.open_room(request); diff --git a/src/main.rs b/src/main.rs index 4f1394d..f06bc52 100644 --- a/src/main.rs +++ b/src/main.rs @@ -17,6 +17,9 @@ fn main() { let options = eframe::NativeOptions { viewport, centered: true, + // Persist only the connect form (see AppRoot::save), not window geometry — + // the root window is fixed-size and centered. + persist_window: false, ..Default::default() };