diff --git a/src/backend/kms/device.rs b/src/backend/kms/device.rs index a0949bc8..7d6c12f4 100644 --- a/src/backend/kms/device.rs +++ b/src/backend/kms/device.rs @@ -645,10 +645,10 @@ fn populate_modes( output.add_mode(mode); } output.set_preferred(output_mode); + let transform = drm_helpers::panel_orientation(drm, conn).unwrap_or(Transform::Normal); output.change_current_state( Some(output_mode), - // TODO: Readout property for monitor rotation - Some(Transform::Normal), + Some(transform), Some(Scale::Fractional(scale)), Some(Point::from((position.0 as i32, position.1 as i32))), ); @@ -663,6 +663,7 @@ fn populate_modes( position, max_bpc, scale, + transform, ..std::mem::take(&mut *output_config) }; diff --git a/src/backend/kms/drm_helpers.rs b/src/backend/kms/drm_helpers.rs index 909c6a27..2724a8bd 100644 --- a/src/backend/kms/drm_helpers.rs +++ b/src/backend/kms/drm_helpers.rs @@ -1,13 +1,16 @@ // SPDX-License-Identifier: GPL-3.0-only use anyhow::{anyhow, Result}; -use smithay::reexports::drm::control::{ - atomic::AtomicModeReq, - connector::{self, State as ConnectorState}, - crtc, - dumbbuffer::DumbBuffer, - property, AtomicCommitFlags, Device as ControlDevice, Mode, ModeFlags, PlaneType, - ResourceHandle, +use smithay::{ + reexports::drm::control::{ + atomic::AtomicModeReq, + connector::{self, State as ConnectorState}, + crtc, + dumbbuffer::DumbBuffer, + property, AtomicCommitFlags, Device as ControlDevice, Mode, ModeFlags, PlaneType, + ResourceHandle, + }, + utils::Transform, }; use std::{ collections::HashMap, @@ -419,3 +422,21 @@ pub fn set_max_bpc(dev: &impl ControlDevice, conn: connector::Handle, bpc: u32) _ => unreachable!(), }) } + +pub fn panel_orientation(dev: &impl ControlDevice, conn: connector::Handle) -> Result { + let (val_type, val) = get_property_val(dev, conn, "panel orientation")?; + match val_type.convert_value(val) { + property::Value::Enum(Some(val)) => match val.value() { + // "Normal" + 0 => Ok(Transform::Normal), + // "Upside Down" + 1 => Ok(Transform::_180), + // "Left Side Up" + 2 => Ok(Transform::_90), + // "Right Side Up" + 3 => Ok(Transform::_270), + _ => Err(anyhow!("panel orientation has invalid value '{:?}'", val)), + }, + _ => Err(anyhow!("panel orientation has wrong value type")), + } +}