Skip to content

Commit ffd731c

Browse files
Add sdr-native support
1 parent 1621b36 commit ffd731c

4 files changed

Lines changed: 49 additions & 25 deletions

File tree

.github/workflows/release.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ on:
99
type: string
1010

1111
env:
12-
UBUNTU_24_10_NAME: oracular
12+
UBUNTU_25_04_NAME: plucky
1313

1414
jobs:
1515
validate-and-patch:
@@ -58,7 +58,7 @@ jobs:
5858
run: |
5959
debchange \
6060
-v ${{ steps.release_version.outputs.release_version }}-1 \
61-
-D $UBUNTU_24_10_NAME -u low --package displayconfig-mutter \
61+
-D $UBUNTU_25_04_NAME -u low --package displayconfig-mutter \
6262
"https://github.com/eaglesemanation/displayconfig-mutter/releases/tag/v${{ steps.release_version.outputs.release_version }}"
6363
- uses: stefanzweifel/git-auto-commit-action@v5
6464
with:

src/cli.rs

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use clap::{Args, Parser, Subcommand};
1+
use clap::{Args, Parser, Subcommand, ValueEnum};
22

33
#[derive(Debug, Parser)]
44
#[command(version, about, long_about = None)]
@@ -56,8 +56,22 @@ pub struct SetArgs {
5656
#[arg(long)]
5757
pub scaling: Option<u32>,
5858
/// Controls high dynamic range color mode
59-
#[arg(long)]
59+
#[arg(long, conflicts_with = "color_mode")]
6060
pub hdr: Option<bool>,
61+
/// Controls display color mode
62+
#[arg(value_enum, long, conflicts_with = "hdr")]
63+
pub color_mode: Option<ColorMode>,
64+
}
65+
66+
#[derive(Debug, Default, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, ValueEnum)]
67+
pub enum ColorMode {
68+
/// sRGB SDR
69+
#[default]
70+
SDR,
71+
/// HDR
72+
HDR,
73+
/// SDR with wide gammut
74+
SDRNative,
6175
}
6276

6377
fn resolution_parser(s: &str) -> Result<(u32, u32), String> {

src/display_config.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ pub mod get_current_state {
117117
pub supported_color_modes: Option<Vec<MonitorColorMode>>,
118118
}
119119

120+
// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/src/backends/meta-output.h#L45
120121
#[derive(
121122
Debug, Type, PartialEq, Eq, Default, Clone, Copy, Serialize_repr, Deserialize_repr,
122123
)]
@@ -126,6 +127,8 @@ pub mod get_current_state {
126127
Default = 0,
127128
/// HDR
128129
BT2100 = 1,
130+
/// SDR with wide gammut
131+
SDRNative = 2,
129132
}
130133

131134
#[derive(Debug, Clone, Type, Serialize, Deserialize)]
@@ -318,6 +321,7 @@ pub mod apply_monitors_config {
318321
}
319322
}
320323

324+
// https://gitlab.gnome.org/GNOME/mutter/-/blob/main/data/dbus-interfaces/org.gnome.Mutter.DisplayConfig.xml
321325
#[zbus::proxy(
322326
default_service = "org.gnome.Mutter.DisplayConfig",
323327
default_path = "/org/gnome/Mutter/DisplayConfig",

src/main.rs

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use std::{cmp::Ordering, collections::HashSet};
33
use anyhow::anyhow;
44
use clap::Parser;
55
use displayconfig_mutter::{
6-
cli::{self, Cli},
6+
cli::{self, Cli, ColorMode},
77
display_config::{
88
apply_monitors_config,
99
get_current_state::{self, LogicalMonitorTransform, MonitorColorMode, RefreshRateMode},
@@ -193,35 +193,41 @@ async fn main() -> anyhow::Result<()> {
193193
}
194194
updated_logical_monitor.scale = *scale;
195195

196-
let hdr_supported = current_monitor
196+
let fallback_supported_color_modes = vec![MonitorColorMode::Default];
197+
let supported_color_modes = current_monitor
197198
.properties
198199
.supported_color_modes
199200
.as_ref()
200-
.is_some_and(|modes| modes.contains(&MonitorColorMode::BT2100));
201-
let color_mode = args
202-
.hdr
203-
.map(|hdr| {
201+
.unwrap_or(&fallback_supported_color_modes);
202+
let color_mode = match (args.hdr, args.color_mode) {
203+
(None, None) => current_monitor
204+
.properties
205+
.color_mode
206+
.unwrap_or(MonitorColorMode::Default),
207+
(Some(hdr), None) => {
204208
if hdr {
205209
MonitorColorMode::BT2100
206210
} else {
207211
MonitorColorMode::Default
208212
}
209-
})
210-
.unwrap_or(
211-
current_monitor
212-
.properties
213-
.color_mode
214-
.unwrap_or(MonitorColorMode::Default),
215-
);
216-
updated_monitor.properties.color_mode = match (color_mode, hdr_supported) {
217-
(MonitorColorMode::BT2100, false) => {
218-
return Err(anyhow!(
219-
"display \"{}\" does not support HDR",
220-
args.connector
221-
))
222213
}
223-
(MonitorColorMode::Default, false) => None,
224-
(mode, true) => Some(mode),
214+
(None, Some(color_mode)) => match color_mode {
215+
ColorMode::SDR => MonitorColorMode::Default,
216+
ColorMode::HDR => MonitorColorMode::BT2100,
217+
ColorMode::SDRNative => MonitorColorMode::SDRNative,
218+
},
219+
(Some(_), Some(_)) => panic!("Clap allowed mutually exclusive flags"),
220+
};
221+
222+
if !supported_color_modes.contains(&color_mode) {
223+
return Err(anyhow!(
224+
"display \"{}\" does not support selected color mode",
225+
args.connector
226+
));
227+
}
228+
updated_monitor.properties.color_mode = match color_mode {
229+
MonitorColorMode::Default => None,
230+
mode => Some(mode),
225231
};
226232
let (updated_x, updated_y) = (updated_logical_monitor.x, updated_logical_monitor.y);
227233

0 commit comments

Comments
 (0)