check only if the position exists

pull/48/head
amrbashir 3 years ago
parent 51b7689b62
commit 6d8126254a
No known key found for this signature in database
GPG Key ID: BBD7A47A2003FF33

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

Loading…
Cancel
Save