From 259a9998d80bfad0de253b585e6dd8540f12c687 Mon Sep 17 00:00:00 2001 From: Dor Askayo Date: Fri, 15 Jul 2022 12:06:12 +0300 Subject: [PATCH] compositor: Introduce MetaCompositorViewNative This class is meant to hold logic specific to the native backend in the context of a MetaCompositorView. Its addition requires making MetaCompositorView inheritable, and an addition of a virtual function which allows each compositor to create its own MetaCompositorView instance. In the case of the MetaCompositorNative, a MetaCompositorViewNative is created. In all other cases, a MetaCompositorView is created. Part-of: --- src/compositor/compositor-private.h | 3 ++ src/compositor/compositor.c | 11 +++- src/compositor/meta-compositor-native.c | 13 +++++ src/compositor/meta-compositor-server.c | 9 ++++ src/compositor/meta-compositor-view-native.c | 55 ++++++++++++++++++++ src/compositor/meta-compositor-view-native.h | 37 +++++++++++++ src/compositor/meta-compositor-view.h | 4 +- src/compositor/meta-compositor-x11.c | 9 ++++ src/meson.build | 2 + 9 files changed, 140 insertions(+), 3 deletions(-) create mode 100644 src/compositor/meta-compositor-view-native.c create mode 100644 src/compositor/meta-compositor-view-native.h diff --git a/src/compositor/compositor-private.h b/src/compositor/compositor-private.h index 096373fbf..4262f23cc 100644 --- a/src/compositor/compositor-private.h +++ b/src/compositor/compositor-private.h @@ -35,6 +35,9 @@ struct _MetaCompositorClass int64_t time_us); void (* grab_begin) (MetaCompositor *compositor); void (* grab_end) (MetaCompositor *compositor); + + MetaCompositorView * (* create_view) (MetaCompositor *compositor, + ClutterStageView *stage_view); }; gboolean meta_compositor_do_manage (MetaCompositor *compositor, diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index a32f7affa..f8ea427c3 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -417,6 +417,14 @@ meta_compositor_redirect_x11_windows (MetaCompositor *compositor) redirect_windows (display->x11_display); } +static MetaCompositorView * +meta_compositor_create_view (MetaCompositor *compositor, + ClutterStageView *stage_view) +{ + return META_COMPOSITOR_GET_CLASS (compositor)->create_view (compositor, + stage_view); +} + gboolean meta_compositor_do_manage (MetaCompositor *compositor, GError **error) @@ -1004,7 +1012,8 @@ meta_compositor_ensure_compositor_views (MetaCompositor *compositor) if (compositor_view) continue; - compositor_view = meta_compositor_view_new (stage_view); + compositor_view = meta_compositor_create_view (compositor, + stage_view); g_object_set_qdata_full (G_OBJECT (stage_view), quark_compositor_view, diff --git a/src/compositor/meta-compositor-native.c b/src/compositor/meta-compositor-native.c index c26890501..a156be7da 100644 --- a/src/compositor/meta-compositor-native.c +++ b/src/compositor/meta-compositor-native.c @@ -24,6 +24,7 @@ #include "backends/meta-logical-monitor.h" #include "backends/native/meta-crtc-kms.h" +#include "compositor/meta-compositor-view-native.h" #include "compositor/meta-surface-actor-wayland.h" struct _MetaCompositorNative @@ -169,6 +170,17 @@ meta_compositor_native_before_paint (MetaCompositor *compositor, parent_class->before_paint (compositor, compositor_view); } +static MetaCompositorView * +meta_compositor_native_create_view (MetaCompositor *compositor, + ClutterStageView *stage_view) +{ + MetaCompositorViewNative *compositor_view_native; + + compositor_view_native = meta_compositor_view_native_new (stage_view); + + return META_COMPOSITOR_VIEW (compositor_view_native); +} + MetaCompositorNative * meta_compositor_native_new (MetaDisplay *display, MetaBackend *backend) @@ -203,4 +215,5 @@ meta_compositor_native_class_init (MetaCompositorNativeClass *klass) object_class->finalize = meta_compositor_native_finalize; compositor_class->before_paint = meta_compositor_native_before_paint; + compositor_class->create_view = meta_compositor_native_create_view; } diff --git a/src/compositor/meta-compositor-server.c b/src/compositor/meta-compositor-server.c index f0d469172..990aa1e77 100644 --- a/src/compositor/meta-compositor-server.c +++ b/src/compositor/meta-compositor-server.c @@ -22,6 +22,7 @@ #include "backends/meta-dnd-private.h" #include "compositor/meta-compositor-server.h" +#include "compositor/meta-compositor-view.h" #include "core/display-private.h" G_DEFINE_TYPE (MetaCompositorServer, meta_compositor_server, META_TYPE_COMPOSITOR) @@ -66,6 +67,13 @@ meta_compositor_server_grab_end (MetaCompositor *compositor) meta_display_sync_wayland_input_focus (display); } +static MetaCompositorView * +meta_compositor_server_create_view (MetaCompositor *compositor, + ClutterStageView *stage_view) +{ + return meta_compositor_view_new (stage_view); +} + MetaCompositorServer * meta_compositor_server_new (MetaDisplay *display, MetaBackend *backend) @@ -91,4 +99,5 @@ meta_compositor_server_class_init (MetaCompositorServerClass *klass) meta_compositor_server_monotonic_to_high_res_xserver_time; compositor_class->grab_begin = meta_compositor_server_grab_begin; compositor_class->grab_end = meta_compositor_server_grab_end; + compositor_class->create_view = meta_compositor_server_create_view; } diff --git a/src/compositor/meta-compositor-view-native.c b/src/compositor/meta-compositor-view-native.c new file mode 100644 index 000000000..0841c954a --- /dev/null +++ b/src/compositor/meta-compositor-view-native.c @@ -0,0 +1,55 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2022 Dor Askayo + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Dor Askayo + */ + +#include "config.h" + +#include "compositor/meta-compositor-view-native.h" + +struct _MetaCompositorViewNative +{ + MetaCompositorView parent; +}; + +G_DEFINE_TYPE (MetaCompositorViewNative, meta_compositor_view_native, + META_TYPE_COMPOSITOR_VIEW) + +MetaCompositorViewNative * +meta_compositor_view_native_new (ClutterStageView *stage_view) +{ + g_assert (stage_view != NULL); + + return g_object_new (META_TYPE_COMPOSITOR_VIEW_NATIVE, + "stage-view", stage_view, + NULL); +} + +static void +meta_compositor_view_native_class_init (MetaCompositorViewNativeClass *klass) +{ +} + +static void +meta_compositor_view_native_init (MetaCompositorViewNative *view_native) +{ +} diff --git a/src/compositor/meta-compositor-view-native.h b/src/compositor/meta-compositor-view-native.h new file mode 100644 index 000000000..d0971cef3 --- /dev/null +++ b/src/compositor/meta-compositor-view-native.h @@ -0,0 +1,37 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2022 Dor Askayo + * + * 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + * + * Written by: + * Dor Askayo + */ + +#ifndef META_COMPOSITOR_VIEW_NATIVE_H +#define META_COMPOSITOR_VIEW_NATIVE_H + +#include "clutter/clutter-mutter.h" +#include "compositor/meta-compositor-view.h" + +#define META_TYPE_COMPOSITOR_VIEW_NATIVE (meta_compositor_view_native_get_type ()) +G_DECLARE_FINAL_TYPE (MetaCompositorViewNative, meta_compositor_view_native, + META, COMPOSITOR_VIEW_NATIVE, MetaCompositorView) + +MetaCompositorViewNative *meta_compositor_view_native_new (ClutterStageView *stage_view); + +#endif /* META_COMPOSITOR_VIEW_NATIVE_H */ diff --git a/src/compositor/meta-compositor-view.h b/src/compositor/meta-compositor-view.h index 5588867fd..7adc41fc1 100644 --- a/src/compositor/meta-compositor-view.h +++ b/src/compositor/meta-compositor-view.h @@ -36,8 +36,8 @@ struct _MetaCompositorViewClass }; #define META_TYPE_COMPOSITOR_VIEW (meta_compositor_view_get_type ()) -G_DECLARE_FINAL_TYPE (MetaCompositorView, meta_compositor_view, - META, COMPOSITOR_VIEW, GObject) +G_DECLARE_DERIVABLE_TYPE (MetaCompositorView, meta_compositor_view, + META, COMPOSITOR_VIEW, GObject) MetaCompositorView *meta_compositor_view_new (ClutterStageView *stage_view); diff --git a/src/compositor/meta-compositor-x11.c b/src/compositor/meta-compositor-x11.c index 8145efb5d..e7cb39abe 100644 --- a/src/compositor/meta-compositor-x11.c +++ b/src/compositor/meta-compositor-x11.c @@ -28,6 +28,7 @@ #include "backends/x11/meta-backend-x11.h" #include "backends/x11/meta-clutter-backend-x11.h" #include "backends/x11/meta-event-x11.h" +#include "compositor/meta-compositor-view.h" #include "compositor/meta-sync-ring.h" #include "compositor/meta-window-actor-x11.h" #include "core/display-private.h" @@ -458,6 +459,13 @@ meta_compositor_x11_grab_end (MetaCompositor *compositor) meta_backend_x11_sync_pointer (backend_x11); } +static MetaCompositorView * +meta_compositor_x11_create_view (MetaCompositor *compositor, + ClutterStageView *stage_view) +{ + return meta_compositor_view_new (stage_view); +} + Window meta_compositor_x11_get_output_xwindow (MetaCompositorX11 *compositor_x11) { @@ -532,4 +540,5 @@ meta_compositor_x11_class_init (MetaCompositorX11Class *klass) meta_compositor_x11_monotonic_to_high_res_xserver_time; compositor_class->grab_begin = meta_compositor_x11_grab_begin; compositor_class->grab_end = meta_compositor_x11_grab_end; + compositor_class->create_view = meta_compositor_x11_create_view; } diff --git a/src/meson.build b/src/meson.build index 504dc20ee..fbe9fb835 100644 --- a/src/meson.build +++ b/src/meson.build @@ -793,6 +793,8 @@ if have_native_backend 'backends/native/meta-xkb-utils.h', 'compositor/meta-compositor-native.c', 'compositor/meta-compositor-native.h', + 'compositor/meta-compositor-view-native.c', + 'compositor/meta-compositor-view-native.h', ] endif