ulyssa / iamb

A Matrix client for Vim addicts
https://iamb.chat
Apache License 2.0
608 stars 45 forks source link

Panic on terminal resize #310

Closed krachynski closed 1 month ago

krachynski commented 2 months ago

My Environment: Windows 11, Windows Terminal, Fedora WSL2, iamb debug on main

I have iamb currently set up to display four rooms in a 2x2 layout. With Windows terminal fullscreen on one of my displays this works fine. I discovered yesterday, while splitting my Windows Terminal tab into two that iamb panics due to the suddenly small size.

Manually resizing the terminal shows that only the right two rooms are resized as it shrinks until they're too narrow to display anything.

thread 'main' panicked at src/message/printer.rs:97:9:
attempt to subtract with overflow
stack backtrace:
   0: rust_begin_unwind
             at /builddir/build/BUILD/rustc-1.79.0-src/library/std/src/panicking.rs:652:5
   1: core::panicking::panic_fmt
             at /builddir/build/BUILD/rustc-1.79.0-src/library/core/src/panicking.rs:72:14
   2: core::panicking::panic_const::panic_const_sub_overflow
             at /builddir/build/BUILD/rustc-1.79.0-src/library/core/src/panicking.rs:180:21
   3: iamb::message::printer::TextPrinter::remaining
             at ./src/message/printer.rs:97:9
   4: iamb::message::printer::TextPrinter::push_break
             at ./src/message/printer.rs:119:25
   5: iamb::message::printer::TextPrinter::commit
             at ./src/message/printer.rs:103:13
   6: iamb::message::printer::TextPrinter::finish
             at ./src/message/printer.rs:275:9
   7: iamb::message::MessageFormatter::push_reactions
             at ./src/message/mod.rs:778:28
   8: iamb::message::Message::show_with_preview
             at ./src/message/mod.rs:1000:13
   9: <iamb::windows::room::scrollback::Scrollback as ratatui::widgets::StatefulWidget>::render
             at ./src/windows/room/scrollback.rs:1346:17
  10: <iamb::windows::room::chat::Chat as ratatui::widgets::StatefulWidget>::render
             at ./src/windows/room/chat.rs:932:9
  11: <iamb::windows::room::chat::ChatState as modalkit_ratatui::WindowOps<iamb::base::IambInfo>>::draw
             at ./src/windows/room/chat.rs:654:9
  12: <iamb::windows::room::RoomState as modalkit_ratatui::WindowOps<iamb::base::IambInfo>>::draw
             at ./src/windows/room/mod.rs:421:38
  13: <iamb::windows::IambWindow as modalkit_ratatui::WindowOps<iamb::base::IambInfo>>::draw
             at ./src/windows/mod.rs:484:40
  14: <modalkit_ratatui::windows::slot::WindowSlot<W> as modalkit_ratatui::WindowOps<I>>::draw
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/slot.rs:205:9
  15: modalkit_ratatui::windows::layout::WindowLayout<W,I>::_draw::{{closure}}
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/layout.rs:1980:25
  16: <modalkit_ratatui::windows::AxisTreeNode<W,X,Y> as modalkit_ratatui::windows::tree::SubtreeOps<W,X,Y>>::for_each_value
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/tree.rs:548:9
  17: <core::option::Option<alloc::boxed::Box<modalkit_ratatui::windows::AxisTreeNode<W,X,Y>>> as modalkit_ratatui::windows::tree::SubtreeOps<W,X,Y>>::for_each_value
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/tree.rs:598:27
  18: <modalkit_ratatui::windows::AxisTreeNode<W,X,Y> as modalkit_ratatui::windows::tree::SubtreeOps<W,X,Y>>::for_each_value
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/tree.rs:549:9
  19: modalkit_ratatui::windows::layout::WindowLayout<W,I>::_draw
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/layout.rs:1993:9
  20: modalkit_ratatui::windows::layout::WindowLayout<W,I>::_draw::{{closure}}
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/layout.rs:1986:21
  21: <modalkit_ratatui::windows::AxisTreeNode<W,X,Y> as modalkit_ratatui::windows::tree::SubtreeOps<W,X,Y>>::for_each_value
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/tree.rs:548:9
  22: modalkit_ratatui::windows::layout::WindowLayout<W,I>::_draw
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/layout.rs:1993:9
  23: <modalkit_ratatui::windows::layout::WindowLayout<W,I> as ratatui::widgets::StatefulWidget>::render
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/windows/layout.rs:2019:13
  24: <modalkit_ratatui::screen::Screen<W,I> as ratatui::widgets::StatefulWidget>::render
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/modalkit-ratatui-0.0.19/src/screen.rs:831:13
  25: ratatui::terminal::frame::Frame::render_stateful_widget
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.1/src/terminal/frame.rs:125:9
  26: iamb::Application::redraw::{{closure}}
             at ./src/main.rs:315:13
  27: ratatui::terminal::terminal::Terminal<B>::draw
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/ratatui-0.26.1/src/terminal/terminal.rs:269:9
  28: iamb::Application::redraw
             at ./src/main.rs:299:9
  29: iamb::Application::step::{{closure}}
             at ./src/main.rs:338:13
  30: iamb::Application::run::{{closure}}
             at ./src/main.rs:650:35
  31: iamb::run::{{closure}}
             at ./src/main.rs:1019:23
  32: iamb::main::{{closure}}
             at ./src/main.rs:1064:44
  33: tokio::runtime::park::CachedParkThread::block_on::{{closure}}
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/park.rs:281:63
  34: tokio::runtime::coop::with_budget
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/coop.rs:107:5
  35: tokio::runtime::coop::budget
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/coop.rs:73:5
  36: tokio::runtime::park::CachedParkThread::block_on
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/park.rs:281:31
  37: tokio::runtime::context::blocking::BlockingRegionGuard::block_on
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/context/blocking.rs:66:9
  38: tokio::runtime::scheduler::multi_thread::MultiThread::block_on::{{closure}}
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/scheduler/multi_thread/mod.rs:87:13
  39: tokio::runtime::context::runtime::enter_runtime
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/context/runtime.rs:65:16
  40: tokio::runtime::scheduler::multi_thread::MultiThread::block_on
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/scheduler/multi_thread/mod.rs:86:9
  41: tokio::runtime::runtime::Runtime::block_on
             at /home/krachynski/.cargo/registry/src/index.crates.io-6f17d22bba15001f/tokio-1.37.0/src/runtime/runtime.rs:351:45
  42: iamb::main
             at ./src/main.rs:1064:5
  43: core::ops::function::FnOnce::call_once
             at /builddir/build/BUILD/rustc-1.79.0-src/library/core/src/ops/function.rs:250:5
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
krachynski commented 1 month ago

image Just tested this on main and resizing did something sensible. Thank you!

ulyssa commented 1 month ago

Thank you for reporting this and sharing the backtrace! 🙏 I've fixed this in #322 and added a test to catch it.