diff --git a/clutter/clutter/clutter-backend-private.h b/clutter/clutter/clutter-backend-private.h index a2b729c2e..f485cba8a 100644 --- a/clutter/clutter/clutter-backend-private.h +++ b/clutter/clutter/clutter-backend-private.h @@ -65,8 +65,6 @@ struct _ClutterBackendClass /*< private >*/ GObjectClass parent_class; - GType stage_window_type; - /* vfuncs */ gboolean (* pre_parse) (ClutterBackend *backend, GError **error); @@ -138,8 +136,11 @@ void _clutter_backend_free_event_data (Clutter gboolean _clutter_backend_translate_event (ClutterBackend *backend, gpointer native, ClutterEvent *event); + +CLUTTER_AVAILABLE_IN_MUTTER void _clutter_backend_add_event_translator (ClutterBackend *backend, ClutterEventTranslator *translator); + void _clutter_backend_remove_event_translator (ClutterBackend *backend, ClutterEventTranslator *translator); diff --git a/clutter/clutter/clutter-backend.c b/clutter/clutter/clutter-backend.c index 0f38270cc..c3b729563 100644 --- a/clutter/clutter/clutter-backend.c +++ b/clutter/clutter/clutter-backend.c @@ -467,37 +467,6 @@ clutter_backend_real_get_features (ClutterBackend *backend) return flags; } -static ClutterStageWindow * -clutter_backend_real_create_stage (ClutterBackend *backend, - ClutterStage *wrapper, - GError **error) -{ - ClutterBackendClass *klass; - - if (!clutter_feature_available (CLUTTER_FEATURE_STAGE_MULTIPLE)) - { - ClutterStageManager *manager = clutter_stage_manager_get_default (); - - if (clutter_stage_manager_get_default_stage (manager) != NULL) - { - g_set_error (error, CLUTTER_INIT_ERROR, - CLUTTER_INIT_ERROR_BACKEND, - _("The backend of type '%s' does not support " - "creating multiple stages"), - G_OBJECT_TYPE_NAME (backend)); - return NULL; - } - } - - klass = CLUTTER_BACKEND_GET_CLASS (backend); - g_assert (klass->stage_window_type != G_TYPE_INVALID); - - return g_object_new (klass->stage_window_type, - "backend", backend, - "wrapper", wrapper, - NULL); -} - static const char *allowed_backends; static ClutterBackend * (* custom_backend_func) (void); @@ -667,8 +636,6 @@ clutter_backend_class_init (ClutterBackendClass *klass) gobject_class->dispose = clutter_backend_dispose; gobject_class->finalize = clutter_backend_finalize; - klass->stage_window_type = G_TYPE_INVALID; - /** * ClutterBackend::resolution-changed: * @backend: the #ClutterBackend that emitted the signal @@ -732,7 +699,6 @@ clutter_backend_class_init (ClutterBackendClass *klass) klass->create_context = clutter_backend_real_create_context; klass->ensure_context = clutter_backend_real_ensure_context; klass->get_features = clutter_backend_real_get_features; - klass->create_stage = clutter_backend_real_create_stage; } static void diff --git a/clutter/clutter/clutter-event-translator.h b/clutter/clutter/clutter-event-translator.h index f7facc7f9..e784fd996 100644 --- a/clutter/clutter/clutter-event-translator.h +++ b/clutter/clutter/clutter-event-translator.h @@ -29,6 +29,7 @@ struct _ClutterEventTranslatorIface ClutterEvent *translated); }; +CLUTTER_AVAILABLE_IN_MUTTER GType _clutter_event_translator_get_type (void) G_GNUC_CONST; ClutterTranslateReturn _clutter_event_translator_translate_event (ClutterEventTranslator *translator, diff --git a/clutter/clutter/clutter-mutter.h b/clutter/clutter/clutter-mutter.h index ebd06b6ae..fec621446 100644 --- a/clutter/clutter/clutter-mutter.h +++ b/clutter/clutter/clutter-mutter.h @@ -27,6 +27,8 @@ #include "clutter-backend.h" #include "clutter-macros.h" +#include "egl/clutter-stage-eglnative.h" +#include "x11/clutter-stage-x11.h" CLUTTER_AVAILABLE_IN_MUTTER void clutter_set_custom_backend_func (ClutterBackend *(* func) (void)); diff --git a/clutter/clutter/egl/clutter-backend-eglnative.c b/clutter/clutter/egl/clutter-backend-eglnative.c index 649110be1..cbe206728 100644 --- a/clutter/clutter/egl/clutter-backend-eglnative.c +++ b/clutter/clutter/egl/clutter-backend-eglnative.c @@ -75,11 +75,8 @@ static void clutter_backend_egl_native_class_init (ClutterBackendEglNativeClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); - ClutterBackendClass *backend_class = CLUTTER_BACKEND_CLASS (klass); gobject_class->dispose = clutter_backend_egl_native_dispose; - - backend_class->stage_window_type = CLUTTER_TYPE_STAGE_EGL_NATIVE; } static void diff --git a/clutter/clutter/egl/clutter-stage-eglnative.h b/clutter/clutter/egl/clutter-stage-eglnative.h index a237ffa77..073ce92d8 100644 --- a/clutter/clutter/egl/clutter-stage-eglnative.h +++ b/clutter/clutter/egl/clutter-stage-eglnative.h @@ -40,6 +40,8 @@ typedef struct _ClutterStageEglNative ClutterStageEglNative; typedef struct _ClutterStageEglNativeClass ClutterStageEglNativeClass; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterStageEglNative, g_object_unref) + struct _ClutterStageEglNative { ClutterStageCogl parent_instance; @@ -50,6 +52,7 @@ struct _ClutterStageEglNativeClass ClutterStageCoglClass parent_class; }; +CLUTTER_AVAILABLE_IN_MUTTER GType _clutter_stage_eglnative_get_type (void) G_GNUC_CONST; #endif /* __CLUTTER_STAGE_EGL_NATIVE_H__ */ diff --git a/clutter/clutter/x11/clutter-backend-x11.c b/clutter/clutter/x11/clutter-backend-x11.c index 4a299cf3f..50fe293c7 100644 --- a/clutter/clutter/x11/clutter-backend-x11.c +++ b/clutter/clutter/x11/clutter-backend-x11.c @@ -829,7 +829,7 @@ clutter_backend_x11_class_init (ClutterBackendX11Class *klass) gobject_class->dispose = clutter_backend_x11_dispose; gobject_class->finalize = clutter_backend_x11_finalize; - backend_class->stage_window_type = CLUTTER_TYPE_STAGE_X11; + backend_class->create_stage = clutter_backend_x11_create_stage; backend_class->pre_parse = clutter_backend_x11_pre_parse; backend_class->post_parse = clutter_backend_x11_post_parse; @@ -840,7 +840,6 @@ clutter_backend_x11_class_init (ClutterBackendX11Class *klass) backend_class->get_renderer = clutter_backend_x11_get_renderer; backend_class->get_display = clutter_backend_x11_get_display; - backend_class->create_stage = clutter_backend_x11_create_stage; backend_class->get_keymap_direction = clutter_backend_x11_get_keymap_direction; } diff --git a/clutter/clutter/x11/clutter-stage-x11.h b/clutter/clutter/x11/clutter-stage-x11.h index 1e0351046..5f577d8af 100644 --- a/clutter/clutter/x11/clutter-stage-x11.h +++ b/clutter/clutter/x11/clutter-stage-x11.h @@ -42,6 +42,8 @@ G_BEGIN_DECLS typedef struct _ClutterStageX11 ClutterStageX11; typedef struct _ClutterStageX11Class ClutterStageX11Class; +G_DEFINE_AUTOPTR_CLEANUP_FUNC (ClutterStageX11, g_object_unref) + typedef enum { STAGE_X11_WITHDRAWN = 1 << 1 @@ -76,6 +78,7 @@ struct _ClutterStageX11Class ClutterStageCoglClass parent_class; }; +CLUTTER_AVAILABLE_IN_MUTTER GType _clutter_stage_x11_get_type (void) G_GNUC_CONST; void _clutter_stage_x11_events_device_changed (ClutterStageX11 *stage_x11, diff --git a/src/Makefile.am b/src/Makefile.am index a4c7cd03b..b378f9f94 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -127,6 +127,8 @@ libmutter_la_SOURCES = \ backends/x11/meta-monitor-manager-xrandr.h \ backends/x11/meta-renderer-x11.c \ backends/x11/meta-renderer-x11.h \ + backends/x11/meta-stage-x11-nested.c \ + backends/x11/meta-stage-x11-nested.h \ core/meta-accel-parse.c \ core/meta-accel-parse.h \ meta/barrier.h \ @@ -351,6 +353,8 @@ libmutter_la_SOURCES += \ backends/native/meta-launcher.h \ backends/native/meta-renderer-native.c \ backends/native/meta-renderer-native.h \ + backends/native/meta-stage-native.c \ + backends/native/meta-stage-native.h \ backends/native/dbus-utils.c \ backends/native/dbus-utils.h \ $(NULL) diff --git a/src/backends/native/meta-clutter-backend-native.c b/src/backends/native/meta-clutter-backend-native.c index 437124131..675395a6c 100644 --- a/src/backends/native/meta-clutter-backend-native.c +++ b/src/backends/native/meta-clutter-backend-native.c @@ -29,6 +29,7 @@ #include "backends/meta-backend-private.h" #include "backends/meta-renderer.h" #include "backends/native/meta-clutter-backend-native.h" +#include "backends/native/meta-stage-native.h" #include "clutter/clutter.h" #include "meta/meta-backend.h" @@ -50,6 +51,17 @@ meta_clutter_backend_native_get_renderer (ClutterBackend *clutter_backend, return meta_renderer_create_cogl_renderer (renderer); } +static ClutterStageWindow * +meta_clutter_backend_native_create_stage (ClutterBackend *backend, + ClutterStage *wrapper, + GError **error) +{ + return g_object_new (META_TYPE_STAGE_NATIVE, + "backend", backend, + "wrapper", wrapper, + NULL); +} + static void meta_clutter_backend_native_init (MetaClutterBackendNative *clutter_backend_nativen) { @@ -61,4 +73,5 @@ meta_clutter_backend_native_class_init (MetaClutterBackendNativeClass *klass) ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass); clutter_backend_class->get_renderer = meta_clutter_backend_native_get_renderer; + clutter_backend_class->create_stage = meta_clutter_backend_native_create_stage; } diff --git a/src/backends/native/meta-stage-native.c b/src/backends/native/meta-stage-native.c new file mode 100644 index 000000000..6547bb483 --- /dev/null +++ b/src/backends/native/meta-stage-native.c @@ -0,0 +1,45 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat Inc. + * + * 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: + * Jonas Ådahl + */ + +#include "config.h" + +#include "backends/native/meta-stage-native.h" + +struct _MetaStageNative +{ + ClutterStageEglNative parent; +}; + +G_DEFINE_TYPE (MetaStageNative, meta_stage_native, + CLUTTER_TYPE_STAGE_EGL_NATIVE) + +static void +meta_stage_native_init (MetaStageNative *stage_native) +{ +} + +static void +meta_stage_native_class_init (MetaStageNativeClass *klass) +{ +} diff --git a/src/backends/native/meta-stage-native.h b/src/backends/native/meta-stage-native.h new file mode 100644 index 000000000..7668bbfef --- /dev/null +++ b/src/backends/native/meta-stage-native.h @@ -0,0 +1,34 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat Inc. + * + * 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: + * Jonas Ådahl + */ + +#ifndef META_STAGE_NATIVE_H +#define META_STAGE_NATIVE_H + +#include "clutter/clutter-mutter.h" + +#define META_TYPE_STAGE_NATIVE (meta_stage_native_get_type ()) +G_DECLARE_FINAL_TYPE (MetaStageNative, meta_stage_native, + META, STAGE_NATIVE, ClutterStageEglNative) + +#endif /* META_STAGE_NATIVE_H */ diff --git a/src/backends/x11/meta-clutter-backend-x11.c b/src/backends/x11/meta-clutter-backend-x11.c index a3b6a50ca..2e8474deb 100644 --- a/src/backends/x11/meta-clutter-backend-x11.c +++ b/src/backends/x11/meta-clutter-backend-x11.c @@ -29,7 +29,9 @@ #include "backends/meta-backend-private.h" #include "backends/meta-renderer.h" #include "backends/x11/meta-clutter-backend-x11.h" +#include "backends/x11/meta-stage-x11-nested.h" #include "clutter/clutter.h" +#include "clutter/clutter-mutter.h" #include "meta/meta-backend.h" struct _MetaClutterBackendX11 @@ -50,6 +52,32 @@ meta_clutter_backend_x11_get_renderer (ClutterBackend *clutter_backend, return meta_renderer_create_cogl_renderer (renderer); } +static ClutterStageWindow * +meta_clutter_backend_x11_create_stage (ClutterBackend *backend, + ClutterStage *wrapper, + GError **error) +{ + ClutterEventTranslator *translator; + ClutterStageWindow *stage; + GType stage_type; + + if (meta_is_wayland_compositor ()) + stage_type = META_TYPE_STAGE_X11_NESTED; + else + stage_type = CLUTTER_TYPE_STAGE_X11; + + stage = g_object_new (stage_type, + "backend", backend, + "wrapper", wrapper, + NULL); + + /* the X11 stage does event translation */ + translator = CLUTTER_EVENT_TRANSLATOR (stage); + _clutter_backend_add_event_translator (backend, translator); + + return stage; +} + static void meta_clutter_backend_x11_init (MetaClutterBackendX11 *clutter_backend_x11) { @@ -61,4 +89,5 @@ meta_clutter_backend_x11_class_init (MetaClutterBackendX11Class *klass) ClutterBackendClass *clutter_backend_class = CLUTTER_BACKEND_CLASS (klass); clutter_backend_class->get_renderer = meta_clutter_backend_x11_get_renderer; + clutter_backend_class->create_stage = meta_clutter_backend_x11_create_stage; } diff --git a/src/backends/x11/meta-stage-x11-nested.c b/src/backends/x11/meta-stage-x11-nested.c new file mode 100644 index 000000000..ba0173f35 --- /dev/null +++ b/src/backends/x11/meta-stage-x11-nested.c @@ -0,0 +1,45 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat Inc. + * + * 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: + * Jonas Ådahl + */ + +#include "config.h" + +#include "backends/x11/meta-stage-x11-nested.h" + +struct _MetaStageX11Nested +{ + ClutterStageX11 parent; +}; + +G_DEFINE_TYPE (MetaStageX11Nested, meta_stage_x11_nested, + CLUTTER_TYPE_STAGE_X11) + +static void +meta_stage_x11_nested_init (MetaStageX11Nested *stage_x11_nested) +{ +} + +static void +meta_stage_x11_nested_class_init (MetaStageX11NestedClass *klass) +{ +} diff --git a/src/backends/x11/meta-stage-x11-nested.h b/src/backends/x11/meta-stage-x11-nested.h new file mode 100644 index 000000000..412aea027 --- /dev/null +++ b/src/backends/x11/meta-stage-x11-nested.h @@ -0,0 +1,34 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* + * Copyright (C) 2016 Red Hat Inc. + * + * 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: + * Jonas Ådahl + */ + +#ifndef META_STAGE_X11_NESTED_H +#define META_STAGE_X11_NESTED_H + +#include "clutter/clutter-mutter.h" + +#define META_TYPE_STAGE_X11_NESTED (meta_stage_x11_nested_get_type ()) +G_DECLARE_FINAL_TYPE (MetaStageX11Nested, meta_stage_x11_nested, + META, STAGE_X11_NESTED, ClutterStageX11) + +#endif /* META_STAGE_X11_NESTED_H */