On macOS, add support for Window::set_blur
This commit is contained in:
parent
5a3be586f4
commit
92b7dcccc1
5 changed files with 29 additions and 2 deletions
|
|
@ -18,6 +18,7 @@ Unreleased` header.
|
||||||
- On Windows, fix deadlock when accessing the state during `Cursor{Enter,Leave}`.
|
- On Windows, fix deadlock when accessing the state during `Cursor{Enter,Leave}`.
|
||||||
- On Windows, add support for `Window::set_transparent`.
|
- On Windows, add support for `Window::set_transparent`.
|
||||||
- On macOS, fix deadlock when entering a nested event loop from an event handler.
|
- On macOS, fix deadlock when entering a nested event loop from an event handler.
|
||||||
|
- On macOS, add support for `Window::set_blur`.
|
||||||
|
|
||||||
# 0.29.2
|
# 0.29.2
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,6 +36,9 @@ extern_methods!(
|
||||||
#[method(frame)]
|
#[method(frame)]
|
||||||
pub(crate) fn frame(&self) -> NSRect;
|
pub(crate) fn frame(&self) -> NSRect;
|
||||||
|
|
||||||
|
#[method(windowNumber)]
|
||||||
|
pub(crate) fn windowNumber(&self) -> NSInteger;
|
||||||
|
|
||||||
#[method(backingScaleFactor)]
|
#[method(backingScaleFactor)]
|
||||||
pub(crate) fn backingScaleFactor(&self) -> CGFloat;
|
pub(crate) fn backingScaleFactor(&self) -> CGFloat;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,7 @@ use core_graphics::{
|
||||||
base::CGError,
|
base::CGError,
|
||||||
display::{CGDirectDisplayID, CGDisplayConfigRef},
|
display::{CGDirectDisplayID, CGDisplayConfigRef},
|
||||||
};
|
};
|
||||||
|
use objc2::{ffi::NSInteger, runtime::AnyObject};
|
||||||
|
|
||||||
pub type CGDisplayFadeInterval = f32;
|
pub type CGDisplayFadeInterval = f32;
|
||||||
pub type CGDisplayReservationInterval = f32;
|
pub type CGDisplayReservationInterval = f32;
|
||||||
|
|
@ -113,6 +114,14 @@ extern "C" {
|
||||||
pub fn CGDisplayModeCopyPixelEncoding(mode: CGDisplayModeRef) -> CFStringRef;
|
pub fn CGDisplayModeCopyPixelEncoding(mode: CGDisplayModeRef) -> CFStringRef;
|
||||||
pub fn CGDisplayModeRetain(mode: CGDisplayModeRef);
|
pub fn CGDisplayModeRetain(mode: CGDisplayModeRef);
|
||||||
pub fn CGDisplayModeRelease(mode: CGDisplayModeRef);
|
pub fn CGDisplayModeRelease(mode: CGDisplayModeRef);
|
||||||
|
|
||||||
|
// Wildly used private APIs; Apple uses them for their Terminal.app.
|
||||||
|
pub fn CGSMainConnectionID() -> *mut AnyObject;
|
||||||
|
pub fn CGSSetWindowBackgroundBlurRadius(
|
||||||
|
connection_id: *mut AnyObject,
|
||||||
|
window_id: NSInteger,
|
||||||
|
radius: i64,
|
||||||
|
) -> i32;
|
||||||
}
|
}
|
||||||
|
|
||||||
mod core_video {
|
mod core_video {
|
||||||
|
|
|
||||||
|
|
@ -46,6 +46,8 @@ use super::appkit::{
|
||||||
NSView, NSWindow, NSWindowButton, NSWindowLevel, NSWindowSharingType, NSWindowStyleMask,
|
NSView, NSWindow, NSWindowButton, NSWindowLevel, NSWindowSharingType, NSWindowStyleMask,
|
||||||
NSWindowTabbingMode, NSWindowTitleVisibility,
|
NSWindowTabbingMode, NSWindowTitleVisibility,
|
||||||
};
|
};
|
||||||
|
use super::ffi::CGSMainConnectionID;
|
||||||
|
use super::ffi::CGSSetWindowBackgroundBlurRadius;
|
||||||
|
|
||||||
pub(crate) struct Window {
|
pub(crate) struct Window {
|
||||||
window: MainThreadBound<Id<WinitWindow>>,
|
window: MainThreadBound<Id<WinitWindow>>,
|
||||||
|
|
@ -494,6 +496,10 @@ impl WinitWindow {
|
||||||
this.setBackgroundColor(&NSColor::clear());
|
this.setBackgroundColor(&NSColor::clear());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if attrs.blur {
|
||||||
|
this.set_blur(attrs.blur);
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(dim) = attrs.min_inner_size {
|
if let Some(dim) = attrs.min_inner_size {
|
||||||
this.set_min_inner_size(Some(dim));
|
this.set_min_inner_size(Some(dim));
|
||||||
}
|
}
|
||||||
|
|
@ -582,7 +588,15 @@ impl WinitWindow {
|
||||||
self.setOpaque(!transparent)
|
self.setOpaque(!transparent)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn set_blur(&self, _blur: bool) {}
|
pub fn set_blur(&self, blur: bool) {
|
||||||
|
// NOTE: in general we want to specify the blur radius, but the choice of 80
|
||||||
|
// should be a reasonable default.
|
||||||
|
let radius = if blur { 80 } else { 0 };
|
||||||
|
let window_number = self.windowNumber();
|
||||||
|
unsafe {
|
||||||
|
CGSSetWindowBackgroundBlurRadius(CGSMainConnectionID(), window_number, radius);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn set_visible(&self, visible: bool) {
|
pub fn set_visible(&self, visible: bool) {
|
||||||
match visible {
|
match visible {
|
||||||
|
|
|
||||||
|
|
@ -918,7 +918,7 @@ impl Window {
|
||||||
///
|
///
|
||||||
/// ## Platform-specific
|
/// ## Platform-specific
|
||||||
///
|
///
|
||||||
/// - **Android / iOS / macOS / X11 / Web / Windows:** Unsupported.
|
/// - **Android / iOS / X11 / Web / Windows:** Unsupported.
|
||||||
/// - **Wayland:** Only works with org_kde_kwin_blur_manager protocol.
|
/// - **Wayland:** Only works with org_kde_kwin_blur_manager protocol.
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn set_blur(&self, blur: bool) {
|
pub fn set_blur(&self, blur: bool) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue