Commit graph

  • b3159c7d35 builder: a refused email says "Email not recognised" and keeps what was typed for fixing Admin 2026-09-24 17:48:30 +02:00
  • a65be5428d builder: a refused email opens the editor again with what was typed and says why, and the app section is YOUR APPS -- when the server answers not enabled / unknown, the log-in screen and Account keep the text with a yellow reason line (Return checks again, Esc keeps the previous email); offline or server errors do not; YOUR LICENSES is renamed YOUR APPS in the TUI, the previews and AGENTS.md Admin 2026-09-24 17:33:08 +02:00
  • 06ac6e4357 cuda: builds link only the CUDA toolkit they are given, never a system install -- makepad-ai-cuda's build script takes its toolkit from MAKEPAD_CUDA_ROOT alone; CUDA_PATH, CUDA_HOME and the Program Files / /usr/local / /opt scans are gone, because an exe linked against a system toolkit then needs that toolkit's DLLs on PATH wherever it runs (music.exe on a box with CUDA 12.4 installed but not on PATH stopped with "cublasLt64_12.dll was not found"). The Builder passes its private toolkit as MAKEPAD_CUDA_ROOT when CUDA is enabled; the Arch fleet provisioning opts in with MAKEPAD_CUDA_ROOT=/opt/cuda. Admin 2026-09-24 15:56:53 +02:00
  • c052c25da4 builder: the GPU notice is remembered -- choosing I understand writes graphics-notice-read in the install folder, so later starts on Windows and Linux skip it; the Graphics row reopens it and MAKEPAD_GPU_ACK is gone Admin 2026-09-24 15:21:26 +02:00
  • 59d4759c6a builder: one forward-only bar per setup component, green checks on finished setup rows, a black Builder window and a smaller Windows ZIP -- Build tools, Windows SDK, Rust and CUDA each show a bar totalled from the manifests' real byte sizes (download + unpack, cache hits count as done) under a "✓ Build tools ● Windows SDK ○ Rust" line; Account, Graphics, Agreements, Build tools/Rust, Xcode tools/System packages and CUDA show a green ✓ when done; the Agreements screen can agree or disagree (recorded in agreements-accepted, withdrawing never deletes anything); Update reads "check for updates"; builds use --offline instead of --locked (the pinned commits are the lock, a stale Cargo.lock no longer fails a build); macOS bundles are named after the catalog title (Makepad Scope.app, Makepad Amp.app); the Builder window is black; the Windows ZIP leaves out the CJK and colour-emoji fonts the Builder never draws. Admin 2026-09-24 15:13:46 +02:00
  • ccf108c778 git: worktree status matches git on real repositories and can be cancelled -- status looks at symlinks themselves (a tracked link to a folder no longer fails the whole status; untracked links are one entry), shows an untracked nested repository as one dir/ entry and skips tracked submodules, uses the real GitIgnore matcher (the old one missed a root **/target/ and reported ~147k false untracked files) with the user's global excludes file, and gains status_cancellable / compute_status_cancellable so long walks honour a budget. Output is identical to git status --porcelain=v1 on makepad (1680 records) and scope. Admin 2026-09-24 14:41:51 +02:00
  • 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. Admin 2026-09-24 14:20:07 +02:00
  • 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. Admin 2026-09-24 14:20:07 +02:00
  • 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. Admin 2026-09-24 14:12:27 +02:00
  • 2389e46094 builder: the terminal scripts delete nothing and read top to bottom, and every Builder delete stays inside its own folder -- bootstrap.sh/check-tools.sh/installer.sh are rewritten as four numbered steps with plain prompts: downloads go to fixed .part names that are renamed into place, Rust components unpack straight into a staging folder (tar --strip-components) that is renamed when verified, the source is checked out in a staging folder the same way, and no rm/rmdir remains; the installer only accepts an empty folder or an earlier Builder folder, never / or the home folder, and the compile shows one counting line with the full log in build.log. In the Rust crate every remaining file delete goes through remove_inside(root, path), which refuses anything not strictly inside a validated install root; gitclone no longer removes a destination on failure, downloads and links are replaced by rename instead of delete-then-write, and clean build is cargo clean --target-dir. tui.rs is regrouped by screen with smaller functions. Admin 2026-09-24 14:05:49 +02:00
  • 90b6a05813 platform: the pipeline-skip repaint mark exists only on Apple, where Metal reads it -- it warned as never read on Android, Windows and Linux Admin 2026-09-24 13:53:23 +02:00
  • f0754226ec platform: Android builds without Vulkan compile again, and the font-selection test counts the hosted entry point -- android_hosted.rs used the Vulkan renderer unconditionally, so every default (OpenGL) Android check failed to compile; the Vulkan paths now build only with use_vulkan behind small helpers, and a hosted child in a GL build logs that it needs MAKEPAD=vulkan and exits. makepad_hosted_main is the fifth entry point calling new_cx_with_font_set Admin 2026-09-24 13:51:07 +02:00
  • 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. Admin 2026-09-24 13:48:33 +02:00
  • 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 Admin 2026-09-24 13:48:31 +02:00
  • dc1de829e1 widgets: relief surfaces can travel like mechanical keys, and dark surfaces take less neighbour light -- ReliefView gains a timed press, a travel that moves the surface and its children down into its slot, and a latch that holds it down while its function is on, all off by default; spill_dark lets a dark surface take a fraction of the light a white one would, and near-white texture-light frames are damped harder so a white flash no longer washes dark bezels pale Admin 2026-09-24 01:38:57 +02:00
  • 149138afc7 widgets, platform: a texture can light the relief buffer, menus take colour chips, and a style reload recompiles changed shader functions -- relief_texture_light makes any texture a light source for neighbouring surfaces: the relief pass runs after the texture's producing pass in the same frame and repaints only when that producer painted, with a soft knee (and damping of near-white frames) so a flash does not flood every bevel; the buffer gained a fifth, widest blur level so spill washes the near half of a neighbouring face, surfaces take a style-wide spill tint and ceiling, and ReliefView caps can follow a held button. MenuRow::swatch(fill, dot) puts a colour chip before a row's label. A style reload re-evaluates Splash modules under the names they had, so the object- and function-address shader caches handed back the previous shader or another template's (changes landing a reload late, or on the wrong surface); a pending style reload now clears those two caches like a file-change live edit does, keeping the code-keyed cache so unchanged shaders do not recompile. examples/skeuomorph gains an animated plasma screen lighting the keys beside it. glass renders pixel-identical, hello_world differs only in its animated GIF Admin 2026-09-24 01:11:51 +02:00
  • 1c64cfdfeb widgets, draw: skeuomorphic surfaces light each other through an optional relief buffer -- mod.sdf.Material shades a widget from its own SDF (height profile, normals, key light, inner shadow, AO, rim, gloss, cast shadow, revolve-profile knobs, a ±1 LSB screen dither and optional grain); widgets that opt in register lit shapes (rounded box or disc with a height and an emissive colour) keyed by their draw list, and the window renders them once into a quarter-resolution f16 height+emissive buffer with its own blur chain, rebuilt only when the shapes change, so a lit LED spills onto its neighbours' bevels, raised parts cast AO between widgets, and nothing renders at rest. Material draws bind the same textures, so batching is unchanged (39 draw calls with and without). A window with no lit shapes allocates and records nothing; hello_world and glass render pixel-identical to before. examples/skeuomorph shows a Bluetooth key, lit ON/OFF buttons, a knob with an LED ring and a segmented control Admin 2026-09-23 23:49:22 +02:00
  • 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 Admin 2026-09-23 22:30:37 +02:00
  • 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 Admin 2026-09-23 22:30:36 +02:00
  • 79873edaeb files: the tile view's three projections are toolbar buttons -- 2D, 2.5D and Perspective open the treemap directly Admin 2026-09-23 22:30:36 +02:00
  • d838ea6aae diskmap: a scan lists each macOS directory in one getattrlistbulk call and classifies files without allocating or locking -- a photo-heavy home folder no longer waits on a mutex Admin 2026-09-23 22:30:36 +02:00
  • f937750491 ai llm: a Metal main buffer is filled in 32 MB chunks -- no host copy the size of the whole buffer under a capped allocator Admin 2026-09-23 22:30:36 +02:00
  • e290165556 ai: the hub's rig-fixture tests find the asset library without the asset client -- the hub never depended on it Admin 2026-09-23 22:30:36 +02:00
  • 371b5dc458 git: timings read a portable clock -- std::time::Instant panics on wasm; the crate reads the host clocks the platform already imports Admin 2026-09-23 22:30:35 +02:00
  • f0e7064364 cef: captured frames and audio carry callback clocks and a navigation epoch -- Stage's browser recording measures AV sync and drops paints from the previous page Admin 2026-09-23 22:30:35 +02:00
  • 84368eec4b flowgraph: ordered ports take many wires, sockets can override their icon, and the canvas embeds as a viewport -- what Stage's flow product builds against Admin 2026-09-23 22:30:35 +02:00
  • dc0ccb4281 agents: a user touching an app under test no longer stops the agent -- input invalidates the interrupted input sequence, not the authorization to keep inspecting, driving, closing and restarting the workflow's app (user instruction 2026-09-22); CEF apps keep their browser profile per executable name, so a replacement launch passes MAKEPAD_CEF_PROFILE_DIR and never shares the user's profile with a second instance Admin 2026-09-23 22:28:33 +02:00
  • 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 Admin 2026-09-23 22:23:18 +02:00
  • 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 Admin 2026-09-23 19:57:28 +02:00
  • 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 Admin 2026-09-23 18:01:23 +02:00
  • 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 Admin 2026-09-23 17:02:47 +02:00
  • 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) Admin 2026-09-23 16:41:02 +02:00
  • 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 Admin 2026-09-23 16:34:03 +02:00
  • 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 Admin 2026-09-23 16:34:03 +02:00
  • 801a07e884 vulkan (android): a window released on suspend is not released again -- switching away from a Makepad Android app and back crashed it (SIGSEGV in ANativeWindow_release from CxVulkan::update_surface): suspend_surface had already released the window and set it to NULL, and update_surface released it again. Only a non-null window is released now Admin 2026-09-23 16:34:03 +02:00
  • 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 Admin 2026-09-23 12:51:47 +02:00
  • 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 Admin 2026-09-23 11:53:14 +02:00
  • 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 Admin 2026-09-23 11:17:11 +02:00
  • 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 Admin 2026-09-23 11:07:22 +02:00
  • 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 Admin 2026-09-23 10:42:10 +02:00
  • 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 Admin 2026-09-23 10:42:05 +02:00
  • 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 Admin 2026-09-23 09:59:25 +02:00
  • 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 Admin 2026-09-23 09:53:21 +02:00
  • 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 Admin 2026-09-23 09:51:58 +02:00
  • 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). Admin 2026-09-23 09:51:28 +02:00
  • 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 Admin 2026-09-23 07:43:22 +02:00
  • 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 Admin 2026-09-23 02:05:32 +02:00
  • 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 Admin 2026-09-23 01:27:43 +02:00
  • deb66b4fef draw text: the CoreText outline fallback is only ever resolved for a face whose outlines live solely in hvgl, and font-family diagnostics are the font trace topic -- a space has no outline in any font, so every face on macOS reached the fallback and would have resolved a CTFont for it (PostScript-name lookup, a cascade-list scan, then the face written to a temp file and loaded through the font manager) on the UI thread to outline nothing; the gate checks for an hvgl table with no glyf, CFF or CFF2, so bitmap faces stay out too; MAKEPAD_FONT_DEBUG read the environment on every update_font_definitions and is now MAKEPAD_TRACE=font Admin 2026-09-21 21:46:57 +02:00
  • 09ff817679 feat(text): CoreText outline fallback for hvgl-only fonts (macOS) ychen 2026-08-14 00:02:19 -07:00
  • 6db127c82e fix(text): enable ttf-parser gvar-alloc for many-tuple variable fonts ychen 2026-08-14 00:02:02 -07:00
  • 6941c0e86b script: the Octoscript hardening keeps a Makepad host's semantics and its speed -- an uncaught error ends an evaluation only when the host sets bail_on_uncaught_error, so by default a module keeps evaluating past one bad statement and scripts can inspect returned error values; an error raised while no script ran is reported at the Rust->script boundary instead of ending, or being caught by, the next run; cross-call try unwinding stops at the nearest root frame, so an error inside a native's callback (array.retain) never pops frames an outer run_core still executes; the equality work ceiling applies to bounded evaluations only and a scalar == allocates nothing; run_core keeps its cached opcode pointer, invalidated by an epoch every bodies.borrow_mut() advances; take_allocation_error and charge_allocation are one flag read when nothing is limited, cast_to_f64 keeps its number path inlinable and checked_index is one round-trip compare Admin 2026-09-21 21:37:44 +02:00
  • a4c31be0b5 script: keep silenced streaming evals running past uncaught errors ymote 2026-09-13 15:04:29 -07:00
  • ba33084d9c script: port orphaned Octoscript VM hardening (execution caps, clear_type_methods, parser diagnostics) ymote 2026-09-13 14:57:13 -07:00
  • 1f481016f4 script: port Octoscript heap/string/array/object hardening onto upstream's allocation budget ymote 2026-09-13 14:44:36 -07:00
  • 2f9565e08a script: port Octoscript parser/tokenizer/control-flow VM patches (ws2) ymote 2026-09-13 14:43:04 -07:00
  • 4a00885f26 script: port Octoscript WS1 — worklist equality with fuel/deadline/work bail, uncaught-error bail, allow_debug_output ymote 2026-09-13 14:39:09 -07:00
  • 6c3414f087 script: re-entrant dispatch, thread index validation, Any-based handle downcasts, UTF-8 previews; regex: never_loop fix ymote 2026-09-13 14:34:59 -07:00
  • 1f60033ed3
    RadioButton: take key focus on the click, not on the press (#1259) Kevin Boos 2026-09-22 22:38:46 -07:00
  • d14a991085
    HtmlLink: fix its hover and pressed states (#1257) Kevin Boos 2026-09-22 12:28:44 -07:00
  • 2b1de986e9
    RadioButton: fix its touch hover state and click-off behavior (#1258) Kevin Boos 2026-09-22 12:28:29 -07:00
  • 76627b6f19 ci: a driven app takes every key once, and the storage module builds for the browser -- the mini's wm script went red one run in three at the browser launch, and the shell menu's new log lines said why: the filter read "bbrowser" and the menu had opened twice. The remote bridge applied every wait=1 input first and, when the frame after it could not be sealed (the window was busy presenting the warm browsers), answered "requested input frame could not be submitted; retry"; the CI driver took that at its word and sent the input again, so a busy app took the Cmd+Space and the first letter twice. The bridge now keeps the waiters of an applied input and asks for the frame on the next beat, as it already did for a drawable still being acquired; the driver never asks an input route twice, whatever the answer, and still retries a grab it could not place. The workspace row was orange and apps/scope red on wasm32 since 8d7246231: the public volume_available_bytes had been put between the not(wasm32) guard and the native module it guarded, so the module compiled in the browser with nothing using it (17 warnings) and the function it exported was missing there; the guard is back on the module, and the browser has a volume_available_bytes that says the free space is not known Admin 2026-09-22 19:03:48 +02:00
  • 3cc56cf9b5 git: the memory ledger can take what it is asked for -- MemoryAccount::reserve takes the bytes whether or not the account has room, keeps the excess in overcommitted and leaves available at zero while it stands, so callers that can wait hold back; try_reserve stays for them. The ledger paces work, it is not a wall: a preparation in Scope that could not do without a lease stopped with a capacity error where the machine could have swapped (the user: "analysis ram cant just fail either") Admin 2026-09-22 17:40:41 +02:00
  • 2e926a70f4 platform: the storage module says how much a volume has free -- volume_available_bytes(path) was the private figure behind the storage estimate; an application that sizes a store by its disk has to ask the disk, not carry a figure of its own (Scope prepared into a fixed 32 GB per namespace and stopped at "disk capacity" on a volume with room to spare), so it is public now Admin 2026-09-22 17:11:05 +02:00
  • 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 Admin 2026-09-22 14:16:57 +02:00
  • da8a29869b widgets: the pooled test context's resets replace the globals -- Cx::set_global keeps a global that is already there, so the reset landed in 83228f9e5 never touched the Escape claim or the drawn root once a case had installed them, and the mini still failed escape_belongs_to_an_overlay_locked_above on the next run; the resets now assign through global(). A test checks the contract on the pool itself: a claim in one checkout does not refuse the next checkout's Escape Admin 2026-09-22 14:12:48 +02:00
  • 83228f9e54 widgets: a pooled test context forgets the last case's Escape claim -- the pooled contexts the widget tests run on since 90c9a7b01 are handed from case to case without an event loop, so their event id never moves; the first case on a thread that claimed an Escape left its claim behind, and every later case on that thread whose menu needed the key was refused it (radial_menu's the_keyboard_walks_the_rings and escape_belongs_to_an_overlay_locked_above failed about one run in four, depending on which cases shared a thread). A checkout now resets the claim, the orphaned-lock list and the drawn root the last case left; twelve release runs in a row pass Admin 2026-09-22 13:48:16 +02:00
  • a08ef4ebd6 widgets: let the host install script mods into every Splash isolate ymote 2026-09-11 17:07:30 -07:00
  • 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. Admin 2026-09-22 12:29:54 +02:00
  • f7ac37f690 ci: a card is as high as its content -- with the time beside the count there is no bottom line to keep room for, so the tile height is capped at the name and two lines under it with the padding around them, and the name takes the size the width allows; the layout test asserts what matters (the whole name fits) instead of an exact column count Admin 2026-09-22 10:26:13 +02:00
  • 14bcadec89 cef: a hosted browser survives its host's exit -- the window manager quits, its pipes close, and the browser it hosted keeps painting for a moment; the CEF crate's next diagnostic line went through eprintln!, which panics when stderr's reader is gone ("failed printing to stderr"), and that panic aborted the browser with a crash report on every quit of the desk (the CI box showed the dialog after each window manager run). Its diagnostics now go through a writer that drops the line when nobody reads it, as the platform's log sink already did Admin 2026-09-22 10:26:13 +02:00
  • 88639f79a2
    Tooltip: position anchored tooltips in the same draw (#1256) Kevin Boos 2026-09-22 00:51:33 -07:00
  • 611a4e2035 ci: the tests are the platform's own, in release, in two minutes -- the user's law: "we mostly only care about the platform tests", "a max of about 2 minutes of tests", "test everything the CI does in release builds; debug builds are uselessly slow for this". ci.test now builds every test binary of its selection ONCE in release and runs them several at a time (half the cores, at least two), each one timed and capped, so a hung test costs its own cap and never the hour, and the step's detail names the slowest binaries with their counts; the doc tests follow through cargo for the packages that have a library. A selection is dirs (the packages whose manifests live under those directories, by cargo metadata), packages, package or workspace: true; a run over budget_secs (120 by default) turns the block orange and says so. The root script runs platform, draw, widgets and tools/ci by default: 49 binaries, 2535 tests, 22 s on a laptop. Every other crate's tests are the deep run, opt-in with deep_tests = true in ci.toml or ci --deep (ci.deep in scripts). The wall's cards lose a line: the time sits beside the count, 1 passed · 12s Admin 2026-09-22 09:50:38 +02:00
  • 68aed71902 gif: the crate's doc examples compile -- they were the upstream crate's, naming it gif, and failed as doc tests in every workspace test run; they alias the crate under that name and are compile-only, since they open sample files the repository does not carry Admin 2026-09-22 09:36:13 +02:00
  • 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 Admin 2026-09-22 09:36:13 +02:00
  • 06a708dc3f ci: the header names the tip being tested -- while a run was on, the branch line still showed the tip of the last finished run beside "testing now", since the live state only learned the tip when the run ended; the record a run keeps as it goes now carries the tip under test from its first update Admin 2026-09-22 08:57:50 +02:00
  • 71f3b84a87
    Linux: fix window chrome button hovers and how maximized/fullscreen windows work (#1255) Kevin Boos 2026-09-21 23:47:38 -07:00
  • 0770a8c8b8 tests: the last three failures of the CI box's night -- the dock clips a reported tab header on the tab bar's scroll axis only, since a tab's own height is its own and clipping it to the bar's box moved the tab's reported centre by a logical pixel and a half (the text centring test measured the "H" tab against that rect and failed everywhere); the Files cancel test walks a made-up home under the temp dir instead of the real one, whose Desktop, Documents and Downloads block on a macOS permission dialog that nobody at a CI box answers (the whole suite hung on it for an hour, and that dialog was the "release wants access to Downloads" the person at the box saw); and the tour generation's "feels instant" budget stays two seconds for the release build it describes while a debug build, where the same work takes 1.7 s on a fast laptop, gets a proportionate eight and the best of three runs, so a busy CI box does not fail it by a few percent Admin 2026-09-22 08:46:45 +02:00
  • c20cf99c89 ci: a judgement is never lost to the way it was phrased, and every "retry" of the bridge is retried -- the small vision model, asked to describe the desk's terminal, locked onto one phrase and repeated it to the token cap, so its answer had no verdict line and the window manager tile went red over a terminal that was fine; the decoder now stops a looping answer (the tail of the text is one short pattern over and over), and when the free answer has no verdict line the conversation is continued with "VERDICT:" already written and the model finishes that line, so the judgement is asked for outright instead of being lost. The harness retries every answer of the bridge that ends in "; retry" (a grab it could not arm as well as an input frame it could not place), where it matched one wording only and failed the browser step on the other. The workspace test suite gets three hours instead of one: it runs beside the app scripts now, and a hung test was worth a whole hour before Admin 2026-09-22 08:46:45 +02:00
  • 863ca812a3 ci: the workspace script gives the wall back after warming -- after a push that touches a core crate the workspace script spent ten minutes and more alone (fifteen target checks, a release build of every app, the workspace check and the whole test suite) while every other tile sat grey, which read as a hang. It still goes first and alone for the part only it may do alone, warming the cache every other script reads, and then calls ci.shared(): its permit turns from exclusive into an ordinary one and the waiting scripts start beside its checks and tests. The runner sends it through the same pool as the rest and hands out nothing else until it holds the wall, instead of running it to the end before the pool even started. It also builds the pty helper while it is alone, so the terminal, director and window manager scripts get a cache answer instead of a cargo run that would queue behind the test build Admin 2026-09-22 00:07:23 +02:00
  • 86cd0604ef libs: no warnings in the workspace check on any row -- the CI box checks every package on every target, and the library crates, which have no tile of their own, warned on the rows nobody builds by hand. On wasm and mobile, things are gated with their users: the workspace document worker (its commands, payloads, retry constants and Drop are native; the wasm API stays, behind an uninhabited worker whose constructors answer that the browser has no document worker), the hub's unused non-Unix available_bytes and its ram facts parser, the loader's ArenaPtr, system_speech's bcp47. On the tvOS rows, the only ones built on nightly, the legacy numeric constants and functions become the associated constants they have been since Rust 1.43 (micro_serde, bytemuck, rustybuzz, unicode-script, smallvec, weezl); fetch_update keeps its name under allow(deprecated) in stitch, git and the map archive, since try_update does not exist on older stable toolchains; objc-sys declares free with the signature the standard library uses; rustybuzz calls its own method through a path that a future std method of the same name cannot shadow; and the Script derive's unused helper attribute splat, which nightly now reserves as a built-in, is spelled script_splat (nothing in makepad, Scope or Stage uses it) Admin 2026-09-22 00:02:28 +02:00
  • 53d4960320 ci: a library's warnings turn the workspace block yellow, and a desktop tool is not warmed for the web -- warming blames nobody for an APP's trouble, since the app's own tile tells it, but a library has no tile: its warnings scrolled past in the log while the workspace block stayed green. The warm step now collects the warnings of every package that is not one of the apps being warmed, names the crates with their counts, and goes yellow. ci.warm and ci.check_targets take desktop_only, packages that are left out of the web, mobile and embedded rows; the root script lists director there, as its own script already asks only for the desktop targets, which takes its 139 compiled-out-worker warnings off the wall Admin 2026-09-21 23:56:25 +02:00
  • 3e8eba0122 examples: the UI tests pass, for the reasons they failed -- the dock reports a tab header clipped to its visible tab bar, and leaves out a tab that is wholly scrolled out of view: the splash example's left panel has more tabs than room, "Toggles" is cut off at the panel's edge, and the centre of its unclipped rect lay on the neighbouring panel's first tab, so a test (or any automation) that clicks a tab by its rect opened the wrong one; the splash test then scrolls the Toggles page to the dropdown that sits below its fold, the way the media test beside it already scrolls; and the render-to-texture test captures until the child pass composite is there (at most three seconds) instead of judging the first frame after the pane has a rect, which is one frame before the composite lands -- what it pins is that every quadrant arrives in its own corner, not on which frame Admin 2026-09-21 23:55:46 +02:00
  • 661842f875 platform: a hidden window wears no hands-off frame -- the red frame a window wears for three seconds after the remote bridge injects input is for a person watching a scripted run; in a hidden window nobody watches, and there it only landed in the grabs, present in a capture taken right after a click and absent in the next one, which made the text atlas stress test see "changed text rows" and changes what any pixel test or vision check sees from one capture to the next Admin 2026-09-21 23:48:07 +02:00
  • 9788b827eb tests: the workspace suite, run as a whole for the first time, passes outside the example UI tests -- each failure was settled from history as a stale test or a regression. Stale, expectation updated to the change that overtook it: draw's road pack tests fed a z-bias tick outside the exact f16 range; network no longer reserves Accept (906f94a94); the log ring test waits for the asynchronous sink (2e27ce2ff) and the audio tap test no longer assumes it owns the shared registry; xatlas compares the irregular oracle within the official tool's float precision instead of bit for bit; xr's four-wheel car exposes the chassis query plus one per wheel (080794781) and the depth mesh plan follows the 0.32 m chunk (ddec6fc60); score's DSL test sets up the OS context clock it reaches; hello_world's GIF test describes the fixture that is actually embedded. Regressions, code fixed: the tweaker could not print layout enums as whole values because the derive never emitted the __enum companion it looks up; the workspace style picker never learned about the Black orange style put at the front of DesktopStyle::ALL, and per the decision that Black orange is not offered in pickers it lists ALL without it, maps indices accordingly and loads a stored "blackorange" without a selection; xr's car controller no longer scales engine force by 1/dt a second time (same force at the fixed step) and a scaled vehicle's suspension is stiff enough to carry it at its shortened rest length. The two xr tests that need a local-only reference dump (xr/dump is git-ignored) say so and return Admin 2026-09-21 23:41:03 +02:00
  • 160668c21f widgets: children a lookup discovers reach the dump, the snapshot and the flood searches -- a view's on_render output never showed up in /d, /snap or a makepad_test selector (the counter example's label could be seen and clicked around but not found): the view marks itself dirty, a lookup is usually the first to settle that node, and lookups deliberately do not raise structure_dirty, so that a recycling list does not make every frame pay a dense rebuild; but the lookup also consumed the dirty mark, the only thing that told sync_dirty the dense arrays were behind. A lookup-driven topology change now sets dense_stale, which only the dense readers act on; structure_dirty keeps its meaning and the two tests that pin it still hold Admin 2026-09-21 23:41:03 +02:00
  • c091430d32 ci: a quiet header, a build that visibly moves, and scripts that leave the machine alone -- the window's top is one band: the branch and its tip, the test progress large (17 / 29) with failed and warning counts only when there are any, the run's elapsed time, Run now and Stop; the line under it is the run progress bar and the tiles start right below it, the rows of counts, "now:" and "Watching" are gone and next poll and the model's state moved to the one footer line; a running step carries what its command is doing ("compiled makepad_draw · 212 crates", told at most twice a second from cargo's artifact messages) and the running tile shows it, so a ten-minute warm build no longer looks stuck; director embeds a terminal, so its script builds the pty helper as the terminal's does; ci.launch takes app_env, and Files runs on its synthetic tree (MAKEPAD_FILES_DEMO) instead of walking the real home, which made macOS ask the person at the CI box for access to Downloads on behalf of "release"; and the workspace tests run with --no-fail-fast, so a run names every failing test target instead of the first Admin 2026-09-21 23:41:02 +02:00
  • 7ffcdab2ca ci: a stop or a restart is not a test result -- restarting the CI app in the middle of a run painted the whole wall red and then left it red: every script still going failed with "stopped by user", a script that had not launched yet got nil from ci.launch and raised method-not-found errors that counted as real failures, and the interrupted tip was recorded as tested, so the new process had nothing to run. Now a failure recorded while the run is already stopped is a skipped step, never a failed one; ci.launch hands a stopped script the inert app; a run the process shutdown interrupts leaves the last finished run as the record and its tip untested, so the next start runs it again; and a run the user stops keeps what finished, leaves the rest untested and says "stopped before it finished" instead of passing Admin 2026-09-21 23:15:29 +02:00
  • 11cd394812 Remove Flow, asset and VJ applications moved into Stage Admin 2026-09-21 22:07:52 +02:00
  • 5f4a1632a8 ci: the window is a dashboard -- inside the wall's law (filled grey tiles, near-black ground, a failure the only bright thing) the window gets a header that reads as one: wordmark, branch with its tip in a monospace face and its state in words, the next poll, the model's state and quiet Run now / Stop buttons, with a thin grey run-progress bar under it and one line for what runs now; tiles have rounded corners drawn in their own shader, an even gutter, a large whole name, measured ellipsis instead of counted characters, the duration pinned to the bottom edge and the running tile's progress inside its rounded shape; tiles keep a stable order while a run is on and put failures first when none is; the detail is a panel with a steps list (state mark, name, duration, the failed step expanded with its reason in a monospace block), captures with an index and the log tail, and a footer names the checkout, the host target, the model and the run directory Admin 2026-09-21 23:05:31 +02:00
  • ccb1041a90
    cargo-makepad: keep the android SDK at a stable path (#1253) Kevin Boos 2026-09-21 14:03:57 -07:00
  • 1d09116779
    ScrollBar: add show_handle for a view that scrolls without a grabbable bar (#1254) Kevin Boos 2026-09-21 14:03:44 -07:00
  • 41079817ba apps: what the CI box found -- the workspace test suite compiles again (the window manager's style tween test states that Windows 2000 carries the whole weight by its own index instead of a seven-entry literal for eight styles, and the landscape test expects the 28-point home strip minimum the shell has kept since the device chrome got it); route builds for the web, with map_build's faces, native, testmap and repack modules, route's bake provisioner and its local navigation and charger queries gated off wasm, where they answer that local data is unavailable on the web; and the warnings that only showed on other targets are gone by gating each item with its users: files' symlink target, photos' Lane, sheets' module import, storybook's filesystem tree helper, task's swap fields on Windows and iOS, and three test-only leftovers in widgets Admin 2026-09-21 22:44:50 +02:00
  • 68a9e24ca4 platform: no warnings on tvOS and linux_direct, and a missing pty helper says so -- the stdin host-batch coalescer and drain, the studio websocket receive helpers and stdin_apply_native_geom are gated to the desktop backends (and the GPU simulator) that call them instead of being compiled everywhere but android under allow(dead_code); IOSurfaceCreate / IOSurfaceGetID and update_shared_texture are macOS and iOS only; i16::MIN/MAX replace the deprecated std::i16 constants; fetch_update keeps its name under allow(deprecated), since nightly renames it to try_update and older stable toolchains must keep building; the tvOS app accessor reads its static through addr_of; and screen_helper returns a NotFound error that names the missing makepad-screen binary and the cargo command that builds it, where a terminal used to report a bare "No such file or directory" Admin 2026-09-21 22:44:50 +02:00
  • 5165eaf349 ci: the terminal gets its pty helper, director is a desktop tool, and a refused input is asked again -- on macOS the terminal starts its shell through makepad-screen, which lives next to it and which an app build alone does not produce, so the terminal and window manager scripts build it (the CI box had a terminal that could not spawn a shell and a desk whose terminal window stayed blank); director drives cargo builds and child processes and most of it is compiled out on web and mobile, so its script asks for the desktop targets only; and when an app answers that it could not place an input on a frame and says retry, the harness asks again, up to five times, instead of failing the step Admin 2026-09-21 22:44:50 +02:00
  • 6296f4c885
    Vulkan: stop printing the loader's startup narration by default (#1252) Kevin Boos 2026-09-21 13:17:19 -07:00
  • c0ea5bc162 ci: warming fills the cache and blames nobody -- a package that fails or warns in the root script's batched warm-up is told by the script that asks for it, on its own tile, so one app that does not compile for wasm no longer turns the workspace tile red as well; the warm step notes which packages are failing, and goes red only when cargo itself could not run Admin 2026-09-21 22:15:53 +02:00
  • 8c0a75861e ci: untested is grey and nothing else -- the wall no longer puts a bright dot of the last finished run's verdict on a tile that has not been tested yet; that history is told in words in the detail header, and the name gets the width the dot had reserved Admin 2026-09-21 22:12:39 +02:00
  • fbe8c2e6c4 ci: the wall shows THIS run and is fit for an OLED -- a tile is grey until its script is tested, grey-blue with a progress bar while it runs, then grey-green, grey-amber or the one bright thing on the screen, a failure red; what the last finished run said is a small dot, never the tile's colour, and a script the user stopped or a restart interrupted goes back to untested instead of red; tiles carry their short name (wm, scope, workspace) in a named font family, since an empty family only rendered where a system fallback happened to exist and the tiles came up blank on the CI box; the packing picks the columns that give the largest whole name; a progress line says how many are tested, passed, warned and failed and what runs now; the pulse and the clocks tick on an 8 Hz timer only while something runs, never per frame on a 240 Hz display; the window no longer maximizes into native fullscreen over its left-half geometry, the background is near-black, the detail sits under the grid so it fits 960 points, a watcher problem is one header line, and the install button shows only when the vision model is missing; a compiler warning is orange and never red in the root script, and a desktop-only app with no library is not applicable on web and mobile targets instead of a standing warning Admin 2026-09-21 22:10:19 +02:00
  • 0458f0c2b7 ci: a run is one target dir and one cargo batch per target, and the wall draws -- the root script warms a run-level cache with ONE cargo check per target covering every app package (the matrix's BuildTy per row, diagnostics attributed by package_id, --keep-going then per-package fallback when one package fails) and one release build of all bins, so the 24 app scripts answer check_targets and build from the cache; the tile grid registers its draw type on DrawQuad and merges its shader into the widget, which is what makes the green / orange / red / grey tiles appear at all; the window takes the left half of the main display (system_profiler, overridable with window = [x, y, w, h]); only apps/<name>/Cargo.toml is an app, so a private app's nested deps are its libraries; scope is no longer skipped by default; a failed launch hands the script an inert app instead of nil and a failure a step already carries is said once; the log keeps the first 20 diagnostics per cargo invocation and hub-install counts a present file once Admin 2026-09-21 21:52:43 +02:00