layer_shika_adapters/wayland/
config.rs

1use layer_shika_domain::config::SurfaceConfig as DomainSurfaceConfig;
2use layer_shika_domain::value_objects::anchor::AnchorEdges;
3use layer_shika_domain::value_objects::handle::SurfaceHandle;
4use layer_shika_domain::value_objects::keyboard_interactivity::KeyboardInteractivity as DomainKeyboardInteractivity;
5use layer_shika_domain::value_objects::layer::Layer;
6use layer_shika_domain::value_objects::margins::Margins;
7use layer_shika_domain::value_objects::output_policy::OutputPolicy;
8use slint_interpreter::{CompilationResult, ComponentDefinition};
9use smithay_client_toolkit::reexports::protocols_wlr::layer_shell::v1::client::{
10    zwlr_layer_shell_v1::{self},
11    zwlr_layer_surface_v1::{Anchor, KeyboardInteractivity as WaylandKeyboardInteractivity},
12};
13use std::rc::Rc;
14
15#[derive(Debug, Clone, Copy)]
16pub(crate) struct LayerSurfaceConfig {
17    pub anchor: Anchor,
18    pub margin: Margins,
19    pub exclusive_zone: i32,
20    pub keyboard_interactivity: WaylandKeyboardInteractivity,
21    pub height: u32,
22    pub width: u32,
23}
24
25#[derive(Clone)]
26pub struct WaylandSurfaceConfig {
27    pub surface_handle: SurfaceHandle,
28    pub surface_name: String,
29    pub height: u32,
30    pub width: u32,
31    pub layer: zwlr_layer_shell_v1::Layer,
32    pub margin: Margins,
33    pub anchor: Anchor,
34    pub keyboard_interactivity: WaylandKeyboardInteractivity,
35    pub exclusive_zone: i32,
36    pub scale_factor: f32,
37    pub namespace: String,
38    pub component_definition: ComponentDefinition,
39    pub compilation_result: Option<Rc<CompilationResult>>,
40    pub output_policy: OutputPolicy,
41}
42
43impl WaylandSurfaceConfig {
44    #[must_use]
45    pub fn from_domain_config(
46        surface_handle: SurfaceHandle,
47        surface_name: impl Into<String>,
48        component_definition: ComponentDefinition,
49        compilation_result: Option<Rc<CompilationResult>>,
50        domain_config: DomainSurfaceConfig,
51    ) -> Self {
52        Self {
53            surface_handle,
54            surface_name: surface_name.into(),
55            height: domain_config.dimensions.height(),
56            width: domain_config.dimensions.width(),
57            layer: convert_layer(domain_config.layer),
58            margin: domain_config.margin,
59            anchor: convert_anchor(domain_config.anchor),
60            keyboard_interactivity: convert_keyboard_interactivity(
61                domain_config.keyboard_interactivity,
62            ),
63            exclusive_zone: domain_config.exclusive_zone,
64            scale_factor: domain_config.scale_factor.value(),
65            namespace: domain_config.namespace,
66            component_definition,
67            compilation_result,
68            output_policy: domain_config.output_policy,
69        }
70    }
71}
72
73const fn convert_layer(layer: Layer) -> zwlr_layer_shell_v1::Layer {
74    match layer {
75        Layer::Background => zwlr_layer_shell_v1::Layer::Background,
76        Layer::Bottom => zwlr_layer_shell_v1::Layer::Bottom,
77        Layer::Top => zwlr_layer_shell_v1::Layer::Top,
78        Layer::Overlay => zwlr_layer_shell_v1::Layer::Overlay,
79    }
80}
81
82const fn convert_anchor(anchor: AnchorEdges) -> Anchor {
83    let mut result = Anchor::empty();
84
85    if anchor.has_top() {
86        result = result.union(Anchor::Top);
87    }
88    if anchor.has_bottom() {
89        result = result.union(Anchor::Bottom);
90    }
91    if anchor.has_left() {
92        result = result.union(Anchor::Left);
93    }
94    if anchor.has_right() {
95        result = result.union(Anchor::Right);
96    }
97
98    result
99}
100
101const fn convert_keyboard_interactivity(
102    mode: DomainKeyboardInteractivity,
103) -> WaylandKeyboardInteractivity {
104    match mode {
105        DomainKeyboardInteractivity::None => WaylandKeyboardInteractivity::None,
106        DomainKeyboardInteractivity::Exclusive => WaylandKeyboardInteractivity::Exclusive,
107        DomainKeyboardInteractivity::OnDemand => WaylandKeyboardInteractivity::OnDemand,
108    }
109}
110
111#[derive(Clone)]
112pub struct ShellSurfaceConfig {
113    pub name: String,
114    pub config: WaylandSurfaceConfig,
115}
116
117#[derive(Clone)]
118pub struct MultiSurfaceConfig {
119    pub surfaces: Vec<ShellSurfaceConfig>,
120    pub compilation_result: Rc<CompilationResult>,
121}
122
123impl MultiSurfaceConfig {
124    pub fn new(compilation_result: Rc<CompilationResult>) -> Self {
125        Self {
126            surfaces: Vec::new(),
127            compilation_result,
128        }
129    }
130
131    #[must_use]
132    pub fn add_surface(mut self, name: impl Into<String>, config: WaylandSurfaceConfig) -> Self {
133        self.surfaces.push(ShellSurfaceConfig {
134            name: name.into(),
135            config,
136        });
137        self
138    }
139
140    pub fn primary_config(&self) -> Option<&WaylandSurfaceConfig> {
141        self.surfaces.first().map(|s| &s.config)
142    }
143}