Дата публикации
ai_products

Turbo Vision 2.0: ретро-фреймворк для текстовых интерфейсов вернулся с Unicode и кроссплатформенностью

Что нового

Turbo Vision 2.0 — это современный порт классического фреймворка Borland для текстовых интерфейсов начала 90‑х. Автор начал проект в конце 2018 года, а к маю 2020 довёл его почти до полного совпадения по функциональности с оригиналом и открыл исходный код. Сейчас это уже не просто ностальгия, а рабочий инструмент для терминальных приложений.

Ключевые новшества по сравнению с оригинальной Turbo Vision и старыми портами:

  • Полноценная поддержка Unicode и UTF‑8

    • Фреймворк корректно отображает полноширинные символы и работает с UTF‑8 строками.
    • Это касается и редактора tvedit, который теперь понимает многобайтные символы.
  • Кроссплатформенность без #ifdef‑адской верстки

    • Linux, Windows (MSVC, MinGW), DOS/Windows через Borland C++.
    • Один и тот же исходный код приложения собирается под разные платформы без разветвления логики.
  • Современные терминальные фичи

    • Поддержка 24‑битного цвета (вместо 16 цветов в оригинале).
    • Поддержка мыши: колёсико, средняя кнопка, перетаскивание окон и скролл содержимого.
    • Окна любого размера до 32 767 строк или столбцов, плюс обработка динамического изменения размеров терминала.
  • Новые UX‑мелочи, которых очень не хватало в 90‑х

    • Окна можно тянуть за пустые области средней кнопкой мыши.
    • Окна меняют размер не только из правого нижнего, но и из левого нижнего угла.
    • Меню закрывается повторным кликом по родительскому пункту.
    • Скроллбары реагируют на колёсико мыши, щелчок по пустой области переносит ползунок под курсор, перетаскивание листает страницу.
    • TInputLine перестаёт «подпрыгивать» при фокусе: текст остаётся на месте.
  • Прокачанный текстовый редактор (TEditor / tvedit)

    • Поддержка файлов больше 64 КБ на 32‑ и 64‑битных сборках.
    • Поддержка LF‑окончаний строк, сохранение исходного формата файла, но новые файлы создаются с CRLF.
    • Клавиша Home переключается между началом строки и началом отступа.
    • Контекстное меню по правому клику.
    • Скролл перетаскиванием средней кнопкой.
    • Удаление слов: kbAltBack, kbCtrlBack, kbCtrlDel.
  • Современная работа с файловой системой

    • Диалог «Open File» понимает и Unix‑, и Windows‑пути.
    • Поддержка ~/ с разворачиванием в $HOME.
  • Более аккуратная работа с терминалом и логами

    • Переназначение stderr: если stderr — терминал, вывод уходит во внутренний буфер и печатается при выходе или «suspend», не ломая интерфейс.
    • Переменная TVISION_MAX_FPS ограничивает частоту перерисовки (по умолчанию 60 FPS, 0 — без лимита, −1 — рисовать при каждом вызове THardwareInfo::screenWrite).
  • Поддержка современных терминальных расширений на Unix

    • Ncurses с широкими символами (libncursesw).
    • Поддержка X10 и SGR‑кодировок мыши.
    • Поддержка modifyOtherKeys в xterm.
    • Поддержка расширений клавиатуры Paul Evans fixterms и протокола клавиатуры Kitty.
    • Поддержка win32-input-mode ConPTY (актуально для WSL).
    • Поддержка модификаторов клавиш через TIOCLINUX и мыши через GPM в Linux‑консоли.
  • Windows‑специфика (кроме сборок Borland C++)

    • Фреймворк переключает кодовую страницу консоли в UTF‑8 при старте и возвращает назад при выходе.
    • C‑RTL переводится в UTF‑8‑режим через setlocale, разработчику не нужны wchar_t‑варианты функций.
    • При падении приложения Turbo Vision поднимает новую консоль.
    • Если консоль в «legacy»‑режиме с bitmap‑шрифтом, Turbo Vision пытается переключить шрифт на Consolas или Lucida Console, чтобы Unicode не превращался в квадраты.
  • Интеграция с современным CMake и vcpkg

    • Поддержка CMake как основной системы сборки.
    • Порт в vcpkg с поддержкой установки одной командой.
    • Возможность подключить Turbo Vision как подмодуль и подтянуть через add_subdirectory.

Отдельно стоит отметить: автор сохранил совместимость на уровне исходников с историческими приложениями Turbo Vision, включая эмуляцию части Borland C++ RTL.

Как это работает

Turbo Vision 2.0 остаётся классическим C++‑фреймворком для текстовых интерфейсов, но с обновлённой архитектурой ввода‑вывода и Unicode‑слоя.

Архитектура и совместимость

Базовые принципы остались теми же, что у Borland Turbo Vision:

  • Приложение строится из «видов» (widgets/views):
    • окна,
    • меню,
    • диалоги,
    • кнопки,
    • скроллбары,
    • чекбоксы и радиокнопки,
    • поля ввода и т.д.
  • Turbo Vision берёт на себя диспетчеризацию событий: клавиатура, мышь, системные события терминала.
  • Пользовательский код описывает поведение и раскладку интерфейса, а не низкоуровневые escape‑последовательности.

Один из ключевых инженерных приёмов — минимальные изменения легаси‑кода. Автор поставил себе цель:

  1. Запустить Turbo Vision под Linux с минимальной правкой исходников.
  2. Сохранить работоспособность под DOS/Windows с Borland C++.
  3. Максимально сохранить совместимость исходников старых приложений Turbo Vision.

Для этого он добавил слой совместимости Borland C++ RTL: заголовки в include/tvision/compat/borland реализуют функции и типы, на которые опирается старый код (например, старые iostream.h, dir.h и т.п.). Подключение <tvision/tv.h> при этом вытаскивает часть имён std в глобальное пространство имён — это плата за совместимость.

Unicode и кодировки

Ключевой инженерный трюк — поддержка Unicode без перехода на wchar_t/TCHAR:

  • Turbo Vision продолжает использовать char‑массивы.
  • Строки интерпретируются как UTF‑8.
  • На Windows фреймворк опирается на поддержку UTF‑8 в setlocale в новых версиях MS RTL.
  • Пример из документации:
std::ifstream f("コンピュータ.txt");
// На Windows RTL конвертирует это имя файла в системную кодировку на лету.

Это позволяет:

  • не ломать старый код, который ожидает char*,
  • не завязываться на платформозависимые wchar_t/TCHAR,
  • при этом корректно работать с многобайтными символами, включая полноширинные.

Терминальное I/O на Unix

Turbo Vision на Unix опирается на ncursesw и, опционально, GPM:

  • Сборка требует libncursesw (важно — именно wide‑версия) и C++14‑совместимого компилятора.
  • Для поддержки мыши в Linux‑консоли нужен libgpm.
  • Для работы буфера обмена используются:
    • xsel или xclip в X11,
    • wl-clipboard в Wayland.

Фреймворк различает два режима терминального ввода‑вывода:

  • По умолчанию Turbo Vision работает через /dev/tty.

    • Это позволяет перенаправлять stdin/stdout/stderr, не ломая интерфейс.
    • Пример: tvdemo | tee out.txt — терминальный интерфейс работает, а текстовый вывод попадает в tee.
  • Если выставить TVISION_USE_STDIO=1, ввод‑вывод идёт через stdin/stdout.

    • Тогда TVISION_USE_STDIO=1 tvdemo | tee out.txt запишет в файл все escape‑последовательности и вывод приложения.

Переменные окружения, которые влияют на поведение:

  • TERM — ncurses использует её для определения возможностей терминала.
  • COLORTERM — при значении truecolor или 24bit Turbo Vision включает 24‑битный цвет.
  • ESCDELAY — задержка в миллисекундах после нажатия ESC (по умолчанию 10). Если во время задержки приходит другая клавиша, Turbo Vision трактует это как Alt+Key. Увеличение значения помогает, если терминал не даёт отдельный Alt.

Есть и свой обработчик сигналов: при падении приложения Turbo Vision старается вернуть терминал в нормальное состояние (режим ввода, цвета, курсор).

Консоль на Windows

На Windows Turbo Vision использует Win32 Console API. Если терминальный эмулятор не поддерживает этот API, фреймворк открывает отдельное консольное окно.

Особенности:

  • Интерфейс подгоняется под размер окна, а не буфера, поэтому в нормальном режиме нет горизонтальных/вертикальных скроллбаров.
  • При старте Turbo Vision:
    • переключает кодовую страницу консоли в UTF‑8,
    • переводит Microsoft C runtime в UTF‑8‑режим через setlocale.
  • При выходе фреймворк возвращает консоль в исходное состояние.

Если консоль работает в «legacy»‑режиме с bitmap‑шрифтом, Unicode‑символы отображаются некорректно. Turbo Vision пытается переключить шрифт на Consolas или Lucida Console, чтобы исправить ситуацию.

Сборка под Windows поддерживает два основных сценария:

  • MSVC: сборка через CMake, с выбором /MD или /MT через опцию TV_USE_STATIC_RTL.
  • MinGW: сборка через CMake с генератором "MinGW Makefiles", в остальном очень похожа на Linux‑путь.

Наследие Borland C++ и DOS

Turbo Vision по‑прежнему можно собрать как библиотеку для DOS и Windows с помощью Borland C++:

  • Подтверждённая конфигурация:
    • Borland C++ 4.52 + Borland PowerPack for DOS,
    • Turbo Assembler 4.0.
  • Unicode в этом режиме отсутствует — это чисто историческая опция.

Сборка управляется Borland Makefile из каталога project с набором флагов:

  • -DDOS32 — 32‑битные DPMI‑приложения (работают и на 64‑битном Windows).
  • -DWIN32 — 32‑битные нативные Win32‑приложения (не для TVDEMO, там завязка на farcoreleft() и прочие артефакты).
  • -DDEBUG — сборка отладочных версий.
  • -DTVDEBUG — линковка приложений с отладочной версией библиотеки.
  • -DOVERLAY, -DALIGNMENT={2,4}, -DEXCEPTION, -DNO_STREAMABLE, -DNOTASM — исторические опции из оригинальных makefile.

Из практических нюансов:

  • Turbo Assembler требует патча под Windows 95.
  • Под Windows XP всё работает штатно.
  • Под Windows 10 старый MAKE может упасть с Fatal: Command arguments too long — помогает обновление MAKE до версии из Borland C++ 5.x.
  • Установщик Borland C++ — 16‑битное приложение и не запускается на 64‑битном Windows 10. Приходится ставить его в другой среде или через winevdm.

Что это значит для вас

Turbo Vision 2.0 — не модная GUI‑библиотека и не фреймворк для веба. Это инструмент для тех, кто сознательно выбирает текстовый интерфейс в терминале.

Когда Turbo Vision реально полезен

  1. Кроссплатформенные CLI‑утилиты с TUI
    Если вы пишете консольный инструмент, который должен:

    • работать и на Linux, и на Windows,
    • иметь окна, меню, диалоги, поля ввода,
    • не требовать от пользователя X11/Wayland или GUI, Turbo Vision снимает с вас головную боль с разбором escape‑последовательностей, различий терминалов и кодировок.
  2. Поддержка и перенос старых приложений Turbo Vision
    Если у вас остались проекты на Turbo Vision из эпохи Borland C++, этот порт даёт шанс:

    • собрать их на современных компиляторах,
    • перенести на Linux,
    • добавить Unicode и поддержку современных терминалов.
  3. Низкоуровневые инструменты для серверов и DevOps
    На серверах часто нет GUI, но есть SSH и терминал. Turbo Vision подойдёт для:

    • админских панелей,
    • TUI‑конфигураторов,
    • лог‑просмотрщиков,
    • редакторов конфигов (на базе TEditor).
  4. Обучение C++ и архитектурам UI без GUI‑слоя
    Turbo Vision даёт классический пример событийной архитектуры интерфейса: виджеты, события, обработчики.
    Это полезно, если вы хотите показать студентам, как строятся UI‑фреймворки, без отвлечения на графику.

  5. Инструмент для тех, кто живёт в терминале
    Если вы предпочитаете TUI‑приложения вроде htop, mc, tig, Turbo Vision даст каркас для своих инструментов с:

    • полноценной мышью,
    • 24‑битным цветом,
    • Unicode.

Когда Turbo Vision — не лучший выбор

  • Вам нужен обычный графический интерфейс
    Для десктопных GUI‑приложений логичнее взять Qt, GTK, .NET или web‑стек. Turbo Vision — про терминал.

  • Вы хотите писать только на безопасных или динамических языках
    Turbo Vision — это C++14. Если вы категорически не хотите трогать C++, лучше посмотреть на библиотеки для Python, Rust, Go и т.п. (например, urwid, tui-rs, bubbletea).

  • Нужна встроенная асинхронность и параллельное выполнение из коробки
    Фреймворк не решает за вас вопросы многопоточности и async/await. Это остаётся задачей вашего приложения.

  • Нужен готовый коммерческий продукт с поддержкой и SLA
    Turbo Vision — open source на GitHub. Это мощный инструмент, но не коммерческий пакет с контрактными гарантиями.

Доступность из России

Turbo Vision лежит на GitHub по адресу:
https://github.com/magiblot/tvision

GitHub в России открывается без VPN у большинства провайдеров. Если у вас корпоративные ограничения на GitHub или внешние репозитории, может потребоваться прокси или внутренний зеркальный репозиторий.

Место на рынке

Turbo Vision 2.0 живёт в нише TUI‑фреймворков для C++ и конкурирует не с GPT‑моделями, а с другими библиотеками для терминальных интерфейсов.

Прямые аналоги в других языках:

  • для Python — urwid, prompt_toolkit, textual,
  • для Rust — tui-rs,
  • для Go — tview, bubbletea (через Go‑экосистему).

В C++ есть ncurses и его обёртки, но Turbo Vision предлагает более высокий уровень абстракции:

  • виджеты, окна, меню, диалоги и редактор текста уже реализованы;
  • не нужно вручную опрашивать терминал и разбирать escape‑последовательности;
  • есть встроенный каркас приложения и система событий.

По сравнению с «голым» ncurses Turbo Vision выигрывает по скорости разработки интерфейса, но требует принятия его архитектуры и соглашений. Если вы хотите полный контроль за каждым байтом, ncurses останется более низкоуровневым и гибким вариантом.

Отдельная ниша — наследие Borland Turbo Vision. Здесь альтернатив почти нет: этот порт сохраняет совместимость с Borland C++ и даёт возможность оживить старые приложения на новых платформах.

Цен и бенчмарков производительности автор не приводит. Turbo Vision остаётся нативной C++‑библиотекой, поэтому по накладным расходам и скорости обработки событий она близка к другим C++ TUI‑решениям, которые не тянут за собой интерпретатор или виртуальную машину.

Установка

Исходники

Официальный репозиторий:
https://github.com/magiblot/tvision

Релизов в виде стабильных версий пока нет. Автор рекомендует разработчикам работать с последним коммитом и сообщать о проблемах при обновлении.

Быстрый старт: демо‑приложения

Если вы хотите просто попробовать демо:

  • *Unix‑системы (Linux, BSD, macOS с терминалом)

    • Соберите Turbo Vision из исходников по инструкции ниже.
  • Windows

    • Актуальные бинарники лежат в разделе Actions на GitHub.
    • Откройте первый успешный workflow (с зелёной галочкой).
    • Внизу страницы workflow, будучи залогиненным в GitHub, найдите раздел Artifacts. Там будут архивы:
      • examples-dos32.zip — 32‑битные исполняемые файлы, собранные Borland C++. Без поддержки Unicode.
      • examples-x86.zip — 32‑битные исполняемые файлы на MSVC. Требуется Windows Vista или новее.
      • examples-x64.zip — 64‑битные исполняемые файлы на MSVC. Требуется 64‑битная Windows Vista или новее.

Как запустить

Linux: сборка библиотеки и демо

Требования к сборке:

  • Компилятор с поддержкой C++14.
  • libncursesw (широкие символы).
  • libgpm — опционально, для мыши в Linux‑консоли.
  • При наличии отдельных devel‑пакетов нужно установить их тоже (например, libncurses-dev, libgpm-dev в Debian‑подобных дистрибутивах).

Команда для сборки статической библиотеки с помощью CMake и GCC/Clang:

cmake . -B ./build -DCMAKE_BUILD_TYPE=Release && \
cmake --build ./build
# Вместо Release можно указать Debug, MinSizeRel или RelWithDebInfo.

Если у вас CMake старше 3.13 и он не понимает -B, используйте:

mkdir -p build ; cd build
cmake .. -DCMAKE_BUILD_TYPE=Release && cmake --build .

Результат сборки:

  • libtvision.a — статическая библиотека Turbo Vision.
  • Демо‑приложения: hello, tvdemo, tvedit, tvdir — классические примеры из оригинальной Turbo Vision с небольшими улучшениями.
  • Демо mmenu и palette из технической поддержки Borland.
  • tvhc — Turbo Vision Help Compiler.

Библиотека и исполняемые файлы лежат в ./build.

Сборка собственного приложения

Минимальная команда для сборки приложения hello.cpp из корня проекта:

g++ -std=c++14 -o hello hello.cpp ./build/libtvision.a -Iinclude -lncursesw -lgpm

Дополнительные флаги, которые могут понадобиться:

  • -Iinclude/tvision — если вы используете заголовки Turbo Vision 1.x (#include <tv.h> вместо #include <tvision/tv.h>).
  • -Iinclude/tvision/compat/borland — если вы подключаете Borland‑заголовки (dir.h, iostream.h и т.д.).
  • На Gentoo (и, возможно, других системах): -ltinfow, если в системе есть и libtinfo.so, и libtinfow.so. Иначе возможен segfault при запуске Turbo Vision‑приложений. tinfo поставляется вместе с ncurses.
  • -lgpm нужен только если Turbo Vision собран с поддержкой libgpm.

Требования в рантайме

  • xsel или xclip — для буфера обмена в X11.
  • wl-clipboard — для буфера обмена в Wayland.

Windows: MSVC

Сборка с MSVC немного сложнее из‑за множества конфигураций и архитектур. Для оптимизированных бинарников:

cmake . -B ./build && \
cmake --build ./build --config Release
# Можно указать Debug, MinSizeRel или RelWithDebInfo вместо Release.
# Для выбора платформы добавьте: -A x64 (64-бит) или -A Win32 (32-бит).

После этого:

  • tvision.lib и примеры окажутся в ./build/Release.

Если нужно статически линковать Microsoft RTL (/MT вместо /MD), включите опцию:

-DTV_USE_STATIC_RTL=ON

При линковке приложений обратите внимание:

  • MSVC не позволяет смешивать /MT и /MD, а также debug и release‑бинарники. Все компоненты должны быть собраны с одинаковыми настройками RTL.

Если вы пишете своё приложение на Turbo Vision, обязательно включите флаги компилятора:

/permissive- /Zc:__cplusplus

Если вы подключаете Turbo Vision как CMake‑подмодуль, эти флаги включаются автоматически.

Важно: Turbo Vision использует setlocale для перевода RTL в UTF‑8‑режим. Это не сработает с очень старыми версиями RTL.

При статической линковке RTL и при наличии поддержки UTF‑8 в setlocale приложения Turbo Vision по умолчанию работают на Windows Vista и новее. При правильной версии MSVC и настройках можно добиться работы и на Windows XP.

Windows: MinGW

После настройки окружения MinGW сборка почти повторяет Linux‑сценарий:

cmake . -B ./build -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release && \
cmake --build ./build

При включённой опции TV_BUILD_EXAMPLES (по умолчанию ON) libtvision.a и все примеры лежат в ./build.

Для линковки собственного приложения с Turbo Vision:

  • добавьте к линковщику: -L./build/lib -ltvision,
  • добавьте к компилятору: -I./include.

Приложения Turbo Vision под MinGW могут работать на Windows XP и новее, если это поддерживает ваш компилятор.

Borland C++: DOS и старый Windows

Сборка через Borland Makefile в каталоге project:

cd project
make.exe <options>

Доступные опции:

  • -DDOS32 — 32‑битные DPMI‑приложения (работают на 64‑битном Windows).
  • -DWIN32 — 32‑битные Win32‑приложения (не для TVDEMO).
  • -DDEBUG — отладочные версии библиотеки и приложений.
  • -DTVDEBUG — линковка приложений с debug‑версией библиотеки.
  • -DOVERLAY, -DALIGNMENT={2,4}, -DEXCEPTION, -DNO_STREAMABLE, -DNOTASM — исторические настройки.

Результат:

  • библиотека собирается в каталог LIB рядом с project,
  • демо‑исполняемые файлы собираются в соответствующих examples/*.

Корневой makefile рассчитан на запуск из каталога project. Если вам нужны другие настройки, можно напрямую запускать исходные makefile в source/tvision и examples/*.

Установка через vcpkg

Turbo Vision доступен в менеджере зависимостей vcpkg:

git clone https://github.com/Microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.sh
./vcpkg integrate install
./vcpkg install tvision

Порт tvision в vcpkg поддерживают команда Microsoft и участники сообщества. Если версия отстаёт от репозитория, можно создать issue или pull request в репозитории vcpkg.

Turbo Vision как зависимость CMake (кроме Borland C++)

Есть два основных подхода:

1. Установить Turbo Vision и импортировать через find_package

Сначала выберите install‑префикс:

  • По умолчанию CMake использует системный префикс (часто требует root‑прав).
  • На Unix можно использовать "$HOME/.local".
  • На Windows — любой путь, который вы потом добавите в CMAKE_PREFIX_PATH при сборке приложения.

Для моно‑конфигурационных генераторов (Unix Makefiles, Ninja и т.п.):

cmake . -B ./build # -DCMAKE_INSTALL_PREFIX=... для переопределения префикса
cmake --build ./build
cmake --install ./build

Для мульти‑конфигурационных генераторов (Visual Studio, Ninja Multi‑Config):

cmake . -B ./build # -DCMAKE_INSTALL_PREFIX=... для переопределения префикса

cmake --build ./build --config Release
cmake --build ./build --config Debug --target tvision
cmake --build ./build --config RelWithDebInfo --target tvision
cmake --build ./build --config MinSizeRel --target tvision

cmake --install ./build --config Release
cmake --install ./build --config Debug --component library
cmake --install ./build --config RelWithDebInfo --component library
cmake --install ./build --config MinSizeRel --component library

После установки в CMakeLists.txt вашего приложения:

find_package(tvision CONFIG)

target_link_libraries(my_application tvision::tvision)

2. Подключить Turbo Vision как подмодуль и использовать add_subdirectory

Добавьте репозиторий Turbo Vision в свой проект (например, в каталог tvision) и в CMakeLists.txt напишите:

add_subdirectory(tvision) # Turbo Vision лежит в каталоге 'tvision'.

target_link_libraries(my_application tvision)

В обоих случаях заголовок <tvision/tv.h> будет доступен в include‑пути при сборке, а ваш проект автоматически получит нужные зависимости (Ncurses, GPM и прочее) при линковке.


Turbo Vision 2.0 — это осознанный выбор для тех, кто хочет строить сложные текстовые интерфейсы в терминале, не погружаясь в детали терминальных escape‑последовательностей и поддержки Unicode на каждой платформе вручную. Если вы живёте в консоли и пишете на C++, этот фреймворк стоит хотя бы один раз собрать и открыть tvdemo и tvedit, чтобы понять, насколько «олдскульный» UI может быть современным.


Читайте также