miracle_plugin/
placement.rs1use super::bindings;
2use super::container::*;
3use super::core::*;
4use super::window::*;
5use super::workspace::*;
6use glam::Mat4;
7
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Default)]
9#[repr(u32)]
10pub enum WindowManagementStrategy {
11 #[default]
13 System = 0,
14 Tiled = 1,
16 Freestyle = 2,
18}
19
20impl From<WindowManagementStrategy> for bindings::miracle_window_management_strategy_t {
21 fn from(value: WindowManagementStrategy) -> Self {
22 value as bindings::miracle_window_management_strategy_t
23 }
24}
25
26impl TryFrom<bindings::miracle_window_management_strategy_t> for WindowManagementStrategy {
27 type Error = ();
28
29 fn try_from(
30 value: bindings::miracle_window_management_strategy_t,
31 ) -> Result<Self, Self::Error> {
32 match value {
33 0 => Ok(Self::System),
34 1 => Ok(Self::Tiled),
35 2 => Ok(Self::Freestyle),
36 _ => Err(()),
37 }
38 }
39}
40
41#[derive(Debug, Clone, Default)]
42pub struct TiledPlacement {
43 pub parent: Option<Container>,
45 pub index: u32,
47 pub layout_scheme: LayoutScheme,
49}
50
51impl From<TiledPlacement> for bindings::miracle_tiled_placement_t {
52 fn from(value: TiledPlacement) -> Self {
53 Self {
54 parent_internal: value.parent.map_or(0, |c| c.id()),
55 index: value.index,
56 layout_scheme: value.layout_scheme.into(),
57 }
58 }
59}
60
61#[derive(Debug, Clone)]
63pub struct FreestylePlacement {
64 pub top_left: Point,
66 pub depth_layer: DepthLayer,
68 pub workspace: Option<Workspace>,
70 pub size: Size,
72 pub transform: Mat4,
76 pub alpha: f32,
80 pub resizable: bool,
84 pub movable: bool,
88}
89
90impl Default for FreestylePlacement {
91 fn default() -> Self {
92 Self {
93 top_left: Point::default(),
94 depth_layer: DepthLayer::default(),
95 workspace: None,
96 size: Size::default(),
97 transform: Mat4::IDENTITY,
98 alpha: 1.0,
99 resizable: true,
100 movable: true,
101 }
102 }
103}
104
105impl From<FreestylePlacement> for bindings::miracle_freestyle_placement_t {
106 fn from(value: FreestylePlacement) -> Self {
107 Self {
108 top_left: value.top_left.into(),
109 depth_layer: value.depth_layer.into(),
110 workspace_internal: value.workspace.map_or(0, |w| w.id()),
111 size: value.size.into(),
112 transform: mat4_to_f32_array(value.transform),
113 alpha: value.alpha,
114 resizable: value.resizable as i32,
115 movable: value.movable as i32,
116 }
117 }
118}
119
120#[derive(Debug, Clone)]
122pub struct Placement {
123 pub strategy: WindowManagementStrategy,
125 pub freestyle: FreestylePlacement,
127 pub tiled: TiledPlacement,
129}
130
131impl Default for Placement {
132 fn default() -> Self {
133 Self {
134 strategy: WindowManagementStrategy::default(),
135 freestyle: FreestylePlacement::default(),
136 tiled: TiledPlacement::default(),
137 }
138 }
139}
140
141impl Placement {
142 pub fn set_c(&self, out: &mut bindings::miracle_placement_t) {
144 out.strategy = self.strategy.into();
145 out.freestyle_placement = self.freestyle.clone().into();
146 out.tiled_placement = self.tiled.clone().into();
147 }
148}
149
150impl From<Placement> for bindings::miracle_placement_t {
151 fn from(value: Placement) -> Self {
152 Self {
153 strategy: value.strategy.into(),
154 freestyle_placement: value.freestyle.clone().into(),
155 tiled_placement: value.tiled.clone().into(),
156 }
157 }
158}