1
0
Fork 0
forked from wry/wry

xdg-popup: handle popup position failures gracefully

This commit is contained in:
Julian Orth 2024-05-06 23:45:50 +02:00
parent 0d7a07ec40
commit 381b71e09c

View file

@ -105,12 +105,8 @@ impl XdgPopup {
.event(PopupDone { self_id: self.id }) .event(PopupDone { self_id: self.id })
} }
fn update_position(&self, parent: &XdgSurface) -> Result<(), XdgPopupError> { fn update_position(&self, parent: &XdgSurface) {
// let parent = parent.extents.get();
let positioner = self.pos.borrow_mut(); let positioner = self.pos.borrow_mut();
// if !parent.contains_rect(&positioner.ar) {
// return Err(XdgPopupError::AnchorRectOutside);
// }
let parent_abs = parent.absolute_desired_extents.get(); let parent_abs = parent.absolute_desired_extents.get();
let mut rel_pos = positioner.get_position(false, false); let mut rel_pos = positioner.get_position(false, false);
let mut abs_pos = rel_pos.move_(parent_abs.x1(), parent_abs.y1()); let mut abs_pos = rel_pos.move_(parent_abs.x1(), parent_abs.y1());
@ -174,26 +170,29 @@ impl XdgPopup {
dy2 = -overflow.bottom.max(0); dy2 = -overflow.bottom.max(0);
} }
if dx1 > 0 || dx2 < 0 || dy1 > 0 || dy2 < 0 { if dx1 > 0 || dx2 < 0 || dy1 > 0 || dy2 < 0 {
abs_pos = Rect::new( let maybe_abs_pos = Rect::new(
abs_pos.x1() + dx1, abs_pos.x1() + dx1,
abs_pos.y1() + dy1, abs_pos.y1() + dy1,
abs_pos.x2() + dx2, abs_pos.x2() + dx2,
abs_pos.y2() + dy2, abs_pos.y2() + dy2,
) );
.unwrap(); // If the popup is completely outside the output, this will fail. Just
rel_pos = Rect::new_sized( // use its position as is.
abs_pos.x1() - parent_abs.x1(), if let Some(maybe_abs_pos) = maybe_abs_pos {
abs_pos.y1() - parent_abs.y1(), abs_pos = maybe_abs_pos;
abs_pos.width(), rel_pos = Rect::new_sized(
abs_pos.height(), abs_pos.x1() - parent_abs.x1(),
) abs_pos.y1() - parent_abs.y1(),
.unwrap(); abs_pos.width(),
abs_pos.height(),
)
.unwrap();
}
} }
} }
} }
self.relative_position.set(rel_pos); self.relative_position.set(rel_pos);
self.xdg.set_absolute_desired_extents(&abs_pos); self.xdg.set_absolute_desired_extents(&abs_pos);
Ok(())
} }
pub fn update_absolute_position(&self) { pub fn update_absolute_position(&self) {
@ -230,7 +229,7 @@ impl XdgPopupRequestHandler for XdgPopup {
fn reposition(&self, req: Reposition, _slf: &Rc<Self>) -> Result<(), Self::Error> { fn reposition(&self, req: Reposition, _slf: &Rc<Self>) -> Result<(), Self::Error> {
*self.pos.borrow_mut() = self.xdg.surface.client.lookup(req.positioner)?.value(); *self.pos.borrow_mut() = self.xdg.surface.client.lookup(req.positioner)?.value();
if let Some(parent) = self.parent.get() { if let Some(parent) = self.parent.get() {
self.update_position(&parent)?; self.update_position(&parent);
let rel = self.relative_position.get(); let rel = self.relative_position.get();
self.send_repositioned(req.token); self.send_repositioned(req.token);
self.send_configure(rel.x1(), rel.y1(), rel.width(), rel.height()); self.send_configure(rel.x1(), rel.y1(), rel.width(), rel.height());
@ -385,7 +384,7 @@ impl StackedNode for XdgPopup {
impl XdgSurfaceExt for XdgPopup { impl XdgSurfaceExt for XdgPopup {
fn initial_configure(self: Rc<Self>) -> Result<(), XdgSurfaceError> { fn initial_configure(self: Rc<Self>) -> Result<(), XdgSurfaceError> {
if let Some(parent) = self.parent.get() { if let Some(parent) = self.parent.get() {
self.update_position(&parent)?; self.update_position(&parent);
let rel = self.relative_position.get(); let rel = self.relative_position.get();
self.send_configure(rel.x1(), rel.y1(), rel.width(), rel.height()); self.send_configure(rel.x1(), rel.y1(), rel.width(), rel.height());
} }