1
0
Fork 0

monitor-manager: Move backlight API to MetaOutput

It's now a signal emitted when `meta_output_set_backlight()` is called.
It is also no longer normalized between 1 and 100; that is now handled
done via the D-Bus API layer.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3861>
This commit is contained in:
Jonas Ådahl 2024-07-01 14:54:05 +02:00
parent c4f1396570
commit 68dd168e33
6 changed files with 67 additions and 68 deletions

View file

@ -183,9 +183,6 @@ struct _MetaMonitorManager
*
* @set_power_save_mode: Sets the #MetaPowerSave mode (for all displays).
*
* @change_backlight: Changes the backlight intensity to the given value (in
* percent).
*
* @tiled_monitor_added: Should be called by a #MetaMonitor when it is created.
*
* @tiled_monitor_removed: Should be called by a #MetaMonitor when it is
@ -223,10 +220,6 @@ struct _MetaMonitorManagerClass
void (* set_power_save_mode) (MetaMonitorManager *manager,
MetaPowerSave power_save);
void (* change_backlight) (MetaMonitorManager *manager,
MetaOutput *output,
int backlight);
void (* tiled_monitor_added) (MetaMonitorManager *manager,
MetaMonitor *monitor);

View file

@ -1610,6 +1610,26 @@ meta_monitor_manager_maybe_emit_privacy_screen_change (MetaMonitorManager *manag
manager->privacy_screen_change_state = META_PRIVACY_SCREEN_CHANGE_STATE_NONE;
}
static int
normalize_backlight (MetaOutput *output,
int value)
{
const MetaOutputInfo *output_info = meta_output_get_info (output);
return (int) round ((double) (value - output_info->backlight_min) /
(output_info->backlight_max - output_info->backlight_min) * 100.0);
}
static int
denormalize_backlight (MetaOutput *output,
int normalized_value)
{
const MetaOutputInfo *output_info = meta_output_get_info (output);
return (int) round ((double) normalized_value / 100.0 *
(output_info->backlight_max + output_info->backlight_min));
}
static gboolean
meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation,
@ -1689,6 +1709,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
MetaCrtc *crtc;
int crtc_index;
int backlight;
int normalized_backlight;
int min_backlight_step;
gboolean is_primary;
gboolean is_presentation;
@ -1730,6 +1751,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
}
backlight = meta_output_get_backlight (output);
normalized_backlight = normalize_backlight (output, backlight);
min_backlight_step =
output_info->backlight_max - output_info->backlight_min
? 100 / (output_info->backlight_max - output_info->backlight_min)
@ -1758,7 +1780,7 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
g_variant_builder_add (&properties, "{sv}", "display-name",
g_variant_new_string (output_info->name));
g_variant_builder_add (&properties, "{sv}", "backlight",
g_variant_new_int32 (backlight));
g_variant_new_int32 (normalized_backlight));
g_variant_builder_add (&properties, "{sv}", "min-backlight-step",
g_variant_new_int32 (min_backlight_step));
g_variant_builder_add (&properties, "{sv}", "primary",
@ -2835,13 +2857,14 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
GDBusMethodInvocation *invocation,
guint serial,
guint output_index,
gint value,
gint normalized_value,
MetaMonitorManager *manager)
{
GList *combined_outputs;
MetaOutput *output;
const MetaOutputInfo *output_info;
int new_backlight;
int value;
int renormalized_value;
if (serial != manager->serial)
{
@ -2864,7 +2887,7 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
output = g_list_nth_data (combined_outputs, output_index);
g_list_free (combined_outputs);
if (value < 0 || value > 100)
if (normalized_value < 0 || normalized_value > 100)
{
g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR,
G_DBUS_ERROR_INVALID_ARGS,
@ -2883,12 +2906,14 @@ meta_monitor_manager_handle_change_backlight (MetaDBusDisplayConfig *skeleton,
return G_DBUS_METHOD_INVOCATION_HANDLED;
}
META_MONITOR_MANAGER_GET_CLASS (manager)->change_backlight (manager, output, value);
value = denormalize_backlight (output, normalized_value);
meta_output_set_backlight (output, value);
renormalized_value = normalize_backlight (output, value);
new_backlight = meta_output_get_backlight (output);
meta_dbus_display_config_complete_change_backlight (skeleton,
invocation,
new_backlight);
renormalized_value);
return G_DBUS_METHOD_INVOCATION_HANDLED;
}

View file

@ -40,6 +40,7 @@ enum
{
COLOR_SPACE_CHANGED,
HDR_METADATA_CHANGED,
BACKLIGHT_CHANGED,
N_SIGNALS
};
@ -216,7 +217,12 @@ meta_output_set_backlight (MetaOutput *output,
{
MetaOutputPrivate *priv = meta_output_get_instance_private (output);
g_return_if_fail (backlight >= priv->info->backlight_min);
g_return_if_fail (backlight <= priv->info->backlight_max);
priv->backlight = backlight;
g_signal_emit (output, signals[BACKLIGHT_CHANGED], 0);
}
int
@ -676,6 +682,13 @@ meta_output_class_init (MetaOutputClass *klass)
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
signals[BACKLIGHT_CHANGED] =
g_signal_new ("backlight-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL, NULL,
G_TYPE_NONE, 0);
}
gboolean

View file

@ -661,14 +661,6 @@ meta_monitor_manager_xrandr_apply_monitors_config (MetaMonitorManager *mana
return TRUE;
}
static void
meta_monitor_manager_xrandr_change_backlight (MetaMonitorManager *manager,
MetaOutput *output,
gint value)
{
meta_output_xrandr_change_backlight (META_OUTPUT_XRANDR (output), value);
}
static MetaMonitorXrandrData *
meta_monitor_xrandr_data_from_monitor (MetaMonitor *monitor)
{
@ -966,7 +958,6 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
manager_class->ensure_initial_config = meta_monitor_manager_xrandr_ensure_initial_config;
manager_class->apply_monitors_config = meta_monitor_manager_xrandr_apply_monitors_config;
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;
manager_class->change_backlight = meta_monitor_manager_xrandr_change_backlight;
manager_class->tiled_monitor_added = meta_monitor_manager_xrandr_tiled_monitor_added;
manager_class->tiled_monitor_removed = meta_monitor_manager_xrandr_tiled_monitor_removed;
manager_class->calculate_monitor_mode_scale = meta_monitor_manager_xrandr_calculate_monitor_mode_scale;

View file

@ -189,41 +189,6 @@ meta_output_xrandr_apply_mode (MetaOutputXrandr *output_xrandr)
}
}
static int
normalize_backlight (MetaOutput *output,
int hw_value)
{
const MetaOutputInfo *output_info = meta_output_get_info (output);
return (int) round ((double) (hw_value - output_info->backlight_min) /
(output_info->backlight_max - output_info->backlight_min) * 100.0);
}
void
meta_output_xrandr_change_backlight (MetaOutputXrandr *output_xrandr,
int value)
{
MetaOutput *output = META_OUTPUT (output_xrandr);
const MetaOutputInfo *output_info = meta_output_get_info (output);
Display *xdisplay = xdisplay_from_output (output);
Atom atom;
int hw_value;
hw_value = (int) round ((double) value / 100.0 * output_info->backlight_max +
output_info->backlight_min);
atom = XInternAtom (xdisplay, "Backlight", False);
xcb_randr_change_output_property (XGetXCBConnection (xdisplay),
(XID) meta_output_get_id (output),
atom, XCB_ATOM_INTEGER, 32,
XCB_PROP_MODE_REPLACE,
1, &hw_value);
/* We're not selecting for property notifies, so update the value immediately */
meta_output_set_backlight (output, normalize_backlight (output, hw_value));
}
static gboolean
ctm_is_equal (const MetaOutputCtm *ctm1,
const MetaOutputCtm *ctm2)
@ -510,7 +475,6 @@ static int
output_get_backlight_xrandr (MetaOutput *output)
{
Display *xdisplay = xdisplay_from_output (output);
int value = -1;
Atom atom, actual_type;
int actual_format;
unsigned long nitems, bytes_after;
@ -527,11 +491,7 @@ output_get_backlight_xrandr (MetaOutput *output)
if (actual_type != XA_INTEGER || actual_format != 32 || nitems < 1)
return -1;
value = ((int*)buffer)[0];
if (value >= 0)
return normalize_backlight (output, value);
else
return -1;
return ((int *) buffer)[0];
}
static void
@ -954,6 +914,22 @@ find_assigned_crtc (MetaGpu *gpu,
return NULL;
}
static void
on_backlight_changed (MetaOutput *output)
{
Display *xdisplay = xdisplay_from_output (output);
int value = meta_output_get_backlight (output);
Atom atom;
atom = XInternAtom (xdisplay, "Backlight", False);
xcb_randr_change_output_property (XGetXCBConnection (xdisplay),
(XID) meta_output_get_id (output),
atom, XCB_ATOM_INTEGER, 32,
XCB_PROP_MODE_REPLACE,
1, &value);
}
MetaOutputXrandr *
meta_output_xrandr_new (MetaGpuXrandr *gpu_xrandr,
XRROutputInfo *xrandr_output,
@ -1062,7 +1038,11 @@ meta_output_xrandr_new (MetaGpuXrandr *gpu_xrandr,
}
if (!(output_info->backlight_min == 0 && output_info->backlight_max == 0))
meta_output_set_backlight (output, output_get_backlight_xrandr (output));
{
meta_output_set_backlight (output, output_get_backlight_xrandr (output));
g_signal_connect (output, "backlight-changed",
G_CALLBACK (on_backlight_changed), NULL);
}
if (output_info->n_modes == 0 || output_info->n_possible_crtcs == 0)
{

View file

@ -33,9 +33,6 @@ G_DECLARE_FINAL_TYPE (MetaOutputXrandr, meta_output_xrandr,
void meta_output_xrandr_apply_mode (MetaOutputXrandr *output_xrandr);
void meta_output_xrandr_change_backlight (MetaOutputXrandr *output_xrandr,
int value);
void meta_output_xrandr_set_ctm (MetaOutputXrandr *output_xrandr,
const MetaOutputCtm *ctm);