1use bitflags::bitflags;
  2use thiserror::Error;
  3use wayland_protocols_wlr::layer_shell::v1::client::{zwlr_layer_shell_v1, zwlr_layer_surface_v1};
  4
  5use crate::Pixels;
  6
  7/// The layer the surface is rendered on. Multiple surfaces can share a layer, and ordering within
  8/// a single layer is undefined.
  9#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
 10pub enum Layer {
 11    /// The background layer, typically used for wallpapers.
 12    Background,
 13
 14    /// The bottom layer.
 15    Bottom,
 16
 17    /// The top layer, typically used for fullscreen windows.
 18    Top,
 19
 20    /// The overlay layer, used for surfaces that should always be on top.
 21    #[default]
 22    Overlay,
 23}
 24
 25impl From<Layer> for zwlr_layer_shell_v1::Layer {
 26    fn from(layer: Layer) -> Self {
 27        match layer {
 28            Layer::Background => Self::Background,
 29            Layer::Bottom => Self::Bottom,
 30            Layer::Top => Self::Top,
 31            Layer::Overlay => Self::Overlay,
 32        }
 33    }
 34}
 35
 36bitflags! {
 37    /// Screen anchor point for layer_shell surfaces. These can be used in any combination, e.g.
 38    /// specifying `Anchor::LEFT | Anchor::RIGHT` will stretch the surface across the width of the
 39    /// screen.
 40    #[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
 41    pub struct Anchor: u32 {
 42        /// Anchor to the top edge of the screen.
 43        const TOP = 1;
 44        /// Anchor to the bottom edge of the screen.
 45        const BOTTOM = 2;
 46        /// Anchor to the left edge of the screen.
 47        const LEFT = 4;
 48        /// Anchor to the right edge of the screen.
 49        const RIGHT = 8;
 50    }
 51}
 52
 53impl From<Anchor> for zwlr_layer_surface_v1::Anchor {
 54    fn from(anchor: Anchor) -> Self {
 55        Self::from_bits_truncate(anchor.bits())
 56    }
 57}
 58
 59/// Keyboard interactivity mode for the layer_shell surfaces.
 60#[derive(Copy, Clone, Debug, Default, PartialEq, Eq)]
 61pub enum KeyboardInteractivity {
 62    /// No keyboard inputs will be delivered to the surface and it won't be able to receive
 63    /// keyboard focus.
 64    None,
 65
 66    /// The surface will receive exclusive keyboard focus as long as it is above the shell surface
 67    /// layer, and no other layer_shell surfaces are above it.
 68    Exclusive,
 69
 70    /// The surface can be focused similarly to a normal window.
 71    #[default]
 72    OnDemand,
 73}
 74
 75impl From<KeyboardInteractivity> for zwlr_layer_surface_v1::KeyboardInteractivity {
 76    fn from(value: KeyboardInteractivity) -> Self {
 77        match value {
 78            KeyboardInteractivity::None => Self::None,
 79            KeyboardInteractivity::Exclusive => Self::Exclusive,
 80            KeyboardInteractivity::OnDemand => Self::OnDemand,
 81        }
 82    }
 83}
 84
 85/// Options for creating a layer_shell window.
 86#[derive(Clone, Debug, Default, PartialEq, Eq)]
 87pub struct LayerShellOptions {
 88    /// The namespace for the surface, mostly used by compositors to apply rules, can not be
 89    /// changed after the surface is created.
 90    pub namespace: String,
 91    /// The layer the surface is rendered on.
 92    pub layer: Layer,
 93    /// The anchor point of the surface.
 94    pub anchor: Anchor,
 95    /// Requests that the compositor avoids occluding an area with other surfaces.
 96    pub exclusive_zone: Option<Pixels>,
 97    /// The anchor point of the exclusive zone, will be determined using the anchor if left
 98    /// unspecified.
 99    pub exclusive_edge: Option<Anchor>,
100    /// Margins between the surface and its anchor point(s).
101    /// Specified in CSS order: top, right, bottom, left.
102    pub margin: Option<(Pixels, Pixels, Pixels, Pixels)>,
103    /// How keyboard events should be delivered to the surface.
104    pub keyboard_interactivity: KeyboardInteractivity,
105}
106
107/// An error indicating that an action failed because the compositor doesn't support the required
108/// layer_shell protocol.
109#[derive(Debug, Error)]
110#[error("Compositor doesn't support zwlr_layer_shell_v1")]
111pub struct LayerShellNotSupportedError;