HN Tanıtımı: Linux için macOS Classic widget kütüphanesi Libmui
(github.com/buserror)- Libmui, Macintosh Classic “Toolbox” API’sinin önemli bir bölümünü yeniden oluşturan bir UI kütüphanesidir; tam bir uygulama olmasa da MII Apple //e emulator ve basit uygulamalar için gereken işlevleri sağlar
- MII için bir UI kütüphanesi olarak başladı; çok bağımlılığı olan ya da “Arrow Keys + Return + Escape” tarzı oyun menülerinden ziyade elle yerleştirilmiş bir UI hedefledi
- Render işlemi, ARGB buffer üzerine çizip ardından OpenGL texture’a veya X11/XCB shared pixmap’e kopyalama şeklinde çalışır; invalid region’ları izleyerek yalnızca gerekli alanları yeniden çizer
- API, özgün Macintosh Toolbox’tan farklı olarak asenkron ve callback tabanlı çalışır; durum değiştirildiğinde UI gerektiğinde yeniden çizilir ve event’ler polling yerine callback’lerle iletilir
- Window, Menu, Control, List, Alert, Standard File özelliklerine sahiptir; ancak zooming, resizing, Save dialog, dark mode, theme, Wayland, GTK/QT/SDL, Rust/Go/Python binding’leri sunmaz
Libmui ne yapıyor
- Libmui, Macintosh Classic “Toolbox” API’sinin büyük kısmını yeniden oluşturan bir kütüphanedir
- Tam bir uygulama değildir, ancak birkaç basit uygulama ve MII Apple //e emulator için gerekli bölümleri içerir
- Çıkış noktası, MII için bir UI kütüphanesine ihtiyaç duyulması; bağımlılığı az, oyun tarzı menü kullanımına yaslanmayan bir UI istenmesiydi
- Önce Nuklear immediate mode UI denenmiş, ancak görünümü beğenilmemiş; özelleştirme açısından çok sınırlı olduğu ve layout engine’in öğeleri istenen konumdan farklı yerlere yerleştirdiği düşünülmüş
- immediate mode UI’nin içeride hash tabanlı durum tuttuğu ve hash çakışmalarının gerçek debug sorunları yaratabildiğine dair deneyim de arka planda yer alıyor
- Hedef, layout engine’in kendi karar verdiği UI’dan çok doğrudan ince ayar yapılmış UI’a yakın
Render ve çalışma modeli
- Libmui, UI’ı ARGB buffer’dan oluşan bir “screen” üzerine çizer
- MII’de bu buffer, OpenGL texture olarak overlay edilir
- example klasöründeki playground demosu bunu bir X11 penceresine XCB shared pixmap olarak kopyalar ve remote X11’de de çalışır
- Eski işletim sistemleri gibi invalid region’ları izleyerek yalnızca gerekli bölümleri yeniden çizer
- Her seferinde tamamını yeniden çizmediği için overdraw çok düşüktür
- 16-bit framebuffer vb. üzerine çizmek için ARGB çıktısından doğrudan dönüştürmek gerekir
- Yalnızca dirty region dönüştürüleceği için yük büyük değildir
- Render işlemini vertex buffer vb. ile vektörleştirmek de mümkün olabilir; ancak mevcut yöntemin yeterince hızlı olduğu ve immediate mode UI gibi her şeyi yeniden çizme davranışına dönmeye gerek olmadığı düşünülüyor
Özgün Macintosh Toolbox’tan farkları
- Görünüm MacOS 8/9’dan yola çıkmış olsa da grayscale öğeleri kaldırılmış bir his verir; System 7’nin flat görünümünün daha iyi yaşlandığı düşünülerek o yön seçilmiş
- popup menu OS8’e daha yakın, scrollbar ise GS/OS tarafına daha yakındır
- API’deki büyük fark tamamen asenkron çalışmasıdır
- Özgününde olduğu gibi herhangi bir zamanda window’a veya GrafPort’a spinloop ile çizim yapılamaz
- UI durumu değiştirildiğinde, gerektiğinde UI kendini yeniden çizer
- Event işleme callback tabanlıdır
- UI’da ne olduğunu polling ile sorgulamazsınız
- Bir menu item’a tıklandığında veya klavye kısayolu girildiğinde action callback’i çağrılır
- Kavramsal yapı özgününden daha basittir
- Her şey
mui_windowveyamui_control’dür - windows, menubars, menus birer
mui_window’dur - menu titles, menu items, window içindeki tüm öğeler ve separator lines birer
mui_control’dür
- Her şey
Sunulan manager’lar ve control’ler
-
Window Manager
- Pencere oluşturmayı ve pencere içine çizim yapmayı destekler
- En fazla 15 layer, clipping, BringToFront davranışı ve pencere sürüklemeyi destekler
- Koordinat sistemi, özgününe benzer şekilde screen coordinates ve window content coordinates olmak üzere 2 sistemle sınırlıdır
- invalid rectangle listesini yöneterek tüm pencereyi her seferinde yeniden çizmez
- zooming ve resizing TODO’dur
- transparent windows kasıtlı olarak desteklenmez
- Çünkü pencereleri top-down yaklaşımla çizerek clipping’i optimize eder
- Şeffaflığı işlemek için bottom-up çizmek gerekir ve bu daha fazla içeriğin yeniden çizilmesine yol açar
- Tüm UI screen’ini istenen yerde alpha blend etmek mümkündür
-
Menu Manager
- menubar, menus, checkmarks, keyboard shortcuts destekler
- System 7/8 veya GS/OS gibi görünecek şekilde yapılmıştır
- hierarchical menus vardır ancak özgünüyle tamamen aynı değildir ve iyileştirme gerektirir
- Çok büyük popup’ların gösterimi ve kaydırılması TODO’dur
- sticky menus desteği yarım yamalak uygulanmıştır, ancak henüz doğru çalışmadığı için devre dışıdır
-
Control Manager
- buttons, checkboxes, radio buttons, vertical scrollbars, wrapping textboxes vb. destekler
- Edit Field üzerinde çalışılmaktadır; Slider ise yoktur
- text edit control prototipi tek satırlık giriş için fena değildir, ancak çok satırlı metin kutuları için henüz uygun değildir
-
List Manager
- Şu anda daha çok dosya adlarını göstermek için hardcoded durumdadır
- arrow keys, page up/down ve scroll wheel’i işler
- Özgün MacOS’ta olduğu gibi typeahead ile istenen öğeyi bulabilir
- Öğe metni çok uzunsa font compression veya ellipsis abbreviation kullanma özelliği TODO’dur
-
Alerts ve Standard File
- Alert, genel Cancel + OK dialog’u sağlar
- Daha fazla alert türü TODO’dur
- Standard File, klasik Open file dialog’u sağlar
- Bu özellik, kütüphanenin ilk ana hedeflerinden biriydi
- Save dialog TODO’dur
- Son kullanılan dizini gösteren ek bir popup vardır
- arrow keys, page up/down ve typeahead dosya aramayı destekler
-
Resource Manager
- Resource Manager yoktur
- ResEdit benzeri bir araca ihtiyaç olduğu düşünülüyor ve mevcut kapsamın dışında tutuluyor
- Resource’lar için MessagePack formatı fikri var, ancak sonraki çalışmalara bırakılmış
Bağımlılıklar ve build
- Tek harici bağımlılık libpixman’dır
- libpixman, pixel processing için bir kütüphanedir ve clipping için yararlı region işlevleri sağlar
- QuickDraw’un region’ları kadar iyi değildir, ancak yeterli görülür
- Kaynakta yer alan bileşenler de vardır
- libcg: cairo’ya benzer küçük bir antialiased renderer’dır ve 2 dosyadan oluşur
- stb_truetype.h: TrueType font yüklemek için kullanılır
stb_ttc.h:stb_truetype.huzantısıdır; font/glyph dictionary, hash table, font texture vb. oluşturur- 2D geometry kodu 25 yıldan daha eski bir koddur ve libc3 içinde de yer almıştır
- Build, kök dizinde
makeçalıştırılan basit bir Makefile yöntemidir - tests, demos, samples build etmek için
xcb,xcb-shm,xcb-randr,xkbcommon-x11gerekir - Nvidia binary driver kullanılıyorsa
mui_shell’in çalışması için/etc/X11/xorg.confiçindekiDevicebölümüneOption "AllowSHMPixmaps" "1"eklenmelidir
Kullanım biçimi ve geliştirme iş akışı
- Başlangıç noktası olarak
mui_shell.cvemui_widgets_demo.cüzerinde değişiklik yapmak önerilir ui_mui_shell,mui_widgets_demo.sodosyasını plugin olarak yükler ve değişiklik algıladığında otomatik olarak yeniden yüklermui_widgets_demo.cdeğiştirildiğinde yeniden yüklemeden sonra tekrar çalıştırılır; böylece yeni dialog’lar hızlıca oluşturulabilirmake watch,libmuidizininde çalıştırılırsa değişiklik olduğunda kütüphaneyi vemui_shell’i otomatik olarak yeniden build eder- Editörün auto save özelliğiyle birlikte kullanıldığında, değişiklik yaparken sürekli build ve run eden bir iş akışı kurulabilir
Açıkça sunulmayanlar
- dark mode yok
- theme desteği yok
- transparent windows ve cube effect yok
- sticky menus şu anda etkin değil
cmake,meson,ninja, autotools kullanılmaz- Rust, Go, Python gibi dil binding’leri yok
- GTK, QT gibi framework’ler kullanılmaz
- SDL kullanılmaz
- Wayland desteği yok
1 yorum
Hacker News yorumları
Bununla bağlantılı olarak, orijinal Chicago sistem yazı tipinin oldukça iyi bir kopyası olan public domain bir TrueType yazı tipi var: https://fontlibrary.org/en/font/chicagoflf
System 8.x sonrasında kullanılan Charcoal çok daha az biliniyor ve bence kişisel olarak oldukça büyük bir iyileştirme
Yine de kütüphanede Chicago'ya geçmek pratikte oldukça kolay. Bahsettiğim kopya dışında, orijinal Chicago'nun “plain” TTF sürümü de bir yerlerde dolaşıyor
Sonrasında FontForge komut satırı aracıyla TTF'yi OTF'ye dönüştürmeniz yeterli: https://www.macintoshrepository.org/1682-mac-os-7-6-x
fontforge -script -c 'Open($1); Generate($2);' input_font.ttf output_font.otfGerçekten harika. Michel bunu kendi Apple II emülatörü için yapmış ama ben biraz eğlencesine Archimedes emülatörünün frontend'ini bununla değiştiriyorum
Hâlâ erken aşamada ama API'yi anlayabiliyorsam kesinlikle iyi bir API'dir :)
Yine de klasik Mac arayüzüne karşı bir sevgim var
Bu projenin kullandığı çift başlıklı 2D grafik rasterizer hoşuma gitti: https://github.com/xboot/libcg
Bu kadar az bağımlılıkla bile güçlü yazılımlar üretilebilmesi bana her zaman şaşırtıcı geliyor
Electron'a alternatif olabilecek temiz ve güçlü bir UI kütüphanesi yapmak gerçekten bu kadar mı zor?
Müthiş. C ile yazılmış ve MIT lisanslı! AppKit API için bir shim eklenirse GNUstep ile de yarışabilir belki
Güzel görünüyor. Keşke macOS arayüzümün tamamını böyle yapabilsem
İyi bir proje. Eski klasik Mac arayüzünü gerçekten çok seviyordum
Örneklerin hepsi çok iyi görünüyor ve widget demo kodlarına bakınca kullanımı da kolay görünüyor
Gerçekten harika. resource fork içindeki kaynak dosyalarını (.rsrc) okuyup bunlardan UI oluşturmanın ne kadar emek istediğini merak ediyorum
Mümkün olsaydı ResEdit kullanılabilirdi :-)