Sharing a project displays a notification (window) on every screen. Previously there was an issue with the positioning of windows on all screens except the primary screen. As you can see here:  Now:  @mikayla-maki and I also decided to refactor the `WindowOptions` a bit. Previously you could specify bounds which controlled the positioning and size of the window in the global coordinate space, while also providing a display id (which screen to show the window on). This can lead to unusual behavior because you could theoretically specify a global bound which does not even belong to the display id which was provided. Therefore we changed the api to this: ```rust struct WindowOptions { /// The bounds of the window in screen coordinates /// None -> inherit, Some(bounds) -> set bounds. pub bounds: Option<Bounds<DevicePixels>>, /// The display to create the window on, if this is None, /// the window will be created on the main display pub display_id: Option<DisplayId>, } ``` This lets you specify a display id, which maps to the screen where the window should be created and bounds relative to the upper left of the screen. Release Notes: - Fixed positioning of popup windows (e.g. when sharing a project) when using multiple external displays. --------- Co-authored-by: Conrad Irwin <conrad.irwin@gmail.com>
44 lines
1.1 KiB
Rust
44 lines
1.1 KiB
Rust
use anyhow::Result;
|
|
use uuid::Uuid;
|
|
use x11rb::{connection::Connection as _, xcb_ffi::XCBConnection};
|
|
|
|
use crate::{Bounds, DevicePixels, DisplayId, PlatformDisplay, Size};
|
|
|
|
#[derive(Debug)]
|
|
pub(crate) struct X11Display {
|
|
x_screen_index: usize,
|
|
bounds: Bounds<DevicePixels>,
|
|
uuid: Uuid,
|
|
}
|
|
|
|
impl X11Display {
|
|
pub(crate) fn new(xc: &XCBConnection, x_screen_index: usize) -> Option<Self> {
|
|
let screen = xc.setup().roots.get(x_screen_index).unwrap();
|
|
Some(Self {
|
|
x_screen_index: x_screen_index,
|
|
bounds: Bounds {
|
|
origin: Default::default(),
|
|
size: Size {
|
|
width: DevicePixels(screen.width_in_pixels as i32),
|
|
height: DevicePixels(screen.height_in_pixels as i32),
|
|
},
|
|
},
|
|
uuid: Uuid::from_bytes([0; 16]),
|
|
})
|
|
}
|
|
}
|
|
|
|
impl PlatformDisplay for X11Display {
|
|
fn id(&self) -> DisplayId {
|
|
DisplayId(self.x_screen_index as u32)
|
|
}
|
|
|
|
fn uuid(&self) -> Result<Uuid> {
|
|
Ok(self.uuid)
|
|
}
|
|
|
|
fn bounds(&self) -> Bounds<DevicePixels> {
|
|
self.bounds
|
|
}
|
|
}
|