@ -16,8 +16,8 @@ use bitflags::bitflags;
use serde ::{ Deserialize , Serialize } ;
use serde ::{ Deserialize , Serialize } ;
use tauri ::{
use tauri ::{
plugin ::{ Builder as PluginBuilder , TauriPlugin } ,
plugin ::{ Builder as PluginBuilder , TauriPlugin } ,
LogicalSize, Manager, Monitor , PhysicalPosition , PhysicalSize , RunEvent , Runtime ,
Manager, Monitor , PhysicalPosition , PhysicalSize , RunEvent , Runtime , WebviewWindow , Window ,
W ebviewWindow, Window , W indowEvent,
W indowEvent,
} ;
} ;
use std ::{
use std ::{
@ -72,8 +72,8 @@ struct PluginState {
#[ derive(Debug, Deserialize, Serialize, PartialEq) ]
#[ derive(Debug, Deserialize, Serialize, PartialEq) ]
struct WindowState {
struct WindowState {
width : f64 ,
width : u32 ,
height : f64 ,
height : u32 ,
x : i32 ,
x : i32 ,
y : i32 ,
y : i32 ,
// prev_x and prev_y are used to store position
// prev_x and prev_y are used to store position
@ -181,7 +181,7 @@ impl<R: Runtime> WindowExt for Window<R> {
}
}
if flags . contains ( StateFlags ::SIZE ) {
if flags . contains ( StateFlags ::SIZE ) {
self . set_size ( Log icalSize {
self . set_size ( Phys icalSize {
width : state . width ,
width : state . width ,
height : state . height ,
height : state . height ,
} ) ? ;
} ) ? ;
@ -223,11 +223,7 @@ impl<R: Runtime> WindowExt for Window<R> {
let mut metadata = WindowState ::default ( ) ;
let mut metadata = WindowState ::default ( ) ;
if flags . contains ( StateFlags ::SIZE ) {
if flags . contains ( StateFlags ::SIZE ) {
let scale_factor = self
let size = self . inner_size ( ) ? ;
. current_monitor ( ) ?
. map ( | m | m . scale_factor ( ) )
. unwrap_or ( 1. ) ;
let size = self . inner_size ( ) ? . to_logical ( scale_factor ) ;
metadata . width = size . width ;
metadata . width = size . width ;
metadata . height = size . height ;
metadata . height = size . height ;
}
}
@ -278,10 +274,11 @@ impl<R: Runtime> WindowExtInternal for WebviewWindow<R> {
impl < R : Runtime > WindowExtInternal for Window < R > {
impl < R : Runtime > WindowExtInternal for Window < R > {
fn update_state ( & self , state : & mut WindowState , flags : StateFlags ) -> tauri ::Result < ( ) > {
fn update_state ( & self , state : & mut WindowState , flags : StateFlags ) -> tauri ::Result < ( ) > {
let is_maximized = match flags . intersects ( StateFlags ::MAXIMIZED | StateFlags ::SIZE ) {
let is_maximized = flags
true = > self . is_maximized ( ) ? ,
. intersects ( StateFlags ::MAXIMIZED | StateFlags ::POSITION | StateFlags ::SIZE )
false = > false ,
& & self . is_maximized ( ) ? ;
} ;
let is_minimized =
flags . intersects ( StateFlags ::POSITION | StateFlags ::SIZE ) & & self . is_minimized ( ) ? ;
if flags . contains ( StateFlags ::MAXIMIZED ) {
if flags . contains ( StateFlags ::MAXIMIZED ) {
state . maximized = is_maximized ;
state . maximized = is_maximized ;
@ -299,21 +296,16 @@ impl<R: Runtime> WindowExtInternal for Window<R> {
state . visible = self . is_visible ( ) ? ;
state . visible = self . is_visible ( ) ? ;
}
}
if flags . contains ( StateFlags ::SIZE ) {
if flags . contains ( StateFlags ::SIZE ) & & ! is_maximized & & ! is_minimized {
let scale_factor = self
let size = self . inner_size ( ) ? ;
. current_monitor ( ) ?
. map ( | m | m . scale_factor ( ) )
. unwrap_or ( 1. ) ;
let size = self . inner_size ( ) ? . to_logical ( scale_factor ) ;
// It doesn't make sense to save a window with 0 height or width
// It doesn't make sense to save a window with 0 height or width
if size . width > 0. & & size . height > 0. & & ! is_maximized {
if size . width > 0 & & size . height > 0 {
state . width = size . width ;
state . width = size . width ;
state . height = size . height ;
state . height = size . height ;
}
}
}
}
if flags . contains ( StateFlags ::POSITION ) & & ! is_maximized & & ! self . is_minimized ( ) ? {
if flags . contains ( StateFlags ::POSITION ) & & ! is_maximized & & ! is_minimized {
let position = self . outer_position ( ) ? ;
let position = self . outer_position ( ) ? ;
state . x = position . x ;
state . x = position . x ;
state . y = position . y ;
state . y = position . y ;
@ -451,13 +443,26 @@ impl Builder {
}
}
WindowEvent ::Moved ( position ) if flags . contains ( StateFlags ::POSITION ) = > {
WindowEvent ::Moved ( position ) if flags . contains ( StateFlags ::POSITION ) = > {
let mut c = cache . lock ( ) . unwrap ( ) ;
if ! window_clone . is_minimized ( ) . unwrap_or_default ( ) {
if let Some ( state ) = c . get_mut ( & label ) {
let mut c = cache . lock ( ) . unwrap ( ) ;
state . prev_x = state . x ;
if let Some ( state ) = c . get_mut ( & label ) {
state . prev_y = state . y ;
state . prev_x = state . x ;
state . prev_y = state . y ;
state . x = position . x ;
state . y = position . y ;
state . x = position . x ;
state . y = position . y ;
}
}
}
WindowEvent ::Resized ( size ) if flags . contains ( StateFlags ::SIZE ) = > {
if ! window_clone . is_minimized ( ) . unwrap_or_default ( )
& & ! window_clone . is_maximized ( ) . unwrap_or_default ( )
{
let mut c = cache . lock ( ) . unwrap ( ) ;
if let Some ( state ) = c . get_mut ( & label ) {
state . width = size . width ;
state . height = size . height ;
}
}
}
}
}
_ = > { }
_ = > { }
@ -473,13 +478,11 @@ impl Builder {
}
}
trait MonitorExt {
trait MonitorExt {
fn intersects ( & self , position : PhysicalPosition < i32 > , size : Log icalSize< u32 > ) -> bool ;
fn intersects ( & self , position : PhysicalPosition < i32 > , size : Phys icalSize< u32 > ) -> bool ;
}
}
impl MonitorExt for Monitor {
impl MonitorExt for Monitor {
fn intersects ( & self , position : PhysicalPosition < i32 > , size : LogicalSize < u32 > ) -> bool {
fn intersects ( & self , position : PhysicalPosition < i32 > , size : PhysicalSize < u32 > ) -> bool {
let size = size . to_physical ::< u32 > ( self . scale_factor ( ) ) ;
let PhysicalPosition { x , y } = * self . position ( ) ;
let PhysicalPosition { x , y } = * self . position ( ) ;
let PhysicalSize { width , height } = * self . size ( ) ;
let PhysicalSize { width , height } = * self . size ( ) ;