1
0
Fork 0

clutter/backend: Keep a back pointer to the Context

Will be useful in the upcoming commits

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3977>
This commit is contained in:
Bilal Elmoussaoui 2024-08-20 21:33:56 +02:00
parent b02a29fee7
commit 8a71c89442
12 changed files with 87 additions and 14 deletions

View file

@ -38,6 +38,8 @@ struct _ClutterBackend
/*< private >*/
GObject parent_instance;
ClutterContext *context;
CoglRenderer *cogl_renderer;
CoglDisplay *cogl_display;
CoglContext *cogl_context;

View file

@ -61,6 +61,15 @@ enum
LAST_SIGNAL
};
enum
{
PROP_0,
PROP_CONTEXT,
N_PROPS
};
static GParamSpec *pspecs[N_PROPS] = { 0 };
G_DEFINE_ABSTRACT_TYPE (ClutterBackend, clutter_backend, G_TYPE_OBJECT)
static guint backend_signals[LAST_SIGNAL] = { 0, };
@ -89,6 +98,44 @@ clutter_backend_dispose (GObject *gobject)
G_OBJECT_CLASS (clutter_backend_parent_class)->dispose (gobject);
}
static void
clutter_backend_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec)
{
ClutterBackend *backend = CLUTTER_BACKEND (object);
switch (prop_id)
{
case PROP_CONTEXT:
g_value_set_object (value, backend->context);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clutter_backend_set_property (GObject *object,
guint prop_id,
const GValue *value,
GParamSpec *pspec)
{
ClutterBackend *backend = CLUTTER_BACKEND (object);
switch (prop_id)
{
case PROP_CONTEXT:
backend->context = g_value_get_object (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static void
clutter_backend_real_resolution_changed (ClutterBackend *backend)
{
@ -238,6 +285,8 @@ clutter_backend_class_init (ClutterBackendClass *klass)
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->dispose = clutter_backend_dispose;
gobject_class->get_property = clutter_backend_get_property;
gobject_class->set_property = clutter_backend_set_property;
/**
* ClutterBackend::resolution-changed:
@ -284,6 +333,15 @@ clutter_backend_class_init (ClutterBackendClass *klass)
NULL, NULL, NULL,
G_TYPE_NONE, 0);
pspecs[PROP_CONTEXT] =
g_param_spec_object ("context", NULL, NULL,
CLUTTER_TYPE_CONTEXT,
G_PARAM_READWRITE |
G_PARAM_STATIC_STRINGS |
G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_properties (gobject_class, N_PROPS, pspecs);
klass->resolution_changed = clutter_backend_real_resolution_changed;
klass->create_context = clutter_backend_real_create_context;

View file

@ -267,7 +267,7 @@ clutter_context_new (ClutterBackendConstructor backend_constructor,
init_clutter_debug (context);
context->show_fps = clutter_show_fps;
context->backend = backend_constructor (user_data);
context->backend = backend_constructor (context, user_data);
context->settings = clutter_settings_get_default ();
_clutter_settings_set_backend (context->settings,
context->backend);

View file

@ -24,7 +24,8 @@
#include "cogl-pango/cogl-pango.h"
typedef ClutterBackend * (* ClutterBackendConstructor) (gpointer user_data);
typedef ClutterBackend * (* ClutterBackendConstructor) (ClutterContext *context,
gpointer user_data);
#define CLUTTER_TYPE_CONTEXT (clutter_context_get_type ())
CLUTTER_EXPORT

View file

@ -55,7 +55,8 @@ struct _MetaBackendClass
{
GObjectClass parent_class;
ClutterBackend * (* create_clutter_backend) (MetaBackend *backend);
ClutterBackend * (* create_clutter_backend) (MetaBackend *backend,
ClutterContext *context);
void (* post_init) (MetaBackend *backend);

View file

@ -1201,11 +1201,13 @@ static GSourceFuncs clutter_source_funcs = {
};
static ClutterBackend *
meta_clutter_backend_constructor (gpointer user_data)
meta_clutter_backend_constructor (ClutterContext *context,
gpointer user_data)
{
MetaBackend *backend = META_BACKEND (user_data);
return META_BACKEND_GET_CLASS (backend)->create_clutter_backend (backend);
return META_BACKEND_GET_CLASS (backend)->create_clutter_backend (backend,
context);
}
static ClutterSeat *

View file

@ -124,9 +124,10 @@ meta_backend_native_dispose (GObject *object)
}
static ClutterBackend *
meta_backend_native_create_clutter_backend (MetaBackend *backend)
meta_backend_native_create_clutter_backend (MetaBackend *backend,
ClutterContext *context)
{
return CLUTTER_BACKEND (meta_clutter_backend_native_new (backend));
return CLUTTER_BACKEND (meta_clutter_backend_native_new (backend, context));
}
static ClutterSeat *

View file

@ -118,11 +118,13 @@ meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass)
}
MetaClutterBackendNative *
meta_clutter_backend_native_new (MetaBackend *backend)
meta_clutter_backend_native_new (MetaBackend *backend,
ClutterContext *context)
{
MetaClutterBackendNative *clutter_backend_native;
clutter_backend_native = g_object_new (META_TYPE_CLUTTER_BACKEND_NATIVE,
"context", context,
NULL);
clutter_backend_native->backend = backend;

View file

@ -33,4 +33,5 @@ G_DECLARE_FINAL_TYPE (MetaClutterBackendNative, meta_clutter_backend_native,
META, CLUTTER_BACKEND_NATIVE,
ClutterBackend)
MetaClutterBackendNative * meta_clutter_backend_native_new (MetaBackend *backend);
MetaClutterBackendNative * meta_clutter_backend_native_new (MetaBackend *backend,
ClutterContext *context);

View file

@ -609,9 +609,10 @@ meta_backend_x11_post_init (MetaBackend *backend)
}
static ClutterBackend *
meta_backend_x11_create_clutter_backend (MetaBackend *backend)
meta_backend_x11_create_clutter_backend (MetaBackend *backend,
ClutterContext *context)
{
return CLUTTER_BACKEND (meta_clutter_backend_x11_new (backend));
return CLUTTER_BACKEND (meta_clutter_backend_x11_new (backend, context));
}
static MetaColorManager *

View file

@ -137,14 +137,17 @@ meta_clutter_backend_x11_class_init (MetaClutterBackendX11Class *klass)
}
MetaClutterBackendX11 *
meta_clutter_backend_x11_new (MetaBackend *backend)
meta_clutter_backend_x11_new (MetaBackend *backend,
ClutterContext *context)
{
MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend);
Atom atoms[N_ATOM_NAMES];
MetaClutterBackendX11 *clutter_backend_x11;
MetaClutterBackendX11Private *priv;
clutter_backend_x11 = g_object_new (META_TYPE_CLUTTER_BACKEND_X11, NULL);
clutter_backend_x11 = g_object_new (META_TYPE_CLUTTER_BACKEND_X11,
"context", context,
NULL);
priv = meta_clutter_backend_x11_get_instance_private (clutter_backend_x11);
priv->backend = backend;

View file

@ -56,4 +56,5 @@ G_DECLARE_FINAL_TYPE (MetaClutterBackendX11, meta_clutter_backend_x11,
META, CLUTTER_BACKEND_X11,
ClutterBackend)
MetaClutterBackendX11 * meta_clutter_backend_x11_new (MetaBackend *backend);
MetaClutterBackendX11 * meta_clutter_backend_x11_new (MetaBackend *backend,
ClutterContext *context);