From b674048184d96ac73b40a30d4e9a8728c6ac7e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 19 Dec 2024 00:47:35 +0100 Subject: [PATCH] gdctl: Allow setting color mode This allows configuring a monitor to enter BT.2100 a.k.a. HDR mode. Part-of: --- doc/man/gdctl.rst | 6 ++++++ tools/gdctl | 50 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 48 insertions(+), 8 deletions(-) diff --git a/doc/man/gdctl.rst b/doc/man/gdctl.rst index d62013fe1..8f3639e42 100644 --- a/doc/man/gdctl.rst +++ b/doc/man/gdctl.rst @@ -134,6 +134,12 @@ MONITOR OPTIONS Set the mode of the monitor. +``--color-mode``, ``-c`` + + Set the color mode of the monitor. Available color modes are ``default`` and + ``bt2100``. + + EXAMPLES -------- diff --git a/tools/gdctl b/tools/gdctl index f67b96800..8f395e77d 100755 --- a/tools/gdctl +++ b/tools/gdctl @@ -296,6 +296,7 @@ class Monitor: properties: dict current_mode: MonitorMode | None preferred_mode: MonitorMode | None + color_mode: ColorMode | None @classmethod def from_variant(cls, variant): @@ -320,6 +321,7 @@ class Monitor: ) display_name = properties.get("display-name", None) + color_mode = properties.get("color-mode", None) return cls( connector=connector, @@ -331,6 +333,7 @@ class Monitor: current_mode=current_mode, preferred_mode=preferred_mode, display_name=display_name, + color_mode=color_mode, ) @@ -715,6 +718,9 @@ def create_logical_monitor(monitors_state, layout_mode, logical_monitor_args): ) monitor.mode = mode + monitor.color_mode = ColorMode.maybe_from_string( + monitor_args.get("color_mode", None) + ) monitors.append(monitor) @@ -836,10 +842,17 @@ def print_config(config): ) print_data( level=4, - is_last=True, + is_last=not monitor.color_mode, lines=lines, data=f"Mode: {monitor.mode.name}", ) + if monitor.color_mode: + print_data( + level=4, + is_last=True, + lines=lines, + data=f"Color mode: {monitor.color_mode}", + ) index += 1 @@ -1076,15 +1089,23 @@ class Config: layout_mode: LayoutMode def generate_monitor_tuples(self, monitors): - return [ + tuples = [] + for monitor in monitors: + options = {} + if monitor.color_mode: + options["color-mode"] = GLib.Variant( + "u", monitor.color_mode.value + ) + # Variant type: (ssa{sv}) - ( - monitor.connector, - monitor.mode.name, - {}, + tuples.append( + ( + monitor.connector, + monitor.mode.name, + options, + ) ) - for monitor in monitors - ] + return tuples def generate_logical_monitor_tuples(self): tuples = [] @@ -1232,6 +1253,11 @@ class TransformCompleter(NamedEnumCompleter): super().__init__(Transform) +class ColorModeCompleter(NamedEnumCompleter): + def __init__(self): + super().__init__(ColorMode) + + if __name__ == "__main__": parser = GdctlParser( description="Display control utility", @@ -1333,6 +1359,14 @@ if __name__ == "__main__": help="Monitor mode", type=str, ).completer = MonitorModeCompleter() + monitor_parser.add_argument( + "--color-mode", + "-c", + action=AppendToSubGroup, + help="Color mode", + choices=[str(color_mode) for color_mode in list(ColorMode)], + type=str, + ).completer = ColorModeCompleter() logical_monitor_parser.add_argument( "--primary", "-p",