Skip to content

Web backend: run ManaTools AUI apps in a web browser - #7

Open
xquiet wants to merge 97 commits into
mainfrom
web_backend
Open

Web backend: run ManaTools AUI apps in a web browser#7
xquiet wants to merge 97 commits into
mainfrom
web_backend

Conversation

@xquiet

@xquiet xquiet commented Aug 2, 2026

Copy link
Copy Markdown

This branch adds a fourth UI backend to the AUI layer: applications written
against manatools can now be served in a web browser with no code
changes
- the same source runs on Qt, GTK, ncurses, or web.

What's included

  • New web backend (manatools/aui/backends/web/): renders the widget
    tree as HTML and serves it over HTTP, with real-time updates and events over
    WebSocket. Pure Python standard library without extra dependencies;
  • All standard widgets supported: dialogs (main + popup modals), layouts,
    labels, buttons, input fields, check/radio boxes, combo/selection boxes,
    frames, progress bars, sliders, tables, trees, rich text, menu bars, images,
    int/date/time fields, multi-line edit, log view, dumb tabs, paned splitter,
    spacing, alignment, replace points;
  • Backend selection: MUI_BACKEND=web|qt|gtk|ncurses environment
    variable override; the web backend is opt-in only and it's never
    auto-selected;
  • Security hardening: CSP and standard security headers on
    every response, localhost-only binding, origin checks on WebSocket upgrades
    and the /event POST fallback, frame/body size caps, path-traversal guards
    on static file and icon serving;
  • Browser UX: Bootstrap 5.3 frontend, XDG icon lookup served from system
    themes, deferred skeleton rendering for heavy widgets (table/tree),
    coalesced server thus browser DOM updates;
  • Qt backend robustness fixes: widgets now initialize their attributes
    before super().__init__() so containers that trigger backend-widget
    creation mid-construction (e.g. YDumbTab) no longer crash; popup dialog
    lifecycle fixes; guarded _items access in table/tree rebuilds.

How to test

bash
MUI_BACKEND=web python3 test/test_hello_world.py

The application prints its URL (http://127.0.0.1:8080/) - open it in a
modern browser. The same test runs unchanged under MUI_BACKEND=qt,
gtk, or ncurses.

Notes

  • The web backend binds to 127.0.0.1 only; file dialogs and system tray are
    not supported in the browser but they seems to degrade gracefully;
  • This branch also carries the main fixes/features merged in (tooltips,
    paned multi-layout, backend detection improvements), so it's ready to
    fast-forward main, local testing show no conflicts.

xquiet added 30 commits March 28, 2026 23:44
Links inside YRichText now behave like Qt/GTK: browser navigation is
blocked, the URL is stored in widget._last_url, and a YMenuEvent(id=url)
is posted to the dialog queue when notify() is True.
xquiet added 30 commits April 6, 2026 20:24
…nd_widget call; guard _items in _rebuildTree
…o build

Resolved yui.py conflict: keep MUI_BACKEND/XDG detection, take main's
DISPLAY/WAYLAND and PKEXEC_UID display-recovery steps, web backend stays
explicit-only. treeqt.py merged both the init-before-super ordering and
tooltip support.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant