feat: support authorized input methods
This commit is contained in:
1 parent
6dc2a5300e
commit
f6dce3316a
4 files changed
+87
-1
No files matched your search
@@ -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()
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user