diff --git a/src/backends/meta-stage-impl-private.h b/src/backends/meta-stage-impl-private.h index ab3e0d391..3620de50d 100644 --- a/src/backends/meta-stage-impl-private.h +++ b/src/backends/meta-stage-impl-private.h @@ -28,6 +28,7 @@ #include +#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); diff --git a/src/backends/meta-stage-impl.c b/src/backends/meta-stage-impl.c index 4ff30360c..c45aaf852 100644 --- a/src/backends/meta-stage-impl.c +++ b/src/backends/meta-stage-impl.c @@ -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; +} diff --git a/src/backends/native/meta-clutter-backend-native.c b/src/backends/native/meta-clutter-backend-native.c index 87963e78e..97affc7b8 100644 --- a/src/backends/native/meta-clutter-backend-native.c +++ b/src/backends/native/meta-clutter-backend-native.c @@ -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); } diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c index fafe31941..4a023a1d4 100644 --- a/src/backends/x11/meta-clutter-backend-x11.c +++ b/src/backends/x11/meta-clutter-backend-x11.c @@ -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; diff --git a/src/backends/x11/meta-stage-x11.c b/src/backends/x11/meta-stage-x11.c index 203ba9106..866fa1779 100644 --- a/src/backends/x11/meta-stage-x11.c +++ b/src/backends/x11/meta-stage-x11.c @@ -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 *) ×tamp, 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); }