mirror of
https://github.com/ArthurSonzogni/FTXUI.git
synced 2025-12-16 01:48:56 +08:00
Compare commits
4 Commits
v6.1.8
...
ff6677cb4e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
ff6677cb4e | ||
|
|
add5f40d31 | ||
|
|
805db9bdea | ||
|
|
baa5973128 |
@@ -1,6 +1,3 @@
|
|||||||
# Copyright 2025 Arthur Sonzogni. All rights reserved.
|
|
||||||
# Use of this source code is governed by the MIT license that can be found in
|
|
||||||
# the LICENSE file.
|
|
||||||
matrix:
|
matrix:
|
||||||
platform:
|
platform:
|
||||||
- centos7
|
- centos7
|
||||||
|
|||||||
@@ -4,6 +4,10 @@ Changelog
|
|||||||
Future release
|
Future release
|
||||||
------------
|
------------
|
||||||
|
|
||||||
|
### dom
|
||||||
|
- Bugfix: Restore the `dbox` behavior from ftxui 5.0.0. To apply bgcolor
|
||||||
|
blending between the two layers, a new `dboxBlend` will be added.
|
||||||
|
|
||||||
6.1.8 (2025-05-01)
|
6.1.8 (2025-05-01)
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
# Copyright 2025 Arthur Sonzogni. All rights reserved.
|
|
||||||
# Use of this source code is governed by the MIT license that can be found in
|
|
||||||
# the LICENSE file.
|
|
||||||
|
|
||||||
# FTXUI Module.
|
# FTXUI Module.
|
||||||
module(name = "ftxui", version = "6.1.8")
|
module(name = "ftxui", version = "6.1.8", compatibility_level = 6)
|
||||||
|
|
||||||
# Build deps.
|
# Build deps.
|
||||||
bazel_dep(name = "rules_cc", version = "0.1.1")
|
bazel_dep(name = "rules_cc", version = "0.1.1")
|
||||||
|
|||||||
@@ -45,59 +45,6 @@ class DBox : public Node {
|
|||||||
child->SetBox(box);
|
child->SetBox(box);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Render(Screen& screen) override {
|
|
||||||
if (children_.size() <= 1) {
|
|
||||||
Node::Render(screen);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const int width = box_.x_max - box_.x_min + 1;
|
|
||||||
const int height = box_.y_max - box_.y_min + 1;
|
|
||||||
std::vector<Pixel> pixels(std::size_t(width * height));
|
|
||||||
|
|
||||||
for (auto& child : children_) {
|
|
||||||
child->Render(screen);
|
|
||||||
|
|
||||||
// Accumulate the pixels
|
|
||||||
Pixel* acc = pixels.data();
|
|
||||||
for (int x = 0; x < width; ++x) {
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
auto& pixel = screen.PixelAt(x + box_.x_min, y + box_.y_min);
|
|
||||||
acc->background_color =
|
|
||||||
Color::Blend(acc->background_color, pixel.background_color);
|
|
||||||
acc->automerge = pixel.automerge || acc->automerge;
|
|
||||||
if (pixel.character.empty()) {
|
|
||||||
acc->foreground_color =
|
|
||||||
Color::Blend(acc->foreground_color, pixel.background_color);
|
|
||||||
} else {
|
|
||||||
acc->blink = pixel.blink;
|
|
||||||
acc->bold = pixel.bold;
|
|
||||||
acc->dim = pixel.dim;
|
|
||||||
acc->inverted = pixel.inverted;
|
|
||||||
acc->italic = pixel.italic;
|
|
||||||
acc->underlined = pixel.underlined;
|
|
||||||
acc->underlined_double = pixel.underlined_double;
|
|
||||||
acc->strikethrough = pixel.strikethrough;
|
|
||||||
acc->hyperlink = pixel.hyperlink;
|
|
||||||
acc->character = pixel.character;
|
|
||||||
acc->foreground_color = pixel.foreground_color;
|
|
||||||
}
|
|
||||||
++acc; // NOLINT
|
|
||||||
|
|
||||||
pixel = Pixel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Render the accumulated pixels:
|
|
||||||
Pixel* acc = pixels.data();
|
|
||||||
for (int x = 0; x < width; ++x) {
|
|
||||||
for (int y = 0; y < height; ++y) {
|
|
||||||
screen.PixelAt(x + box_.x_min, y + box_.y_min) = *acc++; // NOLINT
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|||||||
@@ -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