From badd5312c9e2e9ea2784bc63902cbd9ec1af4187 Mon Sep 17 00:00:00 2001 From: Jonas Wischeropp Date: Tue, 1 Oct 2024 13:05:25 +0200 Subject: [PATCH 1/3] fix: monitor scaling --- packages/desktop/src/widget_factory.rs | 32 +++++++++++++++++--------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/packages/desktop/src/widget_factory.rs b/packages/desktop/src/widget_factory.rs index 930f4ab0..f8d4ee37 100644 --- a/packages/desktop/src/widget_factory.rs +++ b/packages/desktop/src/widget_factory.rs @@ -233,7 +233,7 @@ impl WidgetFactory { async fn widget_placements( &self, config: &WidgetConfig, - ) -> Vec<(LogicalSize, LogicalPosition)> { + ) -> Vec<(PhysicalSize, PhysicalPosition)> { let mut placements = vec![]; for placement in config.default_placements.iter() { @@ -275,21 +275,31 @@ impl WidgetFactory { ), }; - let size = LogicalSize::from_physical( + let size = { + let size = PhysicalSize::::from_logical( + LogicalSize::new( + placement.width.to_px(monitor.width as i32), + placement.height.to_px(monitor.height as i32), + ), + monitor.scale_factor, + ); PhysicalSize::new( - placement.width.to_px(monitor.width as i32), - placement.height.to_px(monitor.height as i32), - ), - monitor.scale_factor, - ); + f64::min(size.width, monitor.width as f64), + f64::min(size.height, monitor.height as f64), + ) + }; - let position = LogicalPosition::from_physical( - PhysicalPosition::new( - anchor_x + placement.offset_x.to_px(monitor.width as i32), - anchor_y + placement.offset_y.to_px(monitor.height as i32), + let offset = PhysicalPosition::::from_logical( + LogicalPosition::new( + placement.offset_x.to_px(monitor.width as i32), + placement.offset_y.to_px(monitor.height as i32), ), monitor.scale_factor, ); + let position = PhysicalPosition::new( + anchor_x as f64 + offset.x, + anchor_y as f64 + offset.y, + ); placements.push((size, position)); } From 661a17e024e14da3ecc3b0a10b2355f1fd1bd0ee Mon Sep 17 00:00:00 2001 From: Jonas Wischeropp Date: Wed, 2 Oct 2024 15:01:08 +0200 Subject: [PATCH 2/3] fix: set size and position twice --- packages/desktop/src/widget_factory.rs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/desktop/src/widget_factory.rs b/packages/desktop/src/widget_factory.rs index f8d4ee37..55f84f53 100644 --- a/packages/desktop/src/widget_factory.rs +++ b/packages/desktop/src/widget_factory.rs @@ -177,6 +177,9 @@ impl WidgetFactory { { let _ = window.set_size(size); let _ = window.set_position(position); + let _ = window.set_size(size); + // Is it also required to set the position twice or only the size? + let _ = window.set_position(position); } let mut widget_states = self.widget_states.lock().await; From 2285c43f7a2a7cf751d845863c524da80b8c5947 Mon Sep 17 00:00:00 2001 From: Jonas Wischeropp Date: Wed, 2 Oct 2024 15:54:34 +0200 Subject: [PATCH 3/3] only scale px values --- packages/desktop/src/common/length_value.rs | 7 ++++ packages/desktop/src/widget_factory.rs | 46 ++++++++++----------- 2 files changed, 29 insertions(+), 24 deletions(-) diff --git a/packages/desktop/src/common/length_value.rs b/packages/desktop/src/common/length_value.rs index 2f905eb1..b132518d 100644 --- a/packages/desktop/src/common/length_value.rs +++ b/packages/desktop/src/common/length_value.rs @@ -24,6 +24,13 @@ impl LengthValue { LengthUnit::Pixel => self.amount as i32, } } + + pub fn to_px_scaled(&self, total_px: i32, scale_factor: f32) -> i32 { + match self.unit { + LengthUnit::Percentage => self.to_px(total_px), + LengthUnit::Pixel => (scale_factor * self.amount) as i32, + } + } } impl FromStr for LengthValue { diff --git a/packages/desktop/src/widget_factory.rs b/packages/desktop/src/widget_factory.rs index 55f84f53..1380ffa1 100644 --- a/packages/desktop/src/widget_factory.rs +++ b/packages/desktop/src/widget_factory.rs @@ -10,8 +10,8 @@ use std::{ use anyhow::{bail, Context}; use serde::Serialize; use tauri::{ - AppHandle, LogicalPosition, LogicalSize, Manager, PhysicalPosition, - PhysicalSize, WebviewUrl, WebviewWindowBuilder, WindowEvent, + AppHandle, Manager, PhysicalPosition, PhysicalSize, WebviewUrl, + WebviewWindowBuilder, WindowEvent, }; use tokio::{ sync::{broadcast, Mutex}, @@ -278,30 +278,28 @@ impl WidgetFactory { ), }; - let size = { - let size = PhysicalSize::::from_logical( - LogicalSize::new( - placement.width.to_px(monitor.width as i32), - placement.height.to_px(monitor.height as i32), - ), - monitor.scale_factor, - ); - PhysicalSize::new( - f64::min(size.width, monitor.width as f64), - f64::min(size.height, monitor.height as f64), - ) - }; + let width = placement + .width + .to_px_scaled(monitor.width as i32, monitor.scale_factor as f32); + let height = placement.height.to_px_scaled( + monitor.height as i32, + monitor.scale_factor as f32, + ); + let size = PhysicalSize::::new( + i32::min(width, monitor.width as i32) as f64, + i32::min(height, monitor.height as i32) as f64, + ); - let offset = PhysicalPosition::::from_logical( - LogicalPosition::new( - placement.offset_x.to_px(monitor.width as i32), - placement.offset_y.to_px(monitor.height as i32), - ), - monitor.scale_factor, + let offset_x = placement + .offset_x + .to_px_scaled(monitor.width as i32, monitor.scale_factor as f32); + let offset_y = placement.offset_y.to_px_scaled( + monitor.height as i32, + monitor.scale_factor as f32, ); - let position = PhysicalPosition::new( - anchor_x as f64 + offset.x, - anchor_y as f64 + offset.y, + let position = PhysicalPosition::::new( + (anchor_x + offset_x) as f64, + (anchor_y + offset_y) as f64, ); placements.push((size, position));