Skip to content

Protocol v9: button bars and addon commands from libmudlet - #65

Open
vadi2 wants to merge 5 commits into
mainfrom
ccr-14671218-tf96z6-scriptui-f4p-buttons
Open

vadi2 wants to merge 5 commits into
mainfrom
ccr-14671218-tf96z6-scriptui-f4p-buttons

Conversation

@vadi2

@vadi2 vadi2 commented Nov 15, 2026 •

Copy link
Copy Markdown
Member

Brief overview of PR changes/additions

  • The engine now sends a profile's button bars (buttonBars) and the commands its packages add with addCommand() (commands). Each list goes out whole whenever it changes, and again to a UI that attaches or drains. The app does not draw them yet.
  • The UI can press a button or menu entry (pressButton {button}) and click a command (activateCommand {command}). Both get a reply only when refused. The fields are named button/command rather than id, because id is already the request id.
  • MudletEngine reads THeadlessSession's buttonBars()/buttonsChanged and addonCommands()/addonCommandsChanged, and calls pressButton()/activateAddonCommand(). The stand-in sends both lists empty and refuses both requests.
  • Protocol.kt has the types, parsing and request builders. A bar whose place the app does not know is left out. Protocol version 9; docs updated.
  • Tests:
    • libmudlet host test: a packaged bar with a push-down button and a folder menu, tempButtonToolbar() (left and floating), presses, addCommand()/setCommandChecked()/activateCommand, refusals, and reattach.
    • Stand-in host test.
    • JVM protocol tests.

Motivation for adding to Mudlet

Packages put their controls on button bars and in addon commands. This makes both reachable from the Android UI.

Other info (issues closed, discussion etc)


Generated by Claude Code

The engine now tells the UI what scripts draw, from THeadlessSession's
script-window API: windows (only what changed, with removed, and every
window with full to a UI that attaches), each console's last 300 rows as
windowText, the main window's area as mainArea and a console's own
command line as windowCommandLine. The UI can give the main window's
size, ask for any rows of a console, place or close a user window and
send a line on a console's command line. libmudlet keeps the size the UI
gave for each profile that loads; the stand-in has no script windows,
says so on attach and refuses the requests.

Versions 4 to 6 are left for protocol changes still in review. The
window of a link (getLink/followLink) waits for version 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ujaeGdi2MHnkoicGsDqhg
THeadlessSession sends a turn's main console lines as the turn runs, but
its script windows, their text and command lines from the event loop
after it. script_windows() waited for the chat console's windowText and
then for the "main window" line the same runLua echoed, which had
already come, and been collected, before the windowText: the wait timed
out. Each wait now looks first at what came since its request, and a
timeout lists what did come.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ujaeGdi2MHnkoicGsDqhg
The profile's mudlet-base-ui package attaches its container to the right
border, so after setBorderLeft(100) the main console's text is narrower
than the window less 100 by that border: read it with getBorderRight().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ujaeGdi2MHnkoicGsDqhg
The engine now tells the UI what each label shows, from THeadlessSession's
labelContent(): a label message after the windows message, for each label
whose text, image, SVG, movie, tool tip, accessible name or button,
click-through or stylesheet changed, and for every label to a UI that
attaches or drains. windows gives bgAlpha for a background below opaque,
as a Geyser.Gauge's text label is transparent; its back and front labels'
geometry gives its value. The UI can send what its pointer did on a window
(pointer, run by THeadlessSession::pointer(), so a label's click callback
runs) and ask for an image file, scaled or one frame of it, as a PNG
(getImage, answered by image). The stand-in has no labels and refuses
both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ujaeGdi2MHnkoicGsDqhg
The engine sends the profile's button bars (buttonBars) and the commands
its packages added with addCommand() (commands), each whole, when it
changed, and to a UI that attaches or drains; the UI presses a button or
menu entry (pressButton) and clicks a command (activateCommand), both
answered only when refused. MudletEngine follows THeadlessSession's
buttonBars()/buttonsChanged and addonCommands()/addonCommandsChanged and
calls pressButton() and activateAddonCommand(); the stand-in sends both
lists empty and refuses both requests.

Protocol.kt parses both messages, leaving out a bar in a place it does
not know, and builds both requests; the app draws none of it yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ujaeGdi2MHnkoicGsDqhg
@vadi2
vadi2 force-pushed the ccr-14671218-tf96z6-scriptui-f4p-buttons branch from bea634c to d182d4d Compare November 15, 2026 04:06
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.

2 participants