2 poin oleh GN⁺ 2024-04-02 | 1 komentar | Bagikan ke WhatsApp
  • Libmui adalah pustaka UI yang mereplikasi sebagian besar API Macintosh Classic “Toolbox”; bukan implementasi lengkap, tetapi menyediakan fitur yang dibutuhkan oleh emulator MII Apple //e dan aplikasi sederhana
  • Dimulai sebagai pustaka UI untuk MII, dengan tujuan membuat UI yang ditata manual alih-alih menu bergaya game “Arrow Keys + Return + Escape” atau solusi dengan banyak dependensi
  • Rendering dilakukan dengan menggambar ke buffer ARGB lalu menyalinnya ke tekstur OpenGL atau shared pixmap X11/XCB, sambil melacak invalid region agar hanya area yang perlu saja yang digambar ulang
  • Tidak seperti Macintosh Toolbox asli, API-nya bekerja secara asinkron dan berbasis callback; saat status berubah, UI akan menggambar ulang saat diperlukan dan event dikirim lewat callback alih-alih polling
  • Menyediakan fitur Window, Menu, Control, List, Alert, dan Standard File, tetapi tidak menyediakan zooming, resizing, dialog Save, dark mode, theme, Wayland, binding Rust/Go/Python, maupun GTK/QT/SDL

Apa yang dibuat Libmui

  • Libmui adalah pustaka yang banyak mereplikasi API Macintosh Classic “Toolbox”
  • Ini bukan implementasi lengkap, tetapi mencakup bagian yang diperlukan untuk beberapa aplikasi sederhana dan emulator MII Apple //e
  • Awalnya berangkat dari kebutuhan akan pustaka UI untuk MII, dengan keinginan akan UI yang tidak memiliki terlalu banyak dependensi dan tidak condong ke navigasi menu bergaya game
  • Nuklear immediate mode UI sempat dicoba lebih dulu, tetapi tampilannya tidak disukai, ruang untuk kustomisasi dianggap terlalu terbatas, dan mesin layout dinilai menempatkan elemen berbeda dari posisi yang diinginkan
  • Pengalaman bahwa immediate mode UI secara internal mempertahankan state berbasis hash, dan benturan hash bisa menimbulkan masalah debugging nyata, juga menjadi latar belakangnya
  • Tujuannya adalah mendekati UI yang dipoles langsung dengan tangan alih-alih UI yang ditentukan otomatis oleh mesin layout

Model rendering dan cara kerja

  • Libmui menggambar UI ke “screen” berupa buffer ARGB
    • Di MII, buffer ini dioverlay ke tekstur OpenGL
    • Demo playground di folder example menyalinnya ke jendela X11 sebagai XCB shared pixmap, dan juga berjalan di remote X11
  • Seperti OS lama, ia melacak invalid region dan hanya menggambar ulang bagian yang diperlukan
    • Tidak menggambar ulang seluruh tampilan setiap saat, sehingga overdraw sangat kecil
    • Jika ingin menggambar ke framebuffer 16-bit dan sejenisnya, perlu konversi langsung dari output ARGB
    • Karena hanya dirty region yang perlu dikonversi, bebannya tidak besar
  • Rendering juga bisa divektorkan ke vertex buffer dan semacamnya, tetapi pendekatan saat ini dianggap cukup cepat dan tidak perlu kembali ke perilaku menggambar ulang keseluruhan seperti immediate mode UI

Perbedaan dari Macintosh Toolbox asli

  • Tampilannya bermula dari MacOS 8/9 tetapi dengan elemen grayscale dihapus; karena tampilan flat System 7 dianggap menua lebih baik, arah itu yang dipilih
  • Popup menu lebih dekat ke OS8, sedangkan scrollbar lebih dekat ke GS/OS
  • Perbedaan besar pada API adalah cara kerjanya yang sepenuhnya asinkron
    • Tidak bisa menggambar ke window atau GrafPort kapan saja dengan spinloop seperti aslinya
    • Saat status UI berubah, UI akan menggambar ulang sendiri saat diperlukan
  • Penanganan event bersifat berbasis callback
    • Tidak melakukan polling untuk mengetahui apa yang terjadi di UI
    • Saat item menu diklik atau shortcut keyboard ditekan, callback action akan dipanggil
  • Struktur konsepnya lebih sederhana daripada aslinya
    • Semua adalah mui_window atau mui_control
    • windows, menubars, dan menus adalah mui_window
    • judul menu, item menu, semua elemen di dalam window, dan garis separator adalah mui_control

Manajer dan kontrol yang disediakan

  • Window Manager

    • Mendukung pembuatan jendela dan penggambaran di dalam jendela
    • Mendukung maksimum 15 layer, clipping, perilaku BringToFront, dan drag jendela
    • Sistem koordinat dibatasi ke dua jenis seperti aslinya: screen coordinates dan window content coordinates
    • Mengelola daftar invalid rectangle agar tidak perlu menggambar ulang seluruh jendela setiap saat
    • zooming dan resizing masih TODO
    • transparent windows sengaja tidak didukung
      • Karena jendela digambar dengan pendekatan top-down untuk mengoptimalkan clipping
      • Untuk menangani transparansi, perlu menggambar bottom-up dan lebih banyak konten harus digambar ulang
      • Namun, tetap memungkinkan melakukan alpha blend seluruh UI screen ke lokasi yang diinginkan
  • Menu Manager

    • Mendukung menubar, menu, checkmark, dan keyboard shortcut
    • Dibuat agar terlihat seperti System 7/8 atau GS/OS
    • Ada hierarchical menus, tetapi belum sepenuhnya sama dengan aslinya dan masih perlu perbaikan
    • Tampilan dan scrolling untuk popup yang sangat besar masih TODO
    • Dukungan sticky menus sudah setengah jadi, tetapi dinonaktifkan karena belum tepat
  • Control Manager

    • Mendukung buttons, checkboxes, radio buttons, scrollbar vertikal, dan textbox dengan pembungkusan teks
    • Edit Field masih dikerjakan dan Slider belum ada
    • Prototipe text edit control cukup baik untuk input satu baris, tetapi belum cocok untuk kotak teks multi-baris
  • List Manager

    • Saat ini hardcoded dan lebih dekat untuk menampilkan nama file
    • Menangani arrow keys, page up/down, dan scroll wheel
    • Seperti MacOS asli, bisa mencari item yang diinginkan dengan typeahead
    • Fitur seperti kompresi font atau ellipsis abbreviation saat teks item terlalu panjang masih TODO
  • Alerts dan Standard File

    • Alert menyediakan dialog umum Cancel + OK
    • Lebih banyak jenis alert masih TODO
    • Standard File menyediakan dialog klasik Open file
      • Fitur ini adalah salah satu target utama awal pustaka ini
      • Dialog Save masih TODO
      • Ada popup tambahan yang menampilkan direktori yang baru-baru ini digunakan
      • Mendukung arrow keys, page up/down, dan pencarian file typeahead
  • Resource Manager

    • Tidak ada Resource Manager
    • Penulis menilai perlu alat seperti ResEdit, sehingga di luar cakupan saat ini
    • Ada gagasan format MessagePack untuk resource, tetapi itu dibiarkan sebagai pekerjaan selanjutnya

Dependensi dan build

  • Dependensi eksternal hanya libpixman
    • libpixman adalah pustaka pemrosesan piksel yang menyediakan fitur region yang berguna untuk clipping
    • Meskipun tidak sebaik region milik QuickDraw, ini dianggap sudah cukup
  • Ada juga komponen yang disertakan di source
    • libcg: renderer antialias kecil mirip cairo, terdiri dari 2 file
    • stb_truetype.h: digunakan untuk memuat font TrueType
    • stb_ttc.h: ekstensi untuk stb_truetype.h yang membentuk font/glyph dictionary, hash table, font texture, dan lain-lain
    • Kode geometri 2D sudah berusia lebih dari 25 tahun dan juga disertakan di libc3
  • Build menggunakan Makefile sederhana dengan menjalankan make di direktori root
  • Untuk membangun tests, demos, dan samples diperlukan xcb, xcb-shm, xcb-randr, xkbcommon-x11
  • Jika memakai Nvidia binary driver, agar mui_shell berjalan perlu menambahkan Option "AllowSHMPixmaps" "1" ke Device di /etc/X11/xorg.conf

Cara penggunaan dan alur kerja pengembangan

  • Sebagai titik awal, disarankan memodifikasi mui_shell.c dan mui_widgets_demo.c
  • ui_mui_shell memuat mui_widgets_demo.so sebagai plugin dan akan memuat ulang otomatis saat mendeteksi perubahan
  • Jika mui_widgets_demo.c diubah, setelah reload ia akan dijalankan lagi sehingga dialog baru bisa dibuat dengan cepat
  • Menjalankan make watch di direktori libmui akan membangun ulang pustaka dan mui_shell secara otomatis saat ada perubahan
  • Jika dipakai bersama auto save di editor, ini memungkinkan alur kerja build-jalankan berulang sambil terus mengedit

Hal-hal yang secara eksplisit tidak disediakan

  • tidak ada dark mode
  • tidak ada dukungan theme
  • tidak ada transparent windows dan cube effect
  • sticky menus saat ini tidak diaktifkan
  • tidak menggunakan cmake, meson, ninja, atau autotools
  • tidak ada binding bahasa seperti Rust, Go, atau Python
  • tidak menggunakan framework seperti GTK, QT
  • tidak menggunakan SDL
  • tidak ada dukungan Wayland

1 komentar

 
GN⁺ 2024-04-02
Komentar Hacker News
  • Terkait ini, ada font TrueType domain publik yang mereplikasi font sistem Chicago asli dengan cukup baik: https://fontlibrary.org/en/font/chicagoflf

    • Saya sempat mempertimbangkan memakai Chicago sebagai font default, tetapi citranya terlalu melekat kuat.
      Charcoal yang digunakan setelah System 8.x jauh kurang dikenal, dan menurut saya pribadi merupakan peningkatan yang cukup besar.
      Meski begitu, menggantinya menjadi Chicago di library ini sebenarnya cukup mudah. Selain replika yang disebutkan, versi TTF “plain” dari Chicago asli juga beredar di suatu tempat
    • Menanggapi soal adanya replika hebat dari “font sistem Chicago asli”, Anda juga bisa mendapatkan TrueType Chicago asli rancangan Bigelow & Holmes melalui unduhan System 7.6.1.
      Setelah itu, cukup ubah TTF ke OTF dengan alat baris perintah FontForge: https://www.macintoshrepository.org/1682-mac-os-7-6-x
      fontforge -script -c 'Open($1); Generate($2);' input_font.ttf output_font.otf
    • macOS modern juga menyertakan font Thailand bernama Silom, dan glyph Latinnya memakai Chicago
  • Keren sekali. Michel membuat ini untuk emulator Apple II miliknya, dan saya memakainya agak sebagai main-main untuk menggantikan frontend emulator Archimedes.
    Ini masih tahap awal, tetapi kalau saya bisa memahami API-nya, pasti itu API yang bagus :)

    • Bahkan memakainya untuk emulator Apple II pun terasa agak seperti bercanda. Saat itu, para pengguna Apple II ingin Apple terus melanjutkan lini Apple II, tetapi merasa Apple pada dasarnya telah meninggalkannya demi fokus ke Mac, jadi mereka kurang suka pada Mac.
      Meski begitu, saya tetap punya rasa sayang pada antarmuka Mac klasik
  • Saya suka rasterizer grafis 2D dua-header yang dipakai proyek ini: https://github.com/xboot/libcg
    Selalu mengejutkan bahwa perangkat lunak sekuat ini bisa dibuat hanya dengan dependensi yang sangat minim.
    Apakah benar sesulit itu membuat library UI yang rapi dan kuat yang bisa menjadi alternatif Electron?

    • Tidak. Tapi lalu memori dan performa yang berlebih itu mau dipakai untuk apa?
  • Hebat. Ditulis dalam C dengan lisensi MIT! Mungkin bisa cukup tangguh untuk bersaing dengan GNUstep jika ditambahkan shim untuk AppKit API

    • Atau cukup beri tema GNUstep saja. Ini mendukung tema seperti itu
  • Tampak bagus. Andai saya bisa mengubah seluruh UI macOS saya menjadi seperti itu

    • Jika Anda menyalakan mode kontras tinggi di pengaturan aksesibilitas, hasilnya akan cukup mirip
  • Proyek yang bagus. Saya dulu sangat menyukai UI Mac klasik.
    Semua contohnya terlihat luar biasa, dan dari kode demo widget-nya tampaknya juga mudah digunakan

  • Sangat keren. Saya penasaran berapa banyak usaha yang diperlukan untuk membaca berkas resource (.rsrc) dari resource fork dan membangun UI darinya.
    Kalau memungkinkan, kita bisa memakai ResEdit :-)