// SPDX-License-Identifier: GPL-3.0-only use crate::{shell::PendingLayer, utils::prelude::*}; use smithay::{ desktop::{LayerSurface, PopupKind, WindowSurfaceType, layer_map_for_output}, output::Output, reexports::wayland_server::protocol::wl_output::WlOutput, wayland::shell::{ wlr_layer::{ Layer, LayerSurface as WlrLayerSurface, WlrLayerShellHandler, WlrLayerShellState, }, xdg::PopupSurface, }, }; impl WlrLayerShellHandler for State { fn shell_state(&mut self) -> &mut WlrLayerShellState { &mut self.common.layer_shell_state } fn new_layer_surface( &mut self, surface: WlrLayerSurface, wl_output: Option, _layer: Layer, namespace: String, ) { let mut shell = self.common.shell.write(); let seat = shell.seats.last_active().clone(); let output = wl_output .as_ref() .and_then(Output::from_resource) .unwrap_or_else(|| seat.active_output()); shell.pending_layers.push(PendingLayer { surface: LayerSurface::new(surface, namespace), output, seat, }); } fn new_popup(&mut self, _parent: WlrLayerSurface, popup: PopupSurface) { self.common .shell .read() .unconstrain_popup(&PopupKind::from(popup.clone())); if let Err(err) = popup.send_configure() { tracing::warn!("Unable to configure popup. {err:?}",); } else { self.common .popups .track_popup(PopupKind::from(popup)) .unwrap(); } } fn layer_destroyed(&mut self, surface: WlrLayerSurface) { let mut shell = self.common.shell.write(); let maybe_output = shell .outputs() .find(|o| { let map = layer_map_for_output(o); map.layer_for_surface(surface.wl_surface(), WindowSurfaceType::TOPLEVEL) .is_some() }) .cloned(); if let Some(output) = maybe_output { { let mut map = layer_map_for_output(&output); let layer = map .layer_for_surface(surface.wl_surface(), WindowSurfaceType::TOPLEVEL) .unwrap() .clone(); map.unmap_layer(&layer); } shell.workspaces.recalculate(); self.backend.schedule_render(&output); } } }