FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
screen_interactive.hpp
Aller à la documentation de ce fichier.
1// Copyright 2020 Arthur Sonzogni. Tous droits réservés.
2// L'utilisation de ce code source est régie par la licence MIT que l'on peut trouver dans
3// le fichier LICENSE.
4#ifndef FTXUI_COMPONENT_SCREEN_INTERACTIVE_HPP
5#define FTXUI_COMPONENT_SCREEN_INTERACTIVE_HPP
6
7#include <atomic> // for atomic
8#include <functional> // for function
9#include <memory> // for shared_ptr
10#include <string> // for string
11
12#include "ftxui/component/animation.hpp" // for TimePoint
13#include "ftxui/component/captured_mouse.hpp" // for CapturedMouse
14#include "ftxui/component/event.hpp" // for Event
15#include "ftxui/component/task.hpp" // for Task, Closure
16#include "ftxui/dom/selection.hpp" // for SelectionOption
17#include "ftxui/screen/screen.hpp" // for Screen
18
19namespace ftxui {
20class ComponentBase;
21class Loop;
22struct Event;
23
24using Component = std::shared_ptr<ComponentBase>;
25class ScreenInteractivePrivate;
26
27namespace task {
28class TaskRunner;
29}
30
31/// @brief ScreenInteractive est un `Screen` qui peut gérer les événements, exécuter une boucle
32/// principale et gérer les composants.
33///
34/// @ingroup component
35class ScreenInteractive : public Screen {
36 public:
37 // Constructors:
38 static ScreenInteractive FixedSize(int dimx, int dimy);
44
45 // Destructor.
47
48 // Options. Must be called before Loop().
49 void TrackMouse(bool enable = true);
50 void HandlePipedInput(bool enable = true);
51
52 // Return the currently active screen, nullptr if none.
53 static ScreenInteractive* Active();
54
55 // Start/Stop the main loop.
56 void Loop(Component);
57 void Exit();
59
60 // Post tasks to be executed by the loop.
61 void Post(Task task);
62 void PostEvent(Event event);
64
66
67 // Décore une fonction. Celle qui en résulte s'exécutera de manière similaire à celle qui
68 // a été entrée, mais avec les hooks du terminal de l'écran actuellement actif
69 // temporairement désinstallés.
71
72 // FTXUI implémente des gestionnaires pour Ctrl-C et Ctrl-Z. Par défaut, ces gestionnaires
73 // sont exécutés, même si le composant intercepte l'événement. Cela évite aux utilisateurs
74 // de gérer chaque événement d'être piégés dans l'application. Cependant, dans certains
75 // cas, l'application peut vouloir gérer ces événements elle-même. Dans ce
76 // cas, l'application peut forcer FTXUI à ne pas gérer ces événements en appelant
77 // les fonctions suivantes avec force=true.
78 void ForceHandleCtrlC(bool force);
79 void ForceHandleCtrlZ(bool force);
80
81 // Selection API.
82 std::string GetSelection();
83 void SelectionChange(std::function<void()> callback);
84
85 private:
86 void ExitNow();
87
88 void Install();
89 void Uninstall();
90
91 void PreMain();
92 void PostMain();
93
94 bool HasQuitted();
95 void RunOnce(Component component);
96 void RunOnceBlocking(Component component);
97
98 void HandleTask(Component component, Task& task);
99 bool HandleSelection(bool handled, Event event);
100 void RefreshSelection();
101 void Draw(Component component);
102 void ResetCursorPosition();
103
104 void InstallPipedInputHandling();
105
106 void Signal(int signal);
107
108 void FetchTerminalEvents();
109
110 void PostAnimationTask();
111
112 ScreenInteractive* suspended_screen_ = nullptr;
113 enum class Dimension {
115 Fixed,
118 };
120 int dimx,
121 int dimy,
122 bool use_alternative_screen);
123
124 const Dimension dimension_;
125 const bool use_alternative_screen_;
126
127 bool track_mouse_ = true;
128
129 std::string set_cursor_position;
130 std::string reset_cursor_position;
131
132 std::atomic<bool> quit_{false};
133 bool animation_requested_ = false;
134 animation::TimePoint previous_animation_time_;
135
136 int cursor_x_ = 1;
137 int cursor_y_ = 1;
138
139 std::uint64_t frame_count_ = 0;
140 bool mouse_captured = false;
141 bool previous_frame_resized_ = false;
142
143 bool frame_valid_ = false;
144
145 bool force_handle_ctrl_c_ = true;
146 bool force_handle_ctrl_z_ = true;
147
148 // État de la gestion de l'entrée piped (POSIX uniquement)
149 bool handle_piped_input_ = true;
150 // Descripteur de fichier pour /dev/tty, utilisé pour la gestion de l'entrée piped.
151 int tty_fd_ = -1;
152
153 // Le style du curseur à restaurer à la sortie.
154 int cursor_reset_shape_ = 1;
155
156 // API de sélection:
157 CapturedMouse selection_pending_;
158 struct SelectionData {
159 int start_x = -1;
160 int start_y = -1;
161 int end_x = -2;
162 int end_y = -2;
163 bool empty = true;
164 bool operator==(const SelectionData& other) const;
165 bool operator!=(const SelectionData& other) const;
166 };
167 SelectionData selection_data_;
168 SelectionData selection_data_previous_;
169 std::unique_ptr<Selection> selection_;
170 std::function<void()> selection_on_change_;
171
172 // Idiome d'implémentation privée PIMPL (Pimpl).
173 struct Internal;
174 std::unique_ptr<Internal> internal_;
175
176 friend class Loop;
177
178 Component component_;
179
180 public:
181 class Private {
182 public:
183 static void Signal(ScreenInteractive& s, int signal) { s.Signal(signal); }
184 };
185 friend Private;
186};
187
188} // namespace ftxui
189
190#endif /* end of include guard: FTXUI_COMPONENT_SCREEN_INTERACTIVE_HPP */
static void Signal(ScreenInteractive &s, int signal)
screen Loop(composition)
static ScreenInteractive TerminalOutput()
void HandlePipedInput(bool enable=true)
Active ou désactive la gestion automatique des entrées pipées. Lorsqu'elle est activée,...
void Exit()
Quitte la boucle principale.
static ScreenInteractive FixedSize(int dimx, int dimy)
void PostEvent(Event event)
Ajoute un événement à la boucle principale. Il sera exécuté plus tard, après tous les autres événemen...
void Post(Task task)
Ajoute une tâche à la boucle principale. Elle sera exécutée plus tard, après toutes les autres tâches...
static ScreenInteractive FitComponent()
static ScreenInteractive Fullscreen()
static ScreenInteractive FullscreenPrimaryScreen()
static ScreenInteractive * Active()
Retourne l'écran actuellement actif, ou null si aucun.
CapturedMouse CaptureMouse()
Tente d'obtenir le verrou unique permettant de capturer la souris.
std::string GetSelection()
Retourne le contenu de la sélection actuelle.
static ScreenInteractive FullscreenAlternateScreen()
void TrackMouse(bool enable=true)
Définit si la souris est suivie et si les événements sont signalés. appelé en dehors de la boucle pri...
void SelectionChange(std::function< void()> callback)
void RequestAnimationFrame()
Ajoute une tâche pour dessiner l'écran une fois de plus, jusqu'à ce que toutes les animations soient ...
Closure ExitLoopClosure()
Retourne une fonction pour quitter la boucle principale.
void ForceHandleCtrlC(bool force)
Force FTXUI à gérer ou non le Ctrl-C, même si le composant intercepte l'événement Event::CtrlC.
void ForceHandleCtrlZ(bool force)
Force FTXUI à gérer ou non le Ctrl-Z, même si le composant intercepte l'événement Event::CtrlZ.
Closure WithRestoredIO(Closure)
Décore une fonction. Elle s'exécute de la même manière, mais avec les hooks du terminal de l'écran ac...
Loop est une classe qui gère la boucle d'événements pour un composant.
Definition loop.hpp:56
ScreenInteractive est un Screen qui peut gérer les événements, exécuter une boucle principale et gére...
Représente un événement. Il peut s'agir d'un événement de touche, d'un redimensionnement de terminal,...
Definition event.hpp:28
int dimy() const
Definition image.hpp:36
int dimx() const
Definition image.hpp:35
Une grille rectangulaire de pixels.
Definition screen.hpp:26
L'espace de noms FTXUI ftxui::Dimension::
std::chrono::time_point< Clock > TimePoint
Definition animation.hpp:29
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10
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