Skip to main content

smithay_client_toolkit/session_lock/
dispatch.rs

1use crate::{dispatch2::Dispatch2, globals::GlobalData};
2use std::sync::atomic::Ordering;
3use wayland_client::{Connection, QueueHandle};
4use wayland_protocols::ext::session_lock::v1::client::{
5    ext_session_lock_manager_v1, ext_session_lock_surface_v1, ext_session_lock_v1,
6};
7
8use super::{
9    SessionLock, SessionLockData, SessionLockHandler, SessionLockSurface,
10    SessionLockSurfaceConfigure, SessionLockSurfaceData,
11};
12
13impl<D> Dispatch2<ext_session_lock_manager_v1::ExtSessionLockManagerV1, D> for GlobalData {
14    fn event(
15        &self,
16        _state: &mut D,
17        _proxy: &ext_session_lock_manager_v1::ExtSessionLockManagerV1,
18        _event: ext_session_lock_manager_v1::Event,
19        _: &Connection,
20        _: &QueueHandle<D>,
21    ) {
22        unreachable!()
23    }
24}
25
26impl<D> Dispatch2<ext_session_lock_v1::ExtSessionLockV1, D> for SessionLockData
27where
28    D: SessionLockHandler,
29{
30    fn event(
31        &self,
32        state: &mut D,
33        proxy: &ext_session_lock_v1::ExtSessionLockV1,
34        event: ext_session_lock_v1::Event,
35        conn: &Connection,
36        qh: &QueueHandle<D>,
37    ) {
38        if let Some(session_lock) = SessionLock::from_ext_session_lock(proxy) {
39            match event {
40                ext_session_lock_v1::Event::Locked => {
41                    session_lock.0.locked.store(true, Ordering::SeqCst);
42                    state.locked(conn, qh, session_lock);
43                }
44                ext_session_lock_v1::Event::Finished => {
45                    state.finished(conn, qh, session_lock);
46                }
47                _ => unreachable!(),
48            }
49        }
50    }
51}
52
53impl<D> Dispatch2<ext_session_lock_surface_v1::ExtSessionLockSurfaceV1, D>
54    for SessionLockSurfaceData
55where
56    D: SessionLockHandler,
57{
58    fn event(
59        &self,
60        state: &mut D,
61        proxy: &ext_session_lock_surface_v1::ExtSessionLockSurfaceV1,
62        event: ext_session_lock_surface_v1::Event,
63        conn: &Connection,
64        qh: &QueueHandle<D>,
65    ) {
66        if let Some(session_lock_surface) = SessionLockSurface::from_ext_session_lock_surface(proxy)
67        {
68            match event {
69                ext_session_lock_surface_v1::Event::Configure { serial, width, height } => {
70                    proxy.ack_configure(serial);
71                    state.configure(
72                        conn,
73                        qh,
74                        session_lock_surface,
75                        SessionLockSurfaceConfigure { new_size: (width, height) },
76                        serial,
77                    );
78                }
79                _ => unreachable!(),
80            }
81        }
82    }
83}