feat: support xdg foreign parenting

This commit is contained in:
Samuel Onoja committed 2026-09-25 00:44:43 +01:00
1 parent e59a524827
commit e57d355db2
3 files changed
+72

No files matched your search

+8
View File
@@ -27,6 +27,7 @@ use smithay::{
PrimarySelectionHandler, PrimarySelectionState, set_primary_focus,
},
},
xdg_foreign::{XdgForeignHandler, XdgForeignState},
},
};
@@ -150,6 +151,12 @@ impl PrimarySelectionHandler for Ferese {
}
}
impl XdgForeignHandler for Ferese {
fn xdg_foreign_state(&mut self) -> &mut XdgForeignState {
&mut self.xdg_foreign_state
}
}
smithay::delegate_compositor!(Ferese);
smithay::delegate_data_device!(Ferese);
smithay::delegate_fractional_scale!(Ferese);
@@ -165,4 +172,5 @@ smithay::delegate_single_pixel_buffer!(Ferese);
smithay::delegate_viewporter!(Ferese);
smithay::delegate_xdg_activation!(Ferese);
smithay::delegate_xdg_decoration!(Ferese);
smithay::delegate_xdg_foreign!(Ferese);
smithay::delegate_xdg_shell!(Ferese);
+25
View File
@@ -51,6 +51,31 @@ impl XdgShellHandler for Ferese {
}
}
fn parent_changed(&mut self, surface: ToplevelSurface) {
let Some(parent) = surface.parent() else {
return;
};
let parent = self.window_ids.iter().find_map(|(window, id)| {
window
.toplevel()
.is_some_and(|toplevel| toplevel.wl_surface() == &parent)
.then_some(*id)
});
let child = self
.space
.elements()
.find(|window| {
window
.toplevel()
.is_some_and(|toplevel| toplevel.wl_surface() == surface.wl_surface())
})
.cloned();
if let (Some(parent), Some(child)) = (parent, child) {
self.make_window_transient(&child, parent);
}
}
fn toplevel_destroyed(&mut self, surface: ToplevelSurface) {
let Some(window) = self
.space