diff --git a/src/ifs/head_management.rs b/src/ifs/head_management.rs index 920b3eb3..33b65fc9 100644 --- a/src/ifs/head_management.rs +++ b/src/ifs/head_management.rs @@ -103,6 +103,7 @@ impl HeadState { enum HeadOp { SetPosition(i32, i32), + SetTransform(Transform), SetScale(Scale), } diff --git a/src/ifs/head_management/head_management_macros.rs b/src/ifs/head_management/head_management_macros.rs index 031c33a8..dfc5a720 100644 --- a/src/ifs/head_management/head_management_macros.rs +++ b/src/ifs/head_management/head_management_macros.rs @@ -391,5 +391,6 @@ declare_extensions! { core_info_v1: CoreInfoV1, compositor_space_info_v1: CompositorSpaceInfoV1, compositor_space_positioner_v1: CompositorSpacePositionerV1, + compositor_space_transformer_v1: CompositorSpaceTransformerV1, compositor_space_scaler_v1: CompositorSpaceScalerV1, } diff --git a/src/ifs/head_management/jay_head_ext.rs b/src/ifs/head_management/jay_head_ext.rs index fbea35cc..9cdf85d8 100644 --- a/src/ifs/head_management/jay_head_ext.rs +++ b/src/ifs/head_management/jay_head_ext.rs @@ -1,4 +1,5 @@ pub(super) mod jay_head_ext_compositor_space_info_v1; pub(super) mod jay_head_ext_compositor_space_positioner_v1; 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_core_info_v1; diff --git a/src/ifs/head_management/jay_head_ext/jay_head_ext_compositor_space_transformer_v1.rs b/src/ifs/head_management/jay_head_ext/jay_head_ext_compositor_space_transformer_v1.rs new file mode 100644 index 00000000..4535c7af --- /dev/null +++ b/src/ifs/head_management/jay_head_ext/jay_head_ext_compositor_space_transformer_v1.rs @@ -0,0 +1,66 @@ +use { + crate::{ + ifs::head_management::{HeadOp, HeadState}, + utils::transform_ext::TransformExt, + wire::{ + jay_head_ext_compositor_space_transformer_v1::{ + JayHeadExtCompositorSpaceTransformerV1RequestHandler, SetTransform, + SupportedTransform, + }, + jay_head_manager_ext_compositor_space_transformer_v1::JayHeadManagerExtCompositorSpaceTransformerV1RequestHandler, + }, + }, + jay_config::video::Transform, + std::rc::Rc, +}; + +impl_compositor_space_transformer_v1! { + version = 1, + after_announce = after_announce, +} + +impl HeadName { + fn after_announce(&self, _shared: &HeadState) { + self.send_supported_transform(Transform::None); + self.send_supported_transform(Transform::Rotate90); + self.send_supported_transform(Transform::Rotate180); + self.send_supported_transform(Transform::Rotate270); + self.send_supported_transform(Transform::Flip); + self.send_supported_transform(Transform::FlipRotate90); + self.send_supported_transform(Transform::FlipRotate180); + self.send_supported_transform(Transform::FlipRotate270); + } + + fn send_supported_transform(&self, transform: Transform) { + self.client.event(SupportedTransform { + self_id: self.id, + transform: transform.to_wl() as _, + }); + } +} + +impl JayHeadManagerExtCompositorSpaceTransformerV1RequestHandler for MgrName { + type Error = ErrorName; + + mgr_common_req!(); +} + +impl JayHeadExtCompositorSpaceTransformerV1RequestHandler for HeadName { + type Error = ErrorName; + + head_common_req!(); + + fn set_transform(&self, req: SetTransform, _slf: &Rc) -> Result<(), Self::Error> { + self.common.assert_in_transaction()?; + let Some(transform) = Transform::from_wl(req.transform as _) else { + return Err(ErrorName::UnknownTransform(req.transform)); + }; + self.common.push_op(HeadOp::SetTransform(transform))?; + Ok(()) + } +} + +error! { + #[error("Unknown transform {0}")] + UnknownTransform(u32), +} 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 107bb6c3..e8dc9fb7 100644 --- a/src/ifs/head_management/jay_head_manager_session_v1.rs +++ b/src/ifs/head_management/jay_head_manager_session_v1.rs @@ -395,6 +395,12 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { state.position = (x, y); to_send |= COMPOSITOR_SPACE_INFO_POS; } + HeadOp::SetTransform(t) => { + state.transform = t; + state.update_size(); + to_send |= COMPOSITOR_SPACE_INFO_TRANSFORM; + to_send |= COMPOSITOR_SPACE_INFO_SIZE; + } HeadOp::SetScale(s) => { state.scale = s; state.update_size(); @@ -463,6 +469,7 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { { node.set_position(desired.position.0, desired.position.1); node.set_preferred_scale(desired.scale); + node.update_transform(desired.transform); } else if let Some(mi) = &desired.monitor_info { let pos = &self.client.state.persistent_output_states; let pos = match pos.get(&mi.output_id) { @@ -483,6 +490,7 @@ impl JayHeadManagerSessionV1RequestHandler for JayHeadManagerSessionV1 { }; pos.pos.set(desired.position); pos.scale.set(desired.scale); + pos.transform.set(desired.transform); } } slf.schedule_transaction_result(req.result, None)?; diff --git a/wire/jay_head_ext_compositor_space_transformer_v1.txt b/wire/jay_head_ext_compositor_space_transformer_v1.txt new file mode 100644 index 00000000..160b005d --- /dev/null +++ b/wire/jay_head_ext_compositor_space_transformer_v1.txt @@ -0,0 +1,15 @@ +request destroy (destructor) { + +} + +request set_transform { + transform: u32, +} + +event reset_supported_transforms { + +} + +event supported_transform { + transform: u32, +} diff --git a/wire/jay_head_manager_ext_compositor_space_transformer_v1.txt b/wire/jay_head_manager_ext_compositor_space_transformer_v1.txt new file mode 100644 index 00000000..ea4badd4 --- /dev/null +++ b/wire/jay_head_manager_ext_compositor_space_transformer_v1.txt @@ -0,0 +1,7 @@ +request destroy (destructor) { + +} + +event head { + head: id(jay_head_ext_compositor_space_transformer_v1) (new), +}