mirror of
https://github.com/italicsjenga/winit-sonoma-fix.git
synced 2024-12-25 23:01:30 +11:00
0df436901a
* First name consistency pass. More to come! * Remove multitouch variable (hopefully this compiles!) * Remove CreationError::NotSupported * Add new error handling types * Remove `get_` prefix from getters. This is as per the Rust naming conventions recommended in https://rust-lang-nursery.github.io/api-guidelines/naming.html#getter-names-follow-rust-convention-c-getter * Make changes to Window position and size function signatures * Remove CreationError in favor of OsError * Begin updating iOS backend * Change MonitorHandle::outer_position to just position * Fix build on Windows and Linux * Add Display and Error implementations to Error types * Attempt to fix iOS build. I can't actually check that this works since I can't cross-compile to iOS on a Windows machine (thanks apple :/) but this should be one of several commits to get it working. * Attempt to fix iOS errors, and muck up Travis to make debugging easier * More iOS fixins * Add Debug and Display impls to OsError * Fix Display impl * Fix unused code warnings and travis * Rename set_ime_spot to set_ime_position * Add CHANGELOG entry * Rename set_cursor to set_cursor_icon and MouseCursor to CursorIcon * Organize Window functions into multiple, categorized impls * Improve clarity of function ordering and docs in EventLoop
183 lines
6.4 KiB
Rust
183 lines
6.4 KiB
Rust
#![cfg(target_os = "macos")]
|
|
|
|
use std::os::raw::c_void;
|
|
|
|
use crate::dpi::LogicalSize;
|
|
use crate::monitor::MonitorHandle;
|
|
use crate::window::{Window, WindowBuilder};
|
|
|
|
/// Additional methods on `Window` that are specific to MacOS.
|
|
pub trait WindowExtMacOS {
|
|
/// Returns a pointer to the cocoa `NSWindow` that is used by this window.
|
|
///
|
|
/// The pointer will become invalid when the `Window` is destroyed.
|
|
fn nswindow(&self) -> *mut c_void;
|
|
|
|
/// Returns a pointer to the cocoa `NSView` that is used by this window.
|
|
///
|
|
/// The pointer will become invalid when the `Window` is destroyed.
|
|
fn nsview(&self) -> *mut c_void;
|
|
|
|
/// Request user attention, causing the application's dock icon to bounce.
|
|
/// Note that this has no effect if the application is already focused.
|
|
///
|
|
/// The `is_critical` flag has the following effects:
|
|
/// - `false`: the dock icon will only bounce once.
|
|
/// - `true`: the dock icon will bounce until the application is focused.
|
|
fn request_user_attention(&self, is_critical: bool);
|
|
|
|
/// Returns whether or not the window is in simple fullscreen mode.
|
|
fn simple_fullscreen(&self) -> bool;
|
|
|
|
/// Toggles a fullscreen mode that doesn't require a new macOS space.
|
|
/// Returns a boolean indicating whether the transition was successful (this
|
|
/// won't work if the window was already in the native fullscreen).
|
|
///
|
|
/// This is how fullscreen used to work on macOS in versions before Lion.
|
|
/// And allows the user to have a fullscreen window without using another
|
|
/// space or taking control over the entire monitor.
|
|
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool;
|
|
}
|
|
|
|
impl WindowExtMacOS for Window {
|
|
#[inline]
|
|
fn nswindow(&self) -> *mut c_void {
|
|
self.window.nswindow()
|
|
}
|
|
|
|
#[inline]
|
|
fn nsview(&self) -> *mut c_void {
|
|
self.window.nsview()
|
|
}
|
|
|
|
#[inline]
|
|
fn request_user_attention(&self, is_critical: bool) {
|
|
self.window.request_user_attention(is_critical)
|
|
}
|
|
|
|
#[inline]
|
|
fn simple_fullscreen(&self) -> bool {
|
|
self.window.simple_fullscreen()
|
|
}
|
|
|
|
#[inline]
|
|
fn set_simple_fullscreen(&self, fullscreen: bool) -> bool {
|
|
self.window.set_simple_fullscreen(fullscreen)
|
|
}
|
|
}
|
|
|
|
/// Corresponds to `NSApplicationActivationPolicy`.
|
|
#[derive(Debug, Clone, Copy, PartialEq)]
|
|
pub enum ActivationPolicy {
|
|
/// Corresponds to `NSApplicationActivationPolicyRegular`.
|
|
Regular,
|
|
/// Corresponds to `NSApplicationActivationPolicyAccessory`.
|
|
Accessory,
|
|
/// Corresponds to `NSApplicationActivationPolicyProhibited`.
|
|
Prohibited,
|
|
}
|
|
|
|
impl Default for ActivationPolicy {
|
|
fn default() -> Self {
|
|
ActivationPolicy::Regular
|
|
}
|
|
}
|
|
|
|
/// Additional methods on `WindowBuilder` that are specific to MacOS.
|
|
///
|
|
/// **Note:** Properties dealing with the titlebar will be overwritten by the `with_decorations` method
|
|
/// on the base `WindowBuilder`:
|
|
///
|
|
/// - `with_titlebar_transparent`
|
|
/// - `with_title_hidden`
|
|
/// - `with_titlebar_hidden`
|
|
/// - `with_titlebar_buttons_hidden`
|
|
/// - `with_fullsize_content_view`
|
|
pub trait WindowBuilderExtMacOS {
|
|
/// 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, increments: LogicalSize) -> WindowBuilder;
|
|
}
|
|
|
|
impl WindowBuilderExtMacOS for WindowBuilder {
|
|
#[inline]
|
|
fn with_activation_policy(mut self, activation_policy: ActivationPolicy) -> WindowBuilder {
|
|
self.platform_specific.activation_policy = activation_policy;
|
|
self
|
|
}
|
|
|
|
#[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
|
|
}
|
|
|
|
#[inline]
|
|
fn with_titlebar_transparent(mut self, titlebar_transparent: bool) -> WindowBuilder {
|
|
self.platform_specific.titlebar_transparent = titlebar_transparent;
|
|
self
|
|
}
|
|
|
|
#[inline]
|
|
fn with_titlebar_hidden(mut self, titlebar_hidden: bool) -> WindowBuilder {
|
|
self.platform_specific.titlebar_hidden = titlebar_hidden;
|
|
self
|
|
}
|
|
|
|
#[inline]
|
|
fn with_titlebar_buttons_hidden(mut self, titlebar_buttons_hidden: bool) -> WindowBuilder {
|
|
self.platform_specific.titlebar_buttons_hidden = titlebar_buttons_hidden;
|
|
self
|
|
}
|
|
|
|
#[inline]
|
|
fn with_title_hidden(mut self, title_hidden: bool) -> WindowBuilder {
|
|
self.platform_specific.title_hidden = title_hidden;
|
|
self
|
|
}
|
|
|
|
#[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, increments: LogicalSize) -> WindowBuilder {
|
|
self.platform_specific.resize_increments = Some(increments.into());
|
|
self
|
|
}
|
|
}
|
|
|
|
/// Additional methods on `MonitorHandle` that are specific to MacOS.
|
|
pub trait MonitorHandleExtMacOS {
|
|
/// Returns the identifier of the monitor for Cocoa.
|
|
fn native_id(&self) -> u32;
|
|
/// Returns a pointer to the NSScreen representing this monitor.
|
|
fn nsscreen(&self) -> Option<*mut c_void>;
|
|
}
|
|
|
|
impl MonitorHandleExtMacOS for MonitorHandle {
|
|
#[inline]
|
|
fn native_id(&self) -> u32 {
|
|
self.inner.native_identifier()
|
|
}
|
|
|
|
fn nsscreen(&self) -> Option<*mut c_void> {
|
|
self.inner.nsscreen().map(|s| s as *mut c_void)
|
|
}
|
|
}
|