mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-09-18 00:48:09 +08:00
Implement "alternative screen".
Apply this option automatically for "fullscreen" screen. Keep it disabled for the other modes. This fixes issue: https://github.com/GiuseppeCesarano/just-fast/issues/2
This commit is contained in:
@@ -124,6 +124,9 @@ static const char* SHOW_CURSOR = "\x1B[?25h";
|
||||
static const char* DISABLE_LINE_WRAP = "\x1B[7l";
|
||||
static const char* ENABLE_LINE_WRAP = "\x1B[7h";
|
||||
|
||||
static const char* USE_ALTERNATIVE_SCREEN = "\x1B[?1049h";
|
||||
static const char* USE_NORMAL_SCREEN = "\x1B[?1049l";
|
||||
|
||||
using SignalHandler = void(int);
|
||||
std::stack<std::function<void()>> on_exit_functions;
|
||||
void OnExit(int signal) {
|
||||
@@ -146,8 +149,13 @@ void OnResize(int /* signal */) {
|
||||
on_resize();
|
||||
}
|
||||
|
||||
ScreenInteractive::ScreenInteractive(int dimx, int dimy, Dimension dimension)
|
||||
: Screen(dimx, dimy), dimension_(dimension) {
|
||||
ScreenInteractive::ScreenInteractive(int dimx,
|
||||
int dimy,
|
||||
Dimension dimension,
|
||||
bool use_alternative_screen)
|
||||
: Screen(dimx, dimy),
|
||||
dimension_(dimension),
|
||||
use_alternative_screen_(use_alternative_screen) {
|
||||
event_receiver_ = MakeReceiver<Event>();
|
||||
event_sender_ = event_receiver_->MakeSender();
|
||||
}
|
||||
@@ -156,22 +164,22 @@ ScreenInteractive::~ScreenInteractive() {}
|
||||
|
||||
// static
|
||||
ScreenInteractive ScreenInteractive::FixedSize(int dimx, int dimy) {
|
||||
return ScreenInteractive(dimx, dimy, Dimension::Fixed);
|
||||
return ScreenInteractive(dimx, dimy, Dimension::Fixed, false);
|
||||
}
|
||||
|
||||
// static
|
||||
ScreenInteractive ScreenInteractive::Fullscreen() {
|
||||
return ScreenInteractive(0, 0, Dimension::Fullscreen);
|
||||
return ScreenInteractive(0, 0, Dimension::Fullscreen, true);
|
||||
}
|
||||
|
||||
// static
|
||||
ScreenInteractive ScreenInteractive::TerminalOutput() {
|
||||
return ScreenInteractive(0, 0, Dimension::TerminalOutput);
|
||||
return ScreenInteractive(0, 0, Dimension::TerminalOutput, false);
|
||||
}
|
||||
|
||||
// static
|
||||
ScreenInteractive ScreenInteractive::FitComponent() {
|
||||
return ScreenInteractive(0, 0, Dimension::FitComponent);
|
||||
return ScreenInteractive(0, 0, Dimension::FitComponent, false);
|
||||
}
|
||||
|
||||
void ScreenInteractive::PostEvent(Event event) {
|
||||
@@ -257,6 +265,11 @@ void ScreenInteractive::Loop(Component* component) {
|
||||
std::thread(&UnixEventListener, &quit_, std::move(char_sender));
|
||||
#endif
|
||||
|
||||
if (use_alternative_screen_) {
|
||||
std::cout << USE_ALTERNATIVE_SCREEN;
|
||||
on_exit_functions.push([] { std::cout << USE_NORMAL_SCREEN; });
|
||||
}
|
||||
|
||||
// The main loop.
|
||||
while (!quit_) {
|
||||
std::cout << reset_cursor_position << ResetPosition();
|
||||
|
Reference in New Issue
Block a user