LINUX.ORG.RU

FTXUI 7.0.0

 , , , ,


4

3

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[<n>A) вместо вывода одного \x1B[1A на каждую строку. Это уменьшило количество экранирующих символов на кадр во время перерисовки (например, ~197 -> 6 байтов для экрана с 50 строками, ~33-кратное уменьшение).
  • Оптимизированы Screen::ToString(), Color::Print() и string_width(), что ускорило:
    • Базовый рендеринг на ~27%.
    • Рендеринг текста на ~27%.
    • Рендеринг стилей на ~38%.

>>> Подробности на GitHub и в первой редакции новости

★★★★★

Проверено: hobbit ()
Последнее исправление: dataman (всего исправлений: 4)

Думаю не помешает https://github.com/leo-arch/keypress от автора Clifm 1.24.

$ keypress -h:


Usage: keypress [OPTIONS]

  -a      Enable Application Cursor Keys (DECCKM) mode.
  -c      Do not clear the screen before displaying key information.
  -h      Display this help and exit.
  -i      Use ASCII characters to draw the table.
  -I      Do not show terminfo capability names.
  -k      Enable the Kitty keyboard protocol (disambiguate mode).
  -K      Enable the Kitty keyboard protocol (full mode).
  -l      Use a light color scheme.
  -p      Run in HP keyboard mode.
  -s      Run in SCO keyboard mode.
  -n      Disable colors.
  -t SEQ  Run in translation mode: translate the escape sequence
          SEQ into its corresponding text/symbolic representation
          and exit.
  -T      Do not show key translations.
  -u      Make XTerm emit CSI-u sequences (requires -x or -X).
  -v      Display version information and exit.
  -x      Enable Xterm's XTMODKEYS (disambiguate mode).
  -X      Enable Xterm's XTMODKEYS (full mode, XTerm only).

By default, keypress runs in interactive mode: it generates a
byte-by-byte representation of keyboard inputs, whether for
individual keys or key combinations.

The output includes the following formats: hexadecimal, octal,
decimal, and the corresponding symbols.

Multi-byte Sequences:
Sequences such as extended ASCII, Unicode, or key combinations
involving function keys and arrow keys, will produce multiple
lines of output, with each line representing a single byte in
the sequence.

Important Notes:
 - The generated byte values may vary depending on the terminal
   emulator used.
 - Pasting from the primary clipboard is allowed.
 - To quit the program, press 'Ctrl+c'.
 - To clear the screen, press 'Ctrl+x'.
 - The above key combinations are reserved for controlling the
   program's flow, so they will not be represented in the output.

Reserved Key Combinations:
  The byte values for these keys are:

   ┌──────┬──────┬─────┬──────────┬──────┐
   │ Hex  │ Oct  │ Dec │   Bin    │ Sym  │
   ├──────┼──────┼─────┼──────────┼──────┤
   │ \x18 │ \030 │  24 │ 00011000 │  CAN │ (Ctrl+x)
   │ \x03 │ \003 │   3 │ 00000011 │  ETX │ (Ctrl+c)
   └──────┴──────┴─────┴──────────┴──────┘

Это пока лучший консольный сканер кнопкосочетаний, который я видел. :)

dataman ★★★★★
() автор топика
Ответ на: комментарий от Aceler

как это будет по-русски?

истории узбека

rukez ★★★★★
()

Добавлена поддержка модулей C++20.

Да. В анонсе на гитхабе можно лицезреть следующее:

import ftxui;
import ftxui.component;
import ftxui.dom;
import ftxui.screen;
import ftxui.util;

Вот и кончилась эпоха :)

hobbit ★★★★★
()

Для обеспечения совместимости предусмотрены псевдонимы и заголовки, чтобы не нарушить работу существующего кода.

а вот это вот признак хорошего тона ☕☕

etwrq ★★★★★
()

Пробовал в своих проектах. На редкость годная штука

Reset ★★★★★
()

Использование std::string_view вместо const std::string& там, где это возможно. Это обеспечивает лучшую совместимость со строковыми литералами и позволяет избежать ненужных копирований.

Я, возможно, чего-то не понимаю, но что за копирования такие у них происходили при обращении по константным ссылкам? Ссылка в плюсах это же засахаренный указатель…

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Надо будет потыкать палочкой.

sparkie ★★★★★
()

Круто! Мечтаю чтобы создали Text + Qt + Web интерфейс, типа задаешь опцию и твой интерфейс меняет платформу отображения, раз уж такие развитые TUI доступны благодаря unicode символам

I-Love-Microsoft ★★★★★
()

простой и элегантный стиль (по мнению автора библиотеки);

FTXUI

Как это читается, «по мнению автора».

Бабы_орут_на_кота.жпг

slackwarrior ★★★★★
()
Последнее исправление: slackwarrior (всего исправлений: 1)
Ответ на: комментарий от slackwarrior

Эф-Ти-Икс-Ю-Ай

Фанкшенал Терминал что-то там юзер интерфейс

skyman ★★★★★
()

Чем это лучше TurboVision ?

cawa
()
Ответ на: комментарий от hobbit

Ссылка в плюсах это же засахаренный указатель…

Вообще да, но иногда нет. Точнее, в целом нет, но иногда да.

sarumeister
()
Ответ на: комментарий от hobbit

Я, возможно, чего-то не понимаю, но что за копирования такие у них происходили при обращении по константным ссылкам? Ссылка в плюсах это же засахаренный указатель…

Копирование происходит еще в момент создания std::string. Не обязательно все аргументы лежат в std::string, поэтому лишь для того что бы передать данные в const std::string&, эту std::string требуется предварительно создать.

uart
()
Ответ на: комментарий от uart

лишь для того что бы передать данные в const std::string&, эту std::string требуется предварительно создать

А std::string_view на основе чего создаётся? Не на основе ли той же std::string?

hobbit ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Мечтаю чтобы создали Text + Qt + Web интерфейс

Текстовый бэкенд для кутей сделать теоретически можно, но там фундаментальная проблема – пересчёт текстовых и графических координат. Сами приложения должны создаваться с расчётом на то, что все иксы и игреки должны быть кратны некоему числу или смириться с тем, что где-то будут наползания.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

А std::string_view на основе чего создаётся? Не на основе ли той же std::string?

На основе «обычной константной строки» например, или substr из std::string, или много еще чего…

uart
()
Ответ на: комментарий от hobbit

Попробуй issue написать.

Уже есть: https://github.com/ArthurSonzogni/FTXUI/issues/413.
Пример – https://github.com/ArthurSonzogni/FTXUI/blob/main/examples/component/collapsible.cpp:

...
int main() {
  auto component =
      Collapsible("Collapsible 1",
                  Inner({
                      Collapsible("Collapsible 1.1",
                                  Inner({
                                      Collapsible("Collapsible 1.1.1", Empty()),
                                      Collapsible("Collapsible 1.1.2", Empty()),
                                      Collapsible("Collapsible 1.1.3", Empty()),
                                  })),
                      Collapsible("Collapsible 1.2",
                                  Inner({
                                      Collapsible("Collapsible 1.2.1", Empty()),
                                      Collapsible("Collapsible 1.2.2", Empty()),
                                      Collapsible("Collapsible 1.2.3", Empty()),
                                  })),
                      Collapsible("Collapsible 1.3",
                                  Inner({
                                      Collapsible("Collapsible 1.3.1", Empty()),
                                      Collapsible("Collapsible 1.3.2", Empty()),
                                      Collapsible("Collapsible 1.3.3", Empty()),
                                  })),
                  }));

  App::FitComponent().Loop(component);
}
dataman ★★★★★
() автор топика
Ответ на: комментарий от hobbit

Не, ясно что Qt >> ftxui, поэтому по единому описанию можно было бы задействовать подмножество того, чтобы было равнозначно с ftxui

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от uart

На основе «обычной константной строки» например, или substr из std::string, или много еще чего…

Помню был какой-то красивый выстрел в ногу с этим std::string_view, std::string и substr. Но не помню деталей.

sarumeister
()
Ответ на: комментарий от sarumeister

Помню был какой-то красивый выстрел в ногу с этим std::string_view, std::string и substr. Но не помню деталей.

Это C++, надо понимать что ты делаешь. Но любом случае в стандарте уже давно std::string_view, глупо это не использовать…

uart
()
Ответ на: комментарий от sarumeister

Да вон прямо на цппреференс бомбический пример:

std::string_view good{"a string literal"};
    // "Good" case: `good` points to a static array.
    // String literals reside in persistent data storage.

std::string_view bad{"a temporary string"s};
    // "Bad" case: `bad` holds a dangling pointer since the std::string temporary,
    // created by std::operator""s, will be destroyed at the end of the statement.

Используйте современный цпп, это легко, красиво и безопасно!

unC0Rr ★★★★★
()
Ответ на: комментарий от sarumeister

Нашел этот пример с substr, постить не хочу. Видимо в тот раз был вау-эффект, а сейчас нет.

Такое еще нашел, из 2022 года:

auto s = "foo bar"sv;

auto s1 = s.substr(4);

auto L = distance(s.begin(), s1.begin());


A test of what people know and what people would prefer: Is this UB? Should this be UB?
sarumeister
()
Последнее исправление: sarumeister (всего исправлений: 1)
Ответ на: комментарий от unC0Rr

Используйте современный цпп, это легко, красиво и безопасно!

Голову просто включать нужно. C/C++ не когда не были «безопасными» в современном понимании, когда можно писать всякую ахинею не думая. Компилятор делает ровно то, что ты написал.

uart
()
Ответ на: комментарий от uart

Да-да, слышали уже, некорректные программы не пишите, пишите корректные, багов не делайте, не опечатывайтесь и будет всё пучком.

unC0Rr ★★★★★
()
Ответ на: комментарий от Gary

А шоукейсы есть? (как это будет по-русски?)
«Выставка» же

«Показуха»... ;))

Somebody ★★★★
()
Ответ на: комментарий от uart

в современном понимании, когда можно писать всякую ахинею не думая

Не можно, и никогда не было можно... Это иллюзия, нынче зачем-то настойчиво внедряемая в умы (??) «широких народных масс»... :)

«Не думая» - подход плохой, но, надо признать, очень популярный «в народе». ;P ;)))

Somebody ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.