Skip to content

Commit

Permalink
Windows: respect min/max sizes when creating the window (#2393)
Browse files Browse the repository at this point in the history
  • Loading branch information
amrbashir authored Aug 4, 2022
1 parent c53a574 commit 6b7ceed
Show file tree
Hide file tree
Showing 3 changed files with 34 additions and 2 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ And please only add new entries to the top of this list, right below the `# Unre

# Unreleased

- On Windows, respect min/max inner sizes when creating the window.

# 0.27.1 (2022-07-30)

- The minimum supported Rust version was lowered to `1.57.0` and now explicitly tested.
Expand Down
23 changes: 23 additions & 0 deletions src/dpi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,29 @@ impl Size {
Size::Logical(size) => size.to_physical(scale_factor),
}
}

pub fn clamp<S: Into<Size>>(input: S, min: S, max: S, scale_factor: f64) -> Size {
let (input, min, max) = (
input.into().to_physical::<f64>(scale_factor),
min.into().to_physical::<f64>(scale_factor),
max.into().to_physical::<f64>(scale_factor),
);

let clamp = |input: f64, min: f64, max: f64| {
if input < min {
min
} else if input > max {
max
} else {
input
}
};

let width = clamp(input.width, min.width, max.width);
let height = clamp(input.height, min.height, max.height);

PhysicalSize::new(width, height).into()
}
}

impl<P: Pixel> From<PhysicalSize<P>> for Size {
Expand Down
11 changes: 9 additions & 2 deletions src/platform_impl/windows/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -879,10 +879,17 @@ impl<'a, T: 'static> InitData<'a, T> {
win.set_fullscreen(attributes.fullscreen);
force_window_active(win.window.0);
} else {
let dimensions = attributes
let size = attributes
.inner_size
.unwrap_or_else(|| PhysicalSize::new(800, 600).into());
win.set_inner_size(dimensions);
let max_size = attributes
.max_inner_size
.unwrap_or_else(|| PhysicalSize::new(f64::MAX, f64::MAX).into());
let min_size = attributes
.min_inner_size
.unwrap_or_else(|| PhysicalSize::new(0, 0).into());
let clamped_size = Size::clamp(size, min_size, max_size, win.scale_factor());
win.set_inner_size(clamped_size);

if attributes.maximized {
// Need to set MAXIMIZED after setting `inner_size` as
Expand Down

0 comments on commit 6b7ceed

Please sign in to comment.