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 est une classe qui gère le cycle de vie de l'application.
29/// Elle est responsable de l'initialisation du terminal, de l'exécution de la
30/// boucle principale, et du nettoyage à la sortie.
31///
32/// @note Cette classe s'appelait précédemment ScreenInteractive.
33///
34/// @ingroup component
35class FTXUI_EXPORT(COMPONENT) App : public Screen {
36 public:
37 // Constructeurs :
38
39 /// @brief Crée une App de taille fixe.
40 /// @param dimx La largeur de l'application.
41 /// @param dimy La hauteur de l'application.
42 static App FixedSize(int dimx, int dimy);
43
44 /// @brief Crée une App occupant toute la taille du terminal. Ceci utilise
45 /// le tampon d'écran alternatif afin de ne pas perturber le contenu du
46 /// terminal.
47 /// @note Ceci est identique à `App::FullscreenAlternateScreen()`
48 static App Fullscreen();
49
50 /// @brief Crée une App occupant toute la taille du terminal. Le tampon
51 /// d'écran principal est utilisé. Cela signifie que si le terminal est
52 /// redimensionné, le contenu précédent peut perturber le contenu du
53 /// terminal.
54 static App FullscreenPrimaryScreen();
55
56 /// @brief Crée une App occupant toute la taille du terminal. Ceci utilise
57 /// le tampon d'écran alternatif afin de ne pas perturber le contenu du
58 /// terminal.
59 static App FullscreenAlternateScreen();
60
61 /// @brief Crée une App dont la largeur et la hauteur correspondent au
62 /// composant dessiné.
63 static App FitComponent();
64
65 /// @brief Crée une App dont la largeur correspond à la largeur de sortie du
66 /// terminal et dont la hauteur correspond au composant dessiné.
67 static App TerminalOutput();
68
69 // Destructeur.
70 ~App() override;
71
72 App(App&&) noexcept;
73 App& operator=(App&&) noexcept;
74 App(const App&) = delete;
75 App& operator=(const App&) = delete;
76
77 // Options. Doivent être appelées avant Loop().
78
79 /// @brief Définit si la souris est suivie et si ses événements sont
80 /// rapportés.
81 /// @param enable Indique s'il faut activer le suivi des événements souris.
82 /// @note Le suivi de la souris est activé par défaut.
83 /// @note Le suivi de la souris n'est supporté que sur les terminaux qui le
84 /// prennent en charge.
85 /// @note Ceci doit être appelé avant d'appeler `App::Loop`.
86 void TrackMouse(bool enable = true);
87
88 /// @brief Active ou désactive la gestion automatique de l'entrée redirigée
89 /// (pipe).
90 /// Lorsque cela est activé, FTXUI détectera une entrée redirigée et
91 /// redirigera stdin depuis /dev/tty pour les entrées clavier, permettant
92 /// aux applications de lire les données redirigées tout en continuant à
93 /// recevoir les événements clavier interactifs.
94 /// @param enable Indique s'il faut activer la gestion de l'entrée redirigée.
95 /// Par défaut à true.
96 /// @note Ceci doit être appelé avant Loop().
97 /// @note Cette fonctionnalité est activée par défaut.
98 /// @note Cette fonctionnalité n'est disponible que sur les systèmes POSIX
99 /// (Linux/macOS).
100 void HandlePipedInput(bool enable = true);
101
102 /// @brief Retourne l'application actuellement active, nullptr si aucune.
103 static App* Active();
104
105 // Démarrer/arrêter la boucle principale.
106
107 /// @brief Exécute la boucle principale.
108 /// @param component Le composant à dessiner.
109 void Loop(Component component);
110
111 /// @brief Quitte la boucle principale.
112 void Exit();
113
114 /// @brief Retourne une fonction permettant de quitter la boucle principale.
115 Closure ExitLoopClosure();
116
117 /// @brief Décore une fonction. La fonction retournée s'exécutera de manière
118 /// similaire à celle passée en entrée, mais avec les hooks du terminal de
119 /// l'application actuellement active temporairement désinstallés.
120 Closure WithRestoredIO(Closure fn);
121
122 /// @brief FTXUI implémente des gestionnaires pour Ctrl-C et Ctrl-Z. Par
123 /// défaut, ces gestionnaires sont exécutés, même si le composant intercepte
124 /// l'événement. Cela évite aux utilisateurs de devoir gérer chaque
125 /// événement pour ne pas rester piégés dans l'application. Cependant, dans
126 /// certains cas, l'application peut vouloir gérer ces événements
127 /// elle-même. Dans ce cas, l'application peut forcer FTXUI à ne pas gérer
128 /// ces événements en appelant les fonctions suivantes avec force=true.
129 void ForceHandleCtrlC(bool force = true);
130
131 /// @brief Force FTXUI à gérer ou non Ctrl-Z, même si le composant intercepte
132 /// l'Event::CtrlZ.
133 void ForceHandleCtrlZ(bool force = true);
134
135 // Poster des tâches à exécuter par la boucle.
136
137 /// @brief Ajoute une tâche à la boucle principale.
138 /// Elle sera exécutée plus tard, après toutes les autres tâches planifiées.
139 void Post(Task task);
140
141 /// @brief Ajoute un événement à la boucle principale.
142 /// Il sera exécuté plus tard, après tous les autres événements planifiés.
143 void PostEvent(Event event);
144
145 /// @brief Ajoute une tâche à la boucle principale.
146 /// Elle sera exécutée plus tard, après toutes les autres tâches planifiées.
147 static void PostEventOrExecute(Closure closure);
148
149 /// @brief Ajoute une tâche pour dessiner l'écran une fois de plus, jusqu'à
150 /// ce que toutes les animations soient terminées.
151 void RequestAnimationFrame();
152
153 // API de sélection :
154
155 /// @brief Tente d'obtenir le verrou unique permettant de capturer la
156 /// souris.
157 /// @return Un verrou unique si la souris n'est pas déjà capturée, sinon
158 /// null.
159 CapturedMouse CaptureMouse();
160
161 /// @brief Retourne le contenu de la sélection actuelle.
162 std::string GetSelection();
163
164 /// @brief Définit un callback qui sera appelé lorsque la sélection change.
165 void SelectionChange(std::function<void()> callback);
166
167 // Informations sur le terminal.
168
169 /// @brief Retourne le nom du terminal.
170 const std::string& TerminalName() const;
171
172 /// @brief Retourne la version du terminal.
173 int TerminalVersion() const;
174
175 /// @brief Retourne le nom de l'émulateur de terminal.
176 const std::string& TerminalEmulatorName() const;
177
178 /// @brief Retourne la version de l'émulateur de terminal.
179 const std::string& TerminalEmulatorVersion() const;
180
181 /// @brief Retourne les capacités du terminal.
182 const std::vector<int>& TerminalCapabilities() const;
183
184 /// @brief Retourne les noms des capacités du terminal.
185 std::vector<std::string> TerminalCapabilityNames() const;
186
187 private:
188 void ExitNow();
189 void Install();
190 void Uninstall();
191
192 void PreMain();
193 void PostMain();
194
195 /// @brief Retourne si la boucle principale a été quittée.
196 bool HasQuitted();
197 void RunOnce(const Component& component);
198 void RunOnceBlocking(Component component);
199
200 void HandleTask(Component component, Task& task);
201 bool HandleSelection(bool handled, Event event);
202 void Draw(Component component);
203 std::string ResetCursorPosition();
204
205 void RequestCursorPosition(bool force = false);
206
207 void TerminalSend(std::string_view);
208 void TerminalFlush();
209
210 void InstallPipedInputHandling();
211 void InstallTerminalInfo();
212
213 void Signal(int signal);
214
215 size_t FetchTerminalEvents();
216
217 void PostAnimationTask();
218
219 struct Internal;
220 explicit App(std::unique_ptr<Internal> internal, int dimx, int dimy);
221
222 std::unique_ptr<Internal> internal_;
223
224 friend class Loop;
225
226 public:
227 class Private {
228 public:
229 static void Signal(App& s, int signal) { s.Signal(signal); }
230 };
231 friend Private;
232};
233
234} // namespace ftxui
235
236#endif /* end of include guard: FTXUI_COMPONENT_APP_HPP */
L'espace de noms FTXUI 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