From be08d25b204b5bc26d692081f50d0dbcc3a49016 Mon Sep 17 00:00:00 2001 From: StaterZ <57621744+StaterZ@users.noreply.github.com> Date: Thu, 21 May 2026 23:58:04 +0200 Subject: [PATCH 1/2] Fix broken Scale::FitScreen across all currently supported platforms --- src/os/macos/mod.rs | 9 ++++----- src/os/posix/x11.rs | 15 ++++----------- src/os/redox/mod.rs | 16 ++++++++++------ src/os/windows/mod.rs | 11 +++++------ 4 files changed, 23 insertions(+), 28 deletions(-) diff --git a/src/os/macos/mod.rs b/src/os/macos/mod.rs index c577fa2..e6f81bd 100644 --- a/src/os/macos/mod.rs +++ b/src/os/macos/mod.rs @@ -599,18 +599,17 @@ impl Window { let screen_y = (wh & 0xffff) as i32; let mut scale = 1i32; - loop { - let w = width as i32 * (scale + 1); - let h = height as i32 * (scale + 1); + let next_scale = scale + 1; + let w = width as i32 * next_scale; + let h = height as i32 * next_scale; if w > screen_x || h > screen_y { break; } - scale *= 2; + scale = next_scale; } - scale } }; diff --git a/src/os/posix/x11.rs b/src/os/posix/x11.rs index 61cc2ec..a48dde5 100644 --- a/src/os/posix/x11.rs +++ b/src/os/posix/x11.rs @@ -849,12 +849,11 @@ impl Window { Scale::X16 => 16, Scale::X32 => 32, Scale::FitScreen => { - let mut scale = 1; - + let mut scale = 1i32; loop { - let next_scale = scale * 2; - let w = width * next_scale; - let h = height * next_scale; + let next_scale = scale + 1; + let w = width as i32 * next_scale; + let h = height as i32 * next_scale; if w > screen_width || h > screen_height { break; @@ -862,12 +861,6 @@ impl Window { scale = next_scale; } - - if scale >= 32 { - 32 - } else { - scale - } } } } diff --git a/src/os/redox/mod.rs b/src/os/redox/mod.rs index e329522..46e5283 100644 --- a/src/os/redox/mod.rs +++ b/src/os/redox/mod.rs @@ -41,14 +41,18 @@ impl Window { Scale::FitScreen => { let display_size = orbclient::get_display_size() .map_err(|_| Error::WindowCreate("Unable to get display size".to_owned()))?; - let mut scale = 32; - while scale > 1 { - if width * scale < display_size.0 as usize - && height * scale < display_size.1 as usize - { + + let mut scale = 1i32; + loop { + let next_scale = scale + 1; + let w = width as i32 * next_scale; + let h = height as i32 * next_scale; + + if w > display_size.0 || h > display_size.1 { break; } - scale -= 1; + + scale = next_scale; } scale } diff --git a/src/os/windows/mod.rs b/src/os/windows/mod.rs index e2291f4..e99a8b0 100644 --- a/src/os/windows/mod.rs +++ b/src/os/windows/mod.rs @@ -1038,19 +1038,18 @@ impl Window { let screen_y = unsafe { winuser::GetSystemMetrics(winuser::SM_CYSCREEN) } as i32; let mut scale = 1i32; - loop { - let w = width as i32 * (scale + 1); - let h = height as i32 * (scale + 1); + let next_scale = scale + 1; + let w = width as i32 * next_scale; + let h = height as i32 * next_scale; if w > screen_x || h > screen_y { break; } - scale *= 2; + scale = next_scale; } - - scale + std::cmp::max(1, scale - 1) //reduce slightly so we don't go over the taskbar } }; From 8a921631d9d7bb287e9a8d3acbed600f8a6431a7 Mon Sep 17 00:00:00 2001 From: StaterZ <57621744+StaterZ@users.noreply.github.com> Date: Fri, 22 May 2026 16:51:26 +0200 Subject: [PATCH 2/2] Fix type issues --- src/os/macos/mod.rs | 2 ++ src/os/posix/x11.rs | 9 ++++++--- src/os/redox/mod.rs | 12 +++++++----- src/os/windows/mod.rs | 2 ++ 4 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/os/macos/mod.rs b/src/os/macos/mod.rs index e6f81bd..5e7b522 100644 --- a/src/os/macos/mod.rs +++ b/src/os/macos/mod.rs @@ -599,6 +599,7 @@ impl Window { let screen_y = (wh & 0xffff) as i32; let mut scale = 1i32; + loop { let next_scale = scale + 1; let w = width as i32 * next_scale; @@ -610,6 +611,7 @@ impl Window { scale = next_scale; } + scale } }; diff --git a/src/os/posix/x11.rs b/src/os/posix/x11.rs index a48dde5..21ae8cd 100644 --- a/src/os/posix/x11.rs +++ b/src/os/posix/x11.rs @@ -849,11 +849,12 @@ impl Window { Scale::X16 => 16, Scale::X32 => 32, Scale::FitScreen => { - let mut scale = 1i32; + let mut scale = 1usize; + loop { let next_scale = scale + 1; - let w = width as i32 * next_scale; - let h = height as i32 * next_scale; + let w = width * next_scale; + let h = height * next_scale; if w > screen_width || h > screen_height { break; @@ -861,6 +862,8 @@ impl Window { scale = next_scale; } + + scale } } } diff --git a/src/os/redox/mod.rs b/src/os/redox/mod.rs index 46e5283..0edaf82 100644 --- a/src/os/redox/mod.rs +++ b/src/os/redox/mod.rs @@ -41,19 +41,21 @@ impl Window { Scale::FitScreen => { let display_size = orbclient::get_display_size() .map_err(|_| Error::WindowCreate("Unable to get display size".to_owned()))?; - - let mut scale = 1i32; + + let mut scale = 1usize; + loop { let next_scale = scale + 1; - let w = width as i32 * next_scale; - let h = height as i32 * next_scale; + let w = width * next_scale; + let h = height * next_scale; - if w > display_size.0 || h > display_size.1 { + if w > display_size.0 as usize || h > display_size.1 as usize { break; } scale = next_scale; } + scale } }; diff --git a/src/os/windows/mod.rs b/src/os/windows/mod.rs index e99a8b0..962a93f 100644 --- a/src/os/windows/mod.rs +++ b/src/os/windows/mod.rs @@ -1038,6 +1038,7 @@ impl Window { let screen_y = unsafe { winuser::GetSystemMetrics(winuser::SM_CYSCREEN) } as i32; let mut scale = 1i32; + loop { let next_scale = scale + 1; let w = width as i32 * next_scale; @@ -1049,6 +1050,7 @@ impl Window { scale = next_scale; } + std::cmp::max(1, scale - 1) //reduce slightly so we don't go over the taskbar } };