From 6fa61a088f426ce81e534443a67c91c28889655d Mon Sep 17 00:00:00 2001 From: Sebastian Wick Date: Fri, 19 Jul 2024 15:30:56 +0200 Subject: [PATCH] core/debug-control: Allow changing the reference luminance of outputs Part-of: --- .../org.gnome.Mutter.DebugControl.xml | 1 + src/backends/meta-color-device.c | 28 +++++++++++++-- src/core/meta-debug-control-private.h | 2 ++ src/core/meta-debug-control.c | 11 ++++++ tools/debug-control.py | 35 +++++++++++++++++-- 5 files changed, 72 insertions(+), 5 deletions(-) diff --git a/data/dbus-interfaces/org.gnome.Mutter.DebugControl.xml b/data/dbus-interfaces/org.gnome.Mutter.DebugControl.xml index 05303a515..326ed3ad4 100644 --- a/data/dbus-interfaces/org.gnome.Mutter.DebugControl.xml +++ b/data/dbus-interfaces/org.gnome.Mutter.DebugControl.xml @@ -8,6 +8,7 @@ + diff --git a/src/backends/meta-color-device.c b/src/backends/meta-color-device.c index b0f2ff65f..30be4cdb5 100644 --- a/src/backends/meta-color-device.c +++ b/src/backends/meta-color-device.c @@ -671,18 +671,32 @@ update_color_state (MetaColorDevice *color_device) MetaMonitor *monitor = color_device->monitor; MetaBackend *backend = meta_color_manager_get_backend (color_device->color_manager); + MetaContext *context = meta_backend_get_context (backend); + MetaDebugControl *debug_control = meta_context_get_debug_control (context); ClutterContext *clutter_context = meta_backend_get_clutter_context (backend); g_autoptr (ClutterColorState) color_state = NULL; ClutterColorspace colorspace; ClutterTransferFunction transfer_function; + float min_lum, max_lum, ref_lum; + float reference_luminance_factor; UpdateResult result = 0; colorspace = get_color_space_from_monitor (monitor); transfer_function = get_transfer_function_from_monitor (monitor); - color_state = clutter_color_state_new (clutter_context, - colorspace, - transfer_function); + clutter_transfer_function_get_default_luminances (transfer_function, + &min_lum, + &max_lum, + &ref_lum); + + reference_luminance_factor = + meta_debug_control_get_luminance_percentage (debug_control) / 100.0f; + ref_lum = ref_lum * reference_luminance_factor; + + color_state = clutter_color_state_new_full (clutter_context, + colorspace, + transfer_function, + min_lum, max_lum, ref_lum); if (!color_device->color_state || !clutter_color_state_equals (color_device->color_state, color_state)) @@ -698,6 +712,9 @@ MetaColorDevice * meta_color_device_new (MetaColorManager *color_manager, MetaMonitor *monitor) { + MetaBackend *backend = meta_color_manager_get_backend (color_manager); + MetaContext *context = meta_backend_get_context (backend); + MetaDebugControl *debug_control = meta_context_get_debug_control (context); MetaColorDevice *color_device; color_device = g_object_new (META_TYPE_COLOR_DEVICE, NULL); @@ -724,6 +741,11 @@ meta_color_device_new (MetaColorManager *color_manager, color_device); } + g_signal_connect_object (debug_control, "notify::luminance-percentage", + G_CALLBACK (meta_color_device_update), + color_device, + G_CONNECT_SWAPPED | G_CONNECT_AFTER); + return color_device; } diff --git a/src/core/meta-debug-control-private.h b/src/core/meta-debug-control-private.h index 128d94e3b..956397701 100644 --- a/src/core/meta-debug-control-private.h +++ b/src/core/meta-debug-control-private.h @@ -25,3 +25,5 @@ gboolean meta_debug_control_is_color_management_protocol_enabled (MetaDebugContr gboolean meta_debug_control_is_linear_blending_forced (MetaDebugControl *debug_control); gboolean meta_debug_control_is_hdr_enabled (MetaDebugControl *debug_control); + +unsigned int meta_debug_control_get_luminance_percentage (MetaDebugControl *debug_control); diff --git a/src/core/meta-debug-control.c b/src/core/meta-debug-control.c index 1fae626f6..8ed806693 100644 --- a/src/core/meta-debug-control.c +++ b/src/core/meta-debug-control.c @@ -182,6 +182,8 @@ meta_debug_control_init (MetaDebugControl *debug_control) g_strcmp0 (getenv ("MUTTER_DEBUG_FORCE_LINEAR_BLENDING"), "1") == 0; meta_dbus_debug_control_set_force_linear_blending (dbus_debug_control, force_linear_blending); + + meta_dbus_debug_control_set_luminance_percentage (dbus_debug_control, 100); } gboolean @@ -211,6 +213,15 @@ meta_debug_control_is_hdr_enabled (MetaDebugControl *debug_control) return meta_dbus_debug_control_get_enable_hdr (dbus_debug_control); } +unsigned int +meta_debug_control_get_luminance_percentage (MetaDebugControl *debug_control) +{ + MetaDBusDebugControl *dbus_debug_control = + META_DBUS_DEBUG_CONTROL (debug_control); + + return meta_dbus_debug_control_get_luminance_percentage (dbus_debug_control); +} + void meta_debug_control_set_exported (MetaDebugControl *debug_control, gboolean exported) diff --git a/tools/debug-control.py b/tools/debug-control.py index ea2faf63a..bab98c241 100755 --- a/tools/debug-control.py +++ b/tools/debug-control.py @@ -15,6 +15,25 @@ def bool_to_string(value): else: return "false" +def string_to_bool(value): + if value == "true": + return True + if value == "false": + return False + raise BaseException(f"bad boolean value: {value}") + +def value_to_string(value): + if isinstance(value, dbus.Boolean): + return bool_to_string(value) + return f"{value}" + +def string_to_value(current, value): + if isinstance(current, dbus.Boolean): + return dbus.Boolean(string_to_bool(value), variant_level=1) + if isinstance(current, dbus.UInt32): + return dbus.UInt32(int(value), variant_level=1) + return value + def get_debug_control(): bus = dbus.SessionBus() try: @@ -28,8 +47,9 @@ def get_debug_control(): def status(): debug_control = get_debug_control() props = debug_control.GetAll(INTERFACE, dbus_interface=PROPS_IFACE) - for prop in props: - print(f"{prop}: {bool_to_string(props[prop])}") + for prop, value in props.items(): + value = value_to_string (value) + print(f"{prop}: {value}") def enable(prop): debug_control = get_debug_control() @@ -48,6 +68,14 @@ def toggle(prop): debug_control.Set(INTERFACE, prop, dbus.Boolean(not value, variant_level=1), dbus_interface=PROPS_IFACE) +def set_value(kv): + debug_control = get_debug_control() + [prop, value] = kv + + current = debug_control.Get(INTERFACE, prop, dbus_interface=PROPS_IFACE) + value = string_to_value (current, value) + + debug_control.Set(INTERFACE, prop, value, dbus_interface=PROPS_IFACE) if __name__ == '__main__': parser = argparse.ArgumentParser(description='Get and set debug state') @@ -56,6 +84,7 @@ if __name__ == '__main__': parser.add_argument('--enable', metavar='PROPERTY', type=str, nargs='?') parser.add_argument('--disable', metavar='PROPERTY', type=str, nargs='?') parser.add_argument('--toggle', metavar='PROPERTY', type=str, nargs='?') + parser.add_argument('--set', metavar='PROPERTY', type=str, nargs=2) args = parser.parse_args() if args.status: @@ -66,5 +95,7 @@ if __name__ == '__main__': disable(args.disable) elif args.toggle: toggle(args.toggle) + elif args.set: + set_value(args.set) else: parser.print_usage()