diff --git a/src/backends/meta-backend-private.h b/src/backends/meta-backend-private.h
index ce703dfa3..f85ef1b60 100644
--- a/src/backends/meta-backend-private.h
+++ b/src/backends/meta-backend-private.h
@@ -67,6 +67,7 @@ struct _MetaBackendClass
MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend,
GError **error);
+ MetaColorManager * (* create_color_manager) (MetaBackend *backend);
MetaCursorRenderer * (* get_cursor_renderer) (MetaBackend *backend,
ClutterInputDevice *device);
MetaCursorTracker * (* create_cursor_tracker) (MetaBackend *backend);
@@ -130,6 +131,8 @@ MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend,
MetaIdleManager * meta_backend_get_idle_manager (MetaBackend *backend);
+MetaColorManager * meta_backend_get_color_manager (MetaBackend *backend);
+
META_EXPORT_TEST
MetaOrientationManager * meta_backend_get_orientation_manager (MetaBackend *backend);
META_EXPORT_TEST
diff --git a/src/backends/meta-backend-types.h b/src/backends/meta-backend-types.h
index 9f4341bb0..7b404060d 100644
--- a/src/backends/meta-backend-types.h
+++ b/src/backends/meta-backend-types.h
@@ -23,6 +23,8 @@
typedef struct _MetaBackend MetaBackend;
+typedef struct _MetaColorManager MetaColorManager;
+
typedef struct _MetaMonitorManager MetaMonitorManager;
typedef struct _MetaMonitorConfigManager MetaMonitorConfigManager;
diff --git a/src/backends/meta-backend.c b/src/backends/meta-backend.c
index 165a1fe4d..db3f75ae6 100644
--- a/src/backends/meta-backend.c
+++ b/src/backends/meta-backend.c
@@ -148,6 +148,7 @@ struct _MetaBackendPrivate
MetaInputMapper *input_mapper;
MetaIdleManager *idle_manager;
MetaRenderer *renderer;
+ MetaColorManager *color_manager;
#ifdef HAVE_EGL
MetaEgl *egl;
#endif
@@ -222,6 +223,7 @@ meta_backend_dispose (GObject *object)
g_clear_pointer (&priv->cursor_tracker, meta_cursor_tracker_destroy);
g_clear_object (&priv->current_device);
+ g_clear_object (&priv->color_manager);
g_clear_object (&priv->monitor_manager);
g_clear_object (&priv->orientation_manager);
#ifdef HAVE_REMOTE_DESKTOP
@@ -954,6 +956,12 @@ meta_backend_create_monitor_manager (MetaBackend *backend,
error);
}
+static MetaColorManager *
+meta_backend_create_color_manager (MetaBackend *backend)
+{
+ return META_BACKEND_GET_CLASS (backend)->create_color_manager (backend);
+}
+
static MetaRenderer *
meta_backend_create_renderer (MetaBackend *backend,
GError **error)
@@ -1194,6 +1202,8 @@ meta_backend_initable_init (GInitable *initable,
if (!priv->monitor_manager)
return FALSE;
+ priv->color_manager = meta_backend_create_color_manager (backend);
+
priv->renderer = meta_backend_create_renderer (backend, error);
if (!priv->renderer)
return FALSE;
@@ -1283,6 +1293,17 @@ meta_backend_get_monitor_manager (MetaBackend *backend)
return priv->monitor_manager;
}
+/**
+ * meta_backend_get_color_manager: (skip)
+ */
+MetaColorManager *
+meta_backend_get_color_manager (MetaBackend *backend)
+{
+ MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
+
+ return priv->color_manager;
+}
+
/**
* meta_backend_get_orientation_manager: (skip)
*/
diff --git a/src/backends/meta-color-manager-private.h b/src/backends/meta-color-manager-private.h
new file mode 100644
index 000000000..2e656ae41
--- /dev/null
+++ b/src/backends/meta-color-manager-private.h
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2021 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+
+#ifndef META_COLOR_MANAGER_PRIVATE_H
+#define META_COLOR_MANAGER_PRIVATE_H
+
+#include "backends/meta-color-manager.h"
+
+struct _MetaColorManagerClass
+{
+ GObjectClass parent_class;
+};
+
+#endif /* META_COLOR_MANAGER_PRIVATE_H */
diff --git a/src/backends/meta-color-manager.c b/src/backends/meta-color-manager.c
new file mode 100644
index 000000000..3e9fdcfca
--- /dev/null
+++ b/src/backends/meta-color-manager.c
@@ -0,0 +1,144 @@
+/*
+ * Copyright (C) 2021 Jeremy Cline
+ * Copyright (C) 2021 Red Hat Inc.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+
+/**
+ * SECTION:meta-color-manager
+ * @title: MetaColorManager
+ * @short_description: Interfaces for managing color-related properties like
+ * color look-up tables and color spaces.
+ *
+ * Each MetaBackend has a MetaColorManager which includes interfaces for querying
+ * and altering the color-related properties for displays associated with that
+ * backend.
+ *
+ * These tasks include configuring the hardware's lookup tables (LUTs) used to
+ * apply or remove transfer functions (traditionally called "gamma"), set up
+ * color space conversions (CSCs), and for determining or setting the output
+ * color space and transfer function.
+ *
+ * Mutter itself does not store and manage device ICC profiles; this task is
+ * handled by [colord](https://www.freedesktop.org/software/colord/). Colord
+ * maintains a database of devices (displays, printers, etc) and color profiles,
+ * including the default output profile for a device. Users configure colord
+ * with their preferred color profile for a device via an external application
+ * like GNOME Control Center or the colormgr CLI.
+ *
+ * Colord defines [a specification for device and profile names](
+ * https://github.com/hughsie/colord/blob/1.4.5/doc/device-and-profile-naming-spec.txt)
+ * which is used to map Colord's devices to Mutter's #MetaMonitor.
+ */
+
+#include "config.h"
+
+#include "backends/meta-color-manager-private.h"
+
+#include "backends/meta-backend-types.h"
+#include "backends/meta-monitor.h"
+
+enum
+{
+ PROP_0,
+
+ PROP_BACKEND,
+
+ N_PROPS
+};
+
+static GParamSpec *obj_props[N_PROPS];
+
+typedef struct _MetaColorManagerPrivate
+{
+ MetaBackend *backend;
+} MetaColorManagerPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (MetaColorManager, meta_color_manager, G_TYPE_OBJECT)
+
+static void
+meta_color_manager_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ MetaColorManager *color_manager = META_COLOR_MANAGER (object);
+ MetaColorManagerPrivate *priv =
+ meta_color_manager_get_instance_private (color_manager);
+
+ switch (prop_id)
+ {
+ case PROP_BACKEND:
+ priv->backend = g_value_get_object (value);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+meta_color_manager_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ MetaColorManager *color_manager = META_COLOR_MANAGER (object);
+ MetaColorManagerPrivate *priv =
+ meta_color_manager_get_instance_private (color_manager);
+
+ switch (prop_id)
+ {
+ case PROP_BACKEND:
+ g_value_set_object (value, priv->backend);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+meta_color_manager_class_init (MetaColorManagerClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+ object_class->set_property = meta_color_manager_set_property;
+ object_class->get_property = meta_color_manager_get_property;
+
+ obj_props[PROP_BACKEND] =
+ g_param_spec_object ("backend",
+ "backend",
+ "MetaBackend",
+ META_TYPE_BACKEND,
+ G_PARAM_READWRITE |
+ G_PARAM_CONSTRUCT_ONLY |
+ G_PARAM_STATIC_STRINGS);
+ g_object_class_install_properties (object_class, N_PROPS, obj_props);
+}
+
+static void
+meta_color_manager_init (MetaColorManager *color_manager)
+{
+}
+
+MetaBackend *
+meta_color_manager_get_backend (MetaColorManager *color_manager)
+{
+ MetaColorManagerPrivate *priv =
+ meta_color_manager_get_instance_private (color_manager);
+
+ return priv->backend;
+}
diff --git a/src/backends/meta-color-manager.h b/src/backends/meta-color-manager.h
new file mode 100644
index 000000000..8053a6b2a
--- /dev/null
+++ b/src/backends/meta-color-manager.h
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) 2021 Jeremy Cline
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see .
+ */
+
+#ifndef META_COLOR_MANAGER_H
+#define META_COLOR_MANAGER_H
+
+#include
+
+#include "backends/meta-backend-types.h"
+
+#define META_TYPE_COLOR_MANAGER (meta_color_manager_get_type ())
+G_DECLARE_DERIVABLE_TYPE (MetaColorManager, meta_color_manager,
+ META, COLOR_MANAGER,
+ GObject)
+
+MetaBackend *
+meta_color_manager_get_backend (MetaColorManager *color_manager);
+
+#endif /* META_COLOR_MANAGER_H */
diff --git a/src/backends/native/meta-backend-native.c b/src/backends/native/meta-backend-native.c
index ffbf0b252..86eccec2b 100644
--- a/src/backends/native/meta-backend-native.c
+++ b/src/backends/native/meta-backend-native.c
@@ -40,6 +40,7 @@
#include
+#include "backends/meta-color-manager.h"
#include "backends/meta-cursor-tracker-private.h"
#include "backends/meta-idle-manager.h"
#include "backends/meta-keymap-utils.h"
@@ -279,6 +280,14 @@ meta_backend_native_create_monitor_manager (MetaBackend *backend,
return manager;
}
+static MetaColorManager *
+meta_backend_native_create_color_manager (MetaBackend *backend)
+{
+ return g_object_new (META_TYPE_COLOR_MANAGER,
+ "backend", backend,
+ NULL);
+}
+
static MetaCursorRenderer *
meta_backend_native_get_cursor_renderer (MetaBackend *backend,
ClutterInputDevice *device)
@@ -714,6 +723,7 @@ meta_backend_native_class_init (MetaBackendNativeClass *klass)
backend_class->get_capabilities = meta_backend_native_get_capabilities;
backend_class->create_monitor_manager = meta_backend_native_create_monitor_manager;
+ backend_class->create_color_manager = meta_backend_native_create_color_manager;
backend_class->get_cursor_renderer = meta_backend_native_get_cursor_renderer;
backend_class->create_renderer = meta_backend_native_create_renderer;
backend_class->get_input_settings = meta_backend_native_get_input_settings;
diff --git a/src/backends/x11/meta-backend-x11.c b/src/backends/x11/meta-backend-x11.c
index da14cd73a..4d4a5da9c 100644
--- a/src/backends/x11/meta-backend-x11.c
+++ b/src/backends/x11/meta-backend-x11.c
@@ -42,6 +42,7 @@
#include
#include
+#include "backends/meta-color-manager.h"
#include "backends/meta-idle-monitor-private.h"
#include "backends/meta-keymap-utils.h"
#include "backends/meta-stage-private.h"
@@ -595,6 +596,14 @@ meta_backend_x11_create_clutter_backend (MetaBackend *backend)
return CLUTTER_BACKEND (meta_clutter_backend_x11_new (backend));
}
+static MetaColorManager *
+meta_backend_x11_create_color_manager (MetaBackend *backend)
+{
+ return g_object_new (META_TYPE_COLOR_MANAGER,
+ "backend", backend,
+ NULL);
+}
+
static ClutterSeat *
meta_backend_x11_create_default_seat (MetaBackend *backend,
GError **error)
@@ -953,6 +962,7 @@ meta_backend_x11_class_init (MetaBackendX11Class *klass)
object_class->dispose = meta_backend_x11_dispose;
object_class->finalize = meta_backend_x11_finalize;
backend_class->create_clutter_backend = meta_backend_x11_create_clutter_backend;
+ backend_class->create_color_manager = meta_backend_x11_create_color_manager;
backend_class->create_default_seat = meta_backend_x11_create_default_seat;
backend_class->post_init = meta_backend_x11_post_init;
backend_class->grab_device = meta_backend_x11_grab_device;
diff --git a/src/meson.build b/src/meson.build
index 49a28137b..6a88f5d5c 100644
--- a/src/meson.build
+++ b/src/meson.build
@@ -181,6 +181,9 @@ mutter_sources = [
'backends/meta-backend-private.h',
'backends/meta-barrier.c',
'backends/meta-barrier-private.h',
+ 'backends/meta-color-manager.c',
+ 'backends/meta-color-manager.h',
+ 'backends/meta-color-manager-private.h',
'backends/meta-crtc-mode.c',
'backends/meta-crtc-mode.h',
'backends/meta-crtc.c',