Implement term_view resize properly

This commit is contained in:
Condorra 2024-08-19 21:00:17 +10:00
parent c117482d4f
commit adaabcc6c2
4 changed files with 24 additions and 77 deletions

74
Cargo.lock generated
View File

@ -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"

View File

@ -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"

View File

@ -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,

View File

@ -74,7 +74,11 @@ pub struct TermFrameData {
pub fit: FitAddon,
pub node: Node,
pub readline: Readline,
pub retained_closures: Option<(Closure<dyn FnMut(String)>, Closure<dyn FnMut(Dims)>)>,
pub retained_closures: Option<(
Closure<dyn FnMut(String)>,
Closure<dyn FnMut(Dims)>,
Closure<dyn FnMut(JsValue) -> 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<dyn FnMut(JsValue) -> 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
})