2 poin oleh GN⁺ 9 jam lalu | 1 komentar | Bagikan ke WhatsApp
  • 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

  • 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
      • Isu terkait: #11
  • 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

 
GN⁺ 9 jam lalu
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

    • Oxygene adalah bagian dari lini produk Elements milik RemObjects, jadi selain Oxygene yang berakar pada Pascal, Anda bisa mencampur beberapa bahasa populer dan menargetkan Windows, macOS, Linux, Android, dan lainnya
      https://www.remobjects.com/elements/oxygene/
      https://www.remobjects.com/elements/
    • Saya juga pernah mengerjakan port tvision ini, dan setiap kali mencoba framework TUI baru, pada akhirnya saya merasa Turbo Vision tetap lebih baik
      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
    • Menyentuh library TV ini benar-benar menggaruk nostalgia dengan tepat, jadi menyenangkan
      Berkat itu saya jadi tidak sampai melakukan upaya sia-sia seperti membuat aplikasi untuk GEOS atau bergabung dengan tim Hurd beranggotakan satu orang
    • Saya juga ingin mencoba hal yang sama
      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

    • Yang menarik, Free Vision pada satu titik adalah hasil seseorang menerjemahkan secara manual versi C++ yang pernah dirilis ke domain publik kembali ke Object/Free Pascal
    • OWL benar-benar melampaui zamannya
  • 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

    • Manual-manual itu memang luar biasa
      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
    • Turbo Vision sudah lama menjadi semacam standar emas bagi saya
      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
    • Ada masa ketika saya sepenuhnya Borland
      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

  • 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

    • Di Unix modern, kompilasi perangkat lunak dulu sempat menjadi masalah yang sudah terpecahkan
      ./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

    • Pada dasarnya itu bukan kuning secara inheren
      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 uses adalah keyword, sedangkan cara meng-include modul dengan #define terasa seperti semacam hack
    Ya, mungkin sekarang itu bukan perbedaan besar

    • Free Vision yang disertakan di Free Pascal pada dasarnya mengisi peran itu
      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 object dari era Turbo Pascal 5.5, bukan class seperti di Delphi
      class memudahkan implementasi hal-hal seperti serialisasi otomatis berkat RTTI, sedangkan object tidak 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 objek
      Free Pascal memang menambahkan beberapa kenyamanan ke object seperti private/protected/public dan property, tetapi Free Vision tidak memakai ekstensi-ekstensi itu karena harus mengimplementasikan API Turbo Vision asli