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 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<i32>,
monitor_size: PhysicalSize<u32>,
}
struct WindowStateCache(Arc<Mutex<HashMap<String, WindowMetadata>>>);
@ -107,14 +105,11 @@ impl<R: Runtime> WindowExt for Window<R> {
// 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<R: Runtime> WindowExt for Window<R> {
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<R: Runtime> WindowExt for Window<R> {
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<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