1 | use wayland_client::{Connection, Dispatch, QueueHandle}; |
2 | use wayland_protocols_wlr::layer_shell::v1::client::{zwlr_layer_shell_v1, zwlr_layer_surface_v1}; |
3 | |
4 | use crate::{ |
5 | error::GlobalError, |
6 | globals::{GlobalData, ProvidesBoundGlobal}, |
7 | }; |
8 | |
9 | use super::{LayerShell, LayerShellHandler, LayerSurface, LayerSurfaceConfigure, LayerSurfaceData}; |
10 | |
11 | // Layer shell has only added requests and enum variants in versions 2-4, so its client-facing API |
12 | // is still compatible. |
13 | impl ProvidesBoundGlobal<zwlr_layer_shell_v1::ZwlrLayerShellV1, 1> for LayerShell { |
14 | fn bound_global(&self) -> Result<zwlr_layer_shell_v1::ZwlrLayerShellV1, GlobalError> { |
15 | Ok(self.wlr_layer_shell.clone()) |
16 | } |
17 | } |
18 | |
19 | impl ProvidesBoundGlobal<zwlr_layer_shell_v1::ZwlrLayerShellV1, 2> for LayerShell { |
20 | fn bound_global(&self) -> Result<zwlr_layer_shell_v1::ZwlrLayerShellV1, GlobalError> { |
21 | Ok(self.wlr_layer_shell.clone()) |
22 | } |
23 | } |
24 | |
25 | impl ProvidesBoundGlobal<zwlr_layer_shell_v1::ZwlrLayerShellV1, 3> for LayerShell { |
26 | fn bound_global(&self) -> Result<zwlr_layer_shell_v1::ZwlrLayerShellV1, GlobalError> { |
27 | Ok(self.wlr_layer_shell.clone()) |
28 | } |
29 | } |
30 | |
31 | impl ProvidesBoundGlobal<zwlr_layer_shell_v1::ZwlrLayerShellV1, 4> for LayerShell { |
32 | fn bound_global(&self) -> Result<zwlr_layer_shell_v1::ZwlrLayerShellV1, GlobalError> { |
33 | Ok(self.wlr_layer_shell.clone()) |
34 | } |
35 | } |
36 | |
37 | impl<D> Dispatch<zwlr_layer_shell_v1::ZwlrLayerShellV1, GlobalData, D> for LayerShell |
38 | where |
39 | D: Dispatch<zwlr_layer_shell_v1::ZwlrLayerShellV1, GlobalData> + LayerShellHandler + 'static, |
40 | { |
41 | fn event( |
42 | _: &mut D, |
43 | _: &zwlr_layer_shell_v1::ZwlrLayerShellV1, |
44 | _: zwlr_layer_shell_v1::Event, |
45 | _: &GlobalData, |
46 | _: &Connection, |
47 | _: &QueueHandle<D>, |
48 | ) { |
49 | unreachable!("zwlr_layer_shell_v1 has no events" ) |
50 | } |
51 | } |
52 | |
53 | impl<D> Dispatch<zwlr_layer_surface_v1::ZwlrLayerSurfaceV1, LayerSurfaceData, D> for LayerShell |
54 | where |
55 | D: Dispatch<zwlr_layer_surface_v1::ZwlrLayerSurfaceV1, LayerSurfaceData> |
56 | + LayerShellHandler |
57 | + 'static, |
58 | { |
59 | fn event( |
60 | data: &mut D, |
61 | surface: &zwlr_layer_surface_v1::ZwlrLayerSurfaceV1, |
62 | event: zwlr_layer_surface_v1::Event, |
63 | _udata: &LayerSurfaceData, |
64 | conn: &Connection, |
65 | qh: &QueueHandle<D>, |
66 | ) { |
67 | if let Some(layer_surface) = LayerSurface::from_wlr_surface(surface) { |
68 | match event { |
69 | zwlr_layer_surface_v1::Event::Configure { serial, width, height } => { |
70 | surface.ack_configure(serial); |
71 | |
72 | let configure = LayerSurfaceConfigure { new_size: (width, height) }; |
73 | data.configure(conn, qh, &layer_surface, configure, serial); |
74 | } |
75 | |
76 | zwlr_layer_surface_v1::Event::Closed => { |
77 | data.closed(conn, qh, &layer_surface); |
78 | } |
79 | |
80 | _ => unreachable!(), |
81 | } |
82 | } |
83 | } |
84 | } |
85 | |