FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
terminal.cpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. All rights reserved.
2// このソースコードの使用は、LICENSE ファイルにある MIT ライセンスに従います。
3#include <cstdlib> // for getenv
4#include <string> // for string, allocator
5
7
8#if defined(_WIN32)
9#define WIN32_LEAN_AND_MEAN
10
11#ifndef NOMINMAX
12#define NOMINMAX
13#endif
14
15#include <windows.h>
16#else
17#include <sys/ioctl.h> // for winsize, ioctl, TIOCGWINSZ
18#include <unistd.h> // for STDOUT_FILENO
19#endif
20
21namespace ftxui {
22
23namespace {
24
25bool g_cached = false; // NOLINT
26Terminal::Color g_cached_supported_color; // NOLINT
27
28Dimensions& FallbackSize() {
29#if defined(__EMSCRIPTEN__)
30 // このサイズは、https://arthursonzogni.com/FTXUI/examples を表示できるように任意に選択されました。
31 // これは、誰かが実装して必要になったときに改善される必要があります。
32 constexpr int fallback_width = 140;
33 constexpr int fallback_height = 43;
34#else
35 // VT100のターミナルサイズは80x24でした。これは今日の多くのターミナルエミュレータでデフォルトとして使用されています。これはフォールバック値として良い選択です。
36 constexpr int fallback_width = 80;
37 constexpr int fallback_height = 24;
38#endif
39 static Dimensions g_fallback_size{
40 fallback_width,
41 fallback_height,
42 };
43 return g_fallback_size;
44}
45
46const char* Safe(const char* c) {
47 return (c != nullptr) ? c : "";
48}
49
50bool Contains(const std::string& s, const char* key) {
51 return s.find(key) != std::string::npos;
52}
53
54Terminal::Color ComputeColorSupport() {
55#if defined(__EMSCRIPTEN__)
57#endif
58
59 std::string COLORTERM = Safe(std::getenv("COLORTERM")); // NOLINT
60 if (Contains(COLORTERM, "24bit") || Contains(COLORTERM, "truecolor")) {
62 }
63
64 std::string TERM = Safe(std::getenv("TERM")); // NOLINT
65 if (Contains(COLORTERM, "256") || Contains(TERM, "256")) {
67 }
68
69#if defined(FTXUI_MICROSOFT_TERMINAL_FALLBACK)
70 // Microsoftのターミナルは、TrueColorのサポートを適切に宣言していません: https://github.com/microsoft/terminal/issues/1040
71 // フォールバックとして、これらの変数を設定していないターミナルをMicrosoft製であると仮定し、TrueColorを有効にします。
72 if (TERM.empty() && COLORTERM.empty()) {
74 }
75#endif
76
78}
79
80} // namespace
81
82namespace Terminal {
83
84/// @brief ターミナルサイズを取得します。
85/// @return ターミナルサイズ。
86/// @ingroup screen
88#if defined(__EMSCRIPTEN__)
89 // このサイズは、https://arthursonzogni.com/FTXUI/examples を表示できるように任意に選択されました。
90 // これは、誰かが実装して必要になったときに改善される必要があります。
91 return FallbackSize();
92#elif defined(_WIN32)
93 CONSOLE_SCREEN_BUFFER_INFO csbi;
94
95 if (GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi)) {
96 return Dimensions{csbi.srWindow.Right - csbi.srWindow.Left + 1,
97 csbi.srWindow.Bottom - csbi.srWindow.Top + 1};
98 }
99
100 return FallbackSize();
101#else
102 winsize w{};
103 const int status = ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); // NOLINT
104 // ioctlの戻り値は確認する必要があります。一部のオペレーティングシステムはTIOCGWINSZをサポートしていません。
105 if (w.ws_col == 0 || w.ws_row == 0 || status < 0) {
106 return FallbackSize();
107 }
108 return Dimensions{w.ws_col, w.ws_row};
109#endif
110}
111
112/// @brief 自動検出が失敗した場合にターミナルサイズを上書きします
113/// @param fallbackSize フォールバックするターミナルサイズ
114void SetFallbackSize(const Dimensions& fallbackSize) {
115 FallbackSize() = fallbackSize;
116}
117
118/// @brief ターミナルの色サポートを取得します。
119/// @ingroup screen
121 if (!g_cached) {
122 g_cached = true;
123 g_cached_supported_color = ComputeColorSupport();
124 }
125 return g_cached_supported_color;
126}
127
128/// @brief 自動検出が失敗した場合にターミナルの色サポートを上書きします
129/// @ingroup dom
131 g_cached = true;
132 g_cached_supported_color = color;
133}
134
135} // namespace Terminal
136} // namespace ftxui
void SetColorSupport(Color color)
自動検出が失敗した場合にターミナルの色サポートを上書きします
Definition terminal.cpp:130
Decorator color(Color)
前景色を使用して装飾します。
Color
Colorは、ターミナルの色サポートを表す列挙型です。
Definition terminal.hpp:21
Dimensions Size()
ターミナルサイズを取得します。
Definition terminal.cpp:87
Color ColorSupport()
ターミナルの色サポートを取得します。
Definition terminal.cpp:120
Dimensionsは、ターミナルのサイズを表す構造体です。
Definition terminal.hpp:10
FTXUI ftxui::Terminal::名前空間
void SetFallbackSize(const Dimensions &fallbackSize)
自動検出が失敗した場合にターミナルサイズを上書きします
Definition terminal.cpp:114
FTXUI ftxui:: 名前空間
Definition animation.hpp:9