Egyszerű, multiplatform UI toolkit

Fórumok

Kerestem egy egyszerűen használható UI toolkit-et ANSI C-ben, és a Nuklear-t találtam (a C++ megfelelője az ImGui, de az nem használható ANSI C-ből).

Nem tudom, hányan ismeritek ezeket, de én nagyon felhúztam magam rajtuk, csupa hazugság a Nuklear. Állítólag kicsi (hát rohadtul nem, a 18000 SLoC az nagyon nem kevés), állítólag hatékony (hát rohadtul nem, folyamatosan memóriát allokálgat és minden képkockánál kovertálgatni kell OpenGL esetén), és állítólag könnyen integrálható (hát rohadtul nem, gyakorlatilag minden glue kódot a nulláról magadnak kell megírni). Ja, és ez az immediate-mode konkrétan egy használhatatlan koncepció, multithreading esélytelen vele például. Ja, és még egy: kurvára nem is C89-ben íródott, hazudik a a README-je...

Szóval, hogy rövidre fogjam, csináltam egy UI toolkitet, ami valóban tudja mindazt, amit a Nuklear igér, de képtelen teljesíteni.
SMGUI

- Státusz-Módú GUI (nem immediate-mode és nem is callback-driven, csak hivatkozni kell a már meglévő változóidra és kész)
- egyaránt használható ANSI C és C++ forrásokból is
- Egyetlen, függőségmentes fejlécfájl (plusz opcionális modulok)
- Platform és backend független (a repóban GLFW3, SDL2/3 és X11 illesztő modulok találhatók, ezek tartalmazzák a glue kódot)
- Bármilyen fontot képes kezelni (a repóban PC Screen Font (amit a Linux Console használ) és vektor fontokhoz SSFN modul található)
- Kis kódbázis (tényleg, mindössze kb. 2500 SLoC)
- Kevés memóriát eszik (gyakorlatilag csak ablak átméretezésnél allokál memóriát, képernyő méretűt és ennyi)
- Könnyen integrálható (kb. 5 sornyi kóddal)
- HTML flow-szerű, flexibilis elrendezés
- Bővíthető a kódodból új widgetekkel (példának egy On-Screen Keyboard-os szövegbeviteli mező van a repóban)
- UTF-8 és többnyelvűség támogatás (a nyelv akár menet közben is változtatható)
- teljes UNICODE támogatás (ami a Nuklear font bakerével képtelenség, túl sok az a 0x10FFFF darab glif egyetlen textúrához)
- multithreading támogatás (ami immediate-mode esetén képtelenség)
- természetesen magyar nyelvű doksival: https://bztsrc.gitlab.io/smgui/index.hu.html

A licensze MIT, szóval szabadon beépíthető akár fizetős alkalmazásokba is.

Hozzászólások

szép!

4 és fél éve csak vim-et használok. elsősorban azért, mert még nem jöttem rá, hogy kell kilépni belőle.

Köszönöm a lelkesítő hozzászólásokat! Dobjatok pár csillagot a repóra, ha tetszik :-) Előre is kösz!

Újdonságok:
- teljesképernyős mód (ui_fullscreen(), felbontásváltás nélkül)
- összes gamepad gomb elérhető immár
- X11 alatt volt egy kis pitty-putty a copy'n'paste-el, ez javítva
- GLFW kódtiszogatás, kikerült a GLES mert felesleges volt

Érkezik:
- jobb OSK integrálás
- platformfüggetlen fájlböngésző mező

- platformfüggetlen fájlböngésző mező

Ha ebből tudnál filepickert csinálni, az nagyon faintos lenne, simán használnám. Ez nekem nagy vesszőparipám, hogy jelenleg csak a Gtk és Qt filepicker az, ami általánosan támogatott a legtöbb szoftverben, meg mindenféle portálos gányolás kell hozzá, sajátot meg nem lehet használni. Ez egy rákfenéje a Linuxnak, szarok a filepicker megoldások, bugosak, bloatok, nincs belőlük nagy választék.

The world runs on Excel spreadsheets. (Dylan Beattie)

Ha ebből tudnál filepickert csinálni, az nagyon faintos lenne, simán használnám.

Pontosan erre gondoltam, colorpicker mintájára lesz majd filepicker.

Ez nekem nagy vesszőparipám, hogy jelenleg csak a Gtk és Qt filepicker az, ami általánosan támogatott a legtöbb szoftverben

LOL, a Gtk a legnagyobb fostalicska programozástechnikailag, amit valaha láttam. Konkrétan tudom, nézd csak meg, mi mindent kell gányolni, hogy egy program meghívja a fájlpickerét: https://gitlab.com/bztsrc/openmodal/-/blob/main/openmodal.h#L223 (Igen, fork()-ra és mmap()-re meg a direkt pollozásra valóban szükség van...)

Tetszik a retróssága, csak hajrá. Írom ezt annak ellenére, hogy szerintem az én telemetriás projektemmel jobban jártál volna, könnyebb lett volna. Plusz én a GUI-tól elfordulok, CLI/TUI irányba tartok inkább, de hát mindenkinek más a fontos, más a workflow-ja.

A Nuklear-t konkrétan nem ismerem, de a 18k SLoC az nem valami sok, főleg nem egy komplett GUI toolkitnél. Ma már a legtöbb mainstream cucc millió kódsoros, ahhoz képest eltörpül. Csak az xterm, ami még nem is egy bonyolult program, 57k SLoC. Igaz ennek nagy része legacy ballaszt, meg sixel-kiegészítés, de akkor is mutatja az arányokat.

The world runs on Excel spreadsheets. (Dylan Beattie)

Tetszik a retróssága

Mire gondolsz? Teljesen személyre szabható, a színtéma, a betűtípusok is és ráadásul még bőrözhető is. https://bztsrc.gitlab.io/smgui#look_and_feel

de a 18k SLoC az nem valami sok, főleg nem egy komplett GUI toolkitnél

De, számomra sok. Ugyanazt a komplett GUI funkcionalitást megoldottam 2.5 SLoC-ból. Sőt, valójában még többet is, mert az enyém még HTML flow-t is tud, amit a Nuklear nem.

Raktam fel egy olyan screenshotot, ahol a keretek színét átállítottam ugyanarra, mint a háttér meg a gomb színe és FreeSerif fontot használ. Ettől most flat designú és hűde fasza menő trendi lett :-D
(A margó és az eltartás is állítható, ha valaki böszme nagyra és felületpazarlóra akarná esetleg állítani a gombokat...)

Az jutott eszembe, hogy attól lehet még retró érzésed, hogy ugyanazt a vga fontot használja alapból, mint a dosbox, ami eléggé retrós. Azért esett erre a választás, mert ha nem adsz meg semmilyen fontot, akkor alapból beágyazza az ASCII karakterek glifjeit, és ehhez mindenképp olyan fontra volt szükségem, ami kompatíbilis az MIT licensszel (na és persze ami kicsi, ez PSF2 formátumban lefordítva 2080 bájt csak).

Értem. Vannak azért hiányosságok benne, pl. nincs benne az a feature, ahol külső szerverről behúzott reklámokat és popupokat injektálsz random ablakokba, így a nagy cégeket nem fogja érdekelni. Keylogger sincs beépítve, az is hiányosság. AI-t nem integráltad bele, meg nem menő nyelven van írva. Az ilyet Rust-ban kell írni, vagyis csak azt konténerben futó a webasm/JS engine-t, ami JS-ként futtatja azt a Java VM-et, amiben a Javában megírt kódot futtatod, persze ezt is konténerizálva muszáj csinálni, meg agilisen kódolni, ha az AI-val generálod a kódot, az még jobb. Kötelező a babzsák is alád, fejlesztés közben, meg egy microsoft.com-os vagy Red Hat-es mailcím, mert anélkül a fejlesztő nem fejlesztő. Anélkül még bélgázt is tilos fejleszteni, nem hogy GUI toolkitet.

Ettől csak akkor tekintünk el, ha szénné matricázott M1-M3-as Macbook-on, MacOS alatt fejlesztetted, de végig a Startbucksban, zsáksapkában, meg kötött garbóban, bölcsésztarisznyával a válladon, de élő Twitch-streamben, ahol kamera is vette, ahogy a gépet püfölöd 8 órán át és a képernyőd is végig meg van osztva, illetve követelmény, hogy a Macbookot végig nem teheted töltőre, mert érzékelnie kell mindenkinek, hogy neked Mac-ed, van, hosszú akkuidővel, meg hogy nonkonform értelmiségi hipszter vagy, fontosch fejlesztő, digitális nomád. Viszont ekkor is csak Rust-ban vagy Haskellben engedélyezett a fejlesztés, és AI-t integrálni kell mindenbe.

The world runs on Excel spreadsheets. (Dylan Beattie)

MegaLike!

„Az összeomlás elkerülhetetlen, a katasztrófa valószínű, a kihalás lehetséges.” (Jem Bendell)

Nekem a C nagyon régen volt, akkor is csak egyetemi szinten, de még így is klassznak tűnik, gratulálok. :-)

Ha nem titok, milyen szoftvereket írsz, amikhez felhasználod?

Nekem a C nagyon régen volt, akkor is csak egyetemi szinten, de még így is klassznak tűnik, gratulálok. :-)

Kösz! Dobj egy csillagot a repóra, ha tetszik!

Ha nem titok, milyen szoftvereket írsz, amikhez felhasználod?

Hát, igazából több is van. Mármint készen vannak már, csak egyébként is újra akarom írni őket ilyen-olyan okokból.

- Az egyik a Scalable Screen Font Editor, amit elég nehézkes továbbfejleszteni, mert az UI egy korai kezdetleges változatára épül és jelen formájában nem lehet emscripten-el weboldalra lefordítani, amit pedig nagyon szeretnék.

- A másik az meg egy játékmotor (görgesd le), illetve a hozzá tartozó szerkesztő. Ez már megy emscripten-el, de a játékmotor felülete jelenleg nem eléggé rugalmas (a mostani projektbe emiatt került be a skinezhetőség, OSK illetve a gamepad támogatás); a szerkesztőnek meg az a baja, hogy remekül működik, csak épp iszonyat nehézkes használni, mert nem sikerült intuitívra a felülete. Ezeket meg emiatt akarom újraírni.

- A harmadik meg a Grand Unified Device Tree, egy multiplatform hardverleíró formátum, aminek van egy ablakos szerkesztője, de ez jelenleg GTK-s. Emiatt nem portolható, jó lenne ezt is lecserélni egy egyszerű, multiplatform UI-ra, valamint ezt is szeretném, hogy tudjon fordulni emscripten-el, weboldalba ágyazva (GTK-val erre esély sincs).

És ha már három projektemben is igény van rá, akkor jobbnak láttam csinálni egy külön repót és lib-et az UI-nak, amit aztán mindben felhasználhatok majd. És talán másoknak is hasznára válik :-)