feat: add per output max-bpc config and ipc action

List current max-bpc values in outputs.

fix: remove 16 bpc and change default behaviour

feat(ipc): add max_bpc and format to output

fix: bpc on output config change

docs: add bpc to Outputs

feat: use atomic commits for connector properties

fix: drm `value_type` breaking change

fix: minor changes based on PR review

Rename bpc to max-bpc.

Add max-bpc output action.

refactor: add set_connector_properties

Fix niri-config parse test.

fix: bail when outside valid max bpc range
This commit is contained in:
Michael Yang
2026-01-01 05:45:17 +11:00
committed by Ivan Molodetskikh
parent 9a6f31012d
commit c5253968b4
9 changed files with 274 additions and 56 deletions
+58
View File
@@ -1097,6 +1097,12 @@ pub enum OutputAction {
#[cfg_attr(feature = "clap", command(flatten))]
vrr: VrrToSet,
},
/// Set the maximum bits per channel (bit depth).
MaxBpc {
/// Maximum bits per channel to set.
#[cfg_attr(feature = "clap", arg())]
max_bpc: MaxBpc,
},
}
/// Output mode to set.
@@ -1228,6 +1234,8 @@ pub struct Output {
///
/// `None` if the output is not mapped to any logical output (for example, if it is disabled).
pub logical: Option<LogicalOutput>,
/// Maximum bits per channel (bit depth), if known.
pub max_bpc: Option<u8>,
}
/// Output mode.
@@ -1291,6 +1299,32 @@ pub enum Transform {
Flipped270,
}
/// Output maximum bits per channel.
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Default)]
#[cfg_attr(feature = "clap", derive(clap::ValueEnum))]
#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
pub enum MaxBpc {
/// 6-bit.
#[serde(rename = "6")]
_6 = 6,
/// 8-bit.
#[default]
#[serde(rename = "8")]
_8 = 8,
/// 10-bit.
#[serde(rename = "10")]
_10 = 10,
/// 12-bit.
#[serde(rename = "12")]
_12 = 12,
/// 14-bit.
#[serde(rename = "14")]
_14 = 14,
/// 16-bit.
#[serde(rename = "16")]
_16 = 16,
}
/// Toplevel window.
#[derive(Serialize, Deserialize, Debug, Clone)]
#[cfg_attr(feature = "json-schema", derive(schemars::JsonSchema))]
@@ -1868,6 +1902,30 @@ impl FromStr for Transform {
}
}
impl TryFrom<u8> for MaxBpc {
type Error = &'static str;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
6 => Ok(MaxBpc::_6),
8 => Ok(MaxBpc::_8),
10 => Ok(MaxBpc::_10),
12 => Ok(MaxBpc::_12),
14 => Ok(MaxBpc::_14),
16 => Ok(MaxBpc::_16),
_ => Err("invalid max-bpc, can be 6, 8, 10, 12, 14, 16"),
}
}
}
impl FromStr for MaxBpc {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
Self::try_from(s.parse::<u8>().unwrap_or_default())
}
}
impl FromStr for Layer {
type Err = &'static str;