Skip to content

Commit

Permalink
Add option to enable/disable WS_CLIPCHILDREN window style (#3212)
Browse files Browse the repository at this point in the history
  • Loading branch information
amrbashir authored Jan 22, 2024
1 parent 0cc1971 commit 10a7850
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 1 deletion.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@ Unreleased` header.
- On macOS, send a `Resized` event after each `ScaleFactorChanged` event.
- On Wayland, fix `wl_surface` being destroyed before associated objects.
- On macOS, fix assertion when pressing `Fn` key.
- On Windows, add `WindowBuilderExtWindows::with_clip_children` to control `WS_CLIPCHILDREN` style.

# 0.29.3

Expand Down
9 changes: 9 additions & 0 deletions src/platform/windows.rs
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,9 @@ pub trait WindowBuilderExtWindows {
/// Enabling the shadow causes a thin 1px line to appear on the top of the window.
fn with_undecorated_shadow(self, shadow: bool) -> Self;

/// This sets or removes `WS_CLIPCHILDREN` style.
fn with_clip_children(self, flag: bool) -> Self;

/// Sets the color of the window border.
///
/// Supported starting with Windows 11 Build 22000.
Expand Down Expand Up @@ -385,6 +388,12 @@ impl WindowBuilderExtWindows for WindowBuilder {
self
}

#[inline]
fn with_clip_children(mut self, flag: bool) -> Self {
self.window.platform_specific.clip_children = flag;
self
}

#[inline]
fn with_border_color(mut self, color: Option<Color>) -> Self {
self.window.platform_specific.border_color = Some(color.unwrap_or(Color::NONE));
Expand Down
2 changes: 2 additions & 0 deletions src/platform_impl/windows/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ pub struct PlatformSpecificWindowBuilderAttributes {
pub skip_taskbar: bool,
pub class_name: String,
pub decoration_shadow: bool,
pub clip_children: bool,
pub border_color: Option<Color>,
pub title_background_color: Option<Color>,
pub title_text_color: Option<Color>,
Expand All @@ -54,6 +55,7 @@ impl Default for PlatformSpecificWindowBuilderAttributes {
skip_taskbar: false,
class_name: "Window Class".to_string(),
decoration_shadow: false,
clip_children: true,
border_color: None,
title_background_color: None,
title_text_color: None,
Expand Down
4 changes: 4 additions & 0 deletions src/platform_impl/windows/window.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1356,6 +1356,10 @@ unsafe fn init(
// Will be changed later using `window.set_enabled_buttons` but we need to set a default here
// so the diffing later can work.
window_flags.set(WindowFlags::CLOSABLE, true);
window_flags.set(
WindowFlags::CLIP_CHILDREN,
attributes.platform_specific.clip_children,
);

let mut fallback_parent = || match attributes.platform_specific.owner {
Some(parent) => {
Expand Down
7 changes: 6 additions & 1 deletion src/platform_impl/windows/window_state.rs
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,8 @@ bitflags! {

const MARKER_ACTIVATE = 1 << 21;

const CLIP_CHILDREN = 1 << 22;

const EXCLUSIVE_FULLSCREEN_OR_MASK = WindowFlags::ALWAYS_ON_TOP.bits();
}
}
Expand Down Expand Up @@ -253,7 +255,7 @@ impl WindowFlags {

pub fn to_window_styles(self) -> (WINDOW_STYLE, WINDOW_EX_STYLE) {
// Required styles to properly support common window functionality like aero snap.
let mut style = WS_CAPTION | WS_BORDER | WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_SYSMENU;
let mut style = WS_CAPTION | WS_BORDER | WS_CLIPSIBLINGS | WS_SYSMENU;
let mut style_ex = WS_EX_WINDOWEDGE | WS_EX_ACCEPTFILES;

if self.contains(WindowFlags::RESIZABLE) {
Expand Down Expand Up @@ -298,6 +300,9 @@ impl WindowFlags {
if self.contains(WindowFlags::IGNORE_CURSOR_EVENT) {
style_ex |= WS_EX_TRANSPARENT | WS_EX_LAYERED;
}
if self.contains(WindowFlags::CLIP_CHILDREN) {
style |= WS_CLIPCHILDREN;
}

if self.intersects(
WindowFlags::MARKER_EXCLUSIVE_FULLSCREEN | WindowFlags::MARKER_BORDERLESS_FULLSCREEN,
Expand Down

0 comments on commit 10a7850

Please sign in to comment.