mirror of
				https://github.com/ArthurSonzogni/FTXUI.git
				synced 2025-11-01 02:58:12 +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
	 ArthurSonzogni
					ArthurSonzogni