diff --git a/Cargo.lock b/Cargo.lock index 553996ae..c6876ac6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -673,14 +673,14 @@ dependencies = [ [[package]] name = "baseview" version = "0.1.0" -source = "git+https://github.com/RustAudio/baseview.git?rev=579130ecb4f9f315ae52190af42f0ea46aeaa4a2#579130ecb4f9f315ae52190af42f0ea46aeaa4a2" +source = "git+https://git.alexjanka.com/alex/baseview?rev=e31a11f1c73c0fdf1463db77105cf9a9b7c9240a#e31a11f1c73c0fdf1463db77105cf9a9b7c9240a" dependencies = [ "cocoa", "core-foundation", "keyboard-types", "nix 0.22.3", "objc", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "uuid", "winapi", "x11", @@ -3045,7 +3045,7 @@ dependencies = [ "atomic_float", "atomic_refcell", "backtrace", - "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=579130ecb4f9f315ae52190af42f0ea46aeaa4a2)", + "baseview 0.1.0 (git+https://git.alexjanka.com/alex/baseview?rev=e31a11f1c73c0fdf1463db77105cf9a9b7c9240a)", "bitflags 1.3.2", "cfg-if", "clap", @@ -3062,7 +3062,7 @@ dependencies = [ "nih_plug_derive", "objc", "parking_lot 0.12.3", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "rtrb", "serde", "serde_json", @@ -3091,12 +3091,12 @@ dependencies = [ name = "nih_plug_egui" version = "0.0.0" dependencies = [ - "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=45465c5f46abed6c6ce370fffde5edc8e4cd5aa3)", + "baseview 0.1.0 (git+https://git.alexjanka.com/alex/baseview?rev=e31a11f1c73c0fdf1463db77105cf9a9b7c9240a)", "crossbeam", "egui-baseview", "nih_plug", "parking_lot 0.12.3", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.2", "serde", ] @@ -3105,12 +3105,12 @@ name = "nih_plug_iced" version = "0.0.0" dependencies = [ "atomic_refcell", - "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=1d9806d5bd92275d0d8142d9c9c90198757b9b25)", + "baseview 0.1.0 (git+https://git.alexjanka.com/alex/baseview?rev=e31a11f1c73c0fdf1463db77105cf9a9b7c9240a)", "crossbeam", "iced_baseview", "nih_plug", "nih_plug_assets", - "raw-window-handle 0.4.3", + "raw-window-handle 0.6.2", "serde", ] @@ -3118,7 +3118,7 @@ dependencies = [ name = "nih_plug_vizia" version = "0.0.0" dependencies = [ - "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4)", + "baseview 0.1.0 (git+https://git.alexjanka.com/alex/baseview?rev=e31a11f1c73c0fdf1463db77105cf9a9b7c9240a)", "crossbeam", "nih_plug", "nih_plug_assets", @@ -3952,6 +3952,12 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + [[package]] name = "rayon" version = "1.10.0" diff --git a/Cargo.toml b/Cargo.toml index 76929e8e..ac2f69d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -54,7 +54,14 @@ assert_process_allocs = ["dep:assert_no_alloc"] # Enables an export target for standalone binaries through the # `nih_export_standalone()` function. Disabled by default as this requires # building additional dependencies for audio and MIDI handling. -standalone = ["dep:baseview", "dep:clap", "dep:cpal", "dep:jack", "dep:midir", "dep:rtrb"] +standalone = [ + "dep:baseview", + "dep:clap", + "dep:cpal", + "dep:jack", + "dep:midir", + "dep:rtrb", +] # Enables the `nih_export_vst3!()` macro. Enabled by default. This feature # exists mostly for GPL-compliance reasons, since even if you don't use the VST3 # wrapper you might otherwise still include a couple (unused) symbols from the @@ -83,26 +90,34 @@ backtrace = "0.3.65" bitflags = "1.3" cfg-if = "1.0" # This supports CLAP 1.1.8 -clap-sys = { git = "https://github.com/robbert-vdh/clap-sys.git", branch = "feature/cstr-macro" } +clap-sys = { git = "https://github.com/robbert-vdh/clap-sys.git", branch = "feature/cstr-macro" } crossbeam = "0.8" log = { version = "0.4", features = ["std", "release_max_level_info"] } midi-consts = "0.1" nih_log = "0.3.1" parking_lot = "0.12" -raw-window-handle = "0.5" +raw-window-handle = "0.6" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" widestring = "1.0.0-beta.1" # Used for the `assert_process_allocs` feature -assert_no_alloc = { git = "https://github.com/robbert-vdh/rust-assert-no-alloc.git", branch = "feature/nested-permit-forbid", features = ["backtrace", "log"], optional = true } +assert_no_alloc = { git = "https://github.com/robbert-vdh/rust-assert-no-alloc.git", branch = "feature/nested-permit-forbid", features = [ + "backtrace", + "log", +], optional = true } # Used for the `standalone` feature # NOTE: OpenGL support is not needed here, but rust-analyzer gets confused when # some crates do use it and others don't -baseview = { git = "https://github.com/RustAudio/baseview.git", rev = "579130ecb4f9f315ae52190af42f0ea46aeaa4a2", features = ["opengl"], optional = true } +baseview = { git = "https://git.alexjanka.com/alex/baseview", rev = "e31a11f1c73c0fdf1463db77105cf9a9b7c9240a", features = [ + "opengl", +], optional = true } # All the claps! -clap = { version = "4.1.8", features = ["derive", "wrap_help"], optional = true } +clap = { version = "4.1.8", features = [ + "derive", + "wrap_help", +], optional = true } cpal = { version = "0.15", optional = true } jack = { version = "0.11.4", optional = true } midir = { version = "0.9.1", optional = true } diff --git a/nih_plug_egui/Cargo.toml b/nih_plug_egui/Cargo.toml index e14bd37e..b062799c 100644 --- a/nih_plug_egui/Cargo.toml +++ b/nih_plug_egui/Cargo.toml @@ -17,8 +17,8 @@ rayon = ["egui-baseview/rayon"] [dependencies] nih_plug = { path = "..", default-features = false } -raw-window-handle = "0.5" -baseview = { git = "https://github.com/RustAudio/baseview.git", rev = "45465c5f46abed6c6ce370fffde5edc8e4cd5aa3" } +raw-window-handle = "0.6.2" +baseview = { git = "https://git.alexjanka.com/alex/baseview", rev = "e31a11f1c73c0fdf1463db77105cf9a9b7c9240a" } crossbeam = "0.8" egui-baseview = { git = "https://github.com/BillyDM/egui-baseview.git", rev = "68c4d0e8e5c1c702a888a245f4ac50eddfdfcaed", default-features = false } parking_lot = "0.12" diff --git a/nih_plug_iced/Cargo.toml b/nih_plug_iced/Cargo.toml index 7b2c9839..409cfcb3 100644 --- a/nih_plug_iced/Cargo.toml +++ b/nih_plug_iced/Cargo.toml @@ -61,10 +61,10 @@ nih_plug_assets = { git = "https://github.com/robbert-vdh/nih_plug_assets.git" } # The currently targeted version of baseview uses a different version of # `raw_window_handle` than NIH-plug, so we need to manually convert between them -raw-window-handle = "0.4" +raw-window-handle = "0.6.2" atomic_refcell = "0.1" -baseview = { git = "https://github.com/RustAudio/baseview.git", rev = "1d9806d5bd92275d0d8142d9c9c90198757b9b25" } +baseview = { git = "https://git.alexjanka.com/alex/baseview", rev = "e31a11f1c73c0fdf1463db77105cf9a9b7c9240a" } crossbeam = "0.8" # This targets iced 0.4 iced_baseview = { git = "https://github.com/robbert-vdh/iced_baseview.git", branch = "feature/update-baseview", default-features = false } diff --git a/nih_plug_vizia/Cargo.toml b/nih_plug_vizia/Cargo.toml index 3afc8351..281b31a7 100644 --- a/nih_plug_vizia/Cargo.toml +++ b/nih_plug_vizia/Cargo.toml @@ -11,10 +11,14 @@ description = "An adapter to use VIZIA GUIs with NIH-plug" nih_plug = { path = "..", default-features = false } nih_plug_assets = { git = "https://github.com/robbert-vdh/nih_plug_assets.git" } -baseview = { git = "https://github.com/RustAudio/baseview.git", rev = "2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4" } +baseview = { git = "https://git.alexjanka.com/alex/baseview", rev = "e31a11f1c73c0fdf1463db77105cf9a9b7c9240a" } # This contains an as of writing not yet merged patch for rounding errors when # resizing, and a workaround for certain events not firing when resizing -vizia = { git = "https://github.com/robbert-vdh/vizia.git", tag = "patched-2024-05-06", default-features = false, features = ["baseview", "clipboard", "x11"] } +vizia = { git = "https://github.com/robbert-vdh/vizia.git", tag = "patched-2024-05-06", default-features = false, features = [ + "baseview", + "clipboard", + "x11", +] } crossbeam = "0.8" # To make the state persistable diff --git a/src/editor.rs b/src/editor.rs index c6bd190e..c4c10e25 100644 --- a/src/editor.rs +++ b/src/editor.rs @@ -1,6 +1,6 @@ //! Traits for working with plugin editors. -use raw_window_handle::{HasRawWindowHandle, RawWindowHandle}; +use raw_window_handle::{HasWindowHandle, RawWindowHandle, WindowHandle}; use std::any::Any; use std::ffi::c_void; use std::sync::Arc; @@ -90,24 +90,33 @@ pub enum ParentWindowHandle { Win32Hwnd(*mut c_void), } -unsafe impl HasRawWindowHandle for ParentWindowHandle { - fn raw_window_handle(&self) -> RawWindowHandle { - match *self { - ParentWindowHandle::X11Window(window) => { - let mut handle = raw_window_handle::XcbWindowHandle::empty(); - handle.window = window; - RawWindowHandle::Xcb(handle) - } - ParentWindowHandle::AppKitNsView(ns_view) => { - let mut handle = raw_window_handle::AppKitWindowHandle::empty(); - handle.ns_view = ns_view; - RawWindowHandle::AppKit(handle) - } - ParentWindowHandle::Win32Hwnd(hwnd) => { - let mut handle = raw_window_handle::Win32WindowHandle::empty(); - handle.hwnd = hwnd; - RawWindowHandle::Win32(handle) - } - } +impl HasWindowHandle for ParentWindowHandle { + fn window_handle( + &self, + ) -> Result, raw_window_handle::HandleError> { + Ok(unsafe { + WindowHandle::borrow_raw(match *self { + ParentWindowHandle::X11Window(window) => { + RawWindowHandle::Xcb(raw_window_handle::XcbWindowHandle::new( + window + .try_into() + .map_err(|_| raw_window_handle::HandleError::Unavailable)?, + )) + } + ParentWindowHandle::AppKitNsView(ns_view) => { + RawWindowHandle::AppKit(raw_window_handle::AppKitWindowHandle::new( + std::ptr::NonNull::new(ns_view) + .ok_or(raw_window_handle::HandleError::Unavailable)?, + )) + } + ParentWindowHandle::Win32Hwnd(hwnd) => { + RawWindowHandle::Win32(raw_window_handle::Win32WindowHandle::new( + (hwnd as isize) + .try_into() + .map_err(|_| raw_window_handle::HandleError::Unavailable)?, + )) + } + }) + }) } } diff --git a/src/wrapper/standalone/wrapper.rs b/src/wrapper/standalone/wrapper.rs index 43476cc1..ca11e996 100644 --- a/src/wrapper/standalone/wrapper.rs +++ b/src/wrapper/standalone/wrapper.rs @@ -3,7 +3,7 @@ use baseview::{EventStatus, Window, WindowHandler, WindowOpenOptions}; use crossbeam::channel::{self, Sender}; use crossbeam::queue::ArrayQueue; use parking_lot::Mutex; -use raw_window_handle::HasRawWindowHandle; +use raw_window_handle::HasWindowHandle; use std::any::Any; use std::collections::{HashMap, HashSet}; use std::sync::atomic::{AtomicBool, AtomicU32, Ordering}; @@ -345,18 +345,20 @@ impl> Wrapper { gl_config: None, }, move |window| { - let parent_handle = match window.raw_window_handle() { + let parent_handle = match window.window_handle().unwrap().as_raw() { raw_window_handle::RawWindowHandle::Xlib(handle) => { ParentWindowHandle::X11Window(handle.window as u32) } raw_window_handle::RawWindowHandle::Xcb(handle) => { - ParentWindowHandle::X11Window(handle.window) + ParentWindowHandle::X11Window(handle.window.into()) } raw_window_handle::RawWindowHandle::AppKit(handle) => { - ParentWindowHandle::AppKitNsView(handle.ns_view) + ParentWindowHandle::AppKitNsView(handle.ns_view.as_ptr()) } raw_window_handle::RawWindowHandle::Win32(handle) => { - ParentWindowHandle::Win32Hwnd(handle.hwnd) + ParentWindowHandle::Win32Hwnd( + handle.hwnd.get() as *mut core::ffi::c_void + ) } handle => unimplemented!("Unsupported window handle: {handle:?}"), };