|
|
@ -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)
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|