From 2f55bfecbf0244f3b5aa1ad7622182fca3fcdcbb Mon Sep 17 00:00:00 2001 From: Lucas Fernandes Nogueira Date: Wed, 7 Feb 2024 22:26:29 -0300 Subject: [PATCH] chore(deps): update wry to 0.36 (#8795) * chore(deps): update wry to 0.36 * rwh 0.6 * remove raw_window_handle usage * fix build * fix windows test --- .changes/rwh-06.md | 7 +++ .changes/wry-0.36.md | 5 ++ core/tauri-runtime-wry/Cargo.toml | 6 +-- core/tauri-runtime-wry/src/lib.rs | 32 +++++++++---- core/tauri-runtime/Cargo.toml | 2 +- core/tauri-runtime/src/lib.rs | 8 ++-- core/tauri/Cargo.toml | 6 +-- core/tauri/src/app.rs | 18 +++++--- core/tauri/src/error.rs | 4 ++ core/tauri/src/test/mock_runtime.rs | 58 ++++++++++++++++-------- core/tauri/src/vibrancy/macos.rs | 4 +- core/tauri/src/vibrancy/windows.rs | 6 +-- core/tauri/src/webview/webview_window.rs | 8 ++-- core/tauri/src/window/mod.rs | 31 ++++++++----- examples/api/src-tauri/Cargo.lock | 6 +-- 15 files changed, 134 insertions(+), 67 deletions(-) create mode 100644 .changes/rwh-06.md create mode 100644 .changes/wry-0.36.md diff --git a/.changes/rwh-06.md b/.changes/rwh-06.md new file mode 100644 index 000000000..a2b6e5f1b --- /dev/null +++ b/.changes/rwh-06.md @@ -0,0 +1,7 @@ +--- +"tauri": patch:breaking +"tauri-runtime": patch:breaking +"tauri-runtime-wry": patch:breaking +--- + +Update raw-window-handle to 0.6. diff --git a/.changes/wry-0.36.md b/.changes/wry-0.36.md new file mode 100644 index 000000000..7d69500ef --- /dev/null +++ b/.changes/wry-0.36.md @@ -0,0 +1,5 @@ +--- +"tauri-runtime-wry": patch:deps +--- + +Update `wry` to 0.36. diff --git a/core/tauri-runtime-wry/Cargo.toml b/core/tauri-runtime-wry/Cargo.toml index 299582d46..5cdd25638 100644 --- a/core/tauri-runtime-wry/Cargo.toml +++ b/core/tauri-runtime-wry/Cargo.toml @@ -13,11 +13,11 @@ edition = { workspace = true } rust-version = { workspace = true } [dependencies] -wry = { version = "0.35.2", default-features = false, features = [ "file-drop", "protocol", "os-webview" ] } -tao = { version = "0.25", default-features = false, features = [ "rwh_05", "rwh_06" ] } +wry = { version = "0.36", default-features = false, features = [ "file-drop", "protocol", "os-webview" ] } +tao = { version = "0.25", default-features = false, features = [ "rwh_06" ] } tauri-runtime = { version = "2.0.0-beta.1", path = "../tauri-runtime" } tauri-utils = { version = "2.0.0-beta.1", path = "../tauri-utils" } -raw-window-handle = "0.5" +raw-window-handle = "0.6" http = "0.2" tracing = { version = "0.1", optional = true } diff --git a/core/tauri-runtime-wry/src/lib.rs b/core/tauri-runtime-wry/src/lib.rs index 58cd41337..de7ded2ad 100644 --- a/core/tauri-runtime-wry/src/lib.rs +++ b/core/tauri-runtime-wry/src/lib.rs @@ -11,7 +11,7 @@ html_favicon_url = "https://github.com/tauri-apps/tauri/raw/dev/app-icon.png" )] -use raw_window_handle::{HasRawDisplayHandle, HasRawWindowHandle, RawDisplayHandle}; +use raw_window_handle::{DisplayHandle, HasDisplayHandle, HasWindowHandle}; use tauri_runtime::{ monitor::Monitor, webview::{DetachedWebview, DownloadEvent, PendingWebview, WebviewIpcHandler}, @@ -1077,8 +1077,8 @@ pub struct GtkBox(pub gtk::Box); #[allow(clippy::non_send_fields_in_send_ty)] unsafe impl Send for GtkBox {} -pub struct RawWindowHandle(pub raw_window_handle::RawWindowHandle); -unsafe impl Send for RawWindowHandle {} +pub struct SendRawWindowHandle(pub raw_window_handle::RawWindowHandle); +unsafe impl Send for SendRawWindowHandle {} #[cfg(target_os = "macos")] #[derive(Debug, Clone)] @@ -1125,7 +1125,7 @@ pub enum WindowMessage { target_os = "openbsd" ))] GtkBox(Sender), - RawWindowHandle(Sender), + RawWindowHandle(Sender>), Theme(Sender), // Setters Center, @@ -1400,6 +1400,12 @@ pub struct WryWindowDispatcher { #[allow(clippy::non_send_fields_in_send_ty)] unsafe impl Sync for WryWindowDispatcher {} +fn get_raw_window_handle( + dispatcher: &WryWindowDispatcher, +) -> Result> { + window_getter!(dispatcher, WindowMessage::RawWindowHandle) +} + impl WindowDispatch for WryWindowDispatcher { type Runtime = Wry; type WindowBuilder = WindowBuilderWrapper; @@ -1531,8 +1537,12 @@ impl WindowDispatch for WryWindowDispatcher { window_getter!(self, WindowMessage::GtkBox).map(|w| w.0) } - fn raw_window_handle(&self) -> Result { - window_getter!(self, WindowMessage::RawWindowHandle).map(|w| w.0) + fn window_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { + get_raw_window_handle(self) + .map_err(|_| raw_window_handle::HandleError::Unavailable) + .and_then(|r| r.map(|h| unsafe { raw_window_handle::WindowHandle::borrow_raw(h.0) })) } // Setters @@ -2046,8 +2056,8 @@ impl RuntimeHandle for WryHandle { send_user_message(&self.context, Message::Task(Box::new(f))) } - fn raw_display_handle(&self) -> RawDisplayHandle { - self.context.main_thread.window_target.raw_display_handle() + fn display_handle(&self) -> std::result::Result { + self.context.main_thread.window_target.display_handle() } fn primary_monitor(&self) -> Option { @@ -2547,7 +2557,11 @@ fn handle_user_message( .send(GtkBox(window.default_vbox().unwrap().clone())) .unwrap(), WindowMessage::RawWindowHandle(tx) => tx - .send(RawWindowHandle(window.raw_window_handle())) + .send( + window + .window_handle() + .map(|h| SendRawWindowHandle(h.as_raw())), + ) .unwrap(), WindowMessage::Theme(tx) => { tx.send(map_theme(&window.theme())).unwrap(); diff --git a/core/tauri-runtime/Cargo.toml b/core/tauri-runtime/Cargo.toml index 0f6189081..e8cf98bfa 100644 --- a/core/tauri-runtime/Cargo.toml +++ b/core/tauri-runtime/Cargo.toml @@ -31,7 +31,7 @@ serde_json = "1.0" thiserror = "1.0" tauri-utils = { version = "2.0.0-beta.1", path = "../tauri-utils" } http = "0.2.4" -raw-window-handle = "0.5" +raw-window-handle = "0.6" url = { version = "2" } [target."cfg(windows)".dependencies.windows] diff --git a/core/tauri-runtime/src/lib.rs b/core/tauri-runtime/src/lib.rs index 5a19e1fa6..cad68dae9 100644 --- a/core/tauri-runtime/src/lib.rs +++ b/core/tauri-runtime/src/lib.rs @@ -12,7 +12,7 @@ )] #![cfg_attr(docsrs, feature(doc_cfg))] -use raw_window_handle::RawDisplayHandle; +use raw_window_handle::DisplayHandle; use serde::Deserialize; use std::{fmt::Debug, sync::mpsc::Sender}; use tauri_utils::{ProgressBarState, Theme}; @@ -233,7 +233,7 @@ pub trait RuntimeHandle: Debug + Clone + Send + Sync + Sized + 'st /// Run a task on the main thread. fn run_on_main_thread(&self, f: F) -> Result<()>; - fn raw_display_handle(&self) -> RawDisplayHandle; + fn display_handle(&self) -> std::result::Result; fn primary_monitor(&self) -> Option; fn available_monitors(&self) -> Vec; @@ -525,7 +525,9 @@ pub trait WindowDispatch: Debug + Clone + Send + Sync + Sized + 's fn default_vbox(&self) -> Result; /// Raw window handle. - fn raw_window_handle(&self) -> Result; + fn window_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError>; /// Returns the current window theme. fn theme(&self) -> Result; diff --git a/core/tauri/Cargo.toml b/core/tauri/Cargo.toml index 39c482cb2..9c395aa2a 100644 --- a/core/tauri/Cargo.toml +++ b/core/tauri/Cargo.toml @@ -62,7 +62,7 @@ dirs-next = "2.0" percent-encoding = "2.3" reqwest = { version = "0.11", default-features = false, features = [ "json", "stream" ] } bytes = { version = "1", features = [ "serde" ] } -raw-window-handle = "0.5" +raw-window-handle = "0.6" glob = "0.3" mime = "0.3" data-url = { version = "0.3", optional = true } @@ -86,11 +86,11 @@ webkit2gtk = { version = "=2.0.1", features = [ "v2_38" ] } embed_plist = "1.2" cocoa = "0.25" objc = "0.2" -window-vibrancy = "0.4" +window-vibrancy = "0.5" [target."cfg(windows)".dependencies] webview2-com = "0.28" -window-vibrancy = "0.4" +window-vibrancy = "0.5" [target."cfg(windows)".dependencies.windows] version = "0.52" diff --git a/core/tauri/src/app.rs b/core/tauri/src/app.rs index 919c1a864..05101cff3 100644 --- a/core/tauri/src/app.rs +++ b/core/tauri/src/app.rs @@ -28,7 +28,7 @@ use crate::{ use crate::menu::{Menu, MenuEvent}; #[cfg(all(desktop, feature = "tray-icon"))] use crate::tray::{TrayIcon, TrayIconBuilder, TrayIconEvent, TrayIconId}; -use raw_window_handle::HasRawDisplayHandle; +use raw_window_handle::HasDisplayHandle; use serialize_to_javascript::{default_template, DefaultTemplate, Template}; use tauri_macros::default_runtime; #[cfg(desktop)] @@ -1730,15 +1730,19 @@ fn init_app_menu(menu: &Menu) -> crate::Result<()> { Ok(()) } -unsafe impl HasRawDisplayHandle for AppHandle { - fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { - self.runtime_handle.raw_display_handle() +impl HasDisplayHandle for AppHandle { + fn display_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { + self.runtime_handle.display_handle() } } -unsafe impl HasRawDisplayHandle for App { - fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { - self.handle.raw_display_handle() +impl HasDisplayHandle for App { + fn display_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { + self.handle.display_handle() } } diff --git a/core/tauri/src/error.rs b/core/tauri/src/error.rs index 933b2449a..6096890ff 100644 --- a/core/tauri/src/error.rs +++ b/core/tauri/src/error.rs @@ -148,6 +148,10 @@ pub enum Error { /// Failed to deserialize scope object. #[error("error deserializing scope: {0}")] CannotDeserializeScope(Box), + + /// Failed to get a raw handle. + #[error(transparent)] + RawHandleError(#[from] raw_window_handle::HandleError), } /// `Result` diff --git a/core/tauri/src/test/mock_runtime.rs b/core/tauri/src/test/mock_runtime.rs index 011d7e33b..891e6d341 100644 --- a/core/tauri/src/test/mock_runtime.rs +++ b/core/tauri/src/test/mock_runtime.rs @@ -203,17 +203,27 @@ impl RuntimeHandle for MockRuntimeHandle { self.context.send_message(Message::Task(Box::new(f))) } - fn raw_display_handle(&self) -> raw_window_handle::RawDisplayHandle { + fn display_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { #[cfg(target_os = "linux")] - return raw_window_handle::RawDisplayHandle::Xlib(raw_window_handle::XlibDisplayHandle::empty()); + return Ok(unsafe { + raw_window_handle::DisplayHandle::borrow_raw(raw_window_handle::RawDisplayHandle::Xlib( + raw_window_handle::XlibDisplayHandle::new(None, 0), + )) + }); #[cfg(target_os = "macos")] - return raw_window_handle::RawDisplayHandle::AppKit( - raw_window_handle::AppKitDisplayHandle::empty(), - ); + return Ok(unsafe { + raw_window_handle::DisplayHandle::borrow_raw(raw_window_handle::RawDisplayHandle::AppKit( + raw_window_handle::AppKitDisplayHandle::new(), + )) + }); #[cfg(windows)] - return raw_window_handle::RawDisplayHandle::Windows( - raw_window_handle::WindowsDisplayHandle::empty(), - ); + return Ok(unsafe { + raw_window_handle::DisplayHandle::borrow_raw(raw_window_handle::RawDisplayHandle::Windows( + raw_window_handle::WindowsDisplayHandle::new(), + )) + }); #[cfg(not(any(target_os = "linux", target_os = "macos", windows)))] return unimplemented!(); } @@ -641,19 +651,31 @@ impl WindowDispatch for MockWindowDispatcher { unimplemented!() } - fn raw_window_handle(&self) -> Result { + fn window_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { #[cfg(target_os = "linux")] - return Ok(raw_window_handle::RawWindowHandle::Xlib( - raw_window_handle::XlibWindowHandle::empty(), - )); + return unsafe { + Ok(raw_window_handle::WindowHandle::borrow_raw( + raw_window_handle::RawWindowHandle::Xlib(raw_window_handle::XlibWindowHandle::new(0)), + )) + }; #[cfg(target_os = "macos")] - return Ok(raw_window_handle::RawWindowHandle::AppKit( - raw_window_handle::AppKitWindowHandle::empty(), - )); + return unsafe { + Ok(raw_window_handle::WindowHandle::borrow_raw( + raw_window_handle::RawWindowHandle::AppKit(raw_window_handle::AppKitWindowHandle::new( + std::ptr::NonNull::from(&()).cast(), + )), + )) + }; #[cfg(windows)] - return Ok(raw_window_handle::RawWindowHandle::Win32( - raw_window_handle::Win32WindowHandle::empty(), - )); + return unsafe { + Ok(raw_window_handle::WindowHandle::borrow_raw( + raw_window_handle::RawWindowHandle::Win32(raw_window_handle::Win32WindowHandle::new( + std::num::NonZeroIsize::MIN, + )), + )) + }; #[cfg(not(any(target_os = "linux", target_os = "macos", windows)))] return unimplemented!(); } diff --git a/core/tauri/src/vibrancy/macos.rs b/core/tauri/src/vibrancy/macos.rs index 2c0ba3772..3d262e4ab 100644 --- a/core/tauri/src/vibrancy/macos.rs +++ b/core/tauri/src/vibrancy/macos.rs @@ -7,10 +7,10 @@ use crate::utils::config::WindowEffectsConfig; use crate::window::{Effect, EffectState}; -use raw_window_handle::HasRawWindowHandle; +use raw_window_handle::HasWindowHandle; use window_vibrancy::{NSVisualEffectMaterial, NSVisualEffectState}; -pub fn apply_effects(window: impl HasRawWindowHandle, effects: WindowEffectsConfig) { +pub fn apply_effects(window: impl HasWindowHandle, effects: WindowEffectsConfig) { let WindowEffectsConfig { effects, radius, diff --git a/core/tauri/src/vibrancy/windows.rs b/core/tauri/src/vibrancy/windows.rs index 9c7cf744c..990698cb3 100644 --- a/core/tauri/src/vibrancy/windows.rs +++ b/core/tauri/src/vibrancy/windows.rs @@ -11,10 +11,10 @@ use std::ffi::c_void; use crate::utils::config::WindowEffectsConfig; use crate::window::{Color, Effect}; -use raw_window_handle::HasRawWindowHandle; +use raw_window_handle::HasWindowHandle; use windows::Win32::Foundation::HWND; -pub fn apply_effects(window: impl HasRawWindowHandle, effects: WindowEffectsConfig) { +pub fn apply_effects(window: impl HasWindowHandle, effects: WindowEffectsConfig) { let WindowEffectsConfig { effects, color, .. } = effects; let effect = if let Some(effect) = effects.iter().find(|e| { matches!( @@ -47,7 +47,7 @@ pub fn apply_effects(window: impl HasRawWindowHandle, effects: WindowEffectsConf }; } -pub fn clear_effects(window: impl HasRawWindowHandle) { +pub fn clear_effects(window: impl HasWindowHandle) { window_vibrancy::clear_blur(&window); window_vibrancy::clear_acrylic(&window); window_vibrancy::clear_mica(&window); diff --git a/core/tauri/src/webview/webview_window.rs b/core/tauri/src/webview/webview_window.rs index 10c048335..69f66eba6 100644 --- a/core/tauri/src/webview/webview_window.rs +++ b/core/tauri/src/webview/webview_window.rs @@ -864,9 +864,11 @@ impl PartialEq for WebviewWindow { } } -unsafe impl raw_window_handle::HasRawWindowHandle for WebviewWindow { - fn raw_window_handle(&self) -> raw_window_handle::RawWindowHandle { - self.webview.window().raw_window_handle() +impl raw_window_handle::HasWindowHandle for WebviewWindow { + fn window_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { + self.webview.window().window_handle() } } diff --git a/core/tauri/src/window/mod.rs b/core/tauri/src/window/mod.rs index 8dc61427f..fcfe93001 100644 --- a/core/tauri/src/window/mod.rs +++ b/core/tauri/src/window/mod.rs @@ -877,9 +877,11 @@ impl std::fmt::Debug for Window { } } -unsafe impl raw_window_handle::HasRawWindowHandle for Window { - fn raw_window_handle(&self) -> raw_window_handle::RawWindowHandle { - self.window.dispatcher.raw_window_handle().unwrap() +impl raw_window_handle::HasWindowHandle for Window { + fn window_handle( + &self, + ) -> std::result::Result, raw_window_handle::HandleError> { + self.window.dispatcher.window_handle() } } @@ -1418,11 +1420,16 @@ impl Window { self .window .dispatcher - .raw_window_handle() + .window_handle() .map_err(Into::into) .and_then(|handle| { - if let raw_window_handle::RawWindowHandle::AppKit(h) = handle { - Ok(h.ns_window) + if let raw_window_handle::RawWindowHandle::AppKit(h) = handle.as_raw() { + Ok(unsafe { + use objc::*; + let ns_window: cocoa::base::id = + objc::msg_send![h.ns_view.as_ptr() as cocoa::base::id, window]; + ns_window as *mut _ + }) } else { Err(crate::Error::InvalidWindowHandle) } @@ -1435,11 +1442,11 @@ impl Window { self .window .dispatcher - .raw_window_handle() + .window_handle() .map_err(Into::into) .and_then(|handle| { - if let raw_window_handle::RawWindowHandle::AppKit(h) = handle { - Ok(h.ns_view) + if let raw_window_handle::RawWindowHandle::AppKit(h) = handle.as_raw() { + Ok(h.ns_view.as_ptr()) } else { Err(crate::Error::InvalidWindowHandle) } @@ -1452,11 +1459,11 @@ impl Window { self .window .dispatcher - .raw_window_handle() + .window_handle() .map_err(Into::into) .and_then(|handle| { - if let raw_window_handle::RawWindowHandle::Win32(h) = handle { - Ok(HWND(h.hwnd as _)) + if let raw_window_handle::RawWindowHandle::Win32(h) = handle.as_raw() { + Ok(HWND(h.hwnd.get())) } else { Err(crate::Error::InvalidWindowHandle) } diff --git a/examples/api/src-tauri/Cargo.lock b/examples/api/src-tauri/Cargo.lock index 3c56869cf..770d1243f 100644 --- a/examples/api/src-tauri/Cargo.lock +++ b/examples/api/src-tauri/Cargo.lock @@ -4960,9 +4960,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.35.2" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3016c47c9b6f7029a9da7cd48af8352327226bba0e955f3c92e2966651365a9" +checksum = "3a9e7b81968555303086ef882a0c213896a76099de4ed0b86a798775c2d54304" dependencies = [ "base64", "block", @@ -4986,7 +4986,7 @@ dependencies = [ "objc", "objc_id", "once_cell", - "raw-window-handle 0.5.2", + "raw-window-handle 0.6.0", "serde", "serde_json", "sha2",