diff --git a/jay-config/src/_private/client.rs b/jay-config/src/_private/client.rs index ee33bad5..cbf40c1d 100644 --- a/jay-config/src/_private/client.rs +++ b/jay-config/src/_private/client.rs @@ -45,6 +45,7 @@ pub(crate) struct Client { on_new_connector: RefCell>>, on_new_drm_device: RefCell>>, on_del_drm_device: RefCell>>, + on_idle: RefCell>>, bufs: RefCell>>, reload: Cell, } @@ -131,6 +132,7 @@ pub unsafe extern "C" fn init( on_new_connector: Default::default(), on_new_drm_device: Default::default(), on_del_drm_device: Default::default(), + on_idle: Default::default(), bufs: Default::default(), reload: Cell::new(false), }); @@ -532,6 +534,10 @@ impl Client { *self.on_new_connector.borrow_mut() = Some(Rc::new(f)); } + pub fn on_idle(&self, f: F) { + *self.on_idle.borrow_mut() = Some(Rc::new(f)); + } + pub fn on_connector_connected(&self, f: F) { *self.on_connector_connected.borrow_mut() = Some(Rc::new(f)); } @@ -718,6 +724,12 @@ impl Client { handler(device); } } + ServerMessage::Idle => { + let handler = self.on_idle.borrow_mut(); + if let Some(handler) = handler.deref() { + handler(); + } + } } } diff --git a/jay-config/src/_private/ipc.rs b/jay-config/src/_private/ipc.rs index 84acb03f..5c2de064 100644 --- a/jay-config/src/_private/ipc.rs +++ b/jay-config/src/_private/ipc.rs @@ -54,6 +54,7 @@ pub enum ServerMessage { DelDrmDev { device: DrmDevice, }, + Idle, } #[derive(Encode, BorrowDecode, Debug)] diff --git a/jay-config/src/lib.rs b/jay-config/src/lib.rs index aafb8dc1..051e910d 100644 --- a/jay-config/src/lib.rs +++ b/jay-config/src/lib.rs @@ -132,3 +132,8 @@ impl Display for PciId { write!(f, "{:04x}:{:04x}", self.vendor, self.model) } } + +/// Sets the callback to be called when the display goes idle. +pub fn on_idle(f: F) { + get!().on_idle(f) +} diff --git a/src/config.rs b/src/config.rs index 523ce7e8..00f9cb46 100644 --- a/src/config.rs +++ b/src/config.rs @@ -125,6 +125,10 @@ impl ConfigProxy { pub fn clear(&self) { self.send(&ServerMessage::Clear); } + + pub fn idle(&self) { + self.send(&ServerMessage::Idle); + } } impl Drop for ConfigProxy { diff --git a/src/tasks/idle.rs b/src/tasks/idle.rs index 5787de03..936c0d47 100644 --- a/src/tasks/idle.rs +++ b/src/tasks/idle.rs @@ -68,6 +68,9 @@ impl Idle { let since = duration_since(self.last_input); if since >= timeout { if !timeout.is_zero() && !self.is_inhibited { + if let Some(config) = self.state.config.get() { + config.idle(); + } self.backend.set_idle(true); self.idle = true; }