layer_shika_adapters/wayland/
config.rs1use 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}