New Buoy releases

v0.49.0

Barcodes & Bug Fixes!

New Features

  • Build barcode package for Linux (x86_64+arm64), re-enable cross-platform tests
  • Build barcode package for Windows (x64+arm64)
  • Build barcode package for macOS (arm64+x86_64)
  • Add Barcode.bui wrapper (Symbologies, Options, Encode)
  • Add barcode package native shim (Zint + stb_image_write)

Bug Fixes

  • Copy barcode sample into examples/ and correct QR comment
  • Guard oversized barcode payloads and silent Nil PNG decode
  • Correct barcode.bui sample Expected comments to match real output
  • Retype barcode Declare params to Int32/UInt8 to fix ARM64 crash
  • Flatten nested classes in Barcode.bui, fix Double->Integer CType misuse
  • VSCode auto-indent recognizes SyncLock as a block keyword
  • Buoy-lsp never publishes diagnostics for vendored .buoy/packages/ files
  • VSCode indentation - case-insensitive keywords, bidirectional Else/Case/Catch/Finally, drop ambiguous Property
  • VSCode auto-indent recognizes all block constructs, not just a handful
  • Exclude preproc_error_warning from Windows remote CI, Error-on-Windows is by design
  • Remove stale loose fluenticons directory before writing sealed buipkg
  • Exclude delegates_ffi from Windows remote CI, SIGUSR1 has no equivalent there
  • Exclude 4 known-affected tests from windows_arm64_remote CI lane
  • Toolbar.AddCustomView after attachment no longer corrupts widget lifetime on Linux
  • Remove dimming on build graph nodes pending dependency

v0.50.0

Picture.Graphics

New Features

  • Windows native implementation for Picture.Graphics offscreen drawing
  • Implement Linux canvas backing + offscreen Graphics
  • Wire Picture.Graphics/FromBuffer/GetBacking in the Buoy stdlib
  • Implement macOS canvas backing + offscreen Graphics
  • Add shared canvas-backing conversion code and C ABI declarations

Bug Fixes

  • Use node --test glob instead of bash $(find …) in test:unit
  • Address final-review findings for Picture.Graphics (feat/picture-graphics)
  • Close ensure_canvas mutex race and generalize the fix

v0.51.0

Special Thanks to Björn for finding the Locale.Current() bug!

New Features

  • Make Picture.Scale writable (#376)
  • Add FileSystemItem.Permissions for POSIX-style rwx bits

Bug Fixes

  • Locale.Current() no longer crashes on unrecognized but valid OS locale identifiers (#374)
  • LSP Shared Property completion; scope Picture.ImageFormat; VSCode word-suggest default

v0.52.0

New Features

  • Add EndOfLine platform line-ending constants (#378)

Bug Fixes

  • Linux Graphics.DrawPicture swaps red/blue and drops alpha for loaded Pictures (#389)
  • Windows ServerSocket uses SO_EXCLUSIVEADDRUSE instead of SO_REUSEADDR (#388)
  • Give each Windows/Linux remote test lane its own staging directory (#387)
  • Enable Windows stack probes for vendored Zint (barcode PDF417/Aztec crash) (#386)
  • Harden getQueueInitFn’s POSIX guard with CAS + memory ordering (#385)
  • Standalone_cache_isolation asserts on the wrong -v line (#384)
  • Windows picture blitting drops per-pixel alpha (#383)
  • MacOS MenuBar intermittently empty on launch (#382)
  • LSP resolves package-qualified Import against .buoy/packages/ (#381)
  • File.Exists fails to link on both Windows targets (#380)
  • Uncaught-exception fallback reports real type/message/code (#379)
  • Build expected paths with path.join in vscode stepType tests (#377)

v0.54.1

Bug Fixes

  • Vendored zlib/libpng symbols no longer leak from pdf/zip packages (#404)
  • If() ternary unifies Nil with reference types (#403)
  • MacOS Graphics.DrawPicture renders vertically flipped (#402)
  • Copy Resources build step supports single-file sources (#401)
  • Select Case FCmp verifier failure on Double/Boolean selectors (#400)
  • Vendored zlib/libpng symbols no longer leak from pdf/zip packages
  • If() ternary unifies Nil with reference types
  • MacOS Graphics.DrawPicture renders vertically flipped
  • Copy Resources build step supports single-file sources
  • Select Case FCmp verifier failure on Double/Boolean selectors
  • Indent FileType block bodies in LSP formatter (#399)
  • Indent FileType block bodies in LSP formatter
  • Strip CRLF from package name in Windows installer staging (#398)
  • Strip CRLF from package name when staging Windows installers

v0.55.0

Mostly work on the build workflow in VSCode

New Features

  • Sink-only Run/Debug connectors, edge hit-area, hover, and arrowheads
  • Run Run/Debug through the build graph with chain-rooted output dirs
  • Add isSinkOnly predicate for Run/Debug edge validation
  • Add load-time migration for backward Run/Debug edges
  • Add chain-rooted build output directory resolution for Run/Debug

Bug Fixes

  • Rebuild an ancestor whose cached ‘success’ status no longer matches disk
  • Sign step auto-resolves the built binary instead of requiring manual path entry
  • Sign step errors on a blank path instead of signing the build output folder
  • Save dirty docs, avoid stale-status skip across chain roots, and fix output-clobber in graph Run/Debug

v0.55.1

Changes

  • Build Graph: add Build sink endpoint, allow dragging edge endpoints to rewire
  • Build Graph: show Copy Resources source/destination and Run Script’s path
  • Build Graph: work with a single open file, no workspace required
  • Build Graph: fix edge endpoint drag handle visibility and hover behavior
  • Sign step: clear extended attributes before codesign
  • Run Script step: respect quoted strings in the Arguments field
  • Warn when a project’s package version differs from buoy’s bundled copy

v0.56.0

Big Release Today!

Just about everything here is about the Layout Editor in VSCode. We’re starting to get the visual constraint editor fleshed out so please play with it and get us some bug reports!

We’ve also made it possible to add event handlers inside View and Window block format so you can now do this without needing to subclass the window:

Window myWindow
  Control button myButton
    Handle Action()
      // code referring to other controls on the layout...
    End Handle
  End Control
End Window

New Features

  • Nesting-aware End Handle scanner with per-control degradation
  • Preserve inline Handle blocks as keyed opaque spans
  • Badge and list inline Handle blocks in the layout editor
  • Warn before deleting a layout control that owns inline Handle code
  • Report inline Handle spans in buoy/layoutOutline and degrade per-control on a broken body
  • Lower window-level inline Handle blocks into the lowered Window class
  • Diagnose bad inline Handle blocks in Window Control bodies
  • Lower control-level inline Handle blocks into the synthesized _ hook
  • Accept inline Handle blocks in Window/View bodies; share one Handle parser
  • Add constraint reattach-drag and delete-via-trash
  • Add inline relation/offset/priority editor popover
  • Add anchor hit-targets and create-drag targeting engine
  • Add constraint-drag axis/targeting/text-generation logic module
  • Add scrollable zoomable canvas viewport with a zoom control
  • Add zoom math pure-logic module for the layout editor
  • Add Preview Constraints toggle with per-workspace persistence
  • Render constraint preview lines and anchor dots in the layout editor
  • Add constraint-overlay geometry/label logic module
  • Decompose Constraints-line relation/priority/RHS into buoy/layoutOutline

Bug Fixes

  • Resized/ScaleFactorChanged firing during Window construction crashes on unbuilt siblings
  • Stop the layout editor’s handler badge from being clipped
  • Preserve blank lines and comments inside Handle bodies
  • Don’t false-positive resync on bare-word statements that aren’t block openers
  • Correct misleading comment about handler signature validation
  • Re-render on zero-movement selection click (#418)
  • Re-render after zero-movement guard so selection still refreshes the view
  • Apply the same zero-movement guard to multi-select and window-resize drags
  • Selecting a constrained control no longer flattens its relative constraints to absolute pins
  • Drop BaselineAnchor from the selected-control anchor-dot list
  • Layer constraint overlay paint order, widen center-anchor fan offset, guard axis-less endpoint handles, and fix drag-preview cleanup/trash positioning
  • Copy Resources nests into .app Contents, forces overwrite (#415)
  • Paint anchor hit-targets under constraint endpoint handles; preserve Medium/Low priority on untouched reattach
  • Build graph persist no longer races an open buoy-build-graph.json editor tab
  • Correct Enter-on-Cancel and popover cleanup on external re-render
  • Copy Resources nests into .app Contents, forces overwrite
  • Fan CenterX/CenterY anchor dots apart, scale snap radius by zoom
  • Preserve canvas-viewport scroll position across re-renders
  • Keep resize handles and anchor dots a constant size across zoom levels
  • Make drag/resize pointer math zoom-aware
  • Correct zoom-anchored scroll padding offset and isolate floating buttons from scroll
  • Anchor overlay to unresolved-control placeholder geometry, add markers for constant/unstructured constraints
  • Correct RHS-selected constraint lines, case-insensitive frame lookups, and dimension-bracket hover/label/fan-out

Changes

  • Fix Resized/ScaleFactorChanged crash during Window construction (#420)
  • Inline Handle blocks in declarative Window blocks (#419)
  • Add inline-Handle Window block sample and unit test
  • Selecting or clicking a constrained/multi-selected control flattens or duplicates its constraints (#417)
  • Layout editor: drag-and-drop constraint creation and editing (#416)
  • Layout editor: zoom and pan (#414)
  • Constraint preview in the layout editor (#411)

v0.57.0

Another big build today!

  • Added code mechanism for controlling tab order (layout editor coming soon)
  • fixed constraint baseline alignment
  • Lots of bug fixes!

New Features

  • Add Help button for layout editor hotkeys (#436)
  • Add Help button for layout editor hotkeys
  • Add Project Type build setting (Automatic/Console/Desktop) (#432)
  • Add Project Type build setting (Automatic/Console/Desktop)
  • Strip spaces from hex-formatted Developer Identity on blur
  • Add Windows Tab-key handling (IsDialogMessage) and TabPressed suppression
  • Add TabPressed event with macOS/Linux native suppression
  • Focus position 0 on Window.Show/ShowModally
  • Two-tier focus relocation on Focusable/Visible/Enabled/page-switch
  • TabView/PagePanel/Splitter effective-focusability filtering - WIP
  • Synthesize native focus chain from Window.mTabOrder
  • Add FocusIndex, Window tab order list, InsertTabOrderAfter/Before
  • Add UIControl.HasFocus query property

Bug Fixes

  • Nest CheckState inside Checkbox instead of global scope (#440)
  • Nest CheckState inside Checkbox instead of global scope
  • Native baseline chrome + TextControl font-push (follow-up to #438) (#439)
  • Push TextControl.FontName/FontSize to the real native control
  • Compute baseline from real native control chrome, not font math alone
  • Baseline anchor layout uses real per-platform font metrics (#438)
  • Wire real per-platform bridges into Baseline anchor layout
  • Autosave stripped Developer Identity; reuse it in the Sign step (#435)
  • Autosave stripped Developer Identity; reuse it in the Sign step
  • Pass mac Developer Identity to Run/Debug compiles (#434)
  • Pass mac Developer Identity to Run/Debug compiles
  • Reject Secure prefs calls on unsigned builds (E210) (#431)
  • Reject Secure prefs calls on unsigned builds (E210)
  • TextField/TextArea FocusGained now fires on keyboard Tab (#429)
  • TextField/TextArea FocusGained now fires on keyboard Tab
  • Build Graph Sign step now runs after the compile it’s wired to (#428)
  • Linux TabView teardown double-free / SIGBUS (#425)
  • Build Graph Sign step now runs after the compile it’s wired to
  • Linux TabView teardown double-free / SIGBUS
  • MacOS secure-prefs hangs/crashes across rebuilt-binary Keychain identities (#424)
  • MacOS secure-prefs hangs/crashes across rebuilt-binary Keychain identities
  • Tab strands focus instead of advancing (missing WS_EX_CONTROLPARENT + tab-order registration race)
  • ComputeRelocationTarget must exclude the whole departing subtree, not just focused
  • Tab-order commit does minimal z-churn instead of hoisting to top
  • Tab-order key-view chain wraps and never messages a closed window
  • TabView sync/slot/relocation-order/registration/self-anchor bugs (§31 review)
  • Cross-platform tab-order effective-focusability bugs on Linux/Windows
  • HasFocus is a Function, not a Property, in tab-order.md
  • Stop IsEffectivelyFocusable’s page-selected check from skipping the container’s own Visible/Enabled
  • Exclude Window’s on-screen-shown state from IsEffectivelyFocusable
  • Change tab-order helpers from Public to Internal visibility
  • Remove tautological assertion in tab-order test
  • Install git-lfs on release runner before checkout (#421)
  • Install git-lfs on release runner before checkout

Changes

  • Rebuild Linux libbuoy_layout.so with the Baseline anchor fix
  • Strip VB/Xojo/Basic references from buoy ai init output (#437)
  • Strip VB/Xojo/Basic references from buoy ai init output
  • Skill for cleaning up branches and worktrees
  • Regression coverage for space/umlaut paths in Copy Resources (#433)
  • Strip spaces from hex-formatted Developer Identity on blur (#430)
  • Regression coverage for space/umlaut paths in Copy Resources
  • Native regression guard for macOS secure-prefs cross-identity read hang (#427)
  • Merge remote-tracking branch ‘Github/main’ into fix/macos-secure-prefs-read-hang-test
  • Native regression guard for macOS secure-prefs cross-identity crash (#426)
  • Native regression guard for macOS secure-prefs cross-identity read hang
  • Native regression guard for macOS secure-prefs cross-identity crash
  • Tab Order and Focus Traversal (core) (#423)
  • Docs+test(ui): tab-order documentation, sample, and CMake registration
  • Cover IsDescendantOrSelf and the Focusable=True append path

0.58.0

New Features

  • Redesign layout editor constraint visualizer
  • Autocomplete control names and anchor properties in Constraints blocks
  • Allow Delegate declarations nested inside a Class
  • Add System.IsDarkMode cross-platform dark-mode detection

Bug Fixes

  • Stop Interface Sub/Function signatures from growing indent
  • Canvas no longer swallows Tab forever once focused (macOS + Linux)
  • Build macOS bundles and Windows/Linux exes in a temp dir, then atomically move into place
  • Don’t suppress user Quit/Hide menu shortcuts on macOS
  • Route Build/Run/Debug commands through the Build Graph
  • Detect mid-line Lambda/Block literals in document formatter
  • Stop UIControl Lock* properties crashing on a second same-axis lock
  • Clamp window resize to Auto Layout constraints
  • Control’s own Handle override no longer shadowed by declarative Window control block

Changes

  • Learning Buoy book has been updated to make sure all examples compile with the changes that have been made to the language thus far, with updates to the visual layout and constraint sections added. A PDF version and accompanying example projects are also in that folder.

0.59.0

We’re specifically looking for edge cases where the layout editor scrambles control positions when moving controls around in constraint-mode. You can change controls to using constraints just by right-clicking on a control and selecting “Convert to Constraints.”

New Features

  • Add a control context menu for stacking order in the Layout Editor
  • Add Inspector editing for the highest-impact property on each control
  • Render visual control skins in place of wireframe boxes
  • Report declared control properties in layout outline

Bug Fixes

  • Right-click on a control no longer starts a drag

0.62.0

New Features

  • Insert VSCode boilerplate contextual menu
  • Return FileSystemItem from OpenFileDialog/SaveFileDialog/SelectFolderDialog
  • Register buoy.insertCode command and context menu entry
  • Add Event Handler / Override Method snippet builders
  • Add static boilerplate snippet builders for Buoy.insertCode
  • Wire buoy/handleEventsAt and buoy/overridableMethodsAt
  • Add Workspace::insertableHandleEventsAt
  • Add Workspace::overridableMethodCompletionsAt

Bug Fixes

  • Offer window-level Handle events for cursor in Window block body
  • Exclude synthesized event slots and Private methods from Override picker

Changes

  • Return FileSystemItem from file dialogs

0.63.0

This release is largely about getting Windows Dark Mode working. We still have a couple of unsolved gaps like DateTimePicker and TabPanel Tabs, but we’re getting there!

New Features

  • Set minimum supported Windows version to 10.0.19045 in installer
  • Apply dark chrome to ProgressBar, Slider, Stepper (Windows)
  • Native dark chrome for Button on Windows via uxtheme
  • Draw a themed border around TabView’s pane on Windows
  • Theme-aware Toolbar item text color on Windows
  • Theme-aware colors for ListBox/Splitter/GroupBox/Canvas/TabView/HtmlView on Windows
  • Theme-aware Label/TextField/TextArea/ComboBox colors on Windows
  • Dark title bar on Windows, live-updating on OS theme change
  • Show and edit GroupBox Caption in the Layout Editor

Bug Fixes

  • Windows quits on any window close, not just the last
  • Only quit on Windows when the last window closes
  • Give toolbar SearchField creation-time dark chrome; keep ProgressBar visual-style opt-out dark-mode-only
  • Theme-aware chrome for RadioButton/TextField/ProgressBar via explicit colors
  • Re-theme TextArea scrollbar chrome on live dark/light toggle
  • Keep Windows DisclosureTriangle’s glyph at native size
  • Dark-theme TextArea’s native scrollbar on Windows
  • Re-theme already-created Windows controls on live OS theme toggle
  • Apply dark chrome to Checkbox/ComboBox/TabView, mute DisclosureTriangle glyph
  • Recolor Toolbar icons in dark mode; fix README Button wording
  • Correct uxtheme ordinal-135 dispatch, app-mode init order, and chrome-apply call site
  • Dark-mode toolbar legibility + WM_SYSCOLORCHANGE + comment fixes
  • Fill TabView pane area with theme brush in dark mode
  • Convert tabview page frame from physical to logical DPI units
  • Give windows-dark-mode’s TabView page a control so it realizes
  • Make GroupBox’s default BorderColor theme-aware
  • Render GroupBox’s Layout Editor skin like the real widget

Changes

  • Full dark-mode theming (title bar + controls) on Windows
  • Add cross-platform dark-mode visual sample

Known Issues

  • DateTimePicker, TabPanel Tabs and Menus are not dark mode aware yet.

I don think the Win32 Date picker supports dark mode at all

I’ve got lead on a solution, just needed to get some of this out of the way to implement native groupboxes.

Why not making Buoy WinUI 3 ready since the design? Win32 controls are a dead tech. WinUI 3 is the current UI Framework for ages now, and even Windows 11 is right now updating the ENTIRE OS to use it everywhere updating legacy content IN THE OS.

Advantages of WinUI 3 over classic Win32 for modern desktop application development:

Advantage Category Win32 C++ WinUI 3 (Windows App SDK)
Theme & Dark Mode Support Flawed and incomplete. Requires stripping visual styles (SetWindowTheme), undocumented hooks, or tedious custom-drawing to prevent white backgrounds and unreadable text. Native, automatic, and flawless. Automatically respects system themes (Light/Dark) and supports explicit app-level overriding with smooth transitions.
User Interface Aesthetic Legacy look and feel (Windows Vista/7 style common controls). Lacks modern design language by default. Fluent Design System. Features modern aesthetics out of the box, including rounded corners, drop shadows, and Mica/Acrylic materials.
High DPI & Scaling Complex to manage. Requires handling WM_DPICHANGED messages, manually resizing fonts, re-calculating layouts, and swapping bitmapped assets. Automatic scaling. Natively handles various monitor resolutions and dynamic DPI changes (e.g., moving a window between a 4K monitor and a 1080p laptop).
Layout & Responsiveness Coordinate-based absolute positioning. Resizing windows requires manual pixel math via MoveWindow or DeferWindowPos. Flexible layout panels. Uses dynamic, flow-based layout containers (like Grid, StackPanel, and RelativePanel) that automatically adapt to resizing windows.
Animations & Effects Minimal native animation support. Smooth UI transitions require third-party libraries or writing custom hardware-accelerated timers. Rich Composition Layer. Built-in, high-performance hardware-accelerated animations, pointer-over transitions, and visual feedback hooks.
Touch & Input Modernization Designed heavily around mouse and keyboard. Handling touch, multi-touch gestures, or digital pens requires complex Win32 messages. Universal input support. Built natively to support mouse, keyboard, touch gestures, digital ink pens, and game controllers interchangeably.

While Win UI 3 is way MS would like everyone to move to its incomplete and there are missing controls
As of the current WinUI documentation, notable gaps in first party (MS built & supported controls) include:

  • Ink controls

    • InkCanvas
    • InkToolbar
      InkCanvas has appeared experimentally in Windows App SDK, but the inking controls are not partof the stable WinUI 3 channel. Microsoft
  • DataGrid

    • There is no first-party Microsoft DataGrid in the core WinUI 3 controls.
    • Use the Windows Community Toolkit, Uno Platform, or a commercial toolkit.
  • Charts and data visualization

    • No built-in chart controls such as line, bar, pie, or financial charts.
  • TreeView-related advanced controls

    • WinUI 3 has TreeView, but lacks several richer tree/grid variants commonly found in third-party frameworks, such as a hierarchical TreeGrid.
  • Color-selection controls

    • No comprehensive built-in color picker equivalent to those commonly available in WPF or third-partyUI suites.
  • Rich text editing

    • There is no full-featured built-in rich-text editor control comparable to a document editor.RichEditBox provides text editing, but it is not a complete word-processing control.
  • Scheduling and calendar views

    • Basic date and time controls exist, but controls such as Scheduler, Agenda, Timeline, andDateRangePicker are not part of the core WinUI 3 set.
  • Advanced input controls

    • Controls often expected from mature UI frameworks—such as NumericUpDown, masked input, autocomplete, range sliders, and advanced multi-select controls—generally require custom implementations or third-party libraries.
  • Specialized navigation and layout controls

    • Ribbon, dock panels, property grids, navigation drawers with advanced features, and document-tab interfaces are not core WinUI 3 controls.

Some of these may exist in the Windows Community Toolkit

Some controls are not truly “missing” but are provided outside the core framework. For example, DataGrid, charts, scheduler controls, autocomplete, color pickers, and tree grids are available through third-party WinUI libraries.

IMHO, MS has made a mess with Win32, WPF, WinForms and the plethora of UI MS own toolkits
No wonder Uno and Avalonia etc are as popular as they are
They fill the gaps in MS own toolkit

When I was researching which library to start with, i actually started going down the winui road. It became very clear that WinUI 3, is just Microsoft’s third failed attempt to unify their UI kit. Here’s one of the main reasons we haven’t gone that way yet.

WinUI 3 is COM/WinRT-only with no C ABI, so Declare can’t reach it directly. And WinUI 3 ships in the Windows App SDK, which is not in-box: you either self-contain it (you own the CVE cadence) or require the framework package (a deployment dependency on the end user’s machine). That cuts against the §24.4 security-update constraint in a way ComCtl v6 does not, since ComCtl is serviced by Windows Update.

Well… ComCtl v6 is already a dead man walking. Legacy that won’t be updated and set to go to the drains, day after day, as MS selected WinUI 3 as the official OS UI framework. That decision alone will make that death of WinUI3 very unlikely, more likely expanded towards some WinUI 4 in the future with easier migration.

But I won’t insist. You will go by your chosen paths, I’m just worrying about the very likely need of rewriting all the components and plumbing again for WinUI 3 (or something as Avalonia and its dependencies too) because the ComCtl UI will rot over time, and fast.

Yep… WinUI 3 demands C++/WinRT but MS has chosen such way as the “native way” and your user interface design may start already with tech debit using the ComCtl legacy

Xojo UI is a 90’s UI already

Let’s see how it unrolls

i get your point but i just cant get to a complete UI with any of the WinUI versions yet.

The problem i see is that to have a complete kit, i’d still have to support win32 plus all current and upcoming versions of WinUI. talk about application bloat! The Windows UI framework is already one of the biggest components in a desktop app.