diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.c b/src/backends/x11/cm/meta-renderer-x11-cm.c index 1bdc206be..2490b055d 100644 --- a/src/backends/x11/cm/meta-renderer-x11-cm.c +++ b/src/backends/x11/cm/meta-renderer-x11-cm.c @@ -24,14 +24,75 @@ #include "backends/x11/cm/meta-renderer-x11-cm.h" +#include "backends/meta-renderer-view.h" + struct _MetaRendererX11Cm { MetaRendererX11 parent; + + MetaRendererView *screen_view; }; G_DEFINE_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm, META_TYPE_RENDERER_X11) +void +meta_renderer_x11_cm_ensure_screen_view (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height) +{ + cairo_rectangle_int_t view_layout; + + if (renderer_x11_cm->screen_view) + return; + + view_layout = (cairo_rectangle_int_t) { + .width = width, + .height = height, + }; + renderer_x11_cm->screen_view = g_object_new (META_TYPE_RENDERER_VIEW, + "layout", &view_layout, + NULL); + meta_renderer_add_view (META_RENDERER (renderer_x11_cm), + renderer_x11_cm->screen_view); +} + +void +meta_renderer_x11_cm_resize (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height) +{ + cairo_rectangle_int_t view_layout; + + view_layout = (cairo_rectangle_int_t) { + .width = width, + .height = height, + }; + + g_object_set (G_OBJECT (renderer_x11_cm->screen_view), + "layout", &view_layout, + NULL); +} + +void +meta_renderer_x11_cm_set_onscreen (MetaRendererX11Cm *renderer_x11_cm, + CoglOnscreen *onscreen) +{ + g_object_set (G_OBJECT (renderer_x11_cm->screen_view), + "framebuffer", onscreen, + NULL); +} + +static void +meta_renderer_x11_cm_rebuild_views (MetaRenderer *renderer) +{ + MetaRendererX11Cm *renderer_x11_cm = META_RENDERER_X11_CM (renderer); + + g_return_if_fail (!meta_renderer_get_views (renderer)); + + meta_renderer_add_view (renderer, renderer_x11_cm->screen_view); +} + static void meta_renderer_x11_cm_init (MetaRendererX11Cm *renderer_x11_cm) { @@ -40,4 +101,7 @@ meta_renderer_x11_cm_init (MetaRendererX11Cm *renderer_x11_cm) static void meta_renderer_x11_cm_class_init (MetaRendererX11CmClass *klass) { + MetaRendererClass *renderer_class = META_RENDERER_CLASS (klass); + + renderer_class->rebuild_views = meta_renderer_x11_cm_rebuild_views; } diff --git a/src/backends/x11/cm/meta-renderer-x11-cm.h b/src/backends/x11/cm/meta-renderer-x11-cm.h index e890a3dbb..65c5125bb 100644 --- a/src/backends/x11/cm/meta-renderer-x11-cm.h +++ b/src/backends/x11/cm/meta-renderer-x11-cm.h @@ -30,4 +30,15 @@ G_DECLARE_FINAL_TYPE (MetaRendererX11Cm, meta_renderer_x11_cm, META, RENDERER_X11_CM, MetaRendererX11) +void meta_renderer_x11_cm_ensure_screen_view (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height); + +void meta_renderer_x11_cm_resize (MetaRendererX11Cm *renderer_x11_cm, + int width, + int height); + +void meta_renderer_x11_cm_set_onscreen (MetaRendererX11Cm *renderer_x11_cm, + CoglOnscreen *onscreen); + #endif /* META_RENDERER_X11_CM_H */ diff --git a/src/backends/x11/meta-stage-x11.c b/src/backends/x11/meta-stage-x11.c index 048bf9067..77e96f97e 100644 --- a/src/backends/x11/meta-stage-x11.c +++ b/src/backends/x11/meta-stage-x11.c @@ -26,6 +26,8 @@ #include #endif +#include "backends/x11/cm/meta-backend-x11-cm.h" +#include "backends/x11/cm/meta-renderer-x11-cm.h" #include "backends/x11/meta-backend-x11.h" #include "backends/x11/meta-seat-x11.h" #include "backends/x11/meta-stage-x11.h" @@ -254,8 +256,6 @@ meta_stage_x11_unrealize (ClutterStageWindow *stage_window) clutter_stage_window_parent_iface->unrealize (stage_window); - g_list_free (stage_x11->legacy_views); - g_clear_object (&stage_x11->legacy_view); g_clear_pointer (&stage_x11->onscreen, cogl_object_unref); } @@ -297,10 +297,13 @@ meta_stage_x11_realize (ClutterStageWindow *stage_window) stage_cogl, NULL); - if (stage_x11->legacy_view) - g_object_set (G_OBJECT (stage_x11->legacy_view), - "framebuffer", stage_x11->onscreen, - NULL); + if (META_IS_BACKEND_X11_CM (stage_x11->backend)) + { + MetaRenderer *renderer = meta_backend_get_renderer (stage_x11->backend); + MetaRendererX11Cm *renderer_x11_cm = META_RENDERER_X11_CM (renderer); + + meta_renderer_x11_cm_set_onscreen (renderer_x11_cm, stage_x11->onscreen); + } /* We just created a window of the size of the actor. No need to fix the size of the stage, just update it. */ @@ -468,34 +471,13 @@ meta_stage_x11_can_clip_redraws (ClutterStageWindow *stage_window) return stage_x11->clipped_redraws_cool_off == 0; } -static void -ensure_legacy_view (ClutterStageWindow *stage_window) -{ - MetaStageX11 *stage_x11 = META_STAGE_X11 (stage_window); - cairo_rectangle_int_t view_layout; - CoglFramebuffer *framebuffer; - - if (stage_x11->legacy_view) - return; - - _clutter_stage_window_get_geometry (stage_window, &view_layout); - framebuffer = COGL_FRAMEBUFFER (stage_x11->onscreen); - stage_x11->legacy_view = g_object_new (CLUTTER_TYPE_STAGE_VIEW_COGL, - "layout", &view_layout, - "framebuffer", framebuffer, - NULL); - stage_x11->legacy_views = g_list_append (stage_x11->legacy_views, - stage_x11->legacy_view); -} - static GList * meta_stage_x11_get_views (ClutterStageWindow *stage_window) { MetaStageX11 *stage_x11 = META_STAGE_X11 (stage_window); + MetaRenderer *renderer = meta_backend_get_renderer (stage_x11->backend); - ensure_legacy_view (stage_window); - - return stage_x11->legacy_views; + return meta_renderer_get_views (renderer); } static int64_t @@ -527,6 +509,9 @@ meta_stage_x11_class_init (MetaStageX11Class *klass) static void meta_stage_x11_init (MetaStageX11 *stage) { + MetaRenderer *renderer; + MetaRendererX11Cm *renderer_x11_cm; + stage->xwin = None; stage->xwin_width = 640; stage->xwin_height = 480; @@ -534,6 +519,19 @@ meta_stage_x11_init (MetaStageX11 *stage) stage->wm_state = STAGE_X11_WITHDRAWN; stage->title = NULL; + + stage->backend = meta_get_backend (); + g_assert (stage->backend); + + if (META_IS_BACKEND_X11_CM (stage->backend)) + { + renderer = meta_backend_get_renderer (stage->backend); + renderer_x11_cm = META_RENDERER_X11_CM (renderer); + + meta_renderer_x11_cm_ensure_screen_view (renderer_x11_cm, + stage->xwin_width, + stage->xwin_height); + } } static void @@ -719,16 +717,16 @@ 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 (stage_x11->legacy_view) + if (META_IS_BACKEND_X11_CM (stage_x11->backend)) { - cairo_rectangle_int_t view_layout = { - .width = stage_width, - .height = stage_height - }; + MetaBackend *backend = stage_x11->backend; + MetaRenderer *renderer = meta_backend_get_renderer (backend); + MetaRendererX11Cm *renderer_x11_cm = + META_RENDERER_X11_CM (renderer); - g_object_set (G_OBJECT (stage_x11->legacy_view), - "layout", &view_layout, - NULL); + meta_renderer_x11_cm_resize (renderer_x11_cm, + stage_width, + stage_height); } } } diff --git a/src/backends/x11/meta-stage-x11.h b/src/backends/x11/meta-stage-x11.h index 9ca4da551..bcfc536e4 100644 --- a/src/backends/x11/meta-stage-x11.h +++ b/src/backends/x11/meta-stage-x11.h @@ -25,6 +25,7 @@ #include #include +#include "backends/meta-backend-private.h" #include "clutter/clutter-mutter.h" #include "clutter/x11/clutter-x11.h" @@ -51,14 +52,13 @@ struct _MetaStageX11 { ClutterStageCogl parent_instance; + MetaBackend *backend; + CoglOnscreen *onscreen; Window xwin; gint xwin_width; gint xwin_height; /* FIXME target_width / height */ - ClutterStageView *legacy_view; - GList *legacy_views; - CoglFrameClosure *frame_closure; gchar *title;