2 puan yazan GN⁺ 2024-04-02 | 1 yorum | WhatsApp'ta paylaş
  • 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_window veya mui_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

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.h uzantı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-x11 gerekir
  • Nvidia binary driver kullanılıyorsa mui_shell’in çalışması için /etc/X11/xorg.conf içindeki Device bölümüne Option "AllowSHMPixmaps" "1" eklenmelidir

Kullanım biçimi ve geliştirme iş akışı

  • Başlangıç noktası olarak mui_shell.c ve mui_widgets_demo.c üzerinde değişiklik yapmak önerilir
  • ui_mui_shell, mui_widgets_demo.so dosyasını plugin olarak yükler ve değişiklik algıladığında otomatik olarak yeniden yükler
  • mui_widgets_demo.c değiştirildiğinde yeniden yüklemeden sonra tekrar çalıştırılır; böylece yeni dialog’lar hızlıca oluşturulabilir
  • make watch, libmui dizininde çalıştırılırsa değişiklik olduğunda kütüphaneyi ve mui_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

 
GN⁺ 2024-04-02
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

    • Varsayılan yazı tipi olarak Chicago kullanmayı düşündüm ama onun yerleşik imajı fazla güçlü
      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
    • “Orijinal Chicago sistem yazı tipinin” mükemmel bir kopyası olduğundan söz edilmişken, System 7.6.1 indirmesi üzerinden Bigelow & Holmes tarafından tasarlanan gerçek TrueType Chicago'yu da edinebilirsiniz
      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.otf
    • Güncel macOS'ta da Silom adlı bir Tayca yazı tipi bulunuyor ve Latin glifleri için Chicago kullanıyor
  • Gerç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 :)

    • Apple II emülatöründe kullanmak bile biraz şaka gibi geliyor. O dönemde Apple II kullanıcıları Apple'ın Apple II serisini sürdürmesini istiyordu ama Apple Mac'e odaklanınca onu fiilen terk ettiğini düşünüp Mac'ten hoşlanmıyorlardı
      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?

    • Hayır. Ama o zaman boşa çıkan bellek ve performansı ne yapacaksınız?
  • Müthiş. C ile yazılmış ve MIT lisanslı! AppKit API için bir shim eklenirse GNUstep ile de yarışabilir belki

    • Ya da doğrudan GNUstep teması giydirirsiniz. Bu tür temaları destekliyor
  • Güzel görünüyor. Keşke macOS arayüzümün tamamını böyle yapabilsem

    • Erişilebilirlik ayarlarından yüksek kontrast modunu açarsanız neredeyse buna benziyor
  • İ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 :-)