layer_shell.rs

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