FTXUI 7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
app.hpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4#ifndef FTXUI_COMPONENT_APP_HPP
5#define FTXUI_COMPONENT_APP_HPP
6
7#include <atomic> // for atomic
8#include <chrono> // for steady_clock, time_point
9#include <functional> // for function
10#include <memory> // for shared_ptr, unique_ptr
11#include <string> // for string, basic_string, allocator
12#include <vector> // for vector
13
14#include "ftxui/component/animation.hpp" // for TimePoint
16#include "ftxui/component/task.hpp" // for Task, Closure
17#include "ftxui/screen/screen.hpp" // for Screen
18#include "ftxui/screen/terminal.hpp" // for Dimensions
19#include "ftxui/util/export.hpp"
20
21namespace ftxui {
22class ComponentBase;
23using Component = std::shared_ptr<ComponentBase>;
24struct Event;
25class Selection;
26class TaskRunner;
27
28/// @brief App es una clase que gestiona el ciclo de vida de la aplicación.
29/// Es responsable de inicializar la terminal, ejecutar el bucle principal,
30/// y limpiar al salir.
31///
32/// @note Esta clase se llamaba anteriormente ScreenInteractive.
33///
34/// @ingroup component
35class FTXUI_EXPORT(COMPONENT) App : public Screen {
36 public:
37 // Constructores:
38
39 /// @brief Crea una App con un tamaño fijo.
40 /// @param dimx El ancho de la app.
41 /// @param dimy El alto de la app.
42 static App FixedSize(int dimx, int dimy);
43
44 /// @brief Crea una App que ocupa el tamaño completo de la terminal. Esto usa
45 /// el búfer de pantalla alternativo para evitar interferir con el contenido de la terminal.
46 /// @note Esto es igual que `App::FullscreenAlternateScreen()`
47 static App Fullscreen();
48
49 /// @brief Crea una App que ocupa el tamaño completo de la terminal. Se usa
50 /// el búfer de pantalla primario. Esto significa que si se redimensiona la terminal, el contenido
51 /// anterior podría interferir con el contenido de la terminal.
52 static App FullscreenPrimaryScreen();
53
54 /// @brief Crea una App que ocupa el tamaño completo de la terminal. Esto usa
55 /// el búfer de pantalla alternativo para evitar interferir con el contenido de la terminal.
56 static App FullscreenAlternateScreen();
57
58 /// @brief Crea una App cuyo ancho y alto coinciden con el componente que se
59 /// dibuja.
60 static App FitComponent();
61
62 /// @brief Crea una App cuyo ancho coincide con el ancho de salida de la terminal y
63 /// el alto coincide con el componente que se dibuja.
64 static App TerminalOutput();
65
66 // Destructor.
67 ~App() override;
68
69 App(App&&) noexcept;
70 App& operator=(App&&) noexcept;
71 App(const App&) = delete;
72 App& operator=(const App&) = delete;
73
74 // Opciones. Debe ser llamado antes de Loop().
75
76 /// @brief Establece si el mouse se rastrea y se reportan sus eventos.
77 /// @param enable Si se debe habilitar el rastreo de eventos del mouse.
78 /// @note El rastreo del mouse está habilitado por defecto.
79 /// @note El rastreo del mouse solo es compatible con terminales que lo soportan.
80 /// @note Esto debe llamarse antes de llamar a `App::Loop`.
81 void TrackMouse(bool enable = true);
82
83 /// @brief Habilita o deshabilita el manejo automático de la entrada por tubería (pipe).
84 /// Cuando está habilitado, FTXUI detectará la entrada por tubería y redirigirá stdin desde
85 /// /dev/tty para la entrada del teclado, permitiendo que las aplicaciones lean datos por tubería
86 /// mientras siguen recibiendo eventos de teclado interactivos.
87 /// @param enable Si se debe habilitar el manejo de entrada por tubería. Por defecto es true.
88 /// @note Esto debe llamarse antes de Loop().
89 /// @note Esta función está habilitada por defecto.
90 /// @note Esta función solo está disponible en sistemas POSIX (Linux/macOS).
91 void HandlePipedInput(bool enable = true);
92
93 /// @brief Devuelve la app actualmente activa, nullptr si no hay ninguna.
94 static App* Active();
95
96 // Iniciar/Detener el bucle principal.
97
98 /// @brief Ejecuta el bucle principal.
99 /// @param component El componente a dibujar.
100 void Loop(Component component);
101
102 /// @brief Sale del bucle principal.
103 void Exit();
104
105 /// @brief Devuelve una función para salir del bucle principal.
106 Closure ExitLoopClosure();
107
108 /// @brief Decora una función. La función resultante se ejecutará de forma similar
109 /// a la de entrada, pero con los ganchos de terminal de la app actualmente activa
110 /// desinstalados temporalmente.
111 Closure WithRestoredIO(Closure fn);
112
113 /// @brief FTXUI implementa manejadores para Ctrl-C y Ctrl-Z. Por defecto, estos
114 /// manejadores se ejecutan, incluso si el componente captura el evento. Esto evita que
115 /// los usuarios que manejan cada evento queden atrapados en la aplicación. Sin embargo, en
116 /// algunos casos, la aplicación puede querer manejar estos eventos ella misma. En
117 /// este caso, la aplicación puede forzar a FTXUI a no manejar estos eventos
118 /// llamando a las siguientes funciones con force=true.
119 void ForceHandleCtrlC(bool force = true);
120
121 /// @brief Fuerza a FTXUI a manejar o no manejar Ctrl-Z, incluso si el componente
122 /// captura el Event::CtrlZ.
123 void ForceHandleCtrlZ(bool force = true);
124
125 // Publica tareas para ser ejecutadas por el bucle.
126
127 /// @brief Agrega una tarea al bucle principal.
128 /// Se ejecutará más tarde, después de todas las demás tareas programadas.
129 void Post(Task task);
130
131 /// @brief Agrega un evento al bucle principal.
132 /// Se ejecutará más tarde, después de todos los demás eventos programados.
133 void PostEvent(Event event);
134
135 /// @brief Agrega una tarea al bucle principal.
136 /// Se ejecutará más tarde, después de todas las demás tareas programadas.
137 static void PostEventOrExecute(Closure closure);
138
139 /// @brief Agrega una tarea para dibujar la pantalla una vez más, hasta que todas las
140 /// animaciones hayan terminado.
141 void RequestAnimationFrame();
142
143 // API de selección:
144
145 /// @brief Intenta obtener el bloqueo exclusivo (unique lock) para poder capturar el mouse.
146 /// @return Un bloqueo exclusivo si el mouse no está ya capturado, de lo contrario un
147 /// null.
148 CapturedMouse CaptureMouse();
149
150 /// @brief Devuelve el contenido de la selección actual.
151 std::string GetSelection();
152
153 /// @brief Establece una función de retorno (callback) que se llamará cuando la selección cambie.
154 void SelectionChange(std::function<void()> callback);
155
156 // Información de la terminal.
157
158 /// @brief Devuelve el nombre de la terminal.
159 const std::string& TerminalName() const;
160
161 /// @brief Devuelve la versión de la terminal.
162 int TerminalVersion() const;
163
164 /// @brief Devuelve el nombre del emulador de terminal.
165 const std::string& TerminalEmulatorName() const;
166
167 /// @brief Devuelve la versión del emulador de terminal.
168 const std::string& TerminalEmulatorVersion() const;
169
170 /// @brief Devuelve las capacidades de la terminal.
171 const std::vector<int>& TerminalCapabilities() const;
172
173 /// @brief Devuelve los nombres de las capacidades de la terminal.
174 std::vector<std::string> TerminalCapabilityNames() const;
175
176 private:
177 void ExitNow();
178 void Install();
179 void Uninstall();
180
181 void PreMain();
182 void PostMain();
183
184 /// @brief Devuelve si el bucle principal ha terminado.
185 bool HasQuitted();
186 void RunOnce(const Component& component);
187 void RunOnceBlocking(Component component);
188
189 void HandleTask(Component component, Task& task);
190 bool HandleSelection(bool handled, Event event);
191 void Draw(Component component);
192 std::string ResetCursorPosition();
193
194 void RequestCursorPosition(bool force = false);
195
196 void TerminalSend(std::string_view);
197 void TerminalFlush();
198
199 void InstallPipedInputHandling();
200 void InstallTerminalInfo();
201
202 void Signal(int signal);
203
204 size_t FetchTerminalEvents();
205
206 void PostAnimationTask();
207
208 struct Internal;
209 explicit App(std::unique_ptr<Internal> internal, int dimx, int dimy);
210
211 std::unique_ptr<Internal> internal_;
212
213 friend class Loop;
214
215 public:
216 class Private {
217 public:
218 static void Signal(App& s, int signal) { s.Signal(signal); }
219 };
220 friend Private;
221};
222
223} // namespace ftxui
224
225#endif /* end of include guard: FTXUI_COMPONENT_APP_HPP */
El espacio de nombres ftxui:: de FTXUI.
Definition animation.hpp:11
std::unique_ptr< CapturedMouseInterface > CapturedMouse
std::variant< Event, Closure, AnimationTask > Task
Definition task.hpp:14
std::function< void()> Closure
Definition task.hpp:13
std::shared_ptr< ComponentBase > Component
Definition app.hpp:23