Current state
rustortion-plugin/Cargo.toml:13 pins our own fork by commit:
iced_baseview = { git = "https://github.com/OpenSauce/iced_baseview.git", rev = "2377031b" }
Do this first: that pin is the Windows crash
2377031b is the iced 0.13 → 0.14 upgrade commit, which predates the Win32 HINSTANCE fix. On that rev, convert_raw_window_handle has an inverted null guard that unwraps NonZeroIsize::new(0) on every Win32 window baseview hands over. In a plugin the panic crosses the extern "C" boundary, becomes a non-unwinding panic, and aborts the host — surfacing on Windows as exception 0xc0000409 with the plugin as the faulting module.
One-line interim fix, independent of this migration:
iced_baseview = { git = "https://github.com/OpenSauce/iced_baseview.git", tag = "v0.1.0" }
Why migrate
BillyDM/iced_baseview, our fork's parent, is archived on GitHub (last push 2026-04-17).
- The project moved to https://codeberg.org/RustAudio/iced_baseview under the RustAudio org on 2026-06-04 and is actively released: six versions between 2026-05-25 and 2026-07-14, landing on 0.4.0.
iced_baseview 0.4.0 is on crates.io and already targets iced 0.14, the same upgrade our fork did by hand.
- It depends on
baseview ^0.2.1 and raw-window-handle ^0.6 with no git dependencies, so this becomes a plain versioned crates.io dep.
The HINSTANCE bug cannot occur upstream. With no raw-window-handle 0.5 there is no 0.5 → 0.6 conversion layer to get wrong, and baseview 0.2.2 sets the field itself (src/platform/win/mod.rs:27, via HInstance::get_from_dll().addr(), which reads the HINSTANCE from the DLL module rather than the window).
Net effect: the fork's only two unique commits (the iced 0.14 port and the HINSTANCE fix) are both redundant upstream, and src/conversion.rs — 848 of the fork's 2506 source lines — stops needing to exist.
Work required
Blast radius is one file: rustortion-plugin/src/editor.rs (236 lines, 24 iced_baseview references). Nothing else in the workspace imports it.
The real change is the trait model. iced 0.14 replaced Application with Program, and 0.4.0 followed:
- 0.4.0 has no
Application trait. editor.rs:131, impl iced_baseview::Application for PluginApp, must be rewritten against Program.
open_parented still exists, re-exported from shell.
Settings and IcedBaseviewSettings still exist; IcedBaseviewSettings moved to shell::settings.
Task, executor, and window modules survive.
rustortion-ui already depends on iced = "0.14" directly, so the widget code should carry over unchanged.
Dependency jumps to expect: keyboard-types 0.6 → 0.8.3, thiserror 1 → 2, window_clipboard 0.4 → 0.5, sysinfo 0.30 → 0.39.6.
Unknowns
- Exact
open_parented signature in 0.4.0 and how Program is parameterised. Needs reading against the real source, not docs summaries.
- Whether nih-plug's editor lifetime expectations still fit the
Program model, particularly the Send wrapper around WindowHandle<M> at editor.rs:26-32.
- Whether baseview 0.2.x changes parented-window behaviour in any host we care about.
Acceptance criteria
Refs: OpenSauce/iced_baseview#1 (the HINSTANCE fix), tag v0.1.0
Current state
rustortion-plugin/Cargo.toml:13pins our own fork by commit:Do this first: that pin is the Windows crash
2377031bis the iced 0.13 → 0.14 upgrade commit, which predates the Win32 HINSTANCE fix. On that rev,convert_raw_window_handlehas an inverted null guard that unwrapsNonZeroIsize::new(0)on every Win32 window baseview hands over. In a plugin the panic crosses theextern "C"boundary, becomes a non-unwinding panic, and aborts the host — surfacing on Windows as exception0xc0000409with the plugin as the faulting module.One-line interim fix, independent of this migration:
Why migrate
BillyDM/iced_baseview, our fork's parent, is archived on GitHub (last push 2026-04-17).iced_baseview0.4.0 is on crates.io and already targets iced 0.14, the same upgrade our fork did by hand.baseview ^0.2.1andraw-window-handle ^0.6with no git dependencies, so this becomes a plain versioned crates.io dep.The HINSTANCE bug cannot occur upstream. With no raw-window-handle 0.5 there is no 0.5 → 0.6 conversion layer to get wrong, and baseview 0.2.2 sets the field itself (
src/platform/win/mod.rs:27, viaHInstance::get_from_dll().addr(), which reads the HINSTANCE from the DLL module rather than the window).Net effect: the fork's only two unique commits (the iced 0.14 port and the HINSTANCE fix) are both redundant upstream, and
src/conversion.rs— 848 of the fork's 2506 source lines — stops needing to exist.Work required
Blast radius is one file:
rustortion-plugin/src/editor.rs(236 lines, 24iced_baseviewreferences). Nothing else in the workspace imports it.The real change is the trait model. iced 0.14 replaced
ApplicationwithProgram, and 0.4.0 followed:Applicationtrait.editor.rs:131,impl iced_baseview::Application for PluginApp, must be rewritten againstProgram.open_parentedstill exists, re-exported fromshell.SettingsandIcedBaseviewSettingsstill exist;IcedBaseviewSettingsmoved toshell::settings.Task,executor, andwindowmodules survive.rustortion-uialready depends oniced = "0.14"directly, so the widget code should carry over unchanged.Dependency jumps to expect:
keyboard-types0.6 → 0.8.3,thiserror1 → 2,window_clipboard0.4 → 0.5,sysinfo0.30 → 0.39.6.Unknowns
open_parentedsignature in 0.4.0 and howProgramis parameterised. Needs reading against the real source, not docs summaries.Programmodel, particularly theSendwrapper aroundWindowHandle<M>ateditor.rs:26-32.Acceptance criteria
rustortion-plugindepends oniced_baseview = "0.4"from crates.io, no git dependencyOpenSauce/iced_baseviewarchived once nothing depends on itRefs: OpenSauce/iced_baseview#1 (the HINSTANCE fix), tag
v0.1.0