FTXUI 6.1.9
C++ functional terminal UI.
Chargement...
Recherche...
Aucune correspondance
terminal.cpp
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 qui se trouve
3// dans le fichier LICENSE.
4#include <cstdlib> // pour getenv
5#include <string> // pour string, allocator
6
8
9#if defined(_WIN32)
10#define WIN32_LEAN_AND_MEAN
11
12#ifndef NOMINMAX
13#define NOMINMAX
14#endif
15
16#include <windows.h>
17#else
18#include <sys/ioctl.h> // for winsize, ioctl, TIOCGWINSZ
19#include <unistd.h> // for STDOUT_FILENO
20#endif
21
22namespace ftxui {
23
24namespace {
25
26bool g_cached = false; // NOLINT
27Terminal::Color g_cached_supported_color; // NOLINT
28
29Dimensions& FallbackSize() {
30#if defined(__EMSCRIPTEN__)
31 // Cette dimension a été choisie arbitrairement pour pouvoir afficher :
32 // https://arthursonzogni.com/FTXUI/examples
33 // Cela devra être amélioré lorsque quelqu'un aura le temps de l'implémenter et en aura besoin.
34 constexpr int fallback_height = 43;
35#else
36 // La taille du terminal en VT100 était de 80x24. Elle est encore utilisée de nos jours par
37 // défaut dans de nombreux émulateurs de terminal. C'est un bon choix pour une valeur de
38 // repli.
39 constexpr int fallback_width = 80;
40 constexpr int fallback_height = 24;
41#endif
42 static Dimensions g_fallback_size{
43 fallback_width,
44 fallback_height,
45 };
46 return g_fallback_size;
47}
48
49const char* Safe(const char* c) {
50 return (c != nullptr) ? c : "";
51}
52
53bool Contains(const std::string& s, const char* key) {
54 return s.find(key) != std::string::npos;
55}
56
57Terminal::Color ComputeColorSupport() {
58#if defined(__EMSCRIPTEN__)
60#endif
61
62 std::string COLORTERM = Safe(std::getenv("COLORTERM")); // NOLINT
63 if (Contains(COLORTERM, "24bit") || Contains(COLORTERM, "truecolor")) {
65 }
66
67 std::string TERM = Safe(std::getenv("TERM")); // NOLINT
68 if (Contains(COLORTERM, "256") || Contains(TERM, "256")) {
70 }
71
72#if defined(FTXUI_MICROSOFT_TERMINAL_FALLBACK)
73 // Les terminaux Microsoft ne se déclarent pas correctement comme supportant les vraies
74 // couleurs : https://github.com/microsoft/terminal/issues/1040
75 // En guise de solution de repli, on suppose que les terminaux Microsoft sont ceux qui ne
76 // définissent pas ces variables, et on active les vraies couleurs.
77 if (TERM.empty() && COLORTERM.empty()) {
79 }
80#endif
81
83}
84
85} // namespace
86
87namespace Terminal {
88
89/// @brief Obtenir la taille du terminal.
90/// @return La taille du terminal.
91/// @ingroup screen
93#if defined(__EMSCRIPTEN__)
94 // Cette dimension a été choisie arbitrairement pour pouvoir afficher :
95 // https://arthursonzogni.com/FTXUI/examples
96 // Cela devra être amélioré lorsque quelqu'un aura le temps de l'implémenter et en aura besoin.
97 return FallbackSize();
98#elif defined(_WIN32)
99 CONSOLE_SCREEN_BUFFER_INFO csbi;
100
101 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
102 return Dimensions{csbi.srWindow.Right - csbi.srWindow.Left + 1,
103 csbi.srWindow.Bottom - csbi.srWindow.Top + 1};
104 }
105
106 return FallbackSize();
107#else
108 winsize w{};
109 const int status = ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); // NOLINT
110 // Le résultat de la valeur de retour ioctl doit être vérifié. Certains systèmes d'exploitation
111 // ne supportent pas TIOCGWINSZ.
112 if (w.ws_col == 0 || w.ws_row == 0 || status < 0) {
113 return FallbackSize();
114 }
115 return Dimensions{w.ws_col, w.ws_row};
116#endif
117}
118
119/// @brief Outrepasser la taille du terminal en cas d'échec de la détection automatique.
120/// @param fallbackSize Dimensions du terminal à utiliser en cas de repli.
121void SetFallbackSize(const Dimensions& fallbackSize) {
122 FallbackSize() = fallbackSize;
123}
124
125/// @brief Obtenir le support couleur du terminal.
126/// @ingroup screen
128 if (!g_cached) {
129 g_cached = true;
130 g_cached_supported_color = ComputeColorSupport();
131 }
132 return g_cached_supported_color;
133}
134
135/// @brief Outrepasser le support couleur du terminal en cas d'échec de la détection automatique.
136/// @ingroup dom
138 g_cached = true;
139 g_cached_supported_color = color;
140}
141
142} // namespace Terminal
143} // namespace ftxui
void SetColorSupport(Color color)
Outrepasser le support couleur du terminal en cas d'échec de la détection automatique.
Definition terminal.cpp:137
Decorator color(Color)
Décore en utilisant une couleur de premier plan.
Color
Color est une énumération qui représente le support des couleurs du terminal.
Definition terminal.hpp:23
Dimensions Size()
Obtenir la taille du terminal.
Definition terminal.cpp:92
Color ColorSupport()
Obtenir le support couleur du terminal.
Definition terminal.cpp:127
Dimensions est une structure qui représente la taille du terminal.
Definition terminal.hpp:11
void SetFallbackSize(const Dimensions &fallbackSize)
Outrepasser la taille du terminal en cas d'échec de la détection automatique.
Definition terminal.cpp:121
L'espace de noms FTXUI ftxui::
Definition animation.hpp:10