- Дата публикации
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-modeConPTY (актуально для WSL). - Поддержка модификаторов клавиш через
TIOCLINUXи мыши через GPM в Linux‑консоли.
- Ncurses с широкими символами (
-
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‑последовательности.
Один из ключевых инженерных приёмов — минимальные изменения легаси‑кода. Автор поставил себе цель:
- Запустить Turbo Vision под Linux с минимальной правкой исходников.
- Сохранить работоспособность под DOS/Windows с Borland C++.
- Максимально сохранить совместимость исходников старых приложений 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или24bitTurbo 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 реально полезен
-
Кроссплатформенные CLI‑утилиты с TUI
Если вы пишете консольный инструмент, который должен:- работать и на Linux, и на Windows,
- иметь окна, меню, диалоги, поля ввода,
- не требовать от пользователя X11/Wayland или GUI, Turbo Vision снимает с вас головную боль с разбором escape‑последовательностей, различий терминалов и кодировок.
-
Поддержка и перенос старых приложений Turbo Vision
Если у вас остались проекты на Turbo Vision из эпохи Borland C++, этот порт даёт шанс:- собрать их на современных компиляторах,
- перенести на Linux,
- добавить Unicode и поддержку современных терминалов.
-
Низкоуровневые инструменты для серверов и DevOps
На серверах часто нет GUI, но есть SSH и терминал. Turbo Vision подойдёт для:- админских панелей,
- TUI‑конфигураторов,
- лог‑просмотрщиков,
- редакторов конфигов (на базе TEditor).
-
Обучение C++ и архитектурам UI без GUI‑слоя
Turbo Vision даёт классический пример событийной архитектуры интерфейса: виджеты, события, обработчики.
Это полезно, если вы хотите показать студентам, как строятся UI‑фреймворки, без отвлечения на графику. -
Инструмент для тех, кто живёт в терминале
Если вы предпочитаете 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 может быть современным.