Tags: gogpu/ui
Tags
fix: widget lifecycle correctness sweep (#171, #173, #174, #175, #181, … …#182) (#186) * fix(listview): unmount evicted decorators + mount row content (#173, #174) Evicted decorators were overwritten without UnmountTree, leaking GPU scenes and signal bindings. New decorators from Content[C].Render were never mounted, so child signal bindings were dead. Changes: - cleanupWidget helper calls UnmountTree on evicted widgets - fullRebuild/incrementalUpdate unmount old widgets before replacement - clear() unmounts all widgets before zeroing - buildDecorator calls MountTree after creation when ctx is available - cache.update() now accepts widget.Context (passed from Draw) * fix(gridview): unmount evicted cells + mount after Content[C].Render (#181) Cell widgets from Content[C].Render were never mounted (signal bindings dead) and never unmounted on eviction (scene/binding leak). Changes: - cellCache.update unmounts old widgets before rebuilding - cellCache.clear unmounts all widgets - New cells are mounted with MountTree when ctx is available - cellCache.update accepts widget.Context parameter * fix(overlay): wire MountTree/UnmountTree into push/pop lifecycle (#171) Overlay containers were pushed/popped without mount/unmount calls, leaking signal bindings and goroutines in content widgets. Changes: - PushOverlay calls MountTree on the container after pushing - PopOverlay calls UnmountTree on the popped container - RemoveOverlay unmounts the target and all overlays above it (matching overlay.Stack.Remove stack semantics) * fix(app): add Window.Close teardown — stop pumper, unmount trees (#175) Window had no Close method, so the animation pumper goroutine leaked on window close, and widget trees were never unmounted. Changes: - Window.Close() stops animPumper, unmounts all overlays, unmounts root - desktop.Run OnClose callback calls Window.Close before releasing GPU - Close is idempotent (safe to call multiple times) * fix(linechart): route invalidation through scheduler for goroutine safety (#182) PushValue, AddSeries, ClearSeries called SetNeedsRedraw directly from arbitrary goroutines. SetNeedsRedraw propagates upward through the parent chain which is not thread-safe. Changes: - Add scheduler field, stored during Mount, cleared during Unmount - requestRedraw helper routes through scheduler.MarkDirty when available, falls back to direct SetNeedsRedraw for unmounted usage - Replace all SetNeedsRedraw(true) calls with requestRedraw() * test(lifecycle): 28 regression tests + docs for v0.1.46 - listview lifecycle_test.go: mount/unmount on scroll, eviction, clear - gridview lifecycle_test.go: cell mount/unmount, update, invalidate - overlay_lifecycle_test.go: push/pop lifecycle, signal bindings - window_close_test.go: close idempotency, unmount, stop pumper - linechart safety_test.go: concurrent PushValue, scheduler routing - CHANGELOG v0.1.46, ROADMAP version update
chore(deps): update ecosystem deps + docs refresh for v0.1.45 (#185) - gg v0.50.4 → v0.50.6 (unified draw queue ADR-051/052, three-tier clip ADR-052) - gogpu v0.44.1 → v0.44.8 (Wayland fractional scale, frame lifecycle) - wgpu v0.30.10 → v0.30.21 (software backend fixes, WriteTexture, blit optimization) - signals v0.1.0 → v0.1.1 - README: 26 widgets, 70 painters, backend selection, Android, software optimization - ROADMAP: unified pipeline, 4-tier software optimization roadmap, Android - CHANGELOG: software optimization roadmap with gg CPU rasterization tier - ARCHITECTURE: deps update
chore(deps): update gg v0.50.4 + ARCHITECTURE.md refresh (#168) - gg v0.50.3 → v0.50.4 (composite hardening) - x/image v0.43.0 → v0.44.0, x/text v0.39.0 → v0.40.0 - ARCHITECTURE.md: 26 widgets, 4 design systems (70 painters), DevTools theme, per-widget layout caching (ADR-032), removed Engine references (CACHE-030)
docs: CHANGELOG v0.1.42, ROADMAP + README updates (#165) CHANGELOG: add v0.1.41 (was missing), v0.1.42 with layout cache, GAP-3, Engine removal, deps. ROADMAP: version 0.1.42, LOC 207K, 24 widgets, Badge/Chip done, layout cache + GAP-3 in completed features. README: LOC 198K→207K, tests 7300→7500.
fix(collapsible): final animation frame + full damage on root repaint (… …#152) (#157) Two fixes for collapsible visual glitch on Wayland (Mutter): 1. tickAnimation: detect animation completion and force one final redraw. Previously, when animation finished, HasActive()=false → early return → no SetNeedsRedraw → render loop went idle with stale content. 2. SetPresentDamage: send full-window damage when root texture changed. Previously, wl_surface.damage_buffer used widget-level dirty rects (current bounds after layout shrink). Vacated area not covered → Wayland compositor didn't update those pixels on physical display. Confirmed fixed by @porjo (Intel Iris Plus ICL GT2, Fedora 44, GNOME/Mutter). deps: gg v0.49.2 → v0.50.1, gogpu v0.42.11 → v0.43.1, wgpu v0.30.7 → v0.30.8
chore(deps): update gg v0.49.3, gogpu v0.43.0 + remove WithContinuous… …Render boilerplate (ADR-035) gogpu v0.43.0: event-driven rendering by default (winit 0.29 pattern). ContinuousRender: true → false in DefaultConfig. Safe-by-default. Remove WithContinuousRender(false) from all 6 examples and docs — no longer needed. Enterprise research (ADR-035): 8/8 UI frameworks (Flutter, Qt, GTK4, SwiftUI, Compose, Iced, Gio, Chromium) enforce event-driven at entry point. gg v0.49.3: IsSoftwareAdapter public API. Verified: damage blit works correctly on llvmpipe — no fix needed.
chore(deps): update gg v0.49.2, gogpu v0.42.11, wgpu v0.30.7, gputype… …s v0.5.1 (#154) gg v0.49.2: Software Vulkan (llvmpipe/SwiftShader/WARP) offscreen boundary textures now work — softwareMode no longer disables GPU (ADR-046). MSAA runtime fallback 4x→1x. Error logging in CreateOffscreenTexture. gogpu v0.42.11: golden tests + RenderToImage, Wayland frame callback (ADR-049). wgpu v0.30.7: Software backend format-aware copy + GLES LockOSThread fix. gputypes v0.5.1: BlockCopySize() for format-aware buffer sizing.
PreviousNext