DisplayConfig: Add API to get and set output luminance
This will in turn change the GSetting, where the setting is actually stored. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/4271>
This commit is contained in:
parent
db2376cb84
commit
be6af00d6b
@ -246,6 +246,47 @@
|
|||||||
-->
|
-->
|
||||||
<property name="Backlight" type="(uaa{sv})" access="read" />
|
<property name="Backlight" type="(uaa{sv})" access="read" />
|
||||||
|
|
||||||
|
<!--
|
||||||
|
SetOutputLuminance:
|
||||||
|
|
||||||
|
Sets the luminance of a monitor when in the specified color mode (see
|
||||||
|
GetCurrentState() for available color modes). The luminance is a
|
||||||
|
floating point value representing the luminance in percent (%).
|
||||||
|
-->
|
||||||
|
<method name="SetLuminance">
|
||||||
|
<arg name="connector" direction="in" type="s" />
|
||||||
|
<arg name="color_mode" direction="in" type="u" />
|
||||||
|
<arg name="luminance" direction="in" type="d" />
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
ResetOutputLuminance:
|
||||||
|
|
||||||
|
Resets the luminance of a monitor to its default when in the specified
|
||||||
|
color mode (see GetCurrentState() for available color modes).
|
||||||
|
-->
|
||||||
|
<method name="ResetLuminance">
|
||||||
|
<arg name="connector" direction="in" type="s" />
|
||||||
|
<arg name="color_mode" direction="in" type="u" />
|
||||||
|
</method>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
Luminance:
|
||||||
|
|
||||||
|
Luminance settings. The property is a list of dictionaries of luminance
|
||||||
|
settings entries.
|
||||||
|
|
||||||
|
The luminance setting is per color mode and monitor.
|
||||||
|
|
||||||
|
Each dictionary consists of the following entries:
|
||||||
|
* 'connector' (s) - The associated connector.
|
||||||
|
* 'color-mode' (u) - The associated color mode.
|
||||||
|
* 'luminance' (d) - The current luminance.
|
||||||
|
* 'is-unset' (b) - True if the luminance is not explicitly set.
|
||||||
|
* 'default' (d) - The default luminance.
|
||||||
|
-->
|
||||||
|
<property name="Luminance" type="aa{sv}" access="read" />
|
||||||
|
|
||||||
<!--
|
<!--
|
||||||
GetCrtcGamma:
|
GetCrtcGamma:
|
||||||
@serial: configuration serial
|
@serial: configuration serial
|
||||||
|
@ -1109,6 +1109,71 @@ apply_privacy_screen_settings (MetaMonitorManager *manager)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
update_output_luminance (MetaMonitorManager *monitor_manager)
|
||||||
|
{
|
||||||
|
MetaSettings *settings = meta_backend_get_settings (monitor_manager->backend);
|
||||||
|
GVariantBuilder builder;
|
||||||
|
GList *l;
|
||||||
|
|
||||||
|
g_variant_builder_init (&builder, G_VARIANT_TYPE ("aa{sv}"));
|
||||||
|
|
||||||
|
for (l = meta_monitor_manager_get_monitors (monitor_manager); l; l = l->next)
|
||||||
|
{
|
||||||
|
MetaMonitor *monitor = META_MONITOR (l->data);
|
||||||
|
MetaMonitorSpec *monitor_spec = meta_monitor_get_spec (monitor);
|
||||||
|
GVariantBuilder luminance_dic_builder;
|
||||||
|
const char *connector;
|
||||||
|
GList *l_color_mode;
|
||||||
|
|
||||||
|
for (l_color_mode = meta_monitor_get_supported_color_modes (monitor);
|
||||||
|
l_color_mode;
|
||||||
|
l_color_mode = l_color_mode->next)
|
||||||
|
{
|
||||||
|
MetaColorMode color_mode = GPOINTER_TO_INT (l_color_mode->data);
|
||||||
|
double luminance;
|
||||||
|
double default_luminance;
|
||||||
|
gboolean is_unset;
|
||||||
|
|
||||||
|
connector = meta_monitor_get_connector (monitor);
|
||||||
|
luminance = meta_settings_get_output_luminance (settings,
|
||||||
|
monitor_spec,
|
||||||
|
color_mode);
|
||||||
|
default_luminance =
|
||||||
|
meta_settings_get_default_output_luminance (settings,
|
||||||
|
monitor_spec,
|
||||||
|
color_mode);
|
||||||
|
is_unset = !meta_settings_has_output_luminance (settings,
|
||||||
|
monitor_spec,
|
||||||
|
color_mode);
|
||||||
|
|
||||||
|
g_variant_builder_init (&luminance_dic_builder,
|
||||||
|
G_VARIANT_TYPE ("a{sv}"));
|
||||||
|
g_variant_builder_add (&luminance_dic_builder, "{sv}",
|
||||||
|
"connector",
|
||||||
|
g_variant_new_string (connector));
|
||||||
|
g_variant_builder_add (&luminance_dic_builder, "{sv}",
|
||||||
|
"color-mode",
|
||||||
|
g_variant_new_uint32 (color_mode));
|
||||||
|
g_variant_builder_add (&luminance_dic_builder, "{sv}",
|
||||||
|
"luminance",
|
||||||
|
g_variant_new_double (luminance));
|
||||||
|
g_variant_builder_add (&luminance_dic_builder, "{sv}",
|
||||||
|
"default",
|
||||||
|
g_variant_new_double (default_luminance));
|
||||||
|
g_variant_builder_add (&luminance_dic_builder, "{sv}",
|
||||||
|
"is-unset",
|
||||||
|
g_variant_new_boolean (is_unset));
|
||||||
|
|
||||||
|
g_variant_builder_add (&builder, "a{sv}",
|
||||||
|
&luminance_dic_builder);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_dbus_display_config_set_luminance (monitor_manager->display_config,
|
||||||
|
g_variant_builder_end (&builder));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_panel_orientation_managed (MetaMonitorManager *manager)
|
update_panel_orientation_managed (MetaMonitorManager *manager)
|
||||||
{
|
{
|
||||||
@ -1318,6 +1383,11 @@ meta_monitor_manager_constructed (GObject *object)
|
|||||||
G_CALLBACK (apply_privacy_screen_settings),
|
G_CALLBACK (apply_privacy_screen_settings),
|
||||||
manager, G_CONNECT_SWAPPED);
|
manager, G_CONNECT_SWAPPED);
|
||||||
|
|
||||||
|
g_signal_connect_object (settings,
|
||||||
|
"output-luminance-changed",
|
||||||
|
G_CALLBACK (update_output_luminance),
|
||||||
|
manager, G_CONNECT_SWAPPED);
|
||||||
|
|
||||||
monitor_manager_setup_dbus_config_handlers (manager);
|
monitor_manager_setup_dbus_config_handlers (manager);
|
||||||
|
|
||||||
g_signal_connect_object (manager->display_config, "notify::power-save-mode",
|
g_signal_connect_object (manager->display_config, "notify::power-save-mode",
|
||||||
@ -3134,6 +3204,103 @@ meta_monitor_manager_handle_set_backlight (MetaDBusDisplayConfig *skeleton,
|
|||||||
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
validate_color_mode_value (uint32_t color_mode_value,
|
||||||
|
MetaColorMode *color_mode)
|
||||||
|
{
|
||||||
|
switch (color_mode_value)
|
||||||
|
{
|
||||||
|
case META_COLOR_MODE_DEFAULT:
|
||||||
|
case META_COLOR_MODE_BT2100:
|
||||||
|
*color_mode = (MetaColorMode) color_mode_value;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_monitor_manager_handle_set_luminance (MetaDBusDisplayConfig *skeleton,
|
||||||
|
GDBusMethodInvocation *invocation,
|
||||||
|
const char * connector,
|
||||||
|
uint32_t color_mode_value,
|
||||||
|
double value,
|
||||||
|
MetaMonitorManager *monitor_manager)
|
||||||
|
{
|
||||||
|
MetaSettings *settings = meta_backend_get_settings (monitor_manager->backend);
|
||||||
|
MetaMonitor *monitor;
|
||||||
|
MetaColorMode color_mode;
|
||||||
|
|
||||||
|
monitor = meta_monitor_manager_get_monitor_from_connector (monitor_manager,
|
||||||
|
connector);
|
||||||
|
if (!monitor)
|
||||||
|
{
|
||||||
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_DBUS_ERROR,
|
||||||
|
G_DBUS_ERROR_FAILED,
|
||||||
|
"The connector doesn't have a connected monitor");
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validate_color_mode_value (color_mode_value, &color_mode))
|
||||||
|
{
|
||||||
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_DBUS_ERROR,
|
||||||
|
G_DBUS_ERROR_FAILED,
|
||||||
|
"Invalid color mode");
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_settings_set_output_luminance (settings,
|
||||||
|
meta_monitor_get_spec (monitor),
|
||||||
|
color_mode,
|
||||||
|
value);
|
||||||
|
|
||||||
|
meta_dbus_display_config_complete_set_luminance (monitor_manager->display_config,
|
||||||
|
invocation);
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_monitor_manager_handle_reset_luminance (MetaDBusDisplayConfig *skeleton,
|
||||||
|
GDBusMethodInvocation *invocation,
|
||||||
|
const char * connector,
|
||||||
|
uint32_t color_mode_value,
|
||||||
|
MetaMonitorManager *monitor_manager)
|
||||||
|
{
|
||||||
|
MetaSettings *settings = meta_backend_get_settings (monitor_manager->backend);
|
||||||
|
MetaMonitor *monitor;
|
||||||
|
MetaColorMode color_mode;
|
||||||
|
|
||||||
|
monitor = meta_monitor_manager_get_monitor_from_connector (monitor_manager,
|
||||||
|
connector);
|
||||||
|
if (!monitor)
|
||||||
|
{
|
||||||
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_DBUS_ERROR,
|
||||||
|
G_DBUS_ERROR_FAILED,
|
||||||
|
"The connector doesn't have a connected monitor");
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!validate_color_mode_value (color_mode_value, &color_mode))
|
||||||
|
{
|
||||||
|
g_dbus_method_invocation_return_error (invocation,
|
||||||
|
G_DBUS_ERROR,
|
||||||
|
G_DBUS_ERROR_FAILED,
|
||||||
|
"Invalid color mode");
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
meta_settings_reset_output_luminance (settings,
|
||||||
|
meta_monitor_get_spec (monitor),
|
||||||
|
color_mode);
|
||||||
|
|
||||||
|
meta_dbus_display_config_complete_reset_luminance (monitor_manager->display_config,
|
||||||
|
invocation);
|
||||||
|
return G_DBUS_METHOD_INVOCATION_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_monitor_manager_handle_get_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
meta_monitor_manager_handle_get_crtc_gamma (MetaDBusDisplayConfig *skeleton,
|
||||||
GDBusMethodInvocation *invocation,
|
GDBusMethodInvocation *invocation,
|
||||||
@ -3319,6 +3486,12 @@ monitor_manager_setup_dbus_config_handlers (MetaMonitorManager *manager)
|
|||||||
g_signal_connect_object (manager->display_config, "handle-set-backlight",
|
g_signal_connect_object (manager->display_config, "handle-set-backlight",
|
||||||
G_CALLBACK (meta_monitor_manager_handle_set_backlight),
|
G_CALLBACK (meta_monitor_manager_handle_set_backlight),
|
||||||
manager, G_CONNECT_DEFAULT);
|
manager, G_CONNECT_DEFAULT);
|
||||||
|
g_signal_connect_object (manager->display_config, "handle-set-luminance",
|
||||||
|
G_CALLBACK (meta_monitor_manager_handle_set_luminance),
|
||||||
|
manager, G_CONNECT_DEFAULT);
|
||||||
|
g_signal_connect_object (manager->display_config, "handle-reset-luminance",
|
||||||
|
G_CALLBACK (meta_monitor_manager_handle_reset_luminance),
|
||||||
|
manager, G_CONNECT_DEFAULT);
|
||||||
g_signal_connect_object (manager->display_config, "handle-get-crtc-gamma",
|
g_signal_connect_object (manager->display_config, "handle-get-crtc-gamma",
|
||||||
G_CALLBACK (meta_monitor_manager_handle_get_crtc_gamma),
|
G_CALLBACK (meta_monitor_manager_handle_get_crtc_gamma),
|
||||||
manager, G_CONNECT_DEFAULT);
|
manager, G_CONNECT_DEFAULT);
|
||||||
@ -3938,6 +4111,7 @@ meta_monitor_manager_update_logical_state (MetaMonitorManager *manager,
|
|||||||
manager->current_switch_config = META_MONITOR_SWITCH_CONFIG_UNKNOWN;
|
manager->current_switch_config = META_MONITOR_SWITCH_CONFIG_UNKNOWN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
update_output_luminance (manager);
|
||||||
meta_monitor_manager_rebuild_logical_monitors (manager, config);
|
meta_monitor_manager_rebuild_logical_monitors (manager, config);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user