diff --git a/Cargo.lock b/Cargo.lock index 5e0554e8..9f4fa0af 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -660,6 +660,23 @@ dependencies = [ "x11rb 0.13.0", ] +[[package]] +name = "baseview" +version = "0.1.0" +source = "git+https://github.com/RustAudio/baseview.git#579130ecb4f9f315ae52190af42f0ea46aeaa4a2" +dependencies = [ + "cocoa", + "core-foundation", + "keyboard-types", + "nix 0.22.3", + "objc", + "raw-window-handle 0.5.2", + "uuid", + "winapi", + "x11", + "x11rb 0.13.0", +] + [[package]] name = "bindgen" version = "0.69.1" @@ -3002,7 +3019,7 @@ dependencies = [ "atomic_float", "atomic_refcell", "backtrace", - "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git?rev=2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4)", + "baseview 0.1.0 (git+https://github.com/RustAudio/baseview.git)", "bitflags 1.3.2", "cfg-if", "clap", @@ -3020,7 +3037,7 @@ dependencies = [ "nih_plug_derive", "objc", "parking_lot 0.12.1", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "rtrb", "serde", "serde_json", @@ -3889,6 +3906,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.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" + [[package]] name = "rayon" version = "1.8.0" diff --git a/Cargo.toml b/Cargo.toml index 1d10163b..42449b8e 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,27 +90,35 @@ 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" lazy_static = "1.4" 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 = "2c1b1a7b0fef1a29a5150a6a8f6fef6a0cbab8c4", features = ["opengl"], optional = true } +baseview = { git = "https://github.com/RustAudio/baseview.git", 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/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:?}"), };