13 травня, після більш ніж року розробки, відбувся випуск 7.0.0 кросплатформної бібліотеки. FTXUI, призначеної для створення на C++ додатків з текстовим інтерфейсом і MIT, що розповсюджується за ліцензією.
Можливості бібліотеки:
- функціональний стиль, на зразок React JS;
- простий та елегантний стиль (на думку автора бібліотеки);
- обробка подій клавіатури та «миші»;
- підтримка UTF8 та Unicode;
- підтримка True Color;
- підтримка зміни стилю курсору;
- підтримка анімацій;
- підтримка малювання;
- відсутність сторонніх залежностей;
- кросплатформність (Linux/MacOS, WebAssembly, Windows).
Зміни
Документація
- Виправлено генерацію документації з Doxygen.
- Додано власну тему для Doxygen.
- Поділ документації на кілька сторінок.
компіляція
- Доданий скрипт tools$ amalgamate.py для генерації «амальгамованого» вихідного коду: ftxui.cpp (534 Kб), ftxui.hpp (110 Кб) та ftxui_all.hpp (643 Кб).
- Додано підтримку модулів C++20.
- Додано підтримку Meson.
- Видалено залежність від pthread.
- Виправлено підтримку Bazel.
- Інші покращення.
Зміни сумісності з попередніми версіями
- Перейменування:
- Pixel в `Cell
- Image в Surface
- ScreenInteractive в App
- метод PixelAt вCellAt
Для забезпечення сумісності передбачені псевдоніми та заголовки, щоб не порушити роботу існуючого коду.
- Використання std::string_view замість const std::string& там, де це можливо. Це забезпечує кращу сумісність із рядковими літералами та дозволяє уникнути непотрібних копіювань.
Компоненти
- Покращено та модернізовано систему перехоплення сигналів з використанням POSIX sigaction для надійного маскування сигналів. Забезпечено захист від подвійного відновлення терміналу при виході із програми за допомогою атомарного відстеження вихідного стану. Додано підтримку додаткових сигналів POSIX (SIGBUS, SIGSYS, як сигналів збою, та SIGQUIT, SIGHUP, як сигналів відкладеного завершення) та виправлено проблеми безпеки асинхронних сигналів.
- Виправлено проблему з відображенням курсору при використанні настроюваного Renderer у вкладених контейнерах.
- Виправлено позиціонування курсору в полях введення та стабільність прокручування.
- Виправлена підтримка не ASCII символів у режимі введення пароля.
- Усунено мерехтіння курсору під час перемальовки в App.
- Обробка введення з використанням POSIX pipes
- Дозволяє програмам FTXUI зчитувати дані зі stdin (при використанні pipe) і при цьому, як і раніше, приймати введення з клавіатури в терміналі.
- Використовується за промовчанням.
- Може бути вимкнено за допомогою App::HandlePipedInput(false).
- Доступно тільки в Linux и macOS.
- Виправлено багато помилок.
DOM
- Підтримка перекладу рядка (n) усередині text() та vtext().
- Тепер dbox передає фокус від верхніх шарів до нижніх, що відповідає візуальному відображенню.
- Додано підтримку декораторів меж таблиць. Це дозволяє, наприклад, змінювати колір меж таблиці.
- Виправлено помилку цілісного переповнення в ComputeShrinkHard.
- Додана спеціалізація в vbox/hbox/dbox для можливості використання контейнера Element як вхідні дані.
- У gridbox виправлено додавання дочірніх елементів.
- Виправлено відображення gauge.
- Додані параметризовані варіанти декораторів flex із параметром _factor. Вони дозволяють вказувати користувацькі коефіцієнти розтягування або стиснення:
flex_factor(grow, shrink), flex_grow_factor(grow), flex_shrink_factor(shrink), а також варіанти для осей x та y.
Оптимізації малювання
- Оптимізація переміщення курсору рядками у методі Screen::ResetPosition (без очищення екрана) в один параметризований набір команд CSI для переміщення курсору вгору (x1B[ A) замість виведення одного x1B[1A на кожен рядок. Це зменшило кількість екрануючих символів на кадр під час перемальовування (наприклад, ~197 -> 6 байтів для екрана з 50 рядками, ~33-кратне зменшення).
- Оптимізовані Screen::ToString(), Color::Print() і string_width(), що прискорило:
- Базовий рендеринг на 27%.
- Рендеринг тексту на ~27%.
- Рендеринг стилів ~38%.
Джерело: linux.org.ru




