andodeki
a3d8f521a9
fix(game/render): port EntityLocal particle anchors from libs/render
...
makepad-game-sim added EmitterAnchor::EntityLocal but game/render's
ParticleSystem still matched only Entity/Point (E0004). Port the
libs/render implementation: step() now resolves (pos, yaw) so a local
offset turns with its body; add clear(). Arcade caller passes yaw.
2026-09-26 11:17:02 +00:00
afccda5445
fix(fork): restore nigig game-sim/math + workspace members, take upstream finance/route manifests - preserve game crates alongside dev/work split into scene/soft-body
2026-09-25 20:12:03 +03:00
99ca24dbbc
Merge upstream origin/work 5f99533 into nigig fork alongside dev
2026-09-25 17:32:26 +03:00
a0f46b7d83
Merge upstream origin/dev fda40f56 into nigig fork - preserve nigig hub/web_server, take upstream dev updates
2026-09-25 17:25:35 +03:00
Admin
5f99533505
Merge branch 'wm-fixes' into work
2026-09-25 11:20:28 +02:00
Admin
343de346b7
calendar: the Calendars sheet is an opaque panel, and the wide layout does not float one over its sidebar -- paper (sheets, pages, panels) was the theme's inset tint, 15% black in the desktop dark theme, so every sheet showed the content under it; it is now that tint over the window background, the colour the root already showed. A Calendars sheet or page carried from the phone or landscape layout into the wide one reopened as a 320 pt panel at the phone button's position, its Close floating over the sidebar's own calendar rows; the wide layout closes it, since the sidebar lists the calendars
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:14:14 +02:00
Admin
b9882bff16
platform + wm: a hosted child redraws at its tile's new size -- two ways a geometry change was lost, measured on Windows (.100) with wm hosting clock and calendar: after a split or a resize the child kept drawing at its old size and the tile showed that frame stretched or squeezed into the new rect (child logs: the WindowGeomChange never arrived, painting stayed at 2268x1428 against a 560-wide tile)
...
- The child's Tick drains the network queue for HTTP and script sockets (dispatch_network_runtime_events), and that queue also carries the host socket its hosted loop reads. A host batch landing during a Tick went through dispatch_studio_msg, which drops the loop's own messages: WindowGeomChange, Swapchain, Tick. The drain now parks host-socket responses in Cx::studio_backlog once a loop owns the socket (its first read), and the loop's next read takes them first, in order. Before: 1 in 2-3 split runs lost the geometry; after: 6 of 6 runs delivered every geometry sent. Applies to the macOS and Linux X11 hosted loops too; Android hosted never drained the network in its Tick
- wm's run view cleared its bootstrap (the geometry resend) on any present, so a frame already in flight when the tile changed size cancelled the geometry before it was sent; a present settles it only after the first bootstrap beat has sent the messages
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 11:14:14 +02:00
Admin
d51069baea
Merge branch 'win-deck' into work
2026-09-25 10:53:36 +02:00
Admin
2b05e260c1
Merge branch 'mcp-reverse' into work
2026-09-25 10:53:35 +02:00
Admin
641ef10a1f
civil-time: one local wall clock for every app, and it knows the zone on Windows -- the Clock app said "UTC" on Windows because its localtime_r copy was Unix-only; clock, calendar, task, mail and wm each carried their own copy (mail's macOS-only, wm's with a separate GetLocalTime path). makepad_civil_time::local() now breaks an epoch second down by the OS's own zone rules (localtime_r on Unix, FileTimeToSystemTime + SystemTimeToTzSpecificLocalTime on Windows, so DST applies at that instant) with the UTC offset, and all five apps use it
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 10:22:16 +02:00
Admin
48f7eabac1
wm: opening an app rebuilds it when its binary is out of date; warm instances never build -- the rule is that pre-warmed ("hot") clients only start when nothing has to compile, not that nothing compiles: opening an app (a click, F10 for the pane) builds it when its binary is missing OR older than any source cargo's dep-info (<bin>.d) lists, on every platform, then runs it in the same tile. The warm pool, the pane at startup and previews run only built, up-to-date binaries; a stale one is not warmed (remembered by its build time, so the check runs once per build) until an open rebuilds it. So no build of wm's own ever holds cargo's lock ahead of the app the person opened. A build logs to wm-client-<id>-build.log, which the app's own log no longer overwrites. On .100 with the Builder's environment: startup ran no cargo and left the stale terminal cold; Photos opened 10 s after start built and drew in 9.9 s with no lock wait; the stale terminal rebuilt on open (4.1 s) and was warmed again after
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 02:08:06 +02:00
Admin
10cc3eb7dc
wm: the clock and calendar know the date on Windows -- local_now() had only a POSIX (localtime_r) version and returned None on Windows, so the date view fell back to January 1 2026 and the bar's clock had no local time; Windows reads it from GetLocalTime
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 02:02:00 +02:00
Admin
6c05f3d43d
ai: Connect hands the .mcpb to Claude Desktop itself -- Windows associates no program with .mcpb, so opening it with the OS opener did nothing there; Claude Desktop takes the bundle's path as an argument, running or not, and shows its install dialog
...
- Windows: the Store package's App Execution Alias (%LOCALAPPDATA%\Microsoft\WindowsApps\claude-desktop.exe), else the running Claude Desktop's own exe (never Claude Code's claude.exe), else the installer's AnthropicClaude\claude.exe or Programs\Claude\Claude.exe; started with no console window.
- macOS: open -a Claude <bundle>, when Claude.app is in /Applications or ~/Applications. Linux: xdg-open as before.
- No Claude Desktop found: the panel says "Claude Desktop isn't installed".
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 02:01:34 +02:00
Admin
8a7758947d
wm: the whole deck out of a Builder's source, compiled only when the person opens an app -- the Builder starts wm in the source it downloaded (with its compiler environment), but wm took a checkout to need local/, which a download has not: it fell back to sibling binaries, listed only the apps already built next to it (calculator, calendar, mixer, route) and logged "binary not found: aichat / terminal / browser / files / task". A checkout is now the workspace with apps/wm in it. And wm compiles nothing behind the person's back: every child is its built binary (the checkout's release build in CARGO_TARGET_DIR, the Builder's shared target, or the installed sibling), started directly instead of through cargo run; the warm pool, the AI pane at startup and previews start only apps that are built (seven cargo runs at startup queued on one target lock while the clicked app said "Waiting to compile" behind them). The menu lists every deck app, "compiles when opened" under those not built; opening one runs a single hidden cargo build --release -p <pkg> --bin <bin> whose progress bar is read into the tile ("compiling 103/107 crates · makepad-widgets…"), and the app starts in that tile when it is built, or the tile says the build failed and names its log
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 01:54:08 +02:00
Admin
482b2b1f56
wm: children open no console windows on Windows -- wm is a windowed program started detached by the Builder, so it has no console; every console program it started (the pre-ac1917d70 Builder linked every app as a console program: makepad-mixer.exe, wm.exe, calculator.exe are PE subsystem 3 in the user's install; and cargo whenever wm ran out of a checkout) got a console window of its own, which showed over the full-screen desk as "a terminal inside wm" and, with cargo, one per warm client. Every child wm starts (clients, curl for themes) and every sibling wm_api starts gets CREATE_NO_WINDOW; hosted children talk over pipes and the hub, never a console
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 01:53:58 +02:00
Admin
e831c4520f
Merge branch 'mcp-reverse' into work
2026-09-25 01:39:16 +02:00
Admin
b6a99cb381
wm: starts on Windows -- the desk no longer overflows the 1 MB main stack
...
wm.exe died at startup with "thread 'main' has overflowed its stack"
(0xc00000fd) on Windows, where the main thread gets 1 MB against 8 MB on
macOS and Linux. The startup chain is shallow (~85 frames) but five of its
frames were huge: ShellIcons (41 DrawSvg, ~110 KB) sat by value in every
ShellDraw, PhoneSurface carries one ShellDraw and WmDesk carries a
PhoneSurface plus its own ShellDraw (286 KB). Each constructor layer
(WmDesk factory, WmDesk::script_new, PhoneSurface::script_new and
script_new_with_default, ShellDraw) held its whole value in its frame:
about 970 KB in five frames. Reproduced on macOS by linking wm with a
1 MB main stack (same overflow).
script gets a transparent Box<T> (ScriptNew/ScriptApply/ScriptHook forward
to T: same type id, proto, default and apply), and ShellDraw boxes its
icons. The same chain now takes ~305 KB (WmDesk 286 -> 69 KB, PhoneSurface
140 -> 30 KB, ShellDraw 117 -> 7 KB); the 1 MB-stack build starts and runs.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 01:13:29 +02:00
Admin
0f39445982
ai: Claude Desktop drives any app with the F10 panel -- pick "Claude Desktop" in the panel's provider menu and the app serves its tools to it over MCP
...
- The loopback MCP server moves from Director into libs/ai/services (mcp::server); Director re-exports it, its lane tokens and tests unchanged. The dispatcher now names the server and its instructions; a TokenStore can live in memory only (ephemeral).
- mcp::host: while Claude Desktop is the provider the panel serves its registry's tools (service__tool names) on an ephemeral 127.0.0.1 port with a fresh bearer token, and writes ~/.makepad/mcp/<exe-stem>.json {pid, port, token, title} (0600 in a 0700 dir), removed when the provider changes or the panel goes. Calls queue to the UI thread and run through EngineCore::call_external: a card in the transcript, destructive calls held for the person's confirm (the pane opens for it), the result sent back when the card lands.
- mcp::mcpb: "Connect to Claude Desktop" writes <exe-stem>.mcpb (a stored zip, manifest_version 0.3, binary server = this executable with --mcp) and opens it so Claude Desktop shows its install dialog.
- platform mcp_relay: `<app> --mcp`, checked first in app_main before any Cx, window, GPU or audio, relays newline JSON-RPC on stdio to the running app's endpoint. It answers initialize/ping itself and tools/list from the app's last list while the app is down, starts the app (detached, MAKEPAD_AI_PROVIDER=claude-desktop, engine up with the pane closed) on the first call that needs it, waits up to 20 s for its file, and exits when stdin closes.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 00:43:05 +02:00
Admin
2e176aaea5
widgets, builder: the big widget families are features, all on by default, and the Builder takes none of them -- makepad-widgets gains tweaker (with reflect and the theme store; needs dock and data), charts (chart, chart shapes, waveform; needs color), color, data (data grid, tree view, file tree), dates (calendar, date and time pickers), chat, dock, rich_text (text flow, rich text, HTML, Markdown, LaTeX maths, log list; makepad-html, pulldown-cmark and latex-math become optional), dropzone, vector, glass and nav_menus (floating action, radial, pill-nav, line and hamburger menus) and command_palette. Each gates its modules, re-exports and registration; the core stays unconditional. Without the tweaker a Window's Tweaker is an empty hidden view, as the voice wave is without voice, and the window, widget tree and fab panel skip their tweaker and dock hooks. wm_theme and wm_api take no families; the terminal app keeps them all through a default all_widgets feature so shared target dirs build makepad-widgets once. The Builder (tools/makepad_builder) takes widgets and terminal without defaults: macOS release 30.04 MB -> 24.41 MB (stripped 24.39 -> 19.70 MB, __text 15.96 -> 12.62 MB), window and TUI unchanged (identical grab), no script errors in its log. Checked: cargo check --workspace, widgets with no features and with each feature alone, widget lib tests with and without defaults (1849 / 1100 pass), Builder on macOS, Windows and Linux targets.
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-25 00:10:52 +02:00
Admin
3993ebb2f7
sheets, score, git, home: saves cannot cut a file short or overwrite another one, and checkouts cannot write outside the repository -- Sheets and Score save through a temp file renamed into place, refuse an empty path, and ask (a second Save) before replacing a file that is not the document's own; Sheets says when formulas were saved as values. The git library rejects tree entry names "", ".", "..", ".git" and any containing / \ or NUL, and refuses to write or remove through a symlinked parent folder. An empty MAKEPAD_HOME counts as unset everywhere it is read, so caches never land in the current folder.
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:20:07 +02:00
Admin
27ae3e2fad
director: coding agents ask before acting unless you choose otherwise -- the hard-coded --dangerously-skip-permissions / --dangerously-bypass-approvals-and-sandbox flags are gone; Settings > Coding agents has, per agent (Claude, Codex, Grok), a "Let this agent act without asking (bypass permissions)" checkbox (off by default; adds the provider's own flag, Grok --always-approve) and a custom-arguments field (empty by default; split like shell words without a shell), stored in agent_arguments.ron beside settings.ron and read at every launch and resume.
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:20:07 +02:00
Admin
cb97f351b7
files: the Files app deletes nothing and never overwrites -- Move to Trash, Delete Permanently, their shortcuts, the two-press confirm, the AI "trash" tool and the trash/delete operations are removed; a per-platform "Show in Finder / Explorer / File Manager" row (open -R, explorer /select, xdg-open on the parent, no shell) takes their place so deleting happens in the system's own file manager. Undo of copies and new folders (which deleted what they made) is gone, moves are renames only (another disk: copy instead), and moves, undo, copies and renames refuse an existing target instead of replacing it.
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 14:12:27 +02:00
Admin
41fc2e3b0a
builder: the Builder TUI matches the new terminal design, Windows executables carry app icons, and every app has one -- plain full-screen menu (SETUP / YOUR LICENSES / MAKEPAD EXPERIMENTS / CODING AGENTS) with one status line and one progress bar; log in with an email kept in the install folder (downloads are no longer personalized); consent screens list each license agreement (Return opens it) with Agree to all / Cancel; a GPU notice screen on Windows and Linux; optional CUDA for Makepad Amp on NVIDIA GPUs; Apple developer tools screen on macOS; updates save local edits as changes/<app>-<date>.diff for a coding agent to merge back; "clean build" runs cargo clean. libs/win_resource writes Windows icon and version resources without rc.exe from the same icon source as macOS bundles; cargo-makepad uses it. Apps get icon.svg + icon_1024.png (tools/app_icons/render.sh). makepad-mac.sh and makepad-windows-preview.sh are the simulated visual specs.
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:48:33 +02:00
Admin
e047d2a790
platform, widgets, audio_route, ai: window crossfades and whole-frame presents, caption controls that click, themed menus, a stereo-pair audio tap, and the AI chat on local Claude Code / Codex with images -- a window can snapshot its presented frame and crossfade it over the next one (0.25 s, Metal; other backends cut), and can hold a frame until everything in it is on the GPU so a relayout appears in one step; app controls in the caption bar answer the window's drag query as client so real clicks reach them; menus scroll within the window and keep a readable text/background contrast, drop-downs take their popup look from the host; relief surfaces gain a texture light knee, spill tint and screen colour maps. audio_route taps a player's output on the device's own stereo pair (no system downmix, device rate and channel order) and reports its format and permission without prompting. The AI chat can use a logged-in Claude Code or Codex CLI as its model (tools as tagged text blocks), attach dropped images, and pick its model; the speech lib gains opt-in GPU pacing, a shorter audio context and a token cap; audio tags expose bpm. The remote bridge gains window resize and drag-query probes
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-24 13:48:31 +02:00
Admin
2a3db09653
director: agent lanes form a tree and Grok joins the usage bar -- lanes start child lanes the person can see, Grok's weekly allowance comes from its own billing call, and lanes are hosted by the agents binary on macOS and Linux too
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:45 +02:00
Admin
b9e58a99fe
mail: the local view takes a theme-derived palette and line icons, search pages share records -- Reply and Open in Mail get icons, --size WxH checks breakpoints
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:45 +02:00
Admin
79873edaeb
files: the tile view's three projections are toolbar buttons -- 2D, 2.5D and Perspective open the treemap directly
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:45 +02:00
Admin
d15996efd9
task, cargo-makepad, widgets, audio: the task manager chooses its columns, graphs every process' network and disk traffic and installs itself as a Dock app built by cargo makepad -- cargo makepad desktop bundle -p <crate> [--install[=DIR]] builds a self-contained, signed macOS .app (MAKEPAD_PACKAGE_DIR=resources in its own target dir, every dependency's resources plus only the fonts the binary's manifest names, icon from [package.metadata.makepad.desktop], per-app usage strings, signed with the Apple Development identity so privacy grants survive rebuilds) and installs it outside target/ (default ~/.makepad/apps), replacing the per-app package-macos.sh scripts
...
- task: a right-click column chooser (sections as flyouts, Default Columns), every figure and graph its own sortable column, dragged order and widths saved; per-process network bytes/packets from the kernel's ntstat control socket (matches nettop, no root), disk bytes, footprint and idle wake-ups every tick; history journal v4
- widgets: data_grid_columns, one column helper (chooser, reorder, resize, fit, sort cycle, layout text) that task uses and other tables can reuse; the menu engine refreshes marks inside an open flyout; the segmented control centres its labels on the line height and no longer glides after a moved row
- svg: a stroke join never connects to the previous subpath (the diagonal through outline icons)
- platform: home::app_data_dir; script: ScriptIp body ids widened to 14 bits (16384 bodies, was 4096) with an index of 26 bits, and a clear stop instead of aliasing past the limit
- audio_route (new): tap an app's audio output through the Core Audio process tap into a host processor (equalizer, gain, limiter, analyzer) and play it; audio_picture owns the one FFT; audio_decode probes tags and length from a file's head and tail; search::fold_words; zip_file reads archives with a trailing comment
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:45 +02:00
Admin
6907154d02
wm on Android: the look switcher stays put, the iOS dock shows its icons, background apps follow a look change -- the Light / Dark / iOS pill moved between skins and crowded the clock; it now sits at one spot in every look, centred above the page dots / All apps row. In the iOS skin the dock's glass bar was drawn over its icons; the glass draws first now. An idle background child applied a look change only after it next got input (the idle-wake work in b61ab763e left it without a tick); it applies it at once, and a tile-only app shows its current tile on its own ground in the new look
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:45 +02:00
Admin
50991700b2
wm on Android: Recents shows the apps over a receding home, and the home screen switches looks -- opening Recents from Home placed every card a screen width off-screen unless a lift had paused, so only headers showed; cards are placed at once now and only a paused lift slides them in. Behind the cards the home recedes to 0.92 and fades while the wallpaper dims to the launcher's 100/255 scrim, continuous with the lift and eased on release, instead of jumping to the tonal grey surface. A Light / Dark / iOS pill on the clock row (above the page row on iOS and in landscape) switches the shell look live, hosted apps keep their processes, and the choice persists as shell.look. A paused lift no longer draws the overlay's fallback status ground as a white strip
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:45 +02:00
Admin
5ac42f026d
wm on Android: the shell follows the Pixel launcher's motion -- launching from an icon grows the window from an icon-sized circle over 500 ms on the emphasized curves while the icon crossfades out (25-75 ms) and home scales to 0.97; releasing an app to Home flies it into its icon or tile on Quickstep's three springs (dock-row circle fallback), gone by 85% while home reveals from 0.85 over 1 s; the lift subtracts the 11.3 dp slop, a motion pause opens Recents with a haptic click and neighbour cards sliding in over 300 ms, >= 36 dp goes Home; All Apps is a full-screen panel rising 300 dp with the launcher's fades, home at 0.97 and hidden at 40%, opening past 40% or on a > 1 dp/ms fling. Cx::haptic_feedback reaches the Activity's performHaptic. The status band keeps the app's last sampled colour while a Recents card opens. Latency: a finger move goes to a hosted child at once with its own tick and every batched MotionEvent sample reaches it (Mail scroll touch->present 22.1 -> 15.7 ms mean). Values from AOSP Launcher3/Quickstep
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
ccadef613e
widgets: touch lists scroll with Android's physics -- Mail's inbox on the Pixel felt indirect and its flings wrong. Touch scrolling in PortalList and ScrollBar-driven views now shares widgets/src/scroll_motion.rs on Android: release velocity is estimated like VelocityTracker (LSQ2 over 100 ms, zero after a 40 ms rest), flings follow OverScroller's spline to its end within 50-8000 dp/s, the 8 dp slop is subtracted so the content does not jump when the drag takes over, and edges stretch briefly and firmly. Mouse, trackpad and every other platform are unchanged. Mail re-binds a list row only when its row, the selection or the layout changes instead of re-running script evaluation for every visible row each frame (4.2 -> 3.05 ms per child frame)
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
6487c41d3a
wm on Android: gestures and surfaces settle like the phone's -- the home wallpaper's motion slows over about 5 s and stops instead of animating forever; the status and navigation bands are a flat colour fading 16 pt into the app instead of the app's stretched edge rows (Weather's clouds smeared into warped bars); swiping an app up keeps its bottom edge under the finger (Quickstep's rule), a pause opens Recents and 36 dp up goes Home; on Home a swipe from the bottom strip opens Recents and a swipe anywhere above opens the drawer; opening an app from Recents only grows, no bounce. The Clock tile no longer redraws every second
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
3e01d10828
android: hosted children hand frames over with GPU fences and draw only when they have work -- Mail as a WM child ran at 20-26 ms per frame (3% of frames at 120 Hz): the child CPU-waited its GPU before announcing each frame and the WM paced it one frame per WM frame on a fixed 125 Hz beat. The child now exports a SYNC_FD semaphore per frame over the socket that carries its AHardwareBuffers and the WM waits on it GPU-side; the WM returns a release semaphore so the child never renders into an image being sampled (VK_KHR_external_semaphore_fd; children announce that they fence, and anything else falls back to the CPU wait). The WM ticks a child on its display frame only when it has work (a requested frame, input, a due timer, startup, a bootstrap), and host messages handled outside a tick ask for a frame. Idle wakeups are gone: host messages no longer wake the child's UI loop, the 2 s heartbeat, the 125 Hz beat on empty views and the 20 Hz warm-pool timer are removed, the bar no longer redraws every second, and touch times are mapped to the app clock (the phone shell treated every touch as just now and never came to rest). Mail landscape fling: 20.5/29.2 ms -> 8.48/11.6 ms (p50/p95), 86% of frames at 120 Hz; the WM home at rest repaints once in 10 s instead of ~1220 times
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
dedc447e68
android: rotated Vulkan windows stop rebuilding their swapchain every frame, and hosted children get touch -- on the Pixel, Mail as a WM child process could not be scrolled in portrait and ran at about 40 fps in landscape. In landscape the WM's swapchain (IDENTITY pre-transform on a rotated display) reported VK_SUBOPTIMAL_KHR on every present and vulkan.rs rebuilt the whole swapchain each frame: present went from 34-35 ms to about 1 ms and repaint from 52-66 ms to 2-7 ms once that one known Android case (extent and transform unchanged since creation) no longer rebuilds; every other SUBOPTIMAL, and desktop Wayland/X11, rebuild as before. The WM forwards the finger to a child as mouse events, so a press on a row captured the mouse and the list refused to drag; an Android hosted child now dispatches it as one touch like the Activity build (Cx::dispatch_hosted_touch), cancels included, and reports its focused text field on a cancel. Mail's toolbar buttons are flat discs with hover/press states instead of glass (the child drew its window twice per frame: 12.8 -> 7.1 ms). The WM's bottom band draws a smooth app edge stretched (Weather's sky) and a busy one in its dominant colour, so text scrolling under it no longer smears into streaks
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
0c83b8c73f
wm on Android: app transitions and gestures feel like the phone's -- on the Pixel, opening Clock from its live tile showed a streaked frame, the swipe up to Recents moved the app about 0.28 pt per pt of finger travel, the bottom gesture was hard to find, fading cards went grey and a closed app landed on a white card then "Loading". The WM now sizes a child's shared images for full screen before it opens (MpRunView::prepare_size), the child refuses to draw into a smaller image and the WM rejects such frames; the lifted card's centre follows the finger 1:1 while it shrinks and on release travels straight to its target; the WM draws its own 32 pt bottom-gesture strip and pill above the OS gesture band; rounded captures use fill_premul (opacity was applied twice); closing into a tile keeps the tile's last face until the child confirms a new one, holding the old capture so a live tile never draws over the foreground app. On Android a child renders one frame per WM frame into three shared images, with tick counters that resync on each acknowledgement; the warm pool is off there. Calculator's portrait toolbar uses a flat button (the glass one refracted its neighbour). A debug hook setprop debug.makepad.grab burst-<tag>-<n> saves a child's next frames
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
e603d6ae84
wm on Android: apps build on the phone -- the multi-process WM's APK can now carry the toolchain, source tree and prebuilt target/ (proc-pack --proc-toolchain=<tc>, written as wm-proc-ondevice.apk), like wm-dyn's super-app, but without the engine dylib: each app is a small generated wrapper crate linking the engine statically, so an on-device cargo build reuses the shipped engine rlibs and compiles only the app. With debug.makepad.wm.ondevice=1 the launcher (--build) builds the app before loading it; builds take turns on a lock, each finished library is copied to its own file in files/run/ and loaded from there, and a build or lock wait past its deadline (300 s, 600 s for the first proc-macro bootstrap) is killed with its process group and the APK's prebuilt library runs instead. Provisioning, unpacking and the proc-macro bootstrap moved out of the WM's dylib host into libs/ondevice_build, shared with wm-dyn (streaming LZ4 parts, same stamps and paths); dyn-pack's staging was factored so proc-pack reuses it. The debuggable switch is opt-in and only for the on-device APK. Proven on a Pixel 11 Pro XL: calculator's source edited in the phone's copy rebuilt in 12.7 s and showed the change; four apps built in turn in about 6 s each
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
9baf6d6854
platform, wm: hosted apps ask the WM for what they cannot do themselves -- a hosted child has no OS window and, on Android, no JVM, so the clipboard menu, opening a URL, permission prompts, file pickers and HTTP were unavailable to it (Weather sat on "Loading" as a phone child process). AppToStudio::Relay / StudioToApp::Relay (appended, tags 26/27, existing ordinals pinned) carry these requests (platform/studio/src/relay.rs); the child side routes them automatically from the ordinary Cx APIs (platform/src/hosted_relay.rs), the WM executes them and answers by a host request id mapped back to the child's. HTTP for Android children is relayed through the WM's own Java HTTPS (NDK code has no TLS and the repo takes no external TLS crate), arriving as the NetworkResponses apps already handle; a relayed request fails after 60 s without an answer. The WM serves relays only to clients it holds a live connection to; open_url allows http, https, mailto, tel and geo; picked documents are copied on a worker into a per-pick cache folder (older than a day deleted); Android save/folder pickers answer cancelled until children can write through SAF. open_url, which was unimplemented on Android, now opens the URL. linux_direct gets a clipboard of its own (platform/src/direct_clipboard.rs): the WM owns it, Ctrl/Logo+C/X/V work as on X11, and children reach it through the existing copy/paste messages
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
3495ce41fa
clock: a cancelled release neither opens an alarm nor switches tab -- the alarm list and the phone tab bar acted on any FingerUp; with the touch-cancel contract (237470eef) a press a scroller took away arrives as a cancelled release, which now only clears the press
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
a8bf0e4dcf
wm on Android: every app is its own process -- the plain makepad-wm now ships as an Android APK (cargo makepad android ... proc-pack -p makepad-wm-android) whose phone apps run as real child processes instead of dylibs loaded into the WM. The interface between WM and app shrinks to what the desktop WM uses: shared GPU buffers and the StudioToApp/AppToStudio protocol. The WM allocates each app's swapchain as AHardwareBuffers and hands them over a unix socket (AHardwareBuffer_sendHandleToUnixSocket, API 26); the child, started through the libmakepad_launch.so launcher in nativeLibraryDir (W^X allows it there), imports them into a windowless Vulkan device and renders its window pass into them (android_hosted.rs). Each app library links the engine statically, so the engine-dylib identity handling of wm-dyn is not needed. Children have no JVM: assets are read from the APK file, audio device lookup no longer goes through Java, and the startup/resize extra draw of the Activity build is repeated so the first frame carries its text. On a phone the WM asks for the soft keyboard only while the child reports a focused text field. Proven on a Pixel 11 Pro XL: all twelve phone apps launch as processes (first frame 1.6-2.4 s cold), taps reach them. Not yet: HTTP in children (the Activity build borrows Java's), clipboard/permission/file-picker relays, idle-app reclaim, and on-device builds of app libraries
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
f9a8f12a00
wm: the phone shell's surfaces match the app and the grid -- in the Android skin a fixed light status band sat over dark apps, corner radii were drawn at twice their size (tiles 44 instead of 28, Recents cards 52), wallpaper seams showed at the screen edges and the home, drawer and Recents spacing drifted. The status and navigation bands now take the open app's own edge colours from a small WM-owned strip read back only after the app really changed (26 KB instead of the 5.2 MB full capture, off for good where readback is unsupported, nothing at rest), with ink chosen by contrast ratio and a wash where neither ink reaches 4.5:1; iOS gets the same bands. Android geometry follows the Material spec: the date under the 48 pt clock, 16 pt tile gutters, a 120x48 All apps target, 96 pt landscape tiles with one row of seven favourites, a 56 pt drawer search with centred Clear/Cancel, fixed row pitch, and Recents with a tonal backdrop, 24 pt icon + 14 pt title header and a 24 pt card gap. iOS keeps its previous radii, gaps and typography through skin-specific metrics
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
1e44574d45
files: the phone layout tidies up -- in the WM's Android skin Files ran Browse into its view switch, showed no selected view, clipped long names and let its footer cover the last row. Browse is its own 48 pt action, Icons/List/Storage is a segmented switch that shows the current view (List stays lit after List->narrow), the toolbar is 56 pt with 48 pt targets, names are 14 pt on two whole lines, and the footer reserves 24 pt. The segment row fits the narrowest phones
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:44 +02:00
Admin
3fed1ffce7
weather, notes, finance, photos, route: the phone layouts tidy up -- in the WM's Android skin Weather drew a dark box behind its city and temperature and ran its list controls over the forecast, Notes had a 56 pt empty spacer and small targets, Finance clipped negative amounts and squeezed four stats into narrow capsules, Photos showed a filesystem path in its footer and had no way back from a deep zoom, and Route's Layers button was a missing-glyph box. Weather's scrims feather instead of boxing, its controls sit on a solid 64 pt bar, the landscape hero is compact and the header fade reaches the regrouped labels. Notes gets 56 pt folder rows, a 20 pt chevron and 48 pt toolbar targets. Finance cards use 16 pt radius and spacing, amounts fit by measuring the whole formatted value, and narrow landscape panes show the stats in two columns. Photos gets a 64/56 pt search row, a Fit action that frames the visible picked or centred picture, and a readable "N pictures . library" footer. Route draws Layers as an SVG, shortens the location button to "Locate me" and aligns its three controls 16 pt from the edges
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:43 +02:00
Admin
6c6ebff2ec
platform, widgets, wm: a touch that is taken away is cancelled, never released -- in the WM's phone skin the mouse now reaches the foreground app as a touch, and scrolling Mail then lifting opened the message under the finger: a list that took over a drag had no way to tell the pressed row it lost the press, and the same happened on real phones. Cancellation is now a contract. Event::FingerCancel and FingerUpEvent.cancelled carry it; was_tap() rejects it and no long press fires. claim_finger_gesture makes one owner per finger: PortalList and ScrollBar claim only with touch travel along their own axis (mouse drags scroll as before), and every loser, ancestors included, gets its terminal cancel in the same dispatch and never moves again. Pressed rows are cancelled before a list recycles them, cancels reach hidden widgets, and captures retire only after every consumer sharing the area has seen the cancel. iOS touchesCancelled and Android ACTION_CANCEL arrive as cancels and end an internal drag without a Drop. The WM relays StudioToApp::MouseCancel (appended, existing tags pinned) only to children that advertise it; inside a child it dispatches as FingerCancel. Widgets and apps that activated, committed, dropped, flung or resampled on any release now clear their state without acting (buttons, radios, menus, DataGrid, Kanban, Carousel, WheelPicker, RadialMenu, Modal, Dialog, Popover, colour controls, video hold-to-pause, maps, the Files treemap and tiles, Weather, Clock, AIChat, fab, flowgraph and more).
...
The WM phone shell rides on it: the simulated finger in the desktop skin, time-based release velocity (80 ms window, stale after a 120 ms rest), one critically damped spring (k 900, c 60) seeded with that velocity for paging, drawer, recents and app open/close, an 8 pt / 1.2x axis lock latched through release, a drawer that tracks the finger 1:1 and draws opaque over the home tiles, hold-to-Recents precedence, launches that zoom from the icon actually drawn with an opaque launch card, no ghost card on close, and one cancel/reset path for rotation, resize, focus loss, style switch and keyboard navigation.
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:43 +02:00
Admin
8329e1fd11
calendar, reminders, calculator, sheets: the phone layouts fit their space -- in the WM's Android skin Reminders drew a blank glass "New Reminder" pill and clipped its "Today" title, Calendar drew month rules the phone layout meant to hide and set today's circle low, Calculator left an empty band under a landscape keypad, and Sheets clipped its toolbar and showed "Your text here" in the name box. Reminders gets solid 80x48 New/Done buttons, baseline-aligned title and count, 56/80/104 pt rows, readable secondary ink and per-tile ink, and a solid priority selector. Calendar honours hidden rules, centres the today mark, snaps week dividers to one physical pixel and gives landscape a 56 pt toolbar with a solid Month/Week/Day selector whose title shrinks near 700 pt. Calculator's landscape header and five 48 pt key rows fill the 332 pt height, results fit from 32 down to 24 pt and pan beyond that. Sheets' portrait toolbar keeps name, Undo and a scrolling More sheet that holds every moved command and Insert function, the name box shows the active cell, tabs scroll with "+" and rename on screen, and a rotation no longer discards an unfinished formula
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:43 +02:00
Admin
fde31df7e3
clock: the phone layout fits both orientations -- in the WM's Android skin the landscape dial ran under the tab bar and the tab bar drew grey square corners from its blur backing. Clock now has a 56/48 pt heading row with an overflow menu holding the "Digital home tile" preference, a two-column landscape (192 pt dial beside time, date and alarm card) and side-by-side Stopwatch/Timer in landscape with widths derived from the screen, and a solid 370x64 tab bar with 16 pt corners whose height the pages reserve. Tab, date and caption ink reach 4.5:1 in light and dark. The alarm editor slides again: margin: Inset{..} failed at runtime with two errors a frame, so the sheet is translated with paired top/bottom margins
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:43 +02:00
Admin
9a12bcf7ea
mail: the phone layout lines up -- in the WM's Android skin the portrait inbox had its back button on the screen edge, titles, icons and cards on three different left edges and a bottom bar over the last row; landscape stacked shadowed toolbars and a second Inbox heading. Portrait now has one 64 pt app bar (48 pt back at the 16 pt margin, title at 72), a 48 pt search, 56 pt mailbox rows with a right-aligned count slot and separators, and a solid 56 pt bottom bar the list reserves. Landscape has one solid 56 pt toolbar, a 320 pt list of 84 pt two-line rows with 24 pt trailing clearance, and the reader actions appear only once a message is selected. The desktop three-pane layout keeps its structure
...
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-09-23 22:34:43 +02:00
Admin
0663a2be6c
wm: the shell menu says what it did, and the CI waits for that -- the mini's wm run went red once with 'log did not contain "browser client * first frame" within 240s' and nothing in the log between the Return and the timeout: no launch, no adoption, no menu line at all, so there was no telling whether the launcher never opened, lost the typed name or picked nothing. The menu now logs each open with its number and path, every activation with its target, its close, and a Return that activated nothing with the filter and row count it had; the terminal and browser steps wait for "shell menu activate apps.<name>" right after Return, so a launcher that went wrong fails there by name instead of at the frame wait
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-22 14:16:57 +02:00
Admin
90c9a7b01a
tests: the three binaries over ten seconds in release come under it -- the user's law is the whole suite in about two minutes, in release, and the CI now runs every test binary of its selection several at a time with a cap on each, so one long binary is the run's floor. Grok measured every binary the debug-era table named (release harness time): fourteen were already under 10 s and are untouched; three were not. Widgets --lib (1822 tests) 17.4 s -> 8.0 s: no single slow test; every test built a fresh Cx and registered the widget library on it (45 ms each, in release), and libtest runs each test on its own thread, so nothing could be kept. Test modules that build widgets now run their cases through on_test_cx on four threads that stay up and keep one registered Cx each (checkout_test_cx); finger, key, pass, draw-list and window state is cleared on every checkout so a case that locks a sweep or draws a menu leaves nothing for the next. The style-reload tests keep their own contexts: a reload would change the next case. The isolate cost table measures batches of 1 and 2 (the four sizes measured 30.06, 29.92, 29.63 and 29.49 ms per isolate: flat), and the two sheet-contrast tests read one walk of every sheet from a OnceLock instead of building the library twelve times each. Director mcp_battery 10.2 s -> 0.4 s: the slowloris test waited out the production head deadline of 10 s; McpServer::start_with_head_deadline takes the budget, production start still passes HEAD_DEADLINE_MS (asserted), and the test proves the socket is held until an 80 ms budget and closed after it. Piano acoustic_reference 11.6 s -> 8.6 s: the promotion renders are 2.5 s instead of 4.0 s, which covers every sample measure and onset read (2.0 s after an onset found in the first 0.5 s). No test is ignored, deleted or loosened. The review dropped the lane's short-circuit in script_mod (a library change for a test's sake: the one test helper that re-registered on a pooled context no longer does) and its per-module pool thread-locals that the checkout never read.
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-22 12:29:54 +02:00
Admin
ab64a64e7e
tools: makepad-screen is makepad-agents, and its binary is agents -- the crate is the agent session manager (start, attach, list, the TUI); "screen" was a nod to GNU screen, and its other job, the pty trampoline a terminal starts its shell through, does not need the old name either. The package is makepad-agents in tools/agents, the executable is agents, so it is the command on the PATH itself and the shell wrapper that existed only to give it that name is gone (the binary already resolves the workspace's session directory the wrapper used to export); the terminal's pty spawn looks for agents beside the app, Director looks for and pins the sibling agents with the makepad-agents-v1 record and the agents version line, the session environment is MAKEPAD_AGENTS_SESSION and MAKEPAD_AGENTS_STATE_DIR, the CI scripts build makepad-agents, and Director's notes say how to build and run it
...
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-22 09:36:13 +02:00