diff --git a/src/ftxui/component/screen_interactive.cpp b/src/ftxui/component/screen_interactive.cpp index 8a7b4e089b2c592449f607cc7e438f651bd5d086..674276f7151e2f7009c7389b12ca86d72f3e068b 100644 --- a/src/ftxui/component/screen_interactive.cpp +++ b/src/ftxui/component/screen_interactive.cpp @@ -295,10 +295,14 @@ ScreenInteractive ScreenInteractive::FitComponent() { } void ScreenInteractive::Post(Task task) { - if (!quit_) { - task_sender_->Send(std::move(task)); - } + // Task/Events sent toward inactive screen or screen waiting to become + // inactive are dropped. + if (!task_sender_) + return; + + task_sender_->Send(std::move(task)); } + void ScreenInteractive::PostEvent(Event event) { Post(event); } diff --git a/src/ftxui/component/screen_interactive_test.cpp b/src/ftxui/component/screen_interactive_test.cpp index 9592d9324bd66064865250869c5cc444bc19e398..957e98b13c5dce706b174c69715f21f50f3c838a 100644 --- a/src/ftxui/component/screen_interactive_test.cpp +++ b/src/ftxui/component/screen_interactive_test.cpp @@ -47,6 +47,20 @@ TEST(ScreenInteractive, Signal_SIGFPE) { TestSignal(SIGFPE); } +// Regression test for: +// https://github.com/ArthurSonzogni/FTXUI/issues/402 +TEST(ScreenInteractive, PostEventToNonActive) { + auto screen = ScreenInteractive::FitComponent(); + screen.Post(Event::Custom); +} + +// Regression test for: +// https://github.com/ArthurSonzogni/FTXUI/issues/402 +TEST(ScreenInteractive, PostTaskToNonActive) { + auto screen = ScreenInteractive::FitComponent(); + screen.Post([] {}); +} + } // namespace ftxui // Copyright 2021 Arthur Sonzogni. All rights reserved.