1
0
Fork 0

stage-impl: Change the backend pointer to MetaBackend

A pointer to the real backend is more useful, so lets use that. This
affects various places that now need to fetch e.g. the clutter backend
via the real backend.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2014>
This commit is contained in:
Jonas Ådahl 2021-09-17 18:24:28 +02:00
parent c0fb52cfe6
commit 5eae0c84ed
5 changed files with 84 additions and 55 deletions

View file

@ -28,6 +28,7 @@
#include <cairo.h>
#include "backends/meta-backend-types.h"
#include "clutter/clutter.h"
G_BEGIN_DECLS
@ -52,9 +53,6 @@ struct _MetaStageImpl
/* the stage wrapper */
ClutterStage *wrapper;
/* back pointer to the backend */
ClutterBackend *backend;
};
struct _MetaStageImplClass
@ -64,6 +62,8 @@ struct _MetaStageImplClass
GType meta_stage_impl_get_type (void) G_GNUC_CONST;
MetaBackend * meta_stage_impl_get_backend (MetaStageImpl *stage_impl);
void meta_stage_impl_presented (MetaStageImpl *stage_impl,
CoglFrameEvent frame_event,
ClutterFrameInfo *frame_info);

View file

@ -36,11 +36,13 @@
#include "clutter/clutter-mutter.h"
#include "cogl/cogl.h"
#include "core/util-private.h"
#include "meta/meta-backend.h"
#define MAX_STACK_RECTS 256
typedef struct _MetaStageImplPrivate
{
MetaBackend *backend;
int64_t global_frame_counter;
} MetaStageImplPrivate;
@ -770,6 +772,7 @@ meta_stage_impl_set_property (GObject *gobject,
GParamSpec *pspec)
{
MetaStageImpl *self = META_STAGE_IMPL (gobject);
MetaStageImplPrivate *priv = meta_stage_impl_get_instance_private (self);
switch (prop_id)
{
@ -778,7 +781,7 @@ meta_stage_impl_set_property (GObject *gobject,
break;
case PROP_BACKEND:
self->backend = g_value_get_object (value);
priv->backend = g_value_get_object (value);
break;
default:
@ -804,9 +807,9 @@ meta_stage_impl_class_init (MetaStageImplClass *klass)
G_PARAM_STATIC_STRINGS);
obj_props[PROP_BACKEND] =
g_param_spec_object ("backend",
"ClutterBackend",
"ClutterBackend",
CLUTTER_TYPE_BACKEND,
"MetaBackend",
"MetaBackend",
META_TYPE_BACKEND,
G_PARAM_WRITABLE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS);
@ -817,3 +820,12 @@ static void
meta_stage_impl_init (MetaStageImpl *stage)
{
}
MetaBackend *
meta_stage_impl_get_backend (MetaStageImpl *stage_impl)
{
MetaStageImplPrivate *priv =
meta_stage_impl_get_instance_private (stage_impl);
return priv->backend;
}

View file

@ -78,8 +78,11 @@ meta_clutter_backend_native_create_stage (ClutterBackend *clutter_backend,
ClutterStage *wrapper,
GError **error)
{
MetaClutterBackendNative *clutter_backend_native =
META_CLUTTER_BACKEND_NATIVE (clutter_backend);
return g_object_new (META_TYPE_STAGE_NATIVE,
"backend", clutter_backend,
"backend", clutter_backend_native->backend,
"wrapper", wrapper,
NULL);
}

View file

@ -311,6 +311,10 @@ meta_clutter_backend_x11_create_stage (ClutterBackend *clutter_backend,
ClutterStage *wrapper,
GError **error)
{
MetaClutterBackendX11 *clutter_backend_x11 =
META_CLUTTER_BACKEND_X11 (clutter_backend);
MetaClutterBackendX11Private *priv =
meta_clutter_backend_x11_get_instance_private (clutter_backend_x11);
ClutterStageWindow *stage;
GType stage_type;
@ -320,7 +324,7 @@ meta_clutter_backend_x11_create_stage (ClutterBackend *clutter_backend,
stage_type = META_TYPE_STAGE_X11;
stage = g_object_new (stage_type,
"backend", clutter_backend,
"backend", priv->backend,
"wrapper", wrapper,
NULL);
return stage;

View file

@ -75,6 +75,15 @@ G_DEFINE_TYPE_WITH_CODE (MetaStageX11,
ButtonReleaseMask | \
PointerMotionMask
static MetaClutterBackendX11 *
clutter_backend_x11_from_stage (MetaStageX11 *stage_x11)
{
MetaBackend *backend =
meta_stage_impl_get_backend (META_STAGE_IMPL (stage_x11));
return META_CLUTTER_BACKEND_X11 (meta_backend_get_clutter_backend (backend));
}
static void
meta_stage_x11_fix_window_size (MetaStageX11 *stage_x11,
int new_width,
@ -105,15 +114,14 @@ meta_stage_x11_fix_window_size (MetaStageX11 *stage_x11,
static void
meta_stage_x11_set_wm_protocols (MetaStageX11 *stage_x11)
{
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_x11);
MetaClutterBackendX11 *backend_x11 =
META_CLUTTER_BACKEND_X11 (stage_impl->backend);
MetaClutterBackendX11 *clutter_backend_x11 =
clutter_backend_x11_from_stage (stage_x11);
Display *xdisplay = meta_clutter_x11_get_default_display ();
Atom protocols[2];
int n = 0;
protocols[n++] = backend_x11->atom_WM_DELETE_WINDOW;
protocols[n++] = backend_x11->atom_NET_WM_PING;
protocols[n++] = clutter_backend_x11->atom_WM_DELETE_WINDOW;
protocols[n++] = clutter_backend_x11->atom_NET_WM_PING;
XSetWMProtocols (xdisplay, stage_x11->xwin, protocols, n);
}
@ -179,9 +187,11 @@ static inline void
set_wm_pid (MetaStageX11 *stage_x11)
{
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_x11);
MetaClutterBackendX11 *backend_x11 =
META_CLUTTER_BACKEND_X11 (stage_impl->backend);
Display *xdisplay = meta_clutter_x11_get_default_display ();
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend);
MetaClutterBackendX11 *clutter_backend_x11 =
clutter_backend_x11_from_stage (stage_x11);
Display *xdisplay = meta_backend_x11_get_xdisplay (backend_x11);
long pid;
if (stage_x11->xwin == None)
@ -197,7 +207,7 @@ set_wm_pid (MetaStageX11 *stage_x11)
pid = getpid ();
XChangeProperty (xdisplay,
stage_x11->xwin,
backend_x11->atom_NET_WM_PID, XA_CARDINAL, 32,
clutter_backend_x11->atom_NET_WM_PID, XA_CARDINAL, 32,
PropModeReplace,
(guchar *) &pid, 1);
}
@ -205,9 +215,8 @@ set_wm_pid (MetaStageX11 *stage_x11)
static inline void
set_wm_title (MetaStageX11 *stage_x11)
{
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_x11);
MetaClutterBackendX11 *backend_x11 =
META_CLUTTER_BACKEND_X11 (stage_impl->backend);
MetaClutterBackendX11 *clutter_backend_x11 =
clutter_backend_x11_from_stage (stage_x11);
Display *xdisplay = meta_clutter_x11_get_default_display ();
if (stage_x11->xwin == None)
@ -217,14 +226,14 @@ set_wm_title (MetaStageX11 *stage_x11)
{
XDeleteProperty (xdisplay,
stage_x11->xwin,
backend_x11->atom_NET_WM_NAME);
clutter_backend_x11->atom_NET_WM_NAME);
}
else
{
XChangeProperty (xdisplay,
stage_x11->xwin,
backend_x11->atom_NET_WM_NAME,
backend_x11->atom_UTF8_STRING,
clutter_backend_x11->atom_NET_WM_NAME,
clutter_backend_x11->atom_UTF8_STRING,
8,
PropModeReplace,
(unsigned char *) stage_x11->title,
@ -285,19 +294,23 @@ meta_stage_x11_realize (ClutterStageWindow *stage_window)
{
MetaStageX11 *stage_x11 = META_STAGE_X11 (stage_window);
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_window);
ClutterBackend *backend = CLUTTER_BACKEND (stage_impl->backend);
MetaSeatX11 *seat_x11 = META_SEAT_X11 (clutter_backend_get_default_seat (backend));
Display *xdisplay = meta_clutter_x11_get_default_display ();
MetaBackend *backend = meta_stage_impl_get_backend (stage_impl);
MetaBackendX11 *backend_x11 = META_BACKEND_X11 (backend);
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
MetaSeatX11 *seat_x11 =
META_SEAT_X11 (meta_backend_get_default_seat (backend));
Display *xdisplay = meta_backend_x11_get_xdisplay (backend_x11);
float width, height;
GError *error = NULL;
clutter_actor_get_size (CLUTTER_ACTOR (stage_impl->wrapper), &width, &height);
stage_x11->onscreen = create_onscreen (backend->cogl_context, width, height);
stage_x11->onscreen = create_onscreen (clutter_backend->cogl_context,
width, height);
if (META_IS_BACKEND_X11_CM (stage_x11->backend))
if (META_IS_BACKEND_X11_CM (backend))
{
MetaRenderer *renderer = meta_backend_get_renderer (stage_x11->backend);
MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaRendererX11Cm *renderer_x11_cm = META_RENDERER_X11_CM (renderer);
meta_renderer_x11_cm_init_screen_view (renderer_x11_cm,
@ -542,17 +555,19 @@ clutter_stage_window_iface_init (ClutterStageWindowInterface *iface)
}
static inline void
set_user_time (MetaClutterBackendX11 *backend_x11,
MetaStageX11 *stage_x11,
long timestamp)
set_user_time (MetaStageX11 *stage_x11,
long timestamp)
{
MetaClutterBackendX11 *clutter_backend_x11 =
clutter_backend_x11_from_stage (stage_x11);
if (timestamp != CLUTTER_CURRENT_TIME)
{
Display *xdisplay = meta_clutter_x11_get_default_display ();
XChangeProperty (xdisplay,
stage_x11->xwin,
backend_x11->atom_NET_WM_USER_TIME,
clutter_backend_x11->atom_NET_WM_USER_TIME,
XA_CARDINAL, 32,
PropModeReplace,
(unsigned char *) &timestamp, 1);
@ -560,26 +575,27 @@ set_user_time (MetaClutterBackendX11 *backend_x11,
}
static gboolean
handle_wm_protocols_event (MetaClutterBackendX11 *backend_x11,
MetaStageX11 *stage_x11,
XEvent *xevent)
handle_wm_protocols_event (MetaStageX11 *stage_x11,
XEvent *xevent)
{
MetaClutterBackendX11 *clutter_backend_x11 =
clutter_backend_x11_from_stage (stage_x11);
Atom atom = (Atom) xevent->xclient.data.l[0];
if (atom == backend_x11->atom_WM_DELETE_WINDOW &&
if (atom == clutter_backend_x11->atom_WM_DELETE_WINDOW &&
xevent->xany.window == stage_x11->xwin)
{
set_user_time (backend_x11, stage_x11, xevent->xclient.data.l[1]);
set_user_time (stage_x11, xevent->xclient.data.l[1]);
return TRUE;
}
else if (atom == backend_x11->atom_NET_WM_PING &&
else if (atom == clutter_backend_x11->atom_NET_WM_PING &&
xevent->xany.window == stage_x11->xwin)
{
XClientMessageEvent xclient = xevent->xclient;
Display *xdisplay = meta_clutter_x11_get_default_display ();
xclient.window = backend_x11->xwin_root;
xclient.window = clutter_backend_x11->xwin_root;
XSendEvent (xdisplay, xclient.window,
False,
SubstructureRedirectMask | SubstructureNotifyMask,
@ -606,19 +622,19 @@ meta_stage_x11_translate_event (MetaStageX11 *stage_x11,
XEvent *xevent,
ClutterEvent *event)
{
MetaClutterBackendX11 *clutter_backend_x11 =
clutter_backend_x11_from_stage (stage_x11);
MetaBackend *backend;
MetaStageImpl *stage_impl;
gboolean res = FALSE;
MetaClutterBackendX11 *clutter_backend_x11;
ClutterStage *stage;
MetaBackend *backend;
stage_impl = meta_x11_get_stage_window_from_window (xevent->xany.window);
if (stage_impl == NULL)
return FALSE;
backend = meta_stage_impl_get_backend (stage_impl);
stage = stage_impl->wrapper;
backend = stage_x11->backend;
clutter_backend_x11 = META_CLUTTER_BACKEND_X11 (stage_impl->backend);
switch (xevent->type)
{
@ -644,7 +660,7 @@ meta_stage_x11_translate_event (MetaStageX11 *stage_x11,
stage_width = xevent->xconfigure.width;
stage_height = xevent->xconfigure.height;
if (META_IS_BACKEND_X11_CM (stage_x11->backend))
if (META_IS_BACKEND_X11_CM (backend))
{
clutter_actor_set_size (CLUTTER_ACTOR (stage),
stage_width,
@ -715,7 +731,7 @@ meta_stage_x11_translate_event (MetaStageX11 *stage_x11,
* X11 compositing manager, we need to reset the legacy
* stage view, now that it has a new size.
*/
if (META_IS_BACKEND_X11_CM (stage_x11->backend))
if (META_IS_BACKEND_X11_CM (backend))
{
MetaRenderer *renderer = meta_backend_get_renderer (backend);
MetaRendererX11Cm *renderer_x11_cm =
@ -774,9 +790,7 @@ meta_stage_x11_translate_event (MetaStageX11 *stage_x11,
if (xevent->xclient.message_type == clutter_backend_x11->atom_WM_PROTOCOLS)
{
if (handle_wm_protocols_event (clutter_backend_x11,
stage_x11,
xevent))
if (handle_wm_protocols_event (stage_x11, xevent))
{
g_return_val_if_fail (META_IS_STAGE_X11_NESTED (stage_x11),
FALSE);
@ -835,9 +849,5 @@ void
meta_stage_x11_set_user_time (MetaStageX11 *stage_x11,
uint32_t user_time)
{
MetaStageImpl *stage_impl = META_STAGE_IMPL (stage_x11);
MetaClutterBackendX11 *backend_x11 =
META_CLUTTER_BACKEND_X11 (stage_impl->backend);
set_user_time (backend_x11, stage_x11, user_time);
set_user_time (stage_x11, user_time);
}