diff --git a/crates/gpui/examples/window_positioning.rs b/crates/gpui/examples/window_positioning.rs index 0c5f216c2e..5505478140 100644 --- a/crates/gpui/examples/window_positioning.rs +++ b/crates/gpui/examples/window_positioning.rs @@ -2,63 +2,209 @@ use gpui::*; struct WindowContent { text: SharedString, + bounds: Bounds, + bg: Hsla, } impl Render for WindowContent { - fn render(&mut self, _cx: &mut ViewContext) -> impl IntoElement { + fn render(&mut self, cx: &mut ViewContext) -> impl IntoElement { + let window_bounds = cx.bounds(); + div() .flex() - .bg(rgb(0x1e2025)) + .flex_col() + .bg(self.bg) .size_full() - .justify_center() .items_center() - .text_xl() .text_color(rgb(0xffffff)) .child(self.text.clone()) + .child( + div() + .flex() + .flex_col() + .text_sm() + .items_center() + .size_full() + .child(format!( + "origin: {}, {} size: {}, {}", + self.bounds.origin.x, + self.bounds.origin.y, + self.bounds.size.width, + self.bounds.size.height + )) + .child(format!( + "cx.bounds() origin: {}, {} size {}, {}", + window_bounds.origin.x, + window_bounds.origin.y, + window_bounds.size.width, + window_bounds.size.height + )), + ) + } +} + +fn build_window_options(display_id: DisplayId, bounds: Bounds) -> WindowOptions { + WindowOptions { + // Set the bounds of the window in screen coordinates + window_bounds: Some(WindowBounds::Windowed(bounds)), + // Specify the display_id to ensure the window is created on the correct screen + display_id: Some(display_id), + titlebar: None, + window_background: WindowBackgroundAppearance::Transparent, + focus: false, + show: true, + kind: WindowKind::PopUp, + is_movable: false, + app_id: None, + window_min_size: None, + window_decorations: None, } } fn main() { App::new().run(|cx: &mut AppContext| { // Create several new windows, positioned in the top right corner of each screen + let size = Size { + width: px(350.), + height: px(75.), + }; + let margin_offset = px(150.); for screen in cx.displays() { - let options = { - let margin_right = px(16.); - let margin_height = px(-48.); - - let size = Size { - width: px(400.), - height: px(72.), - }; - - let bounds = gpui::Bounds:: { - origin: screen.bounds().upper_right() - - point(size.width + margin_right, margin_height), - size, - }; - - WindowOptions { - // Set the bounds of the window in screen coordinates - window_bounds: Some(WindowBounds::Windowed(bounds)), - // Specify the display_id to ensure the window is created on the correct screen - display_id: Some(screen.id()), - - titlebar: None, - window_background: WindowBackgroundAppearance::default(), - focus: false, - show: true, - kind: WindowKind::PopUp, - is_movable: false, - app_id: None, - window_min_size: None, - window_decorations: None, - } + let bounds = Bounds { + origin: point(margin_offset, margin_offset), + size, }; - cx.open_window(options, |cx| { + cx.open_window(build_window_options(screen.id(), bounds), |cx| { cx.new_view(|_| WindowContent { - text: format!("{:?}", screen.id()).into(), + text: format!("Top Left {:?}", screen.id()).into(), + bg: gpui::red(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: screen.bounds().upper_right() + - point(size.width + margin_offset, -margin_offset), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Top Right {:?}", screen.id()).into(), + bg: gpui::red(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: screen.bounds().lower_left() + - point(-margin_offset, size.height + margin_offset), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Bottom Left {:?}", screen.id()).into(), + bg: gpui::blue(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: screen.bounds().lower_right() + - point(size.width + margin_offset, size.height + margin_offset), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Bottom Right {:?}", screen.id()).into(), + bg: gpui::blue(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: point(screen.bounds().center().x - size.center().x, margin_offset), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Top Center {:?}", screen.id()).into(), + bg: gpui::black(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: point(margin_offset, screen.bounds().center().y - size.center().y), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Left Center {:?}", screen.id()).into(), + bg: gpui::black(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: point( + screen.bounds().center().x - size.center().x, + screen.bounds().center().y - size.center().y, + ), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Center {:?}", screen.id()).into(), + bg: gpui::black(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: point( + screen.bounds().size.width - size.width - margin_offset, + screen.bounds().center().y - size.center().y, + ), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Right Center {:?}", screen.id()).into(), + bg: gpui::black(), + bounds, + }) + }) + .unwrap(); + + let bounds = Bounds { + origin: point( + screen.bounds().center().x - size.center().x, + screen.bounds().size.height - size.height - margin_offset, + ), + size, + }; + + cx.open_window(build_window_options(screen.id(), bounds), |cx| { + cx.new_view(|_| WindowContent { + text: format!("Bottom Center {:?}", screen.id()).into(), + bg: gpui::black(), + bounds, }) }) .unwrap(); diff --git a/crates/gpui/src/platform/mac/window.rs b/crates/gpui/src/platform/mac/window.rs index e98e8f0f74..3ed4f22f14 100644 --- a/crates/gpui/src/platform/mac/window.rs +++ b/crates/gpui/src/platform/mac/window.rs @@ -452,7 +452,7 @@ impl MacWindowState { let bounds = Bounds::new( point( px((window_frame.origin.x - screen_frame.origin.x) as f32), - px((window_frame.origin.y - screen_frame.origin.y) as f32), + px((window_frame.origin.y + screen_frame.origin.y) as f32), ), size( px(window_frame.size.width as f32), @@ -546,7 +546,7 @@ impl MacWindow { let count: u64 = cocoa::foundation::NSArray::count(screens); for i in 0..count { let screen = cocoa::foundation::NSArray::objectAtIndex(screens, i); - let frame = NSScreen::visibleFrame(screen); + let frame = NSScreen::frame(screen); let display_id = display_id_for_screen(screen); if display_id == display.0 { screen_frame = Some(frame); @@ -557,7 +557,7 @@ impl MacWindow { let screen_frame = screen_frame.unwrap_or_else(|| { let screen = NSScreen::mainScreen(nil); target_screen = screen; - NSScreen::visibleFrame(screen) + NSScreen::frame(screen) }); let window_rect = NSRect::new(