From adaabcc6c2fb09f5f08394764f60549ab8f5b0ff Mon Sep 17 00:00:00 2001 From: Condorra Date: Mon, 19 Aug 2024 21:00:17 +1000 Subject: [PATCH] Implement term_view resize properly --- Cargo.lock | 74 +----------------------------------------- Cargo.toml | 3 +- src/lineengine/line.rs | 5 +++ src/term_view.rs | 19 +++++++++-- 4 files changed, 24 insertions(+), 77 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3d94f4..a3a6351 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -30,12 +30,6 @@ dependencies = [ "zerocopy", ] -[[package]] -name = "aliasable" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "250f629c0161ad8107cf89319e990051fae62832fd343083bea452d93e2205fd" - [[package]] name = "allocator-api2" version = "0.2.18" @@ -649,12 +643,6 @@ dependencies = [ "allocator-api2", ] -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - [[package]] name = "hermit-abi" version = "0.3.9" @@ -716,15 +704,6 @@ dependencies = [ "hashbrown", ] -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itertools" version = "0.13.0" @@ -825,31 +804,6 @@ version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" -[[package]] -name = "ouroboros" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "944fa20996a25aded6b4795c6d63f10014a7a83f8be9828a11860b08c5fc4a67" -dependencies = [ - "aliasable", - "ouroboros_macro", - "static_assertions", -] - -[[package]] -name = "ouroboros_macro" -version = "0.18.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39b0deead1528fd0e5947a8546a9642a9777c25f6e1e26f34c97b204bbb465bd" -dependencies = [ - "heck", - "itertools 0.12.1", - "proc-macro2", - "proc-macro2-diagnostics", - "quote", - "syn 2.0.73", -] - [[package]] name = "percent-encoding" version = "2.3.1" @@ -976,19 +930,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "proc-macro2-diagnostics" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.73", - "version_check", - "yansi", -] - [[package]] name = "prokio" version = "0.1.0" @@ -1163,12 +1104,6 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3b9b39299b249ad65f3b7e96443bad61c02ca5cd3589f46cb6d610a0fd6c0d6a" -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "syn" version = "1.0.109" @@ -1418,10 +1353,9 @@ dependencies = [ "anyhow", "console_error_panic_hook", "im", - "itertools 0.13.0", + "itertools", "minicrossterm", "nom", - "ouroboros", "piccolo", "thiserror", "unicode-segmentation", @@ -1431,12 +1365,6 @@ dependencies = [ "yew", ] -[[package]] -name = "yansi" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfe53a6657fd280eaa890a3bc59152892ffa3e30101319d168b781ed6529b049" - [[package]] name = "yew" version = "0.21.0" diff --git a/Cargo.toml b/Cargo.toml index 436efc6..bb6f20e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,10 +13,9 @@ piccolo = "0.3.3" unicode-segmentation = "1.11.0" unicode-width = "0.1.13" wasm-bindgen = "0.2.92" -web-sys = "0.3.69" +web-sys = { version = "0.3.69", features = ["ResizeObserver"] } yew = { version = "0.21.0", features = ["csr"] } minicrossterm = { git = "https://git.blastmud.org/blasthavers/minicrossterm.git", rev = "494f89daef41162fbd89d5266e261018ed5ff6dc" } thiserror = "1.0.63" console_error_panic_hook = "0.1.7" -ouroboros = "0.18.4" anyhow = "1.0.86" diff --git a/src/lineengine/line.rs b/src/lineengine/line.rs index 9e59014..2826c5a 100644 --- a/src/lineengine/line.rs +++ b/src/lineengine/line.rs @@ -498,6 +498,11 @@ impl Readline { } pub fn handle_resize(&mut self, term_size: (u16, u16)) -> Result<(), ReadlineError> { + web_sys::console::log_3( + &"Doing resize event".into(), + &term_size.0.into(), + &term_size.1.into(), + ); self.line_state.handle_event( Event::Resize(term_size.0, term_size.1), &mut self.write_term, diff --git a/src/term_view.rs b/src/term_view.rs index 4c19b5c..485f2e1 100644 --- a/src/term_view.rs +++ b/src/term_view.rs @@ -74,7 +74,11 @@ pub struct TermFrameData { pub fit: FitAddon, pub node: Node, pub readline: Readline, - pub retained_closures: Option<(Closure, Closure)>, + pub retained_closures: Option<( + Closure, + Closure, + Closure JsValue>, + )>, } impl PartialEq for TermFrameData { @@ -100,6 +104,16 @@ fn get_or_make_term_frame<'a>( .and_then(|d| d.create_element("div").ok()) .expect("Can create element for term"); element.set_class_name("hterminal"); + + let fit_for_resize = FitAddon { obj: fit.clone() }; + let resize_element_closure: Closure JsValue> = + Closure::new(move |_: JsValue| { + fit_for_resize.fit(); + JsValue::TRUE + }); + web_sys::ResizeObserver::new(resize_element_closure.as_ref().unchecked_ref()) + .expect("Couldn't construct ResizeObserver") + .observe(&element); term.open(&element); term.loadAddon(&fit); fit.fit(); @@ -128,6 +142,7 @@ fn get_or_make_term_frame<'a>( let frame_for_resize: TermFrame = frame.clone(); let globals_for_resize: GlobalCell = globals.clone(); let resize_closure = Closure::new(move |dims: Dims| { + web_sys::console::log_1(&"Resize closure called".into()); globals_for_resize .frame_registry .try_borrow_mut() @@ -175,7 +190,7 @@ fn get_or_make_term_frame<'a>( term.onData(&data_closure); new_data .retained_closures - .replace((data_closure, resize_closure)); + .replace((data_closure, resize_closure, resize_element_closure)); new_data })