Add WindowBuilder::with_outer_position (#1866)
This commit is contained in:
parent
86748fbc68
commit
0d634a0061
8 changed files with 108 additions and 16 deletions
|
|
@ -8,11 +8,12 @@ use std::ops::{BitAnd, Deref};
|
|||
use cocoa::{
|
||||
appkit::{NSApp, NSWindowStyleMask},
|
||||
base::{id, nil},
|
||||
foundation::{NSAutoreleasePool, NSRect, NSString, NSUInteger},
|
||||
foundation::{NSAutoreleasePool, NSPoint, NSRect, NSString, NSUInteger},
|
||||
};
|
||||
use core_graphics::display::CGDisplay;
|
||||
use objc::runtime::{Class, Object, Sel, BOOL, YES};
|
||||
|
||||
use crate::dpi::LogicalPosition;
|
||||
use crate::platform_impl::platform::ffi;
|
||||
|
||||
// Replace with `!` once stable
|
||||
|
|
@ -91,6 +92,16 @@ pub fn bottom_left_to_top_left(rect: NSRect) -> f64 {
|
|||
CGDisplay::main().pixels_high() as f64 - (rect.origin.y + rect.size.height)
|
||||
}
|
||||
|
||||
/// Converts from winit screen-coordinates to macOS screen-coordinates.
|
||||
/// Winit: top-left is (0, 0) and y increasing downwards
|
||||
/// macOS: bottom-left is (0, 0) and y increasing upwards
|
||||
pub fn window_position(position: LogicalPosition<f64>) -> NSPoint {
|
||||
NSPoint::new(
|
||||
position.x,
|
||||
CGDisplay::main().pixels_high() as f64 - position.y,
|
||||
)
|
||||
}
|
||||
|
||||
pub unsafe fn ns_string_id_ref(s: &str) -> IdRef {
|
||||
IdRef::new(NSString::alloc(nil).init_str(s))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -166,7 +166,17 @@ fn create_window(
|
|||
}
|
||||
None => (800.0, 600.0),
|
||||
};
|
||||
NSRect::new(NSPoint::new(0.0, 0.0), NSSize::new(width, height))
|
||||
let (left, bottom) = match attrs.position {
|
||||
Some(position) => {
|
||||
let logical = util::window_position(position.to_logical(scale_factor));
|
||||
// macOS wants the position of the bottom left corner,
|
||||
// but caller is setting the position of top left corner
|
||||
(logical.x, logical.y - height)
|
||||
}
|
||||
// This value is ignored by calling win.center() below
|
||||
None => (0.0, 0.0),
|
||||
};
|
||||
NSRect::new(NSPoint::new(left, bottom), NSSize::new(width, height))
|
||||
}
|
||||
};
|
||||
|
||||
|
|
@ -249,8 +259,9 @@ fn create_window(
|
|||
if !pl_attrs.has_shadow {
|
||||
ns_window.setHasShadow_(NO);
|
||||
}
|
||||
|
||||
ns_window.center();
|
||||
if attrs.position.is_none() {
|
||||
ns_window.center();
|
||||
}
|
||||
ns_window
|
||||
});
|
||||
pool.drain();
|
||||
|
|
@ -496,17 +507,8 @@ impl UnownedWindow {
|
|||
pub fn set_outer_position(&self, position: Position) {
|
||||
let scale_factor = self.scale_factor();
|
||||
let position = position.to_logical(scale_factor);
|
||||
let dummy = NSRect::new(
|
||||
NSPoint::new(
|
||||
position.x,
|
||||
// While it's true that we're setting the top-left position,
|
||||
// it still needs to be in a bottom-left coordinate system.
|
||||
CGDisplay::main().pixels_high() as f64 - position.y,
|
||||
),
|
||||
NSSize::new(0f64, 0f64),
|
||||
);
|
||||
unsafe {
|
||||
util::set_frame_top_left_point_async(*self.ns_window, dummy.origin);
|
||||
util::set_frame_top_left_point_async(*self.ns_window, util::window_position(position));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue