From 1e13fc11d85648bcb5a1be07a88294300462f71a Mon Sep 17 00:00:00 2001 From: muwoo <2424880409@qq.com> Date: Fri, 7 Mar 2025 15:18:28 +0800 Subject: [PATCH 1/2] fix(window-state): The window size state needs to be related to the screen's scale_factor. --- plugins/window-state/src/lib.rs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/plugins/window-state/src/lib.rs b/plugins/window-state/src/lib.rs index 1f4abdd633..b1b6cafe64 100644 --- a/plugins/window-state/src/lib.rs +++ b/plugins/window-state/src/lib.rs @@ -14,7 +14,7 @@ use bitflags::bitflags; use serde::{Deserialize, Serialize}; use tauri::{ plugin::{Builder as PluginBuilder, TauriPlugin}, - Manager, Monitor, PhysicalPosition, PhysicalSize, RunEvent, Runtime, WebviewWindow, Window, + LogicalSize, Manager, Monitor, PhysicalPosition, PhysicalSize, RunEvent, Runtime, WebviewWindow, Window, WindowEvent, }; @@ -184,7 +184,7 @@ impl WindowExt for Window { } if flags.contains(StateFlags::SIZE) { - self.set_size(PhysicalSize { + self.set_size(LogicalSize { width: state.width, height: state.height, })?; @@ -224,9 +224,12 @@ impl WindowExt for Window { should_show = state.visible; } else { let mut metadata = WindowState::default(); - if flags.contains(StateFlags::SIZE) { - let size = self.inner_size()?; + let scale_factor = self + .current_monitor()? + .map(|m| m.scale_factor()) + .unwrap_or(1.); + let size = self.inner_size()?.to_logical(scale_factor); metadata.width = size.width; metadata.height = size.height; } @@ -300,7 +303,12 @@ impl WindowExtInternal for Window { } if flags.contains(StateFlags::SIZE) && !is_maximized && !is_minimized { - let size = self.inner_size()?; + let scale_factor = self + .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 if size.width > 0 && size.height > 0 { state.width = size.width; @@ -523,11 +531,13 @@ impl Builder { } trait MonitorExt { - fn intersects(&self, position: PhysicalPosition, size: PhysicalSize) -> bool; + fn intersects(&self, position: PhysicalPosition, size: LogicalSize) -> bool; } impl MonitorExt for Monitor { - fn intersects(&self, position: PhysicalPosition, size: PhysicalSize) -> bool { + fn intersects(&self, position: PhysicalPosition, size: LogicalSize) -> bool { + let size = size.to_physical::(self.scale_factor()); + let PhysicalPosition { x, y } = *self.position(); let PhysicalSize { width, height } = *self.size(); From 55fbf3af6b0c8fa4d0344743a00822838571aae3 Mon Sep 17 00:00:00 2001 From: muwoo <2424880409@qq.com> Date: Fri, 7 Mar 2025 15:24:08 +0800 Subject: [PATCH 2/2] fix: The window size state needs to be related to the screen's scale_factor. --- .changes/window-state-size-scale-factor.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changes/window-state-size-scale-factor.md diff --git a/.changes/window-state-size-scale-factor.md b/.changes/window-state-size-scale-factor.md new file mode 100644 index 0000000000..a921f0438a --- /dev/null +++ b/.changes/window-state-size-scale-factor.md @@ -0,0 +1,5 @@ +--- +window-state: patch +--- + +fix: The window size state needs to be related to the screen's scale_factor, Otherwise, the restored window size will be scaled relative to the previous state.