mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-12-16 01:48:56 +08:00
Compare commits
3 Commits
3e04ffc5b3
...
8daba47a21
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8daba47a21 | ||
|
|
994915dbb9 | ||
|
|
baa5973128 |
@@ -6,6 +6,7 @@ add_library(ftxui-modules)
|
|||||||
|
|
||||||
target_sources(ftxui-modules
|
target_sources(ftxui-modules
|
||||||
PUBLIC FILE_SET CXX_MODULES FILES
|
PUBLIC FILE_SET CXX_MODULES FILES
|
||||||
|
src/ftxui/ftxui.cppm
|
||||||
src/ftxui/component.cppm
|
src/ftxui/component.cppm
|
||||||
src/ftxui/component/animation.cppm
|
src/ftxui/component/animation.cppm
|
||||||
src/ftxui/component/captured_mouse.cppm
|
src/ftxui/component/captured_mouse.cppm
|
||||||
|
|||||||
@@ -12,8 +12,24 @@ FTXUI experimentally supports
|
|||||||
compilation times and improve code organization. Each header has a
|
compilation times and improve code organization. Each header has a
|
||||||
corresponding module.
|
corresponding module.
|
||||||
|
|
||||||
**Example with CMake and Ninja**
|
Use the FTXUI_BUILD_MODULES option to build the FTXUI project itself to provide C++ 20 modules,
|
||||||
|
for example with CMake and Ninja:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cmake \
|
||||||
|
-DCMAKE_GENERATOR=Ninja \
|
||||||
|
-DFTXUI_BUILD_MODULES=ON \
|
||||||
|
..
|
||||||
|
|
||||||
|
ninja
|
||||||
|
```
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> To use modules, you need a C++20 compatible compiler, CMake version 3.20 or
|
||||||
|
> higher, and use a compatible generator like Ninja. Note that Makefile
|
||||||
|
> generators **do not support modules**.
|
||||||
|
|
||||||
|
Then, in your own code you can consume the modules and code as normal:
|
||||||
|
|
||||||
```cpp
|
```cpp
|
||||||
import ftxui;
|
import ftxui;
|
||||||
@@ -26,23 +42,30 @@ int main() {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh
|
Note, the `ftxui` convenience module which simply pulls together all the modules:
|
||||||
cmake \
|
|
||||||
-DCMAKE_GENERATOR=Ninja \
|
|
||||||
-DFTXUI_BUILD_MODULES=ON \
|
|
||||||
..
|
|
||||||
|
|
||||||
ninja
|
```cpp
|
||||||
|
export import ftxui.component;
|
||||||
|
export import ftxui.dom;
|
||||||
|
export import ftxui.screen;
|
||||||
|
export import ftxui.util;
|
||||||
|
```
|
||||||
|
You can instead import only the module(s) you need if desired.
|
||||||
|
|
||||||
|
To properly find and link the modules with CMake, use `target_link_libraries` to get the right
|
||||||
|
compiler, linker, etc. flags.
|
||||||
|
|
||||||
|
```cmake
|
||||||
|
target_link_libraries(my_executable
|
||||||
|
#...whatever...
|
||||||
|
PRIVATE ftxui::modules
|
||||||
|
)
|
||||||
```
|
```
|
||||||
> [!NOTE]
|
|
||||||
> To use modules, you need a C++20 compatible compiler, CMake version 3.20 or
|
|
||||||
> higher, and use a compatible generator like Ninja. Note that Makefile
|
|
||||||
> generators **do not support modules**.
|
|
||||||
|
|
||||||
### Module list
|
### Module list
|
||||||
|
|
||||||
The modules directly reference the corresponding header, or a group of related
|
The modules directly reference the corresponding header, or a group of related
|
||||||
headers to provide a more convenient interface. The following modules
|
headers to provide a more convenient interface. The following modules
|
||||||
are available:
|
are available:
|
||||||
|
|
||||||
- `ftxui`
|
- `ftxui`
|
||||||
|
|||||||
@@ -48,25 +48,38 @@ Dimensions& FallbackSize() {
|
|||||||
return g_fallback_size;
|
return g_fallback_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* Safe(const char* c) {
|
|
||||||
return (c != nullptr) ? c : "";
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Contains(const std::string& s, const char* key) {
|
bool Contains(const std::string& s, const char* key) {
|
||||||
return s.find(key) != std::string::npos;
|
return s.find(key) != std::string::npos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// https://github.com/gabime/spdlog/blob/885b5473e291833b148eeac3b7ce227e582cd88b/include/spdlog/details/os-inl.h#L566
|
||||||
|
std::string getenv_safe(const char *field) {
|
||||||
|
#if defined(_MSC_VER)
|
||||||
|
#if defined(__cplusplus_winrt)
|
||||||
|
return std::string{}; // not supported under uwp
|
||||||
|
#else
|
||||||
|
size_t len = 0;
|
||||||
|
char buf[1024];
|
||||||
|
bool ok = ::getenv_s(&len, buf, sizeof(buf), field) == 0;
|
||||||
|
return ok ? buf : std::string{};
|
||||||
|
#endif
|
||||||
|
#else // revert to getenv
|
||||||
|
char *buf = ::getenv(field); // NOLINT(*-mt-unsafe)
|
||||||
|
return buf ? buf : std::string{};
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
Terminal::Color ComputeColorSupport() {
|
Terminal::Color ComputeColorSupport() {
|
||||||
#if defined(__EMSCRIPTEN__)
|
#if defined(__EMSCRIPTEN__)
|
||||||
return Terminal::Color::TrueColor;
|
return Terminal::Color::TrueColor;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::string COLORTERM = Safe(std::getenv("COLORTERM")); // NOLINT
|
std::string COLORTERM = getenv_safe("COLORTERM");
|
||||||
if (Contains(COLORTERM, "24bit") || Contains(COLORTERM, "truecolor")) {
|
if (Contains(COLORTERM, "24bit") || Contains(COLORTERM, "truecolor")) {
|
||||||
return Terminal::Color::TrueColor;
|
return Terminal::Color::TrueColor;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string TERM = Safe(std::getenv("TERM")); // NOLINT
|
std::string TERM = getenv_safe("TERM");
|
||||||
if (Contains(COLORTERM, "256") || Contains(TERM, "256")) {
|
if (Contains(COLORTERM, "256") || Contains(TERM, "256")) {
|
||||||
return Terminal::Color::Palette256;
|
return Terminal::Color::Palette256;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user