Skip to content

feat(windows): complete WinUI 3 backend - #8722

Closed
proggeramlug wants to merge 2 commits into
mainfrom
feat/4680-winui-complete
Closed

feat(windows): complete WinUI 3 backend#8722
proggeramlug wants to merge 2 commits into
mainfrom
feat/4680-winui-complete

Conversation

@proggeramlug

Copy link
Copy Markdown
Contributor

Summary

  • replace the windows-winui scaffold with real WinUI 3 / Fluent rendering through a vendored Windows Reactor snapshot from microsoft/windows-rs commit 65066a7109c214f317ed66261cfb7518160b8aaf, with upstream licenses and attribution preserved
  • map Perry's core controls, state updates, callbacks, lifecycle, layout, and Mica window backdrop to native WinUI controls
  • link and deploy the required Windows App SDK bootstrap import library, DLL, and PRI resources for compiled applications
  • document the backend, runtime requirements, diagnostics, and fallback behavior while preserving the default Win32 backend and its ABI

Testing

  • cargo build --release -p perry-ui-windows-winui
  • cargo build --release -p perry-ui-windows
  • cargo test -p perry winui_asset_tests
  • compared exported Perry UI symbols: 326 WinUI / 326 Win32, with no missing or extra symbols
  • compiled the ToDo example with --target windows-winui
  • launched the compiled ToDo executable and confirmed the Fluent backend remained running with bootstrap status ready

No version bump.

Closes #4680

@coderabbitai

coderabbitai Bot commented Aug 24, 2026

Copy link
Copy Markdown

Warning

Review limit reached

Next included review available in 57 seconds.

View limit details

Limit details: You’ve used all 8 included reviews currently available.

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: ae905944-fb60-4f4e-b6ae-ef1a023e6948

📥 Commits

Reviewing files that changed from the base of the PR and between 3f65530 and c85381b.

⛔ Files ignored due to path filters (1)
  • Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (289)
  • changelog.d/8722-windows-winui.md
  • crates/perry-ui-windows-winui/Cargo.toml
  • crates/perry-ui-windows-winui/src/app.rs
  • crates/perry-ui-windows-winui/src/lib.rs
  • crates/perry-ui-windows-winui/src/pointer.rs
  • crates/perry-ui-windows-winui/src/widgets.rs
  • crates/perry-ui-windows-winui/src/winui.rs
  • crates/perry-ui-windows-winui/vendor/VENDORED.md
  • crates/perry-ui-windows-winui/vendor/windows-collections/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-collections/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-collections/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-collections/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/iterable.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/key_value_pair.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/map.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/map_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/observable_map.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/observable_vector.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/vector.rs
  • crates/perry-ui-windows-winui/vendor/windows-collections/src/vector_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-core/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-core/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-core/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-core/src/agile_reference.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/array.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/as_impl.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/com_object.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/compose.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/event.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/event_revoker.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/guid.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/agile.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/array_proxy.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/can_into.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/com_bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/delegate_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/factory_cache.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/generic_factory.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/marshaler.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/mod.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/ref_count.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/sha1.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/weak_ref_count.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/imp/windows.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/implement_macro.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/in_ref.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/inspectable.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/interface.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/interface_macro.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/out_param.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/out_ref.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/param.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/param_value.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/resources.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/runtime_name.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/runtime_type.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/scoped_interface.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/type.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/unknown.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/weak.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/src/windows.rs
  • crates/perry-ui-windows-winui/vendor/windows-core/windows-core.natvis
  • crates/perry-ui-windows-winui/vendor/windows-future/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-future/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-future/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-future/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-future/src/async.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/async_ready.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/async_spawn.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/bindings_impl.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/future.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/join.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/waiter.rs
  • crates/perry-ui-windows-winui/vendor/windows-future/src/when.rs
  • crates/perry-ui-windows-winui/vendor/windows-implement/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-implement/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-implement/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-implement/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-implement/src/gen.rs
  • crates/perry-ui-windows-winui/vendor/windows-implement/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-implement/src/tests.rs
  • crates/perry-ui-windows-winui/vendor/windows-interface/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-interface/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-interface/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-interface/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-interface/src/gen.rs
  • crates/perry-ui-windows-winui/vendor/windows-interface/src/guid.rs
  • crates/perry-ui-windows-winui/vendor/windows-interface/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-interface/src/tests.rs
  • crates/perry-ui-windows-winui/vendor/windows-link/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-link/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-link/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-link/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-link/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-numerics/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-numerics/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-numerics/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/matrix3x2.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/matrix4x4.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/vector2.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/vector3.rs
  • crates/perry-ui-windows-winui/vendor/windows-numerics/src/vector4.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-reactor/build.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-reactor/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-reactor/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/app.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/app_shim.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/accessibility.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/animation.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/backend.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/callback.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/component.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/component_element.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/context.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/custom.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/dispatcher.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/element.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/error_boundary.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/geometry.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/into_elements.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/keyboard.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/mod.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/modifiers.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/pointer.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/prop_binding.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/rc_fn.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/reconciler.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/reconciler/child.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/reconciler/diff_helpers.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/reconciler/templated.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/reconciler/widget_dispatch.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/reconciler/wrappers.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/render_context.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/render_host.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/resource.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/rich_text.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/templated_list.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/theme.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/tooltip.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widget.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/auto_suggest_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/border.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/breadcrumb_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/calendar_date_picker.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/calendar_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/canvas.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/check_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/color_picker.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/combo_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/command_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/content_dialog.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/date_picker.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/drop_down_button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/expander.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/flyout.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/grid.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/hyperlink_button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/icon.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/image.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/info_badge.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/info_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/list_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/menu_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/mod.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/navigation_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/number_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/password_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/person_picture.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/pivot.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/progress_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/progress_ring.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/radio_button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/radio_buttons.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/rating_control.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/relative_panel.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/repeat_button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/rich_edit_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/scroll_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/scroll_viewer.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/selector_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/shape.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/slider.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/split_button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/split_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/stack_panel.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/tab_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/teaching_tip.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/text_block.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/text_box.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/time_picker.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/title_bar.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/toggle_button.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/toggle_switch.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/tree_view.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/widgets/viewbox.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/core/window.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/diagnostics.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/dsl/factories.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/dsl/mod.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/dsl/modifiers.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/backend/convert.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/backend/diag.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/backend/mod.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/dispatcher.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/hooks.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/host.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/mod.rs
  • crates/perry-ui-windows-winui/vendor/windows-reactor/src/winui/template_cache.rs
  • crates/perry-ui-windows-winui/vendor/windows-reference/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-reference/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-reference/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-reference/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-reference/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-reference/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-reference/src/reference.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-result/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-result/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-result/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-result/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/bool.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/bstr.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/com.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/error.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/hresult.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/ntstatus.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/rpc_status.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/strings.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/src/win32_error.rs
  • crates/perry-ui-windows-winui/vendor/windows-result/windows-result.natvis
  • crates/perry-ui-windows-winui/vendor/windows-strings/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-strings/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-strings/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-strings/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/bstr.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/decode.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/hstring.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/hstring_builder.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/hstring_header.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/literals.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/pcstr.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/pcwstr.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/pstr.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/pwstr.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/src/ref_count.rs
  • crates/perry-ui-windows-winui/vendor/windows-strings/windows-strings.natvis
  • crates/perry-ui-windows-winui/vendor/windows-threading/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-threading/examples/threading_bench.rs
  • crates/perry-ui-windows-winui/vendor/windows-threading/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-threading/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-threading/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-threading/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-threading/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-threading/src/pool.rs
  • crates/perry-ui-windows-winui/vendor/windows-time/Cargo.toml
  • crates/perry-ui-windows-winui/vendor/windows-time/license-apache-2.0
  • crates/perry-ui-windows-winui/vendor/windows-time/license-mit
  • crates/perry-ui-windows-winui/vendor/windows-time/readme.md
  • crates/perry-ui-windows-winui/vendor/windows-time/src/bindings.rs
  • crates/perry-ui-windows-winui/vendor/windows-time/src/datetime.rs
  • crates/perry-ui-windows-winui/vendor/windows-time/src/lib.rs
  • crates/perry-ui-windows-winui/vendor/windows-time/src/timespan.rs
  • crates/perry-ui-windows/Cargo.toml
  • crates/perry-ui-windows/src/lib.rs
  • crates/perry-ui-windows/src/state.rs
  • crates/perry-ui-windows/src/widgets/textfield.rs
  • crates/perry/src/commands/compile/library_search.rs
  • crates/perry/src/commands/compile/link/build_and_run.rs
  • docs/examples/ui/state/todo_app.ts
  • docs/src/cli/flags.md
  • docs/src/platforms/windows.md

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@proggeramlug

Copy link
Copy Markdown
Contributor Author

Holding this one — not on correctness, but because the gate failures need policy decisions about vendored third-party code that I don't think are mine to make unilaterally on a 73,441-line drop.

Vendoring hygiene looks right, for the record: per-crate license-mit and license-apache-2.0 files are present for all 13 vendored crates, and the upstream commit (65066a7109c214f317ed66261cfb7518160b8aaf) is pinned in-tree. It also merges cleanly against current main (8beca2f29).

Three gates are red:

1. workspace_architecture.py --check — the 13 vendored crates land as implicit workspace members:

implicit workspace members: crates/perry-ui-windows-winui/vendor/windows-{collections,core,future,
  implement,interface,link,numerics,reactor,reference,result,strings,threading,time}
unclassified workspace crates: windows-collections, windows-core, …
crates missing [lints] workspace = true: windows-collections, windows-core, …
architecture baseline differs; review the structural change and refresh workspace-architecture.json

This one is substantive rather than cosmetic: as workspace members they enter the build graph, so cargo test --workspace and the deny-warnings jobs will now compile them, and [lints] workspace = true would apply our lint policy to upstream code. The usual answer is workspace.exclude for vendored trees — but that's your call, and it needs the architecture baseline refreshed either way.

2. check_file_size.sh — four vendored files exceed the 2000-line cap, the largest at 26,441 lines:

  3094  vendor/windows-collections/src/bindings.rs
  2015  vendor/windows-future/src/bindings.rs
 26441  vendor/windows-reactor/src/bindings.rs
  4246  vendor/windows-reactor/src/winui/backend/mod.rs

Generated bindings obviously shouldn't be split, so these want the script's documented ALLOWLIST block with a rationale. Again a deliberate decision — it exempts 73k lines from that gate permanently.

3. One that is yours, not the vendor's: crates/perry/src/commands/compile/link/build_and_run.rs is back over the cap at 2110. I split the is_watchos arm out of that file a few hours ago (#8721 lineage) to get it under; this PR pushes it back. Worth extracting the block you added rather than growing it further.

4. gc_runtime_root_holders.py — two new holders in the new crate need a verdict or scanner coverage:

crates/perry-ui-windows-winui/src/app.rs:33:     APPS:  RefCell<Vec<AppState>>   [rule S]
crates/perry-ui-windows-winui/src/widgets.rs:137: NODES: RefCell<Vec<Node>>      [rule S]

Note #8713 just landed (via #8721) and registers root scanners for every other UI crate, closing #8701 — if AppState/Node hold JS callbacks as NaN-boxed f64, this crate should join that scheme rather than take a not_a_gc_pointer verdict. That's the correctness-relevant one of the four.

One caveat on my side: I can't validate any of the WinUI behaviour from macOS, and your test plan is cargo build --release -p perry-ui-windows-winui, which I also can't run here. So my review is limited to the gates, the merge, and the vendoring hygiene — someone on Windows should confirm the backend actually works before this lands.

proggeramlug added a commit that referenced this pull request Aug 24, 2026
Lands #8722 with its four gate blockers resolved.

Replaces the windows-winui scaffold with real WinUI 3 / Fluent rendering
through a vendored Windows Reactor snapshot (microsoft/windows-rs
65066a7109c214f317ed66261cfb7518160b8aaf), upstream licenses preserved.

The vendored tree moved from `crates/perry-ui-windows-winui/vendor/` to
`third_party/windows-winui/`, and this was forced rather than chosen.
Cargo's `is_excluded` is `!explicit_member && excluded`, and
`explicit_member` matches any `members` entry that is a path PREFIX of the
candidate -- so while the snapshot sat under a member directory, `exclude`
lost and all 13 crates were real workspace members. Verified empirically:
adding `exclude = ["crates/perry-ui-windows-winui/vendor"]` in place left
cargo reporting 92 packages with all 13 still members; after the move it
reports 79, matching the existing architecture baseline exactly, so no
baseline refresh was needed. As members they entered the build graph, so
`cargo test --workspace` compiled them and Perry's `[workspace.lints]`
would have applied to upstream code.

GC roots, the part that mattered: `Node` DOES hold JS values -- every
widget callback is stored as a raw closure pointer via
`js_nanbox_get_pointer` -- so it gets scanner coverage following #8713's
pattern, not a verdict. `AppState` does not: `String`, two `f64`
dimensions, an `i64` that indexes NODES rather than an address, two
`Option<(f64,f64)>` and a `PresenterKind`, so it takes a
`not_a_gc_pointer` verdict. Three further roots the census had not
flagged are scanned too (`ON_ACTIVATE`, `ON_TERMINATE`, `PENDING_TIMERS`),
and the scanner is armed on the Fluent path, where winui shadows
`app_create` and would otherwise have left `perry-ui-windows`' own tables
unscanned.

The four oversized files are generated upstream bindings and are
allowlisted as an immutable snapshot. `build_and_run.rs` was NOT
allowlisted -- the block this PR added moved to `link/winui_assets.rs`,
2110 -> 1970.

No version bump; the only root Cargo.toml change is the `exclude` entry.

Co-authored-by: Ralph Küpper <ralph@skelpo.com>
@proggeramlug

Copy link
Copy Markdown
Contributor Author

Landed on main via #8733 (squash 0749bd338), with all four gate blockers resolved.

The vendored tree had to move, and I verified that rather than assuming it. Cargo's is_excluded is !explicit_member && excluded, and explicit_member matches any members entry that is a path prefix — so while the snapshot sat under crates/perry-ui-windows-winui/vendor/, the parent's member entry won. Measured on your head: as submitted, 92 packages with 13 vendored crates as members; adding exclude in place, still 92 and still 13; moved to third_party/windows-winui/ and excluded, 79 — which matches the existing architecture baseline exactly, so no refresh was needed. That mattered substantively: as members, cargo test --workspace was compiling 73k lines of upstream code and [workspace.lints] would have applied to it.

On the GC side, Node does hold JS values — every widget callback is a raw closure pointer via js_nanbox_get_pointer — so it got scanner coverage following #8713's pattern rather than a not_a_gc_pointer verdict, which would have been false. AppState genuinely doesn't (String, two f64 dimensions, an i64 that indexes NODES rather than an address, two Options, a PresenterKind), so that one took a verdict. Three more roots the census hadn't flagged are scanned too — ON_ACTIVATE, ON_TERMINATE, PENDING_TIMERS — and the scanner is armed on the Fluent path, where winui shadows app_create and would otherwise have left perry-ui-windows' own tables unscanned.

build_and_run.rs was not allowlisted — the block this PR added moved to link/winui_assets.rs instead (2110 → 1970). Only the four generated upstream bindings are allowlisted.

Two things you should know:

  1. A residual I did not fix. render_handle works on a clone of the node and copies the unboxed callback pointer into move closures owned by the Reactor element tree; start_runtime_pump and app_run do the same for timers and on_exit. Those copies live inside boxed Rust closures no scanner can reach or rewrite, so an evacuating collection leaves them stale. Scanning the tables cannot fix it — the real fix is re-reading a scanned slot at invoke time, the indirection perry-ui-macos gets from its handle-keyed maps. It's a pre-existing property of the design, it's documented at both scanners, and it deserves a follow-up issue.

  2. WinUI runtime behaviour is unverified. It can't be built or run from macOS, and a real cross-compile fails on a C build script. The scanner and type definitions were validated by compiling the real definitions against the real perry_ffi::GcRootVisitor, which proves exhaustiveness and signatures but nothing about the backend working. Someone on Windows should confirm it. The three relocated winui_asset_tests type-check but weren't executed.

Validated: all 30 lint checkers, cargo check -p perry and -p perry --tests clean with zero warnings.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add opt-in WinUI 3 (Fluent) Windows target: --target windows-winui

1 participant