2 पॉइंट द्वारा GN⁺ 2024-04-02 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Libmui एक UI लाइब्रेरी है जो Macintosh Classic “Toolbox” API के बड़े हिस्से को दोहराती है; यह पूरी implementation नहीं है, लेकिन MII Apple //e emulator और सरल applications के लिए जरूरी features देती है
  • यह MII के लिए UI लाइब्रेरी के रूप में शुरू हुई थी, और लक्ष्य ऐसा हाथ से layout किया गया UI था जिसमें बहुत सारी dependencies न हों और जो “Arrow Keys + Return + Escape” जैसे game-style menus पर निर्भर न हो
  • Rendering में ARGB buffer पर draw करने के बाद उसे OpenGL texture या X11/XCB shared pixmap में copy किया जाता है, और invalid regions track करके केवल जरूरी क्षेत्रों को फिर से draw किया जाता है
  • API मूल Macintosh Toolbox से अलग asynchronous और callback-based तरीके से काम करता है; state बदलने पर UI जरूरत पड़ने पर फिर से draw होता है और events polling के बजाय callbacks के जरिए मिलते हैं
  • इसमें Window, Menu, Control, List, Alert, Standard File features हैं, लेकिन zooming, resizing, Save dialog, dark mode, theme, Wayland, GTK/QT/SDL, Rust/Go/Python bindings उपलब्ध नहीं हैं

Libmui क्या बनाता है

  • Libmui एक लाइब्रेरी है जो Macintosh Classic “Toolbox” API का काफी हिस्सा दोहराती है
  • यह पूरी implementation नहीं है, लेकिन कुछ सरल applications और MII Apple //e emulator के लिए जरूरी हिस्से शामिल करती है
  • शुरुआत इसलिए हुई क्योंकि MII के लिए एक UI लाइब्रेरी चाहिए थी, और ऐसा UI चाहिए था जिसमें बहुत अधिक dependencies न हों और जो game-style menu control की तरफ झुका हुआ न हो
  • पहले Nuklear immediate mode UI इस्तेमाल करके देखा गया, लेकिन उसका look पसंद नहीं आया, customization में बड़ी सीमाएं लगीं, और layout engine इच्छित जगह से अलग placement करता लगा
  • यह अनुभव भी पृष्ठभूमि में था कि immediate mode UI अंदरूनी तौर पर hash-based state बनाए रखता है, और hash collisions असली debugging problems बना सकते हैं
  • लक्ष्य layout engine द्वारा अपने-आप तय UI की बजाय सीधे हाथ से तराशे गए UI के करीब है

Rendering और operation model

  • Libmui ARGB buffer वाली “screen” पर UI draw करता है
    • MII में इस buffer को OpenGL texture के रूप में overlay किया जाता है
    • example folder का playground demo इसे X11 window में XCB shared pixmap के रूप में copy करता है, और remote X11 पर भी काम करता है
  • पुराने OS की तरह invalid region track करके केवल जरूरी हिस्से फिर से draw किए जाते हैं
    • हर बार पूरा UI फिर से draw नहीं होता, इसलिए overdraw बहुत कम है
    • 16-bit framebuffer आदि पर draw करना हो तो ARGB output से सीधे convert करना होगा
    • केवल dirty region convert करने होते हैं, इसलिए workload बड़ा नहीं होता
  • Rendering को vertex buffer आदि से vectorize भी किया जा सकता है, लेकिन मौजूदा तरीका काफी तेज है और immediate mode UI की तरह पूरा UI फिर से draw करने वाले behavior पर लौटने की जरूरत नहीं मानी गई

मूल Macintosh Toolbox से अंतर

  • Look की शुरुआत MacOS 8/9 से हुई थी, लेकिन grayscale elements हटाए हुए जैसा feel है; System 7 का flat look बेहतर तरीके से पुराना होता दिखा, इसलिए वही दिशा चुनी गई
  • popup menu OS8 के अधिक करीब है, और scrollbar GS/OS के अधिक करीब है
  • API का बड़ा अंतर इसका पूरी तरह asynchronous behavior है
    • मूल की तरह किसी भी समय window या GrafPort में spinloop से draw नहीं किया जा सकता
    • UI state बदलने पर जरूरत पड़ने पर UI खुद फिर से draw करता है
  • Event handling callback-based है
    • UI में क्या हुआ, यह polling से नहीं पूछा जाता
    • menu item click या keyboard shortcut input होने पर action callback call होता है
  • Conceptual structure मूल से सरल है
    • हर चीज mui_window या mui_control है
    • windows, menubars, menus mui_window हैं
    • menu titles, menu items, window के अंदर के सभी elements, separator lines mui_control हैं

उपलब्ध managers और controls

  • Window Manager

    • window creation और window के अंदर drawing को support करता है
    • अधिकतम 15 layers, clipping, BringToFront behavior, window dragging support करता है
    • coordinate system मूल जैसा रखते हुए केवल 2 प्रकारों तक सीमित है: screen coordinates और window content coordinates
    • invalid rectangle list manage करता है ताकि हर बार पूरी window फिर से draw न करनी पड़े
    • zooming और resizing TODO हैं
    • transparent windows को जानबूझकर support नहीं किया गया है
      • क्योंकि windows को top-down तरीके से draw करके clipping optimize की जाती है
      • transparency handle करने के लिए bottom-up draw करना होगा, और ज्यादा content फिर से draw करना पड़ेगा
      • पूरे UI screen को इच्छित जगह alpha blend करना संभव है
  • Menu Manager

    • menubar, menus, checkmarks, keyboard shortcuts support करता है
    • System 7/8 या GS/OS जैसा दिखने के लिए बनाया गया है
    • hierarchical menus हैं, लेकिन मूल जैसा पूरी तरह नहीं है और सुधार की जरूरत है
    • बहुत बड़े popups का display और scrolling TODO है
    • sticky menus support आधा implement हुआ है, लेकिन अभी सही नहीं है इसलिए disabled है
  • Control Manager

    • buttons, checkboxes, radio buttons, vertical scrollbars, wrapping textboxes आदि support करता है
    • Edit Field पर काम चल रहा है और Slider शामिल नहीं है
    • text edit control prototype single-line input के लिए ठीक है, लेकिन multi-line textbox के लिए अभी उपयुक्त नहीं है
  • List Manager

    • फिलहाल यह file names दिखाने के उपयोग के लिए काफी हद तक hardcoded है
    • arrow keys, page up/down, scroll wheel handle करता है
    • मूल MacOS की तरह typeahead से desired item खोजा जा सकता है
    • item text बहुत लंबा होने पर font compression या ellipsis abbreviation इस्तेमाल करने की सुविधा TODO है
  • Alerts और Standard File

    • Alert सामान्य Cancel + OK dialog box देता है
    • और ज्यादा alert types TODO हैं
    • Standard File classic Open file dialog देता है
      • यह feature लाइब्रेरी के शुरुआती मुख्य लक्ष्यों में से एक था
      • Save dialog TODO है
      • हाल में इस्तेमाल directories दिखाने वाला एक अतिरिक्त popup है
      • arrow keys, page up/down, typeahead file search support करता है
  • Resource Manager

    • Resource Manager नहीं है
    • ResEdit जैसे tool की जरूरत मानी गई है, और मौजूदा scope से बाहर रखा गया है
    • resources के लिए MessagePack format का idea है, लेकिन उसे आगे के काम के लिए छोड़ा गया है

Dependencies और build

  • बाहरी dependency केवल libpixman है
    • libpixman pixel processing के लिए लाइब्रेरी है और clipping के लिए उपयोगी region features देती है
    • यह QuickDraw के region जितनी अच्छी नहीं है, लेकिन पर्याप्त मानी गई है
  • Source में शामिल components भी हैं
    • libcg: cairo जैसी छोटी antialiased renderer है और 2 files से बनी है
    • stb_truetype.h: TrueType font loading के लिए इस्तेमाल होती है
    • stb_ttc.h: stb_truetype.h extension है, जो font/glyph dictionary, hash table, font texture आदि बनाता है
    • 2D geometry code 25 साल से अधिक पुराना code है और libc3 में भी शामिल था
  • Build root directory में make चलाने वाली simple Makefile method से होता है
  • tests, demos, samples build करने के लिए xcb, xcb-shm, xcb-randr, xkbcommon-x11 चाहिए
  • अगर Nvidia binary driver इस्तेमाल कर रहे हैं, तो mui_shell के काम करने के लिए /etc/X11/xorg.conf के Device में Option "AllowSHMPixmaps" "1" जोड़ना होगा

इस्तेमाल का तरीका और development workflow

  • starting point के रूप में mui_shell.c और mui_widgets_demo.c को modify करके देखने की सलाह दी जाती है
  • ui_mui_shell mui_widgets_demo.so को plugin के रूप में load करता है, और changes detect होने पर automatically reload करता है
  • mui_widgets_demo.c modify करने पर reload के बाद फिर execute होता है, इसलिए नया dialog जल्दी बनाया जा सकता है
  • libmui directory में make watch चलाने पर changes होने पर library और mui_shell automatically rebuild होते हैं
  • editor के auto save के साथ इस्तेमाल करने पर edit करते समय लगातार build और run होने वाला workflow बनाया जा सकता है

जो स्पष्ट रूप से उपलब्ध नहीं है

  • dark mode नहीं है
  • theme support नहीं है
  • transparent windows और cube effect नहीं है
  • sticky menus फिलहाल enabled नहीं हैं
  • cmake, meson, ninja, autotools का इस्तेमाल नहीं होता
  • Rust, Go, Python जैसी languages के bindings नहीं हैं
  • GTK, QT जैसे frameworks का इस्तेमाल नहीं होता
  • SDL का इस्तेमाल नहीं होता
  • Wayland support नहीं है

1 टिप्पणियां

 
GN⁺ 2024-04-02
Hacker News की रायें
  • इसी से जुड़ा, मूल Chicago सिस्टम फ़ॉन्ट की काफी अच्छी नकल वाला एक public domain TrueType फ़ॉन्ट है: https://fontlibrary.org/en/font/chicagoflf

    • मैंने default फ़ॉन्ट के तौर पर Chicago इस्तेमाल करने पर सोचा था, लेकिन उसकी फिक्स्ड इमेज बहुत मजबूत है
      System 8.x के बाद इस्तेमाल हुआ Charcoal कहीं कम जाना-पहचाना है, और निजी तौर पर मुझे यह काफी बड़ा सुधार लगता है
      फिर भी, library में Chicago पर स्विच करना असल में काफी आसान है। बताए गए clone के अलावा, मूल Chicago का “plain” TTF version भी कहीं घूम रहा है
    • “मूल Chicago सिस्टम फ़ॉन्ट” की बेहतरीन clone मौजूद होने की बात से संबंधित, System 7.6.1 download के जरिए Bigelow & Holmes द्वारा design किया गया असली TrueType Chicago भी मिल सकता है
      इसके बाद FontForge command-line tool से TTF को OTF में convert कर सकते हैं: https://www.macintoshrepository.org/1682-mac-os-7-6-x
      fontforge -script -c 'Open($1); Generate($2);' input_font.ttf output_font.otf
    • नए macOS में भी Silom नाम का एक Thai फ़ॉन्ट शामिल है, जो Latin glyphs के लिए Chicago का इस्तेमाल करता है
  • वाकई शानदार। Michel ने इसे अपने Apple II emulator के लिए बनाया था, लेकिन मैं इसे कुछ हद तक मज़ाक-मज़ाक में Archimedes emulator के frontend को replace करने के लिए इस्तेमाल कर रहा हूं
    अभी शुरुआती चरण में है, लेकिन अगर मैं API समझ पा रहा हूं तो API अच्छी ही होगी :)

    • Apple II emulator में इस्तेमाल करना भी थोड़ा मज़ाक जैसा लगता है। उस समय Apple II users चाहते थे कि Apple, Apple II line को जारी रखे, लेकिन Apple ने Mac पर focus करते हुए उसे लगभग छोड़ दिया माना गया, इसलिए वे Mac को नापसंद करते थे
      फिर भी classic Mac interface से लगाव है
  • मुझे इस project में इस्तेमाल हुआ double-header वाला 2D graphics rasterizer पसंद आया: https://github.com/xboot/libcg
    इतनी कम dependencies के साथ भी powerful software बनाया जा सकता है, यह बात हमेशा हैरान करती है
    Electron का alternative बन सकने वाली clean और powerful UI library बनाना क्या सच में इतना मुश्किल है?

    • नहीं। लेकिन फिर बची हुई memory और performance का करेंगे क्या?
  • कमाल है। MIT license में और C में लिखा हुआ! AppKit API के लिए shim जोड़ दें तो शायद GNUstep से भी टक्कर ले सके

    • या फिर बस GNUstep theme लगा दें। यह ऐसी themes support करता है
  • देखने में अच्छा है। काश मैं अपना पूरा macOS UI ऐसा बदल पाता

    • accessibility settings में high-contrast mode चालू करें तो लगभग वैसा ही हो जाता है
  • अच्छा project है। पुराना classic Mac UI मुझे सच में बहुत पसंद था
    examples सब बहुत अच्छे दिखते हैं, और widget demo code देखने पर लगता है कि इसे इस्तेमाल करना भी आसान है

  • वाकई शानदार। सोच रहा हूं कि resource fork की resource files (.rsrc) पढ़कर UI बनाने में कितनी मेहनत लगेगी
    अगर संभव हो तो ResEdit इस्तेमाल किया जा सकेगा :-)