diff --git a/deploy-notes.md b/deploy-notes.md index 01dfd8fc..aec75929 100644 --- a/deploy-notes.md +++ b/deploy-notes.md @@ -1,5 +1,9 @@ # Unreleased +- Needs jay-config release. +- Needs jay-toml-config release. +- Needs jay-compositor release. + # 1.7.0 - Needs jay-config release. diff --git a/docs/features.md b/docs/features.md index b0451a02..15a2e344 100644 --- a/docs/features.md +++ b/docs/features.md @@ -143,7 +143,7 @@ Jay supports the following wayland protocols: | ext_data_control_manager_v1 | 1 | Yes | | ext_foreign_toplevel_image_capture_source_manager_v1 | 1 | | | ext_foreign_toplevel_list_v1 | 1 | Yes | -| ext_idle_notifier_v1 | 1 | Yes | +| ext_idle_notifier_v1 | 2 | Yes | | ext_image_copy_capture_manager_v1 | 1[^composited] | Yes | | ext_output_image_capture_source_manager_v1 | 1 | | | ext_session_lock_manager_v1 | 1 | Yes | diff --git a/release-notes.md b/release-notes.md index e7568aea..86ca1c28 100644 --- a/release-notes.md +++ b/release-notes.md @@ -4,6 +4,7 @@ - Add support fo ext-data-control-v1. - Implement wl-fixes. - Implement ei_touchscreen v2. +- Implement idle-notification v2. # 1.7.0 (2024-10-25) diff --git a/src/ifs/ext_idle_notifier_v1.rs b/src/ifs/ext_idle_notifier_v1.rs index ca70529b..4135834f 100644 --- a/src/ifs/ext_idle_notifier_v1.rs +++ b/src/ifs/ext_idle_notifier_v1.rs @@ -6,7 +6,7 @@ use { leaks::Tracker, object::{Object, Version}, utils::errorfmt::ErrorFmt, - wire::{ext_idle_notifier_v1::*, ExtIdleNotifierV1Id}, + wire::{ext_idle_notifier_v1::*, ExtIdleNotificationV1Id, ExtIdleNotifierV1Id, WlSeatId}, }, std::{cell::Cell, rc::Rc}, thiserror::Error, @@ -46,6 +46,36 @@ pub struct ExtIdleNotifierV1 { pub version: Version, } +impl ExtIdleNotifierV1 { + fn create_notification( + &self, + id: ExtIdleNotificationV1Id, + timeout: u32, + seat: WlSeatId, + ) -> Result<(), ExtIdleNotifierV1Error> { + let seat = self.client.lookup(seat)?; + let notification = Rc::new(ExtIdleNotificationV1 { + id, + client: self.client.clone(), + tracker: Default::default(), + resume: Default::default(), + task: Cell::new(None), + seat: seat.global.clone(), + duration_usec: (timeout as u64).max(1000).saturating_mul(1000), + version: self.version, + }); + track!(self.client, notification); + self.client.add_client_obj(¬ification)?; + let future = self + .client + .state + .eng + .spawn("idle notifier", run(notification.clone())); + notification.task.set(Some(future)); + Ok(()) + } +} + impl ExtIdleNotifierV1RequestHandler for ExtIdleNotifierV1 { type Error = ExtIdleNotifierV1Error; @@ -59,26 +89,15 @@ impl ExtIdleNotifierV1RequestHandler for ExtIdleNotifierV1 { req: GetIdleNotification, _slf: &Rc, ) -> Result<(), Self::Error> { - let seat = self.client.lookup(req.seat)?; - let notification = Rc::new(ExtIdleNotificationV1 { - id: req.id, - client: self.client.clone(), - tracker: Default::default(), - resume: Default::default(), - task: Cell::new(None), - seat: seat.global.clone(), - duration_usec: (req.timeout as u64).max(1000).saturating_mul(1000), - version: self.version, - }); - track!(self.client, notification); - self.client.add_client_obj(¬ification)?; - let future = self - .client - .state - .eng - .spawn("idle notifier", run(notification.clone())); - notification.task.set(Some(future)); - Ok(()) + self.create_notification(req.id, req.timeout, req.seat) + } + + fn get_input_idle_notification( + &self, + req: GetInputIdleNotification, + _slf: &Rc, + ) -> Result<(), Self::Error> { + self.create_notification(req.id, req.timeout, req.seat) } } @@ -118,7 +137,7 @@ impl Global for ExtIdleNotifierV1Global { } fn version(&self) -> u32 { - 1 + 2 } fn required_caps(&self) -> ClientCaps { diff --git a/wire/ext_idle_notifier_v1.txt b/wire/ext_idle_notifier_v1.txt index 99f95d47..bf3e1e10 100644 --- a/wire/ext_idle_notifier_v1.txt +++ b/wire/ext_idle_notifier_v1.txt @@ -8,3 +8,9 @@ request get_idle_notification { timeout: u32, seat: id(wl_seat), } + +request get_input_idle_notification { + id: id(ext_idle_notification_v1), + timeout: u32, + seat: id(wl_seat), +}