From c25ddc8b5b0825d9b536a16aea83f2cab61c54fd Mon Sep 17 00:00:00 2001 From: Julian Orth Date: Sat, 12 Jul 2025 09:32:38 +0200 Subject: [PATCH] head-management: add mode-info-v1 extension --- src/ifs/head_management.rs | 8 +++ .../head_management/head_management_macros.rs | 1 + src/ifs/head_management/jay_head_ext.rs | 1 + .../jay_head_ext/jay_head_ext_mode_info_v1.rs | 51 +++++++++++++++++++ .../jay_head_manager_session_v1.rs | 6 +++ wire/jay_head_ext_mode_info_v1.txt | 9 ++++ wire/jay_head_manager_ext_mode_info_v1.txt | 7 +++ 7 files changed, 83 insertions(+) create mode 100644 src/ifs/head_management/jay_head_ext/jay_head_ext_mode_info_v1.rs create mode 100644 wire/jay_head_ext_mode_info_v1.txt create mode 100644 wire/jay_head_manager_ext_mode_info_v1.txt diff --git a/src/ifs/head_management.rs b/src/ifs/head_management.rs index 162d8e42..93a224c6 100644 --- a/src/ifs/head_management.rs +++ b/src/ifs/head_management.rs @@ -218,6 +218,10 @@ impl HeadManagers { ext.send_connected(state); head.session.schedule_done(); } + if let Some(ext) = &head.ext.mode_info_v1 { + ext.send_mode(state); + head.session.schedule_done(); + } if let Some(ext) = &head.ext.compositor_space_info_v1 { ext.send_inside_outside(state); head.session.schedule_done(); @@ -264,6 +268,10 @@ impl HeadManagers { ext.send_size(state); head.session.schedule_done(); } + if let Some(ext) = &head.ext.mode_info_v1 { + ext.send_mode(state); + head.session.schedule_done(); + } } } diff --git a/src/ifs/head_management/head_management_macros.rs b/src/ifs/head_management/head_management_macros.rs index db079acf..54b10996 100644 --- a/src/ifs/head_management/head_management_macros.rs +++ b/src/ifs/head_management/head_management_macros.rs @@ -395,4 +395,5 @@ declare_extensions! { compositor_space_scaler_v1: CompositorSpaceScalerV1, compositor_space_enabler_v1: CompositorSpaceEnablerV1, connector_info_v1: ConnectorInfoV1, + mode_info_v1: ModeInfoV1, } diff --git a/src/ifs/head_management/jay_head_ext.rs b/src/ifs/head_management/jay_head_ext.rs index 29d69415..af8d366a 100644 --- a/src/ifs/head_management/jay_head_ext.rs +++ b/src/ifs/head_management/jay_head_ext.rs @@ -5,3 +5,4 @@ pub(super) mod jay_head_ext_compositor_space_scaler_v1; pub(super) mod jay_head_ext_compositor_space_transformer_v1; pub(super) mod jay_head_ext_connector_info_v1; pub(super) mod jay_head_ext_core_info_v1; +pub(super) mod jay_head_ext_mode_info_v1; diff --git a/src/ifs/head_management/jay_head_ext/jay_head_ext_mode_info_v1.rs b/src/ifs/head_management/jay_head_ext/jay_head_ext_mode_info_v1.rs new file mode 100644 index 00000000..75602030 --- /dev/null +++ b/src/ifs/head_management/jay_head_ext/jay_head_ext_mode_info_v1.rs @@ -0,0 +1,51 @@ +use { + crate::{ + ifs::head_management::HeadState, + wire::{ + jay_head_ext_mode_info_v1::{JayHeadExtModeInfoV1RequestHandler, Mode}, + jay_head_manager_ext_mode_info_v1::JayHeadManagerExtModeInfoV1RequestHandler, + }, + }, + std::rc::Rc, +}; + +impl_mode_info_v1! { + version = 1, + after_announce = after_announce, + after_transaction = after_transaction, +} + +impl HeadName { + fn after_announce(&self, shared: &HeadState) { + self.send_mode(shared); + } + + fn after_transaction(&self, shared: &HeadState, tran: &HeadState) { + if shared.mode != tran.mode { + self.send_mode(shared); + } + } + + pub(in super::super) fn send_mode(&self, state: &HeadState) { + self.client.event(Mode { + self_id: self.id, + width: state.mode.width, + height: state.mode.height, + refresh_mhz: state.mode.refresh_rate_millihz, + }) + } +} + +impl JayHeadManagerExtModeInfoV1RequestHandler for MgrName { + type Error = ErrorName; + + mgr_common_req!(); +} + +impl JayHeadExtModeInfoV1RequestHandler for HeadName { + type Error = ErrorName; + + head_common_req!(); +} + +error!(); diff --git a/src/ifs/head_management/jay_head_manager_session_v1.rs b/src/ifs/head_management/jay_head_manager_session_v1.rs index cb6be4a7..82c6ea38 100644 --- a/src/ifs/head_management/jay_head_manager_session_v1.rs +++ b/src/ifs/head_management/jay_head_manager_session_v1.rs @@ -381,6 +381,7 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { COMPOSITOR_SPACE_INFO_SIZE = 1 << 3, COMPOSITOR_SPACE_INFO_TRANSFORM = 1 << 4, COMPOSITOR_SPACE_INFO_SCALE = 1 << 5, + MODE_INFO = 1 << 6, COMPOSITOR_SPACE_INFO_ENABLED = 1 << 13, } for head in self.heads.lock().values() { @@ -441,6 +442,11 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { } } } + if to_send.contains(MODE_INFO) + && let Some(i) = &head.ext.mode_info_v1 + { + i.send_mode(state); + } } slf.schedule_transaction_result(req.result, None)?; Ok(()) diff --git a/wire/jay_head_ext_mode_info_v1.txt b/wire/jay_head_ext_mode_info_v1.txt new file mode 100644 index 00000000..600e5eff --- /dev/null +++ b/wire/jay_head_ext_mode_info_v1.txt @@ -0,0 +1,9 @@ +request destroy (destructor) { + +} + +event mode { + width: i32, + height: i32, + refresh_mhz: u32, +} diff --git a/wire/jay_head_manager_ext_mode_info_v1.txt b/wire/jay_head_manager_ext_mode_info_v1.txt new file mode 100644 index 00000000..b1b5ec92 --- /dev/null +++ b/wire/jay_head_manager_ext_mode_info_v1.txt @@ -0,0 +1,7 @@ +request destroy (destructor) { + +} + +event head { + head: id(jay_head_ext_mode_info_v1) (new), +}