mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2025-01-11 05:21:31 +11:00
Add Window::set_content_protected
on macOS and Windows (#2525)
* Add `Window::set_content_protect` on macOS and Windows * Update window.rs * Add builder variant * fix import * fix argument type * fix import * fix always visible window on Windows * update docs
This commit is contained in:
parent
418cc44e93
commit
65baae75c4
|
@ -8,6 +8,7 @@ And please only add new entries to the top of this list, right below the `# Unre
|
||||||
|
|
||||||
# Unreleased
|
# Unreleased
|
||||||
|
|
||||||
|
- On MacOS and Windows, add `Window::set_content_protected`.
|
||||||
- On MacOS, add `EventLoopBuilderExtMacOS::with_activate_ignoring_other_apps`.
|
- On MacOS, add `EventLoopBuilderExtMacOS::with_activate_ignoring_other_apps`.
|
||||||
- On Windows, fix icons specified on `WindowBuilder` not taking effect for windows created after the first one.
|
- On Windows, fix icons specified on `WindowBuilder` not taking effect for windows created after the first one.
|
||||||
- On Windows and macOS, add `Window::title` to query the current window title.
|
- On Windows and macOS, add `Window::title` to query the current window title.
|
||||||
|
|
|
@ -54,7 +54,7 @@ pub(crate) use self::version::NSAppKitVersion;
|
||||||
pub(crate) use self::view::{NSTrackingRectTag, NSView};
|
pub(crate) use self::view::{NSTrackingRectTag, NSView};
|
||||||
pub(crate) use self::window::{
|
pub(crate) use self::window::{
|
||||||
NSBackingStoreType, NSWindow, NSWindowButton, NSWindowLevel, NSWindowOcclusionState,
|
NSBackingStoreType, NSWindow, NSWindowButton, NSWindowLevel, NSWindowOcclusionState,
|
||||||
NSWindowStyleMask, NSWindowTitleVisibility,
|
NSWindowSharingType, NSWindowStyleMask, NSWindowTitleVisibility,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[link(name = "AppKit", kind = "framework")]
|
#[link(name = "AppKit", kind = "framework")]
|
||||||
|
|
|
@ -84,6 +84,9 @@ extern_methods!(
|
||||||
#[sel(setMovable:)]
|
#[sel(setMovable:)]
|
||||||
pub fn setMovable(&self, movable: bool);
|
pub fn setMovable(&self, movable: bool);
|
||||||
|
|
||||||
|
#[sel(setSharingType:)]
|
||||||
|
pub fn setSharingType(&self, sharingType: NSWindowSharingType);
|
||||||
|
|
||||||
#[sel(setOpaque:)]
|
#[sel(setOpaque:)]
|
||||||
pub fn setOpaque(&self, opaque: bool);
|
pub fn setOpaque(&self, opaque: bool);
|
||||||
|
|
||||||
|
@ -349,3 +352,16 @@ pub enum NSBackingStoreType {
|
||||||
unsafe impl Encode for NSBackingStoreType {
|
unsafe impl Encode for NSBackingStoreType {
|
||||||
const ENCODING: Encoding = NSUInteger::ENCODING;
|
const ENCODING: Encoding = NSUInteger::ENCODING;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[repr(usize)] // NSUInteger
|
||||||
|
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
|
||||||
|
pub enum NSWindowSharingType {
|
||||||
|
NSWindowSharingNone = 0,
|
||||||
|
NSWindowSharingReadOnly = 1,
|
||||||
|
NSWindowSharingReadWrite = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
unsafe impl Encode for NSWindowSharingType {
|
||||||
|
const ENCODING: Encoding = NSUInteger::ENCODING;
|
||||||
|
}
|
||||||
|
|
|
@ -45,7 +45,8 @@ use objc2::{declare_class, msg_send, msg_send_id, sel, ClassType};
|
||||||
use super::appkit::{
|
use super::appkit::{
|
||||||
NSApp, NSAppKitVersion, NSAppearance, NSApplicationPresentationOptions, NSBackingStoreType,
|
NSApp, NSAppKitVersion, NSAppearance, NSApplicationPresentationOptions, NSBackingStoreType,
|
||||||
NSColor, NSCursor, NSFilenamesPboardType, NSRequestUserAttentionType, NSResponder, NSScreen,
|
NSColor, NSCursor, NSFilenamesPboardType, NSRequestUserAttentionType, NSResponder, NSScreen,
|
||||||
NSWindow, NSWindowButton, NSWindowLevel, NSWindowStyleMask, NSWindowTitleVisibility,
|
NSWindow, NSWindowButton, NSWindowLevel, NSWindowSharingType, NSWindowStyleMask,
|
||||||
|
NSWindowTitleVisibility,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
#[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
|
||||||
|
@ -305,6 +306,10 @@ impl WinitWindow {
|
||||||
this.setTitle(&NSString::from_str(&attrs.title));
|
this.setTitle(&NSString::from_str(&attrs.title));
|
||||||
this.setAcceptsMouseMovedEvents(true);
|
this.setAcceptsMouseMovedEvents(true);
|
||||||
|
|
||||||
|
if attrs.content_protected {
|
||||||
|
this.setSharingType(NSWindowSharingType::NSWindowSharingNone);
|
||||||
|
}
|
||||||
|
|
||||||
if pl_attrs.titlebar_transparent {
|
if pl_attrs.titlebar_transparent {
|
||||||
this.setTitlebarAppearsTransparent(true);
|
this.setTitlebarAppearsTransparent(true);
|
||||||
}
|
}
|
||||||
|
@ -1123,6 +1128,14 @@ impl WinitWindow {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
pub fn set_content_protected(&self, protected: bool) {
|
||||||
|
self.setSharingType(if protected {
|
||||||
|
NSWindowSharingType::NSWindowSharingNone
|
||||||
|
} else {
|
||||||
|
NSWindowSharingType::NSWindowSharingReadOnly
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
pub fn title(&self) -> String {
|
pub fn title(&self) -> String {
|
||||||
self.title_().to_string()
|
self.title_().to_string()
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,11 +42,12 @@ use windows_sys::Win32::{
|
||||||
CreateWindowExW, FlashWindowEx, GetClientRect, GetCursorPos, GetForegroundWindow,
|
CreateWindowExW, FlashWindowEx, GetClientRect, GetCursorPos, GetForegroundWindow,
|
||||||
GetSystemMetrics, GetWindowPlacement, GetWindowTextLengthW, GetWindowTextW,
|
GetSystemMetrics, GetWindowPlacement, GetWindowTextLengthW, GetWindowTextW,
|
||||||
IsWindowVisible, LoadCursorW, PeekMessageW, PostMessageW, RegisterClassExW, SetCursor,
|
IsWindowVisible, LoadCursorW, PeekMessageW, PostMessageW, RegisterClassExW, SetCursor,
|
||||||
SetCursorPos, SetForegroundWindow, SetWindowPlacement, SetWindowPos, SetWindowTextW,
|
SetCursorPos, SetForegroundWindow, SetWindowDisplayAffinity, SetWindowPlacement,
|
||||||
CS_HREDRAW, CS_VREDRAW, CW_USEDEFAULT, FLASHWINFO, FLASHW_ALL, FLASHW_STOP,
|
SetWindowPos, SetWindowTextW, CS_HREDRAW, CS_VREDRAW, CW_USEDEFAULT, FLASHWINFO,
|
||||||
FLASHW_TIMERNOFG, FLASHW_TRAY, GWLP_HINSTANCE, HTCAPTION, MAPVK_VK_TO_VSC, NID_READY,
|
FLASHW_ALL, FLASHW_STOP, FLASHW_TIMERNOFG, FLASHW_TRAY, GWLP_HINSTANCE, HTCAPTION,
|
||||||
PM_NOREMOVE, SM_DIGITIZER, SWP_ASYNCWINDOWPOS, SWP_NOACTIVATE, SWP_NOSIZE,
|
MAPVK_VK_TO_VSC, NID_READY, PM_NOREMOVE, SM_DIGITIZER, SWP_ASYNCWINDOWPOS,
|
||||||
SWP_NOZORDER, WM_NCLBUTTONDOWN, WNDCLASSEXW,
|
SWP_NOACTIVATE, SWP_NOSIZE, SWP_NOZORDER, WDA_EXCLUDEFROMCAPTURE, WDA_NONE,
|
||||||
|
WM_NCLBUTTONDOWN, WNDCLASSEXW,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
@ -738,6 +739,20 @@ impl Window {
|
||||||
unsafe { force_window_active(window.0) };
|
unsafe { force_window_active(window.0) };
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn set_content_protected(&self, protected: bool) {
|
||||||
|
unsafe {
|
||||||
|
SetWindowDisplayAffinity(
|
||||||
|
self.hwnd(),
|
||||||
|
if protected {
|
||||||
|
WDA_EXCLUDEFROMCAPTURE
|
||||||
|
} else {
|
||||||
|
WDA_NONE
|
||||||
|
},
|
||||||
|
)
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Drop for Window {
|
impl Drop for Window {
|
||||||
|
@ -908,6 +923,10 @@ impl<'a, T: 'static> InitData<'a, T> {
|
||||||
|
|
||||||
let attributes = self.attributes.clone();
|
let attributes = self.attributes.clone();
|
||||||
|
|
||||||
|
if attributes.content_protected {
|
||||||
|
win.set_content_protected(true);
|
||||||
|
}
|
||||||
|
|
||||||
// Set visible before setting the size to ensure the
|
// Set visible before setting the size to ensure the
|
||||||
// attribute is correctly applied.
|
// attribute is correctly applied.
|
||||||
win.set_visible(attributes.visible);
|
win.set_visible(attributes.visible);
|
||||||
|
|
|
@ -136,6 +136,7 @@ pub(crate) struct WindowAttributes {
|
||||||
pub window_icon: Option<Icon>,
|
pub window_icon: Option<Icon>,
|
||||||
pub preferred_theme: Option<Theme>,
|
pub preferred_theme: Option<Theme>,
|
||||||
pub resize_increments: Option<Size>,
|
pub resize_increments: Option<Size>,
|
||||||
|
pub content_protected: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Default for WindowAttributes {
|
impl Default for WindowAttributes {
|
||||||
|
@ -157,6 +158,7 @@ impl Default for WindowAttributes {
|
||||||
window_icon: None,
|
window_icon: None,
|
||||||
preferred_theme: None,
|
preferred_theme: None,
|
||||||
resize_increments: None,
|
resize_increments: None,
|
||||||
|
content_protected: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -365,6 +367,23 @@ impl WindowBuilder {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Prevents the window contents from being captured by other apps.
|
||||||
|
///
|
||||||
|
/// The default is `false`.
|
||||||
|
///
|
||||||
|
/// ## Platform-specific
|
||||||
|
///
|
||||||
|
/// - **macOS**: if `false`, [`NSWindowSharingNone`] is used but doesn't completely
|
||||||
|
/// prevent all apps from reading the window content, for instance, QuickTime.
|
||||||
|
/// - **iOS / Android / Web / x11:** Ignored.
|
||||||
|
///
|
||||||
|
/// [`NSWindowSharingNone`]: https://developer.apple.com/documentation/appkit/nswindowsharingtype/nswindowsharingnone
|
||||||
|
#[inline]
|
||||||
|
pub fn with_content_protected(mut self, protected: bool) -> Self {
|
||||||
|
self.window.content_protected = protected;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Builds the window.
|
/// Builds the window.
|
||||||
///
|
///
|
||||||
/// Possible causes of error include denied permission, incompatible system, and lack of memory.
|
/// Possible causes of error include denied permission, incompatible system, and lack of memory.
|
||||||
|
@ -953,6 +972,20 @@ impl Window {
|
||||||
self.window.theme()
|
self.window.theme()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Prevents the window contents from being captured by other apps.
|
||||||
|
///
|
||||||
|
/// ## Platform-specific
|
||||||
|
///
|
||||||
|
/// - **macOS**: if `false`, [`NSWindowSharingNone`] is used but doesn't completely
|
||||||
|
/// prevent all apps from reading the window content, for instance, QuickTime.
|
||||||
|
/// - **iOS / Android / x11 / Wayland / Web:** Unsupported.
|
||||||
|
///
|
||||||
|
/// [`NSWindowSharingNone`]: https://developer.apple.com/documentation/appkit/nswindowsharingtype/nswindowsharingnone
|
||||||
|
pub fn set_content_protected(&self, _protected: bool) {
|
||||||
|
#[cfg(any(target_os = "macos", target_os = "windows"))]
|
||||||
|
self.window.set_content_protected(_protected);
|
||||||
|
}
|
||||||
|
|
||||||
/// Gets the current title of the window.
|
/// Gets the current title of the window.
|
||||||
///
|
///
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
|
|
Loading…
Reference in a new issue