61 lines
2.0 KiB
Rust
61 lines
2.0 KiB
Rust
use smithay::desktop::{PopupKind, WindowSurfaceType, layer_map_for_output};
|
|
use smithay::reexports::wayland_server::protocol::wl_surface::WlSurface;
|
|
use smithay::utils::{Logical, Rectangle};
|
|
use smithay::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_surface(self, surface.wl_surface());
|
|
}
|
|
|
|
fn dismiss_popup(&mut self, surface: PopupSurface) {
|
|
let outputs = self.surface_outputs(surface.wl_surface());
|
|
self.popups.cleanup();
|
|
crate::backends::direct::render_on(self, &outputs);
|
|
}
|
|
|
|
fn popup_repositioned(&mut self, surface: PopupSurface) {
|
|
crate::backends::direct::render_surface(self, surface.wl_surface());
|
|
}
|
|
|
|
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()
|
|
}
|
|
}
|