diff --git a/plugins/window-state/src/lib.rs b/plugins/window-state/src/lib.rs index a3fcc3cd..05157317 100644 --- a/plugins/window-state/src/lib.rs +++ b/plugins/window-state/src/lib.rs @@ -5,7 +5,8 @@ use serde::{Deserialize, Serialize}; use tauri::{ plugin::{Builder as PluginBuilder, TauriPlugin}, - LogicalSize, Manager, PhysicalPosition, PhysicalSize, RunEvent, Runtime, Window, WindowEvent, + LogicalSize, Manager, Monitor, PhysicalPosition, PhysicalSize, RunEvent, Runtime, Window, + WindowEvent, }; use std::{ @@ -58,9 +59,6 @@ struct WindowMetadata { visible: bool, decorated: bool, fullscreen: bool, - monitor: String, - monitor_position: PhysicalPosition, - monitor_size: PhysicalSize, } struct WindowStateCache(Arc>>); @@ -107,14 +105,11 @@ impl WindowExt for Window { // restore position to saved value if saved monitor exists // otherwise, let the OS decide where to place the window for m in self.available_monitors()? { - if m.name().map(ToString::to_string).unwrap_or_default() == state.monitor { - if *m.position() == state.monitor_position && *m.size() == state.monitor_size { - self.set_position(PhysicalPosition { - x: state.x, - y: state.y, - })?; - } - break; + if m.contains((state.x, state.y).into()) { + self.set_position(PhysicalPosition { + x: state.x, + y: state.y, + })?; } } @@ -135,10 +130,6 @@ impl WindowExt for Window { let visible = self.is_visible().unwrap_or(true); let decorated = self.is_decorated().unwrap_or(true); let fullscreen = self.is_fullscreen().unwrap_or(false); - let monitor = self.current_monitor()?.unwrap(); - let monitor_name = monitor.name().map(ToString::to_string).unwrap_or_default(); - let monitor_position = monitor.position(); - let monitor_size = monitor.size(); c.insert( self.label().into(), WindowMetadata { @@ -150,9 +141,6 @@ impl WindowExt for Window { visible, decorated, fullscreen, - monitor: monitor_name, - monitor_position: monitor_position.clone(), - monitor_size: monitor_size.clone(), }, ); } @@ -239,11 +227,7 @@ impl Builder { state.maximized = is_maximized; if let Some(monitor) = window_clone.current_monitor().unwrap() { - state.monitor = - monitor.name().map(ToString::to_string).unwrap_or_default(); let monitor_position = monitor.position(); - state.monitor_position = monitor_position.clone(); - state.monitor_size = monitor.size().clone(); // save only window positions that are inside the current monitor if position.x > monitor_position.x && position.y > monitor_position.y @@ -294,3 +278,19 @@ impl Builder { .build() } } + +trait MonitorExt { + fn contains(&self, position: PhysicalPosition) -> bool; +} + +impl MonitorExt for Monitor { + fn contains(&self, position: PhysicalPosition) -> bool { + let PhysicalPosition { x, y } = *self.position(); + let PhysicalSize { width, height } = *self.size(); + + x < position.x as _ + && position.x < (x + width as i32) + && y < position.y as _ + && position.y < (y + height as i32) + } +}