diff --git a/CHANGELOG.md b/CHANGELOG.md index 336fa3b9a6..ffee774ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ - Fixed bug on macOS where using `with_decorations(false)` would cause `set_decorations(true)` to produce a transparent titlebar with no title. - Implemented `MonitorId::get_position` on macOS. - On macOS, `Window::get_current_monitor` now returns accurate values. +- Added `WindowBuilderExt::with_resize_increments` to macOS. +- **Breaking:** On X11, `WindowBuilderExt::with_resize_increments` and `WindowBuilderExt::with_base_size` now take `u32` values rather than `i32`. # Version 0.14.0 (2018-05-09) diff --git a/src/os/macos.rs b/src/os/macos.rs index 19c6331a25..c560336c22 100644 --- a/src/os/macos.rs +++ b/src/os/macos.rs @@ -71,64 +71,72 @@ impl From for NSApplicationActivationPolicy { /// - `with_titlebar_buttons_hidden` /// - `with_fullsize_content_view` pub trait WindowBuilderExt { + /// Sets the activation policy for the window being built. fn with_activation_policy(self, activation_policy: ActivationPolicy) -> WindowBuilder; + /// Enables click-and-drag behavior for the entire window, not just the titlebar. fn with_movable_by_window_background(self, movable_by_window_background: bool) -> WindowBuilder; + /// Makes the titlebar transparent and allows the content to appear behind it. fn with_titlebar_transparent(self, titlebar_transparent: bool) -> WindowBuilder; + /// Hides the window title. fn with_title_hidden(self, title_hidden: bool) -> WindowBuilder; + /// Hides the window titlebar. fn with_titlebar_hidden(self, titlebar_hidden: bool) -> WindowBuilder; + /// Hides the window titlebar buttons. fn with_titlebar_buttons_hidden(self, titlebar_buttons_hidden: bool) -> WindowBuilder; + /// Makes the window content appear behind the titlebar. fn with_fullsize_content_view(self, fullsize_content_view: bool) -> WindowBuilder; + /// Build window with `resizeIncrements` property. Values must not be 0. + fn with_resize_increments(self, width_inc: u32, height_inc: u32) -> WindowBuilder; } impl WindowBuilderExt for WindowBuilder { - /// Sets the activation policy for the window being built #[inline] fn with_activation_policy(mut self, activation_policy: ActivationPolicy) -> WindowBuilder { self.platform_specific.activation_policy = activation_policy; self } - /// Enables click-and-drag behavior for the entire window, not just the titlebar #[inline] fn with_movable_by_window_background(mut self, movable_by_window_background: bool) -> WindowBuilder { self.platform_specific.movable_by_window_background = movable_by_window_background; self } - /// Makes the titlebar transparent and allows the content to appear behind it #[inline] fn with_titlebar_transparent(mut self, titlebar_transparent: bool) -> WindowBuilder { self.platform_specific.titlebar_transparent = titlebar_transparent; self } - /// Hides the window titlebar #[inline] fn with_titlebar_hidden(mut self, titlebar_hidden: bool) -> WindowBuilder { self.platform_specific.titlebar_hidden = titlebar_hidden; self } - /// Hides the window titlebar buttons #[inline] fn with_titlebar_buttons_hidden(mut self, titlebar_buttons_hidden: bool) -> WindowBuilder { self.platform_specific.titlebar_buttons_hidden = titlebar_buttons_hidden; self } - /// Hides the window title #[inline] fn with_title_hidden(mut self, title_hidden: bool) -> WindowBuilder { self.platform_specific.title_hidden = title_hidden; self } - /// Makes the window content appear behind the titlebar #[inline] fn with_fullsize_content_view(mut self, fullsize_content_view: bool) -> WindowBuilder { self.platform_specific.fullsize_content_view = fullsize_content_view; self } + + #[inline] + fn with_resize_increments(mut self, width_inc: u32, height_inc: u32) -> WindowBuilder { + self.platform_specific.resize_increments = Some((width_inc, height_inc)); + self + } } /// Additional methods on `MonitorId` that are specific to MacOS. diff --git a/src/os/unix.rs b/src/os/unix.rs index 2013c65425..04bfa2780a 100644 --- a/src/os/unix.rs +++ b/src/os/unix.rs @@ -199,9 +199,9 @@ pub trait WindowBuilderExt { fn with_x11_screen(self, screen_id: i32) -> WindowBuilder; /// Build window with resize increment hint. Only implemented on X11. - fn with_resize_increments(self, width_inc: i32, height_inc: i32) -> WindowBuilder; + fn with_resize_increments(self, width_inc: u32, height_inc: u32) -> WindowBuilder; /// Build window with base size hint. Only implemented on X11. - fn with_base_size(self, base_width: i32, base_height: i32) -> WindowBuilder; + fn with_base_size(self, base_width: u32, base_height: u32) -> WindowBuilder; } impl WindowBuilderExt for WindowBuilder { @@ -220,13 +220,13 @@ impl WindowBuilderExt for WindowBuilder { } #[inline] - fn with_resize_increments(mut self, width_inc: i32, height_inc: i32) -> WindowBuilder { + fn with_resize_increments(mut self, width_inc: u32, height_inc: u32) -> WindowBuilder { self.platform_specific.resize_increments = Some((width_inc, height_inc)); self } #[inline] - fn with_base_size(mut self, base_width: i32, base_height: i32) -> WindowBuilder { + fn with_base_size(mut self, base_width: u32, base_height: u32) -> WindowBuilder { self.platform_specific.base_size = Some((base_width, base_height)); self } diff --git a/src/platform/linux/mod.rs b/src/platform/linux/mod.rs index 1e77133719..fb72894ff8 100644 --- a/src/platform/linux/mod.rs +++ b/src/platform/linux/mod.rs @@ -42,8 +42,8 @@ const BACKEND_PREFERENCE_ENV_VAR: &str = "WINIT_UNIX_BACKEND"; pub struct PlatformSpecificWindowBuilderAttributes { pub visual_infos: Option, pub screen_id: Option, - pub resize_increments: Option<(i32, i32)>, - pub base_size: Option<(i32, i32)>, + pub resize_increments: Option<(u32, u32)>, + pub base_size: Option<(u32, u32)>, } lazy_static!( diff --git a/src/platform/macos/window.rs b/src/platform/macos/window.rs index 9ee54b09b6..f9c8026662 100644 --- a/src/platform/macos/window.rs +++ b/src/platform/macos/window.rs @@ -488,6 +488,7 @@ pub struct PlatformSpecificWindowBuilderAttributes { pub titlebar_hidden: bool, pub titlebar_buttons_hidden: bool, pub fullsize_content_view: bool, + pub resize_increments: Option<(u32, u32)>, } pub struct Window2 { @@ -771,6 +772,13 @@ impl Window2 { if pl_attrs.movable_by_window_background { window.setMovableByWindowBackground_(YES); } + + if let Some((x, y)) = pl_attrs.resize_increments { + if x >= 1 && y >= 1 { + let size = NSSize::new(x as _, y as _); + window.setResizeIncrements_(size); + } + } window.center(); window