diff --git a/include/ftxui/component/screen_interactive.hpp b/include/ftxui/component/screen_interactive.hpp index f3460917..6c938f2c 100644 --- a/include/ftxui/component/screen_interactive.hpp +++ b/include/ftxui/component/screen_interactive.hpp @@ -105,11 +105,12 @@ class ScreenInteractive : public Screen { Fullscreen, TerminalOutput, }; - Dimension dimension_ = Dimension::Fixed; - bool use_alternative_screen_ = false; - ScreenInteractive(int dimx, + const Dimension dimension_ = Dimension::Fixed; + const bool use_alternative_screen_ = false; + + ScreenInteractive(Dimension dimension, + int dimx, int dimy, - Dimension dimension, bool use_alternative_screen); bool track_mouse_ = true; @@ -129,6 +130,7 @@ class ScreenInteractive : public Screen { int cursor_x_ = 1; int cursor_y_ = 1; + std::uint64_t frame_count_ = 0; bool mouse_captured = false; bool previous_frame_resized_ = false; diff --git a/src/ftxui/component/screen_interactive.cpp b/src/ftxui/component/screen_interactive.cpp index 83ff4049..dadeff7e 100644 --- a/src/ftxui/component/screen_interactive.cpp +++ b/src/ftxui/component/screen_interactive.cpp @@ -346,9 +346,9 @@ void AnimationListener(std::atomic* quit, Sender out) { } // namespace -ScreenInteractive::ScreenInteractive(int dimx, +ScreenInteractive::ScreenInteractive(Dimension dimension, + int dimx, int dimy, - Dimension dimension, bool use_alternative_screen) : Screen(dimx, dimy), dimension_(dimension), @@ -359,10 +359,10 @@ ScreenInteractive::ScreenInteractive(int dimx, // static ScreenInteractive ScreenInteractive::FixedSize(int dimx, int dimy) { return { + Dimension::Fixed, dimx, dimy, - Dimension::Fixed, - false, + /*use_alternative_screen=*/false, }; } @@ -379,11 +379,12 @@ ScreenInteractive ScreenInteractive::Fullscreen() { /// content might mess up with the terminal content. // static ScreenInteractive ScreenInteractive::FullscreenPrimaryScreen() { + auto terminal = Terminal::Size(); return { - 0, - 0, - Dimension::Fullscreen, - false, + Dimension::Fullscreen, + terminal.dimx, + terminal.dimy, + /*use_alternative_screen=*/false, }; } @@ -391,30 +392,37 @@ ScreenInteractive ScreenInteractive::FullscreenPrimaryScreen() { /// alternate screen buffer to avoid messing with the terminal content. // static ScreenInteractive ScreenInteractive::FullscreenAlternateScreen() { + auto terminal = Terminal::Size(); return { - 0, - 0, Dimension::Fullscreen, - true, + terminal.dimx, + terminal.dimy, + /*use_alternative_screen=*/true, }; } +/// Create a ScreenInteractive whose width match the terminal output width and +/// the height matches the component being drawn. // static ScreenInteractive ScreenInteractive::TerminalOutput() { + auto terminal = Terminal::Size(); return { - 0, - 0, Dimension::TerminalOutput, - false, + terminal.dimx, + terminal.dimy, // Best guess. + /*use_alternative_screen=*/false, }; } +/// Create a ScreenInteractive whose width and height match the component being +/// drawn. // static ScreenInteractive ScreenInteractive::FitComponent() { + auto terminal = Terminal::Size(); return { - 0, - 0, Dimension::FitComponent, + terminal.dimx, // Best guess. + terminal.dimy, // Best guess. false, }; } @@ -921,7 +929,7 @@ void ScreenInteractive::Draw(Component component) { break; } - const bool resized = (dimx != dimx_) || (dimy != dimy_); + const bool resized = frame_count_ == 0 || (dimx != dimx_) || (dimy != dimy_); ResetCursorPosition(); std::cout << ResetPosition(/*clear=*/resized); @@ -1004,6 +1012,7 @@ void ScreenInteractive::Draw(Component component) { Flush(); Clear(); frame_valid_ = true; + frame_count_++; } // private