iced-rs / iced

A cross-platform GUI library for Rust, inspired by Elm
https://iced.rs
MIT License
23.38k stars 1.07k forks source link

Panic with widget::text_editor when pressing multiple key at the same time. #2462

Open JacobHaig opened 3 weeks ago

JacobHaig commented 3 weeks ago

Is there an existing issue for this?

Is this issue related to iced?

What happened?

When I run the below application, if I press certain keys at the exact same time the application panics. It can take a few tries to get it right, but it seems like any combination of a Movement Key and a Modification Key causes the panic.

For example, if you press the below key combinations at the same time you should be able to replicate the issue.

  1. Edit(Backspace) + Move(Down)
  2. Edit(Insert('d')) + Move(Up)
  3. Edit(Delete) + Move(End)

Commenting self.content.perform(action); in the below code prevents the application from panicking.

Here is the code. I was following this as an example https://www.youtube.com/watch?v=gcBJ7cPSALo

use iced::{
    widget::{container, text, text_editor},
    Element, Sandbox, Settings,
};

fn main() -> iced::Result {
    Editor::run(Settings::default())
}

struct Editor {
    content: text_editor::Content,
}

#[derive(Debug, Clone)]
enum Message {
    Edit(text_editor::Action),
}

impl Sandbox for Editor {
    type Message = Message;

    fn new() -> Self {
        Self {
            content: text_editor::Content::with_text(include_str!("main.rs")),
        }
    }

    fn title(&self) -> String {
        String::from("Editor")
    }

    fn update(&mut self, message: Message) {
        match message {
            Message::Edit(action) => {
                println!("{:?}", action);
                self.content.perform(action);
            }
        }
    }

    fn view(&self) -> Element<'_, Self::Message> {
        let input = iced::widget::text_editor(&self.content).on_action(Message::Edit);

        container(input).padding(10).into()
    }

    fn theme(&self) -> iced::Theme {
        iced::theme::Theme::Dark
    }
}

What is the expected behavior?

The expected behavior would be that the program doesn't crash. Either eat the input or perform both actions.

Version

crates.io release

Operating System

Windows

Do you have any log output?

warning: `horizon-voyager` (bin "horizon-voyager") generated 1 warning (run `cargo fix --bin "horizon-voyager"` to apply 1 suggestion)
    Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.28s
     Running `target\debug\horizon-voyager.exe`
Click(Point { x: -1.0, y: 10.0 })
Edit(Delete)
Move(End)
thread 'main' panicked at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cosmic-text-0.10.0\src\buffer.rs:498:49:
layout not found
stack backtrace:
   0: std::panicking::begin_panic_handler
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865/library\std\src\panicking.rs:652
   1: core::panicking::panic_fmt
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865/library\core\src\panicking.rs:72
   2: core::panicking::panic_display
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865/library\core\src\panicking.rs:262
   3: core::option::expect_failed
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865/library\core\src\option.rs:1997
   4: enum2$<core::option::Option<ref$<alloc::vec::Vec<cosmic_text::layout::LayoutLine,alloc::alloc::Global> > > >::expect<ref$<alloc::vec::Vec<cosmic_text::layout::LayoutLine,alloc::alloc::Global> > >
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\core\src\option.rs:898
   5: cosmic_text::buffer::Buffer::layout_cursor
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cosmic-text-0.10.0\src\buffer.rs:498
   6: cosmic_text::edit::editor::impl$1::action
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\cosmic-text-0.10.0\src\edit\editor.rs:430
   7: iced_graphics::text::editor::impl$1::perform
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_graphics-0.12.1\src\text\editor.rs:285
   8: iced_widget::text_editor::Content<enum2$<iced_renderer::Renderer> >::perform<enum2$<iced_renderer::Renderer> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_widget-0.12.3\src\text_editor.rs:185
   9: horizon_voyager::impl$0::update
             at .\src\main.rs:36
  10: iced::sandbox::impl$0::update<horizon_voyager::Editor>
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced-0.12.1\src\sandbox.rs:175
  11: iced::application::impl$0::update<horizon_voyager::Editor>
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced-0.12.1\src\application.rs:227
  12: iced_winit::application::update::closure$0<iced::application::Instance<horizon_voyager::Editor>,enum2$<iced_renderer::compositor::Compositor>,iced_futures::backend::null::Executor>
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_winit-0.12.2\src\application.rs:641
  13: iced_futures::executor::Executor::enter<iced_futures::backend::null::Executor,iced_runtime::command::Command<enum2$<horizon_voyager::Message> >,iced_winit::application::update::closure_env$0<iced::application::Instance<horizon_voyager::Editor>,enum2$<iced_
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_futures-0.12.0\src\executor.rs:22
  14: iced_futures::runtime::Runtime<iced_futures::backend::null::Executor,iced_winit::proxy::Proxy<enum2$<horizon_voyager::Message> >,enum2$<horizon_voyager::Message> >::enter<iced_futures::backend::null::Executor,iced_winit::proxy::Proxy<enum2$<horizon_voyager
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_futures-0.12.0\src\runtime.rs:51
  15: iced_winit::application::update<iced::application::Instance<horizon_voyager::Editor>,enum2$<iced_renderer::compositor::Compositor>,iced_futures::backend::null::Executor>
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_winit-0.12.2\src\application.rs:641
  16: iced_winit::application::run_instance::async_fn$0<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Executor,enum2$<iced_renderer::compositor::Compositor> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_winit-0.12.2\src\application.rs:528
  17: iced_winit::application::run::closure$1<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Executor,enum2$<iced_renderer::compositor::Compositor> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_winit-0.12.2\src\application.rs:228
  18: iced_winit::application::run::closure$2<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Executor,enum2$<iced_renderer::compositor::Compositor> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_winit-0.12.2\src\application.rs:265
  19: winit::platform_impl::platform::event_loop::impl$3::run_on_demand::closure$0<enum2$<horizon_voyager::Message>,iced_winit::application::run::closure_env$2<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Executor,enum2$<iced
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop.rs:236
  20: alloc::boxed::impl$49::call_mut<tuple$<enum2$<winit::event::Event<enum2$<horizon_voyager::Message> > > >,dyn$<core::ops::function::FnMut<tuple$<enum2$<winit::event::Event<enum2$<horizon_voyager::Message> > > >,assoc$<Output,tuple$<> > > >,alloc::alloc::Glo
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\alloc\src\boxed.rs:2070
  21: winit::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure$0<enum2$<horizon_voyager::Message> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop\runner.rs:250
  22: core::panic::unwind_safe::impl$25::call_once<tuple$<>,winit::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0<enum2$<horizon_voyager::Message> > >
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\core\src\panic\unwind_safe.rs:272
  23: std::panicking::try::do_call<core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0<enum2$<horizon_voyager::Message> > >,tuple$<> >
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\std\src\panicking.rs:559
  24: std::panicking::try::do_catch<core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::platform::event_loop::thread_event_target_callback::closure_env$0<enum2$<horizon_voyager::Message> > >,isize>
  25: std::panicking::try<tuple$<>,core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0<enum2$<horizon_voyager::Message> > > >
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\std\src\panicking.rs:523
  26: std::panic::catch_unwind<core::panic::unwind_safe::AssertUnwindSafe<winit::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0<enum2$<horizon_voyager::Message> > >,tuple$<> >
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\std\src\panic.rs:149
  27: winit::platform_impl::platform::event_loop::runner::EventLoopRunner<enum2$<horizon_voyager::Message> >::catch_unwind<enum2$<horizon_voyager::Message>,tuple$<>,winit::platform_impl::platform::event_loop::runner::impl$3::call_event_handler::closure_env$0<enu
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop\runner.rs:183
  28: winit::platform_impl::platform::event_loop::runner::EventLoopRunner<enum2$<horizon_voyager::Message> >::call_event_handler<enum2$<horizon_voyager::Message> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop\runner.rs:246
  29: winit::platform_impl::platform::event_loop::runner::EventLoopRunner<enum2$<horizon_voyager::Message> >::move_state_to<enum2$<horizon_voyager::Message> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop\runner.rs:333
  30: winit::platform_impl::platform::event_loop::runner::EventLoopRunner<enum2$<horizon_voyager::Message> >::prepare_wait<enum2$<horizon_voyager::Message> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop\runner.rs:211
  31: winit::platform_impl::platform::event_loop::EventLoop<enum2$<horizon_voyager::Message> >::wait_and_dispatch_message<enum2$<horizon_voyager::Message> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop.rs:369
  32: winit::platform_impl::platform::event_loop::EventLoop<enum2$<horizon_voyager::Message> >::run_on_demand<enum2$<horizon_voyager::Message>,iced_winit::application::run::closure_env$2<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend:
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop.rs:241
  33: winit::platform_impl::platform::event_loop::EventLoop<enum2$<horizon_voyager::Message> >::run<enum2$<horizon_voyager::Message>,iced_winit::application::run::closure_env$2<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Exe
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\platform_impl\windows\event_loop.rs:218
  34: winit::event_loop::EventLoop<enum2$<horizon_voyager::Message> >::run<enum2$<horizon_voyager::Message>,iced_winit::application::run::closure_env$2<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Executor,enum2$<iced_rendere
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\winit-0.29.15\src\event_loop.rs:249
  35: iced_winit::application::run<iced::application::Instance<horizon_voyager::Editor>,iced_futures::backend::null::Executor,enum2$<iced_renderer::compositor::Compositor> >
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced_winit-0.12.2\src\application.rs:253
  36: iced::application::Application::run<horizon_voyager::Editor>
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced-0.12.1\src\application.rs:208
  37: iced::sandbox::Sandbox::run<horizon_voyager::Editor>
             at C:\Users\jacob\.cargo\registry\src\index.crates.io-6f17d22bba15001f\iced-0.12.1\src\sandbox.rs:153
  38: horizon_voyager::main
             at .\src\main.rs:7
  39: core::ops::function::FnOnce::call_once<enum2$<core::result::Result<tuple$<>,enum2$<iced::error::Error> > > (*)(),tuple$<> >
             at /rustc/98489f2487465f3765e5dd28d7305ebfd40f0865\library\core\src\ops\function.rs:250
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
error: process didn't exit successfully: `target\debug\horizon-voyager.exe` (exit code: 101)
Keshyu commented 2 weeks ago

I've looked at the source of the panic and it seem to be an error in cosmic-text:

//TODO: ensure layout is done?
let layout = line.layout_opt().as_ref().expect("layout not found");

On cosmic-text-0.11.0 this seems to be fixed. Maybe upgrading to the dependency will help?