feat: support authorized input methods

This commit is contained in:
Samuel Onoja committed 2026-09-25 01:07:44 +01:00
1 parent 6dc2a5300e
commit f6dce3316a
4 files changed
+87 -1

No files matched your search

+61
View File
@@ -0,0 +1,61 @@
use smithay::{
desktop::{PopupKind, WindowSurfaceType, layer_map_for_output},
reexports::wayland_server::protocol::wl_surface::WlSurface,
utils::{Logical, Rectangle},
wayland::input_method::{InputMethodHandler, PopupSurface},
};
use crate::Ferese;
impl InputMethodHandler for Ferese {
fn new_popup(&mut self, surface: PopupSurface) {
if let Err(error) = self
.popups
.track_popup(PopupKind::InputMethod(surface.clone()))
{
tracing::warn!(?error, "failed to track input method popup");
}
crate::backends::direct::render_all(self);
}
fn dismiss_popup(&mut self, _surface: PopupSurface) {
self.popups.cleanup();
crate::backends::direct::render_all(self);
}
fn popup_repositioned(&mut self, _surface: PopupSurface) {
crate::backends::direct::render_all(self);
}
fn parent_geometry(&self, parent: &WlSurface) -> Rectangle<i32, Logical> {
if let Some(geometry) = self.space.elements().find_map(|window| {
window
.toplevel()
.is_some_and(|toplevel| toplevel.wl_surface() == parent)
.then(|| self.space.element_geometry(window))
.flatten()
}) {
return geometry;
}
let Some(layer) = self
.space
.layer_for_surface(parent, WindowSurfaceType::TOPLEVEL)
else {
return Rectangle::default();
};
self.space
.outputs()
.find_map(|output| {
let output_geometry = self.space.output_geometry(output)?;
let layer_geometry = layer_map_for_output(output).layer_geometry(&layer)?;
Some(Rectangle::new(
output_geometry.loc + layer_geometry.loc,
layer_geometry.size,
))
})
.unwrap_or_default()
}
}