- Memindahkan kembali framework UI teks klasik agar bisa digunakan lagi di Linux dan Windows, sekaligus menyediakan basis pengembangan bersama yang mencakup UTF-8 dan warna yang diperluas
- Semaksimal mungkin mempertahankan kompatibilitas tingkat kode sumber untuk aplikasi Turbo Vision lama, sambil tetap memakai API berbasis
char sehingga perbedaan terminal antar-platform diserap di dalam library
- Mengintegrasikan input dan tampilan Unicode ke seluruh framework sehingga karakter lebar ganda, karakter gabungan, shortcut multibyte, serta pengeditan dan penggambaran berbasis UTF-8 dapat ditangani bersama
- Menyediakan widget dasar seperti jendela bertumpuk, menu, kotak dialog, kolom input, dan scrollbar, serta mendukung perilaku modern seperti event loop, timer, clipboard, mouse wheel, resize, dan pengeditan file berukuran besar
- Melampaui API lama yang berpusat pada 16 warna dengan menggabungkan warna 24-bit, palet xterm-256, clipboard sistem, dan dukungan untuk berbagai lingkungan konsol, sehingga menjadi fondasi yang menghubungkan kode TUI lama dengan lingkungan terminal modern
Karakter proyek dan arah utama
- Sebagai port modern Turbo Vision 2.0, proyek ini menghidupkan kembali framework UI teks klasik untuk Linux dan Windows sambil menghadirkan UTF-8 dan warna yang diperluas
- Pada tahap awal, fokusnya adalah menambahkan dukungan Linux, mempertahankan perilaku DOS/Windows yang ada, dan menjaga kompatibilitas tingkat kode sumber untuk aplikasi Turbo Vision lama
- Demi kompatibilitas ini, beberapa fungsi Borland C++ RTL juga diimplementasikan langsung
- Pada Juli–Agustus 2020, dukungan Unicode penuh diintegrasikan ke dalam struktur yang sudah ada, dan dalam prosesnya editor teks Turbo juga dibuat
- Aplikasi dibungkus agar tidak perlu mengakali perbedaan fitur terminal atau menangani I/O terminal secara langsung, sehingga perbedaan antar-platform diserap oleh sisi library
- Berfokus pada penulisan UI teks dengan kode yang sama di Linux dan Windows, sambil tetap mempertahankan API berbasis
char alih-alih wchar_t atau TCHAR
Mengapa berguna
- Menyediakan banyak kelas widget sehingga jendela bertumpuk yang bisa diubah ukurannya, menu pull-down, kotak dialog, tombol, scrollbar, kolom input, checkbox, radio button, dan lainnya bisa langsung digunakan
- Saat membuat widget sendiri, beban untuk menulis ulang penanganan umum seperti distribusi event atau tampilan karakter Unicode full-width juga berkurang
- Diupayakan agar menghasilkan hasil yang sama semaksimal mungkin di tiap lingkungan
- Bahkan ketika warna latar terang di konsol Linux bergantung pada atribut blink, library akan menanganinya untuk Anda
- Dengan memanfaatkan dukungan UTF-8
setlocale dari Microsoft RTL, di Windows pun kode seperti std::ifstream f("コンピュータ.txt"); bisa berjalan sesuai maksud
- Di Windows, RTL langsung mengonversi nama file ke encoding sistem
Desain Unicode dan pemrosesan teks
- Mengadopsi UTF-8 sebagai encoding dasar untuk input dan tampilan
- Kompatibel dengan tipe data
char * yang sudah ada, dan sama dengan encoding I/O terminal sehingga mengurangi konversi yang tidak perlu
- Arahnya juga selaras dengan UTF-8 Everywhere Manifesto
- Saat dibangun dengan Borland C++, Unicode tidak didukung, tetapi perluasan API dirancang agar tetap memungkinkan penulisan kode yang independen dari encoding
- Pada
KeyDownEvent, selain charScan.charCode yang sudah ada, ditambahkan text[4] dan textLength untuk langsung meneruskan rangkaian byte input UTF-8
- Pada
charScan.charCode, karakter berbasis CP437 tetap dimasukkan demi kompatibilitas ke belakang
- Disarankan menggunakan
getText() untuk mengambil string view
- Contoh input menunjukkan secara apa adanya bagaimana Unicode dan kode lama berjalan bersama
- Saat memasukkan
ñ, nilainya menjadi charCode=164 ('ñ'), text={'\xC3','\xB1'}, textLength=2
- Saat memasukkan
€, karena tidak ada di CP437, nilainya menjadi keyCode=0x0, charCode=0, text={'\xE2','\x82','\xAC'}, textLength=3
- Saat memasukkan shortcut,
textLength=0 sehingga kosong
- TScreenCell dapat memuat code point UTF-8 serta atribut tambahan seperti bold, underline, dan italic
- Karakter kontrol ASCII diperlakukan seperti karakter code page
- UTF-8 yang valid ditampilkan apa adanya, sedangkan UTF-8 yang tidak valid diperlakukan sebagai karakter code page
- ASCII diperluas dan UTF-8 bisa dicampur, yang menguntungkan untuk kompatibilitas ke belakang tetapi juga dapat menimbulkan hasil yang tak terduga
- Karakter lebar ganda dan karakter gabungan juga ditangani secara terpisah
- Karakter gabungan ditumpangkan di atas karakter sebelumnya
ZERO WIDTH JOINER U+200D selalu dihilangkan
- Jika terminal mematuhi lebar karakter berdasarkan
wcwidth, hampir tidak ada kerusakan grafis yang mencolok
- Contohnya bisa dilihat di Wide character display
API Unicode dan dukungan view standar
-
API rendering yang mengenali Unicode
TDrawBuffer::moveChar, putChar memperlakukan char c sebagai karakter code page
moveStr, moveCStr menerima TStringView dan memproses string dengan aturan Unicode
maxStrWidth didasarkan pada jumlah kolom, bukan jumlah byte
strIndent juga didasarkan pada jumlah kolom, bukan byte, sehingga bisa dipakai untuk scroll horizontal
- Nilai kembalian adalah lebar tampilan dari teks yang disalin
moveBuf dipertahankan karena merupakan fungsi yang digunakan untuk menangani string non-null-terminated sebelum TStringView diperkenalkan
cstrlen(TStringView s) mengembalikan panjang tampilan tanpa ~, sedangkan strwidth(TStringView s) mengembalikan panjang tampilan dengan ~
-
Penyederhanaan draw() dan pengurangan bug
TFileViewer::draw() versi lama menyalin substring ke buffer sementara lalu memanggil moveStr, tetapi pendekatan ini membawa risiko buffer overrun dan masalah batas multibyte
- Setelah diperbaiki, pemrosesan cukup dilakukan dengan satu baris
b.moveStr(0, p, c, size.x, delta.x);, sehingga penyalinan perantara dihilangkan
delta.x bisa langsung diterapkan berdasarkan kolom
- Karena hanya menyalin maksimal
size.x kolom, kebutuhan untuk menghitung sendiri jumlah byte dan kondisi batas menjadi berkurang
-
View standar yang mendukung tampilan Unicode
TStaticText, TFrame, TStatusLine, THistoryViewer, THelpViewer, 8c7dac2a, 20f331e3, TListViewer, TMenuBox, TTerminal, TOutlineViewer, TFileViewer di tvdemo, dan TFilePane di tvdir mendukung tampilan Unicode
- Beberapa view juga menangani scroll horizontal dan word wrapping
-
View yang juga menangani input Unicode
TInputLine, cb489d42, TEditor, dan shortcut di TMenuView juga menangani input pengguna Unicode
- Instance
TEditor secara default berjalan dalam mode UTF-8 dan bisa diubah ke mode single-byte dengan Ctrl+P
- Peralihan ini tidak mengubah isi dokumen, hanya mengubah cara tampilan dan encoding input
- Shortcut tombol yang disorot seperti di
TStatusLine dan TButton tidak didukung
-
String multibahasa di menu dan status line
- String seperti
~Ñ~ello, 階~毎~料入報最..., 五劫~の~擦り切れ, העברית ~א~ינטרנט, ~Alt-Ç~ Exit bisa langsung digunakan di menu dan status line
- Hasil tampilannya bisa dilihat di Unicode Hello
Model operasi per platform
-
Unix
- Menggunakan dukungan terminal berbasis Ncurses
- Mendukung encoding mouse X10, SGR, modifyOtherKeys milik xterm, fixterms milik Paul Evans, keyboard protocol milik Kitty,
win32-input-mode milik WSL Conpty, far2l, modifier TIOCLINUX pada konsol Linux, dan mouse GPM
- Memiliki custom signal handler untuk memulihkan status terminal sebelum program berakhir secara abnormal
- Jika
stderr adalah tty, output akan disimpan di buffer lalu dicetak saat keluar atau suspend untuk mencegah kerusakan layar
- Karena ada batas ukuran buffer, penulisan ke
stderr bisa gagal saat buffer penuh
- Untuk mempertahankan semuanya, disarankan menggunakan redirect
2>
- Membaca variabel lingkungan
TERM, COLORTERM, ESCDELAY, TVISION_USE_STDIO
- Jika
COLORTERM=truecolor atau 24bit, maka diasumsikan memakai warna 24-bit
- Nilai bawaan
ESCDELAY adalah 10ms
- Jika
TVISION_USE_STDIO tidak kosong, I/O dilakukan melalui stdin dan stdout alih-alih /dev/tty
-
Windows
- Hanya kompatibel dengan Win32 Console API
- Pada emulator terminal yang tidak mendukungnya, jendela konsol terpisah akan dibuka otomatis
- Tata letak aplikasi didasarkan pada ukuran jendela konsol, bukan buffer konsol, dan buffer konsol dipulihkan saat keluar atau suspend
- Jika bukan Borland C++, code page konsol diubah ke UTF-8 saat mulai dan dipulihkan saat keluar
- Microsoft C runtime juga diubah ke mode UTF-8 sehingga developer tidak perlu langsung memakai varian
wchar_t
- Pada kombinasi mode legacy dan font bitmap, tampilan Unicode bisa rusak; jika terdeteksi, akan dicoba mengganti font ke
Consolas atau Lucida Console
- Contohnya bisa dilihat di photo
-
Peningkatan perilaku umum
- Menyediakan warna 24-bit, koeksistensi dengan redirect
stdin/stdout/stderr, dan kompatibilitas file help 32-bit
- Mengontrol laju refresh maksimum dengan variabel lingkungan
TVISION_MAX_FPS
- Nilai bawaannya adalah
60
0 menonaktifkan batas
-1 membuat gambar dirender segera pada setiap pemanggilan THardwareInfo::screenWrite
- Mendukung tombol mouse tengah, roda mouse, ukuran layar hingga 32767 baris/kolom, dan event resize
- Ukuran jendela bisa diubah dari sudut kiri bawah, dan area kosong bisa diseret dengan tombol tengah
- Menu bisa ditutup dengan mengklik ulang item induk, dan scrollbar merespons page scroll serta input roda saat sedang diseret
TInputLine tidak menggulir teks secara tidak perlu saat fokus berpindah
TFileViewer dan TEditor mendukung line ending LF, dan TEditor mempertahankan line ending lama saat menyimpan, sementara file baru memakai CRLF secara bawaan
TEditor juga mencakup menu klik kanan, scroll drag tombol tengah, tombol hapus per kata, peningkatan tombol Home, serta dukungan file lebih dari 64 KiB
tvdemo berisi applet event viewer dan opsi untuk mengubah pola latar belakang
Event loop dan perubahan API
- Menggunakan buffering penulisan layar, dan biasanya mengirim ke terminal sekali untuk setiap satu putaran active event loop
- Jika perlu refresh langsung dalam loop sibuk,
TScreen::flushScreen() bisa dipanggil
TEventQueue::waitForEvents(int timeoutMs) menunggu event input, dan selama menunggu juga melakukan refresh layar dengan TScreen::flushScreen()
TProgram::getEvent() memanggil ini dengan eventTimeoutMs yang nilai bawaannya 20 untuk menghindari busy loop CPU 100%
TEventQueue::wakeUp() adalah metode thread-safe untuk membangunkan event loop dari thread lain
- Dengan
TView::getEvent(TEvent &, int timeoutMs), timeout wait dapat diterapkan per view
setTimer dan killTimer ditambahkan untuk memicu evBroadcast dan cmTimerExpired saat timer kedaluwarsa
- Jika
periodMs bernilai negatif, timer menjadi one-shot dan dibersihkan otomatis
- Event timer dibuat di
TProgram::idle() dan hanya diproses saat tidak ada event keyboard atau mouse
TDrawBuffer bukan lagi array panjang tetap, dan mencegah akses di luar jangkauan
move, grow, intersect, Union pada TRect mengembalikan TRect& sehingga bisa di-chaining
TApplication menyediakan dosShell(), cascade(), tile() secara bawaan dan menangani cmDosShell, cmCascade, cmTile secara default
- Tipe seperti
TStringView, TSpan<T>, TDrawSurface, TSurfaceView, TClipboard ditambahkan
THardwareInfo, TScreen, TEventQueue diinisialisasi saat TApplication pertama dibuat, bukan sebelum main
- Perluasan input juga disertakan
evMouseWheel, mwUp, mwDown, mwLeft, mwRight
mbMiddleButton, meTripleClick
- Informasi tombol yang dilepas tetap dipertahankan di
evMouseUp.buttons
- Shortcut multibyte dapat diimplementasikan dengan
hotKeyStr, getAltCharStr, getCtrlCharStr
- Dengan
TKey, kombinasi tombol baru seperti Shift+Alt+Up dapat didefinisikan
TInputLine mendukung limitMode untuk ilMaxBytes, ilMaxWidth, ilMaxChars
Integrasi clipboard
-
Integrasi clipboard sistem
- Sebelumnya hanya ada clipboard internal melalui anggota statis
TEditor::clipboard, dan hanya TEditor yang bisa menggunakannya
- Kelas
TClipboard baru mengakses clipboard sistem, dan jika tidak bisa diakses maka akan memakai clipboard internal sebagai pengganti
-
Lingkungan yang didukung
- Didukung secara bawaan di Windows, WSL, dan macOS
- Di Unix selain macOS, diperlukan dependensi eksternal
- Dalam eksekusi jarak jauh, dapat bekerja dengan X11 forwarding via
ssh -X, far2l dan putty4far2l, serta terminal yang mendukung OSC 52
- Beberapa terminal lain hanya mendukung penyalinan
- Paste melalui
Ctrl+Shift+V atau Cmd+V milik emulator terminal selalu tetap bisa dilakukan secara terpisah
-
API dan penanganan paste
TClipboard bisa digunakan dengan mendefinisikan Uses_TClipboard sebelum menyertakan <tvision/tv.h>
setText(TStringView text) mengatur isi clipboard sistem, dan jika tidak dapat diakses akan memakai clipboard internal
requestText() melakukan permintaan asinkron atas isi clipboard sistem, lalu menerimanya dalam bentuk event evKeyDown biasa
- Teks hasil paste bisa dibedakan dari input tombol biasa melalui flag
kbPaste di keyDown.controlKeyState
- Untuk mengurangi inefisiensi saat paste panjang diproses seperti ribuan input tombol, ditambahkan
TView::textEvent(...)
- Membaca teks
evKeyDown berurutan dengan mengumpulkannya ke buffer pengguna
- Jika sudah bukan teks lagi, meneruskannya ke loop berikutnya dengan
putEvent()
-
Integrasi perintah standar
TEditor dan TInputLine merespons perintah cmCut, cmCopy, cmPaste
- Aplikasi harus menghubungkan
kbCtrlX, kbCtrlC, kbCtrlV ke masing-masing perintah di status bar dan sebagainya
- Berdasarkan fokus dan status seleksi, perintah terkait akan diaktifkan atau dinonaktifkan secara otomatis
Model warna yang diperluas dan kompatibilitas
- API Turbo Vision mendukung warna yang diperluas melampaui 16 warna lama
- atribut warna BIOS 4-bit
- RGB 24-bit
- indeks palet xterm-256color 8-bit
- warna default terminal
- Jika terminal tidak mendukung format warna tertentu, Turbo Vision akan menampilkannya dengan kuantisasi
- Di platform modern, diperkenalkan TColorAttr sebagai pengganti
uchar dan TAttrPair sebagai pengganti ushort
TPalette juga memakai array TColorAttr
TView::mapColor kini menjadi virtual, sehingga penetapan warna yang melewati sistem palet hierarkis menjadi memungkinkan
- Hierarki representasi warna dibagi menjadi
TColorBIOS, TColorRGB, TColorXTerm, TColorDesired
TColorAttr memiliki bitmask foreground, background, dan style
- Style mencakup
slBold, slItalic, slUnderline, slBlink, slReverse, slStrike
- Karena
slReverse kurang andal, disarankan memakai reverseAttribute(TColorAttr attr)
- Ada tiga cara memakai warna yang diperluas di
TView
- Override
mapColor untuk hardcode per indeks
- Di
draw(), mengoper TColorAttr langsung ke TDrawBuffer
- Memodifikasi palet aplikasi itu sendiri
TScreen::screenMode mengekspos kemampuan tampilan
smMono berarti monocolor
smBW80 berarti grayscale
smCO80 berarti minimal 16 warna
smColor256 berarti minimal 256 warna
smColorHigh berarti lebih banyak warna dari itu, misalnya warna 24-bit
- Kompatibilitas mundur dirancang agar tetap mempertahankan API bersama tanpa
#ifdef
- Di Borland C++,
TColorAttr dan TAttrPair masing-masing adalah typedef untuk uchar dan ushort
- Di platform modern, keduanya dapat menggantikan posisi
uchar dan ushort yang lama
- Kode lawas tetap bisa dikompilasi apa adanya, tetapi atribut warna non-BIOS bisa hilang saat dikonversi implisit ke
uchar atau ushort
- Kode dalam metode
draw yang memakai ushort baik untuk pasangan indeks palet maupun pasangan atribut warna akan tetap berjalan, tetapi untuk mempertahankan warna yang diperluas, deklarasi variabel cukup diubah dari ushort menjadi TAttrPair
TColorDialog tidak didesain ulang, sehingga tidak bisa dipakai sebagai pemilih warna diperluas saat runtime
Build, distribusi, integrasi
-
Linux dan keluarga Unix
- Dapat membangun pustaka statis
libtvision.a dengan CMake dan GCC/Clang
hello, tvdemo, tvedit, tvdir, mmenu, palette, serta Help Compiler tvhc juga ikut dibuat
- Persyaratannya diringkas menjadi kompiler dengan dukungan C++14,
libncursesw, dan libgpm yang bersifat opsional
- Untuk integrasi clipboard saat runtime, digunakan
xsel, xclip, dan wl-clipboard
- Di beberapa lingkungan,
-ltinfow mungkin diperlukan; jika tidak, saat dijalankan bisa terjadi segmentation fault
-
Windows dan toolchain lainnya
- Build MSVC menggunakan direktori build terpisah untuk tiap arsitektur target, dan menghasilkan
tvision.lib beserta aplikasi contoh
- Opsi
TV_USE_STATIC_RTL memungkinkan penautan statis ke Microsoft runtime
- Biner
/MT dan /MD, serta biner debug dan non-debug, tidak bisa dicampur untuk linking
- Penggunaan
<tvision/tv.h> memerlukan flag /permissive- dan /Zc:__cplusplus, dan akan diaktifkan otomatis jika memakai metode submodul CMake
- Disebutkan bahwa Windows XP juga dimungkinkan jika versi dan konfigurasi MSVC sesuai
- MinGW dibangun dengan CMake seperti di Linux, dan jika kompiler mendukung, dapat berjalan di Windows XP ke atas
- Dengan Borland C++, build pustaka DOS atau Windows juga dimungkinkan, tetapi tidak mendukung Unicode
- Di lingkungan Borland C++, penggunaan winevdm diajukan sebagai alternatif
-
Cara integrasi proyek dan status distribusi
- Di CMake, tersedia dua cara:
find_package(tvision CONFIG) atau add_subdirectory(tvision)
- Keduanya otomatis menangani path include dan kebutuhan linking seperti Ncurses, GPM, dan lainnya
- Tersedia port
tvision di vcpkg
- Saat ini belum ada stable release, dan disarankan melaporkan masalah yang ditemukan saat upgrade berdasarkan commit terbaru
- Untuk keluarga Unix, aplikasi demo harus dibangun sendiri
- Biner Windows disediakan di Actions
examples-dos32.zip: executable 32-bit hasil build Borland C++, tanpa dukungan Unicode
examples-x86.zip: executable 32-bit hasil build MSVC, memerlukan Windows Vista atau lebih baru
examples-x64.zip: executable 64-bit hasil build MSVC, memerlukan Windows Vista x64 atau lebih baru
Contoh, dokumentasi, kasus penggunaan
1 komentar
Pendapat Hacker News
Senang sekali melihat repositori ini naik ke front page, dan sekarang saya sedang membuat wrapper sendiri untuk repositori ini
Saya menjalankan Turbo Vision di macOS di atas .NET, dan rasanya cukup ajaib
Saya sedang menambahkan API level lebih tinggi, membungkus atau memperbaiki palette API yang sudah cukup kuno, dan juga menambahkan layout
Masih dikerjakan intensif di repositori privat, dan saya terus mengutak-atiknya sedikit demi sedikit, misalnya hari ini menetapkan palette berdasarkan surface tempat kontrol diletakkan, lalu besok merapikan bagian lain
Masih ada pekerjaan seperti merapikan layout dan menambahkan kontrol dasar yang menurut standar sekarang terasa kurang
Saya juga pernah mencoba Terminal.Gui, tapi mungkin karena sedang transisi ke v2, cukup sulit dipakai tanpa bug, dan Claude juga menunjukkan dengan sangat baik hal-hal yang tidak boleh dilakukan saat membuat library TUI tanpa mempertimbangkan terminal sungguhan
Jadi saya memang sedang berharap ada Turbo Vision versi modern, lalu menemukan repositori ini, dan sangat berterima kasih melihat dukungan Unicode sudah masuk
https://www.remobjects.com/elements/oxygene/
https://www.remobjects.com/elements/
Saya juga sedang membuat wrapper .NET, mungkin progresnya belum sejauh itu, tetapi saya ingin meniru Windows Forms API semirip mungkin sekaligus menambahkan desainer TUI drag-and-drop
Contohnya ada di sini: https://github.com/brianluft/terminalforms/tree/main/src/TerminalFormsDemo
Sebagian besar pekerjaan integrasi C++ yang rumit saya tangani di sini: https://github.com/brianluft/terminalforms/tree/main/src/tfcore
Saya mengekspor fungsi-fungsi C sederhana agar bisa dipanggil lewat P/Invoke, lalu sisi C# bisa lebih fokus pada penataan struktur kelas
Awalnya saya memaksakan bahwa apa pun yang bisa dilakukan di C++ harus bisa dilakukan juga di C#, tetapi jadinya terlalu rumit, sampai sempat menaruh objek C++ ke dalam buffer C# dengan placement new, nyaris seperti membuat kelas C++ diwarisi dari sisi C#, dan desainnya pun runtuh
Akhirnya saya beralih ke pendekatan yang lebih langsung, kurang fleksibel tetapi jauh lebih sederhana, dan fleksibilitasnya saya letakkan di sisi C#
Saya penasaran bagaimana Anda menyusun sistem P/Invoke Anda
Berkat itu saya jadi tidak sampai melakukan upaya sia-sia seperti membuat aplikasi untuk GEOS atau bergabung dengan tim Hurd beranggotakan satu orang
Saya sempat memakai Terminal.Gui, tetapi lebih tertarik ke TV sehingga pernah mempertimbangkan membuat wrapper, dan saya benar-benar ingin melihatnya saat sudah dipublikasikan
Karier pemrograman saya secara harfiah dimulai dari tempat sampah pada tahun 90-an
Saya memungut buku Turbo Vision yang dibuang seseorang, lalu langsung jatuh cinta pada TUI kebiruan yang bisa dibuat siapa saja
Versi aslinya ada di Turbo Pascal 6, dan port C++ muncul belakangan
Jadi ini bisa dibilang port modern dari sebuah port
Borland punya pola serupa pada framework lain; OWL juga awalnya lebih dulu ada di Turbo Pascal for Windows 1.5, dan banyak alat C++ Builder sebenarnya ditulis dengan Delphi
Object Pascal di Turbo Pascal 5.5, lalu Turbo Vision di versi 6, adalah pengenalan saya ke OOP, dan saya merasa beruntung menapaki jalur itu
Bahkan di lingkungan seperti MS-DOS pun saya bisa benar-benar belajar keunggulan framework yang dibawa OOP dan Turbo Vision
Saat Borland merilis Turbo Pascal, Turbo C++, dan TurboVision, rasanya seperti seluruh semesta kemungkinan terbuka lebar
Performa kompiler juga luar biasa, dan manualnya seperti karya seni; andai saja saya masih menyimpan buku-buku itu
Ini benar-benar harta budaya
Pada awal 90-an saya belajar C/C++ hampir sepenuhnya secara otodidak hanya dengan membaca tumpukan buku Borland yang datang bersama Turbo C++, dan sekarang rasanya bahkan sulit membayangkan orang belajar seperti itu hanya dari buku referensi
Framework TUI baru selalu terasa seperti ada yang kurang, dan sekarang saya ingin memakainya lagi untuk melihat apakah itu cuma nostalgia atau bukan
Saya berencana memakainya pada alat berikutnya, dan ingin memberi tepuk tangan besar kepada para pembuatnya
Selain GW-BASIC dan MS-DOS, semuanya Borland: Turbo BASIC, Turbo Pascal, Turbo C++ for MS-DOS and Windows 3.x, Turbo Vision, sampai OWL
Saya mulai memakai VC++ sekitar versi 5, tetapi MFC selalu terasa terlalu hambar dibandingkan produk-produk Borland
Bahkan sekarang pun masih jarang ada yang benar-benar menandingi kemampuan RAD C++ Builder, dan .NET juga butuh waktu cukup lama untuk merapikan cerita low-level coding dan AOT ala Delphi
Menurut saya para pengembang Go, C++, dan Rust seharusnya diberi beberapa salinan Turbo Pascal 7 untuk MS-DOS dan Delphi modern
Turbo Vision 2.0 masih cukup praktis sampai sekarang, dan saya benar-benar memakainya untuk pekerjaan prototipe sekitar setahun lalu
Saya mencoba membuat frontend Turbo Vision untuk debugger LLDB agar berfungsi seperti Turbo Debugger milik Borland, dan sebagian besar berhasil sesuai harapan
Mengejutkan karena rasanya seperti langsung melanjutkan dari titik saat semuanya berhenti pada 199x, dan saya juga bisa mengompilasi serta menjalankan kode dari 1993 tanpa masalah besar
Editor internalnya juga punya versi berbasis Scintilla yang lebih baik, jadi ada fitur seperti syntax highlighting, tetapi modifikasi yang ingin saya lakukan tidak berjalan mulus, jadi mungkin saya harus meminta bantuan penulisnya
Namun, dalam arti dokumentasi sebagai pengetahuan bersama ala masa kini, memang masih kurang, sehingga sulit bertanya ke Stack Overflow atau AI; saya akhirnya harus belajar dari kode contoh dan membaca berulang beberapa buku Turbo Vision seperti cara lama
Layout manual cukup merepotkan, jadi saya berharap ada auto layout seperti Qt, dan saya juga agak merindukan splitter, meski implementasinya sepertinya tidak sulit
Hal lain yang mengejutkan adalah TV ternyata cukup kecil dan ringkas. Pada tahun 90-an dulu rasanya sangat besar
Secara keseluruhan, modernisasinya dilakukan dengan sangat baik, dan saya sangat menyukainya
Turbo Vision dulu justru menyediakan sangat banyak dokumentasi berkualitas tinggi
Menurut saya, yang justru kekurangan dokumentasi seperti itu adalah dunia modern
https://archive.org/details/bitsavers_borlandTurrogrammingGuide1992_25707423
Melihat banyak sekali direktif cmake membuat saya ingin kembali ke masa lalu tanpa alasan yang jelas
Dulu di Turbo C atau Pascal tinggal tekan F9 lalu langsung jalan
Di sisi lain, ini juga terasa menunjukkan ketidakmampuan toolchain kita
Di zaman sekarang seharusnya cukup dengan menunjuk satu kompiler online untuk langsung menjalankannya, atau mengunduh lalu membuka satu folder dan menjalankannya; bukannya berubah jadi semacam ritual
./configure && make && make install seharusnya tetap menjadi gold standard
Ini hanya salah satu dari sekian port/klon Turbo Vision
Di dunia C++ juga ada ini: https://github.com/kloczek/tvision
Versi yang masuk ke FreePascal/Lazarus ditulis dalam Pascal, dan ada juga versi Rust yang agak terasa seperti vibe-coded: https://github.com/aovestdipaperino/turbo-vision-4-rust
Menjalankannya di terminal memang sedikit menghilangkan sensasi inti dari mouse di layar mode teks aslinya
Di layar mode teks sungguhan, mouse itu bukan terlihat seperti pointer, melainkan seperti blok kuning yang digerakkan dengan mouse
Saya penasaran apakah ada yang pernah menjalankannya di mode teks Linux beresolusi tinggi dengan GPM
Caranya adalah dengan membalik warna sel yang ditimpa, dan karena jendela utama yang memenuhi sebagian besar layar biasanya berwarna biru tua, hasilnya sering tampak seperti blok kuning terang
Saya merekomendasikan episode Wookash podcast terbaru tentang Chuck Jazdzewski
Ia adalah salah satu anggota tim yang membuat Turbo Vision asli, dan banyak cerita tentang ekosistemnya secara keseluruhan juga muncul di sana
Saya masih lebih menginginkan Turbo Vision yang asli, yaitu versi Pascal, daripada versi C++
Versi C++ pada akhirnya terasa lebih seperti hasil pemindahan dari versi Pascal
Misalnya, di Pascal
usesadalah keyword, sedangkan cara meng-include modul dengan#defineterasa seperti semacam hackYa, mungkin sekarang itu bukan perbedaan besar
IDE mode teksnya juga memakai Free Vision
https://wiki.lazarus.freepascal.org/images/1/19/Userscreen.png
Hanya saja perbedaan intinya adalah Free Vision dan Turbo Vision memakai tipe
objectdari era Turbo Pascal 5.5, bukanclassseperti di Delphiclassmemudahkan implementasi hal-hal seperti serialisasi otomatis berkat RTTI, sedangkanobjecttidak punya itu, jadi untuk membedakan tipe yang berbeda saat runtime perlu melakukan serialisasi manual, misalnya dengan mendaftarkan pointer VMT yang berada pada offset tetap di pointer objekFree Pascal memang menambahkan beberapa kenyamanan ke
objectseperti private/protected/public dan property, tetapi Free Vision tidak memakai ekstensi-ekstensi itu karena harus mengimplementasikan API Turbo Vision asli