[HN Gopher] Advice for the next dozen Rust GUIs
       ___________________________________________________________________
        
       Advice for the next dozen Rust GUIs
        
       Author : raphlinus
       Score  : 43 points
       Date   : 2022-07-15 21:09 UTC (1 hours ago)
        
 (HTM) web link (raphlinus.github.io)
 (TXT) w3m dump (raphlinus.github.io)
        
       | stephc_int13 wrote:
       | I have no business related to Rust, but after reading a few
       | articles from this author, I tend to think that his approach to
       | GUI toolkit design is deeply flawed.
       | 
       | He is undoubtedly highly knowledgeable about the subject, but
       | this knowledge may be a curse in his case.
       | 
       | A mix of second system syndrome and Architecture Astronaut,
       | trying to satisfy too many constraints can be a deadlock.
       | 
       | I think the sensible approach is starting with a Minimum Viable
       | Product, cutting some corners and consciously making tradeoffs.
       | And if success comes, then try to organically grow from there.
        
         | zem wrote:
         | i am just interested enough in new gui toolkits that i have
         | read through a bunch of blogposts, articles, and github repo
         | docs for a ton of emerging ones. my overall impression is that
         | if a lot of these "architecture astronaut" concerns are not at
         | least planned for up front, they will never be implemented, so
         | i welcome the OP's thoroughness in documenting the various
         | issues to be taken into account.
        
           | stephc_int13 wrote:
           | I don't think that GUI toolkits that are in use today were
           | born in their final form, or that everything was planned from
           | the start.
           | 
           | I think that unfortunate early design decisions can lead to
           | dead-ends, or extremely painful evolution, of course, and
           | knowledge can help, but paralysis is in my opinion an ever
           | bigger issue.
           | 
           | Making the perfect GUI Toolkit starts by making one that is
           | Good Enough for some use cases.
        
         | game-of-throws wrote:
         | Maybe you know this, but he already released an MVP for a GUI
         | library: https://github.com/linebender/druid
        
           | stephc_int13 wrote:
           | Not an MVP but an early demo, from my point of view.
        
         | tayistay wrote:
         | A more scrappy approach is what I'm trying to do with my
         | library, rui [1]. Just get something out there. Also, it's
         | really in service of my (already released) app, as opposed to
         | trying to be a successful open source project. If others happen
         | to like it, great!
         | 
         | That said, I think Druid is a good Minimum Viable Product. I
         | just needed GPU acceleration for my app, and wanted something
         | closer to SwiftUI, which I'm used to.
         | 
         | [1] https://github.com/audulus/rui
        
       | game-of-throws wrote:
       | Small comment: It's possible to stitch together UI/video/3D
       | without dealing with the compositor, if you use child windows
       | instead (or in wayland terms, a subsurface). On win32 at least,
       | it's a much simpler approach.
        
       | mwcampbell wrote:
       | I'm the main developer of the AccessKit [1] project mentioned in
       | this post. AMA. To preemptively answer one expected question, I
       | know the project has been inactive for a while; I'm back to work
       | on it in earnest starting this month.
       | 
       | [1]: https://github.com/AccessKit/accesskit
        
       | billconan wrote:
       | I attempted to implement my own windowing library after studying
       | winit and SDL2.
       | 
       | The missing feature I need is supporting detachable tabs (like
       | what chrome and sublime text have).
       | 
       | I think for productivity apps, this is very important. But
       | implementing a windowing lib from scratch is not easy.
        
         | modeless wrote:
         | Dear Imgui has an impressive implementation of detachable tabs.
         | https://github.com/ocornut/imgui/wiki/Multi-Viewports
        
           | billconan wrote:
           | That was the reason I studied SDL2 in the first place.
           | 
           | It's working on linux, but buggy on Mac.
        
         | zachrip wrote:
         | What are some of the difficulties?
        
           | billconan wrote:
           | you mean what are some of the difficulties of implementing
           | detachable tabs using existing libraries?
           | 
           | For example, they don't give you the correct mouse
           | coordinates once your mouse cursor is outside a window. I
           | heard this is impossible to do if the underlining system is
           | wayland.
        
         | billconan wrote:
         | Also, do you think if multi-channel signed distance field is a
         | good approach for GUI text rendering?
         | 
         | I understand, for games, it can support extreme zooming with
         | small textures. But for GUI (for example a text editor), we
         | only occasionally resize fonts.
         | 
         | I looked at some of the open source projects (mostly terminal
         | emulators), they simply rasterize fonts onto a texture map
         | using CPU. I wonder if signed distance field is really
         | necessary.
        
           | modeless wrote:
           | The best GPU accelerated text rendering I know of is
           | https://sluglibrary.com/. Not based on distance fields.
           | Unfortunately not open source, though it is a one-man
           | project. Maybe someday one of the big tech companies will pay
           | him a whole ton of money to open source it.
        
           | raphlinus wrote:
           | I'm not a fan of distance fields for GUI text rendering.
           | Their main advantage in games is super-easy integration into
           | the rendering pipeline (they're basically just a texture and
           | a simple shader), but the quality is not quite as good as
           | standard font rendering. There are other issues, including
           | fairly large texture RAM requirements for CJK fonts, and no
           | easy way to do do variable fonts. My main work these days is
           | piet-gpu, which is intended to do 2D graphics (including font
           | rendering) "the right way." In the meantime, using existing
           | platform glyph rendering capabilities makes sense and will
           | certainly give the best visual match to platform text.
        
       | dmitriid wrote:
       | This advice is applicable to anyone building cross-platform UI
       | toolkits, not just to Rust.
        
       | pornel wrote:
       | The background for this is that most existing UI toolkits are a
       | poor fit for Rust.
       | 
       | Rust doesn't like having shared mutable state, but event-based
       | UIs have a global event loop and can mutate anything at any time.
       | 
       | Rust works best with strictly tree-shaped data structures, but
       | event handlers turn trees of widgets into arbitrary webs with
       | possibility of circular references.
       | 
       | Rust prefers everything thread-safe, but many UI toolkits can't
       | even be touched from a "non-main" thread.
       | 
       | Rust's object-oriented programming features are pretty shallow,
       | and Rust doesn't have inheritance. That makes it awkward to model
       | most toolkits that have deep hierarchies with a base View type
       | and a dozen of Button subclasses.
       | 
       | So instead of retrofitting mutable single-threaded OOP to a
       | functional multi-threaded language, there's a quest to find
       | another approach for UIs. This change of approach has worked for
       | games. Rust wasn't nice for "class Player extends Entity" design,
       | but turned out to be a great fit the ECS pattern.
        
       | seanalltogether wrote:
       | I haven't looked closely at the latest rust gui projects, but
       | from what I remember most of them seem to be focused on code
       | driven ui layouts, which I think is going to be a non-starter for
       | anyone doing serious application work. View hierarchies and
       | layout rules are too big and too complex to be maintainable via
       | hand coding. Even a moderately sized app can have hundreds of
       | custom views or components that need constant refactoring. You
       | really need something like xml or json or whatever to build out
       | that tree structure and easily visualize it.
        
       ___________________________________________________________________
       (page generated 2022-07-15 23:00 UTC)