summaryrefslogtreecommitdiff
path: root/src/core/meta-context.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/meta-context.c')
-rw-r--r--src/core/meta-context.c568
1 files changed, 0 insertions, 568 deletions
diff --git a/src/core/meta-context.c b/src/core/meta-context.c
deleted file mode 100644
index 7bb0e5f46..000000000
--- a/src/core/meta-context.c
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * Copyright (C) 2019 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.
- *
- */
-
-#include "config.h"
-
-#include "core/meta-context-private.h"
-
-#include <locale.h>
-
-#include "backends/meta-backend-private.h"
-#include "compositor/meta-plugin-manager.h"
-#include "core/display-private.h"
-#include "core/prefs-private.h"
-#include "core/util-private.h"
-
-#ifdef HAVE_WAYLAND
-#include "wayland/meta-wayland.h"
-#endif
-
-enum
-{
- PROP_0,
-
- PROP_NAME,
-
- N_PROPS
-};
-
-static GParamSpec *obj_props[N_PROPS];
-
-typedef enum _MetaContextState
-{
- META_CONTEXT_STATE_INIT,
- META_CONTEXT_STATE_CONFIGURED,
- META_CONTEXT_STATE_SETUP,
- META_CONTEXT_STATE_STARTED,
- META_CONTEXT_STATE_RUNNING,
- META_CONTEXT_STATE_TERMINATED,
-} MetaContextState;
-
-typedef struct _MetaContextPrivate
-{
- char *name;
- char *plugin_name;
- GType plugin_gtype;
- char *gnome_wm_keybindings;
-
- MetaContextState state;
-
- GOptionContext *option_context;
-
- MetaBackend *backend;
- MetaDisplay *display;
-#ifdef HAVE_WAYLAND
- MetaWaylandCompositor *wayland_compositor;
-#endif
-
- GMainLoop *main_loop;
- GError *termination_error;
-} MetaContextPrivate;
-
-G_DEFINE_TYPE_WITH_PRIVATE (MetaContext, meta_context, G_TYPE_OBJECT)
-
-void
-meta_context_add_option_entries (MetaContext *context,
- const GOptionEntry *entries,
- const char *translation_domain)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_INIT);
-
- g_option_context_add_main_entries (priv->option_context,
- entries,
- translation_domain);
-}
-
-void
-meta_context_add_option_group (MetaContext *context,
- GOptionGroup *group)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_INIT);
- g_return_if_fail (priv->option_context);
-
- g_option_context_add_group (priv->option_context, group);
-}
-
-void
-meta_context_set_plugin_gtype (MetaContext *context,
- GType plugin_gtype)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_return_if_fail (priv->state <= META_CONTEXT_STATE_CONFIGURED);
- g_return_if_fail (!priv->plugin_name);
-
- priv->plugin_gtype = plugin_gtype;
-}
-
-void
-meta_context_set_plugin_name (MetaContext *context,
- const char *plugin_name)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_return_if_fail (priv->state <= META_CONTEXT_STATE_CONFIGURED);
- g_return_if_fail (priv->plugin_gtype == G_TYPE_NONE);
-
- priv->plugin_name = g_strdup (plugin_name);
-}
-
-void
-meta_context_set_gnome_wm_keybindings (MetaContext *context,
- const char *wm_keybindings)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_return_if_fail (priv->state <= META_CONTEXT_STATE_CONFIGURED);
-
- g_clear_pointer (&priv->gnome_wm_keybindings, g_free);
- priv->gnome_wm_keybindings = g_strdup (wm_keybindings);
-}
-
-const char *
-meta_context_get_gnome_wm_keybindings (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- return priv->gnome_wm_keybindings;
-}
-
-void
-meta_context_notify_ready (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_return_if_fail (priv->state == META_CONTEXT_STATE_STARTED ||
- priv->state == META_CONTEXT_STATE_RUNNING);
-
- META_CONTEXT_GET_CLASS (context)->notify_ready (context);
-}
-
-const char *
-meta_context_get_name (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- return priv->name;
-}
-
-/**
- * meta_context_get_backend:
- * @context: The #MetaContext
- *
- * Returns: (transfer none): the #MetaBackend
- */
-MetaBackend *
-meta_context_get_backend (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- return priv->backend;
-}
-
-/**
- * meta_context_get_display:
- * @context: The #MetaContext
- *
- * Returns: (transfer none): the #MetaDisplay
- */
-MetaDisplay *
-meta_context_get_display (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- return priv->display;
-}
-
-#ifdef HAVE_WAYLAND
-MetaWaylandCompositor *
-meta_context_get_wayland_compositor (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- return priv->wayland_compositor;
-}
-#endif
-
-MetaCompositorType
-meta_context_get_compositor_type (MetaContext *context)
-{
- return META_CONTEXT_GET_CLASS (context)->get_compositor_type (context);
-}
-
-gboolean
-meta_context_is_replacing (MetaContext *context)
-{
- return META_CONTEXT_GET_CLASS (context)->is_replacing (context);
-}
-
-MetaX11DisplayPolicy
-meta_context_get_x11_display_policy (MetaContext *context)
-{
- return META_CONTEXT_GET_CLASS (context)->get_x11_display_policy (context);
-}
-
-static gboolean
-meta_context_real_configure (MetaContext *context,
- int *argc,
- char ***argv,
- GError **error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
- g_autoptr (GOptionContext) option_context = NULL;
-
- if (!priv->option_context)
- {
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Tried to configure multiple times");
- return FALSE;
- }
-
- option_context = g_steal_pointer (&priv->option_context);
- return g_option_context_parse (option_context, argc, argv, error);
-}
-
-gboolean
-meta_context_configure (MetaContext *context,
- int *argc,
- char ***argv,
- GError **error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
- MetaCompositorType compositor_type;
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_INIT);
-
- if (!META_CONTEXT_GET_CLASS (context)->configure (context, argc, argv, error))
- {
- priv->state = META_CONTEXT_STATE_TERMINATED;
- return FALSE;
- }
-
- compositor_type = meta_context_get_compositor_type (context);
- switch (compositor_type)
- {
- case META_COMPOSITOR_TYPE_WAYLAND:
- meta_set_is_wayland_compositor (TRUE);
- break;
- case META_COMPOSITOR_TYPE_X11:
- meta_set_is_wayland_compositor (FALSE);
- break;
- }
-
- priv->state = META_CONTEXT_STATE_CONFIGURED;
-
- return TRUE;
-}
-
-static const char *
-compositor_type_to_description (MetaCompositorType compositor_type)
-{
- switch (compositor_type)
- {
- case META_COMPOSITOR_TYPE_WAYLAND:
- return "Wayland display server";
- case META_COMPOSITOR_TYPE_X11:
- return "X11 window and compositing manager";
- }
-
- g_assert_not_reached ();
-}
-
-static void
-init_introspection (MetaContext *context)
-{
-#ifdef HAVE_INTROSPECTION
- g_irepository_prepend_search_path (MUTTER_PKGLIBDIR);
-#endif
-}
-
-static gboolean
-meta_context_real_setup (MetaContext *context,
- GError **error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
- MetaBackend *backend;
-
- backend = META_CONTEXT_GET_CLASS (context)->create_backend (context, error);
- if (!backend)
- return FALSE;
-
- priv->backend = backend;
- return TRUE;
-}
-
-gboolean
-meta_context_setup (MetaContext *context,
- GError **error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
- MetaCompositorType compositor_type;
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_CONFIGURED);
-
- if (!priv->plugin_name && priv->plugin_gtype == G_TYPE_NONE)
- {
- priv->state = META_CONTEXT_STATE_TERMINATED;
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "No compositor plugin set");
- return FALSE;
- }
-
- meta_init_debug_utils ();
-
- compositor_type = meta_context_get_compositor_type (context);
- g_message ("Running %s (using mutter %s) as a %s",
- priv->name, VERSION,
- compositor_type_to_description (compositor_type));
-
- if (priv->plugin_name)
- meta_plugin_manager_load (priv->plugin_name);
- else
- meta_plugin_manager_set_plugin_type (priv->plugin_gtype);
-
- init_introspection (context);
-
- if (!META_CONTEXT_GET_CLASS (context)->setup (context, error))
- {
- priv->state = META_CONTEXT_STATE_TERMINATED;
- return FALSE;
- }
-
- priv->state = META_CONTEXT_STATE_SETUP;
- return TRUE;
-}
-
-gboolean
-meta_context_start (MetaContext *context,
- GError **error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_SETUP);
-
- meta_prefs_init ();
-
-#ifdef HAVE_WAYLAND
- if (meta_context_get_compositor_type (context) ==
- META_COMPOSITOR_TYPE_WAYLAND)
- priv->wayland_compositor = meta_wayland_compositor_new (context);
-#endif
-
- priv->display = meta_display_new (context, error);
- if (!priv->display)
- {
- priv->state = META_CONTEXT_STATE_TERMINATED;
- return FALSE;
- }
-
- priv->main_loop = g_main_loop_new (NULL, FALSE);
-
- priv->state = META_CONTEXT_STATE_STARTED;
-
- return TRUE;
-}
-
-gboolean
-meta_context_run_main_loop (MetaContext *context,
- GError **error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_STARTED);
- if (!priv->main_loop)
- {
- priv->state = META_CONTEXT_STATE_TERMINATED;
- g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
- "Tried to run main loop without having started");
- return FALSE;
- }
-
- priv->state = META_CONTEXT_STATE_RUNNING;
- g_main_loop_run (priv->main_loop);
- priv->state = META_CONTEXT_STATE_TERMINATED;
- g_clear_pointer (&priv->main_loop, g_main_loop_unref);
-
- if (priv->termination_error)
- {
- g_propagate_error (error, g_steal_pointer (&priv->termination_error));
- return FALSE;
- }
-
- return TRUE;
-}
-
-void
-meta_context_terminate (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_warn_if_fail (priv->state == META_CONTEXT_STATE_RUNNING);
- g_warn_if_fail (g_main_loop_is_running (priv->main_loop));
-
- g_main_loop_quit (priv->main_loop);
-}
-
-void
-meta_context_terminate_with_error (MetaContext *context,
- GError *error)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- priv->termination_error = g_steal_pointer (&error);
- meta_context_terminate (context);
-}
-
-void
-meta_context_destroy (MetaContext *context)
-{
- g_object_run_dispose (G_OBJECT (context));
- g_object_unref (context);
-}
-
-static void
-meta_context_get_property (GObject *object,
- guint prop_id,
- GValue *value,
- GParamSpec *pspec)
-{
- MetaContext *context = META_CONTEXT (object);
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- switch (prop_id)
- {
- case PROP_NAME:
- g_value_set_string (value, priv->name);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-meta_context_set_property (GObject *object,
- guint prop_id,
- const GValue *value,
- GParamSpec *pspec)
-{
- MetaContext *context = META_CONTEXT (object);
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- switch (prop_id)
- {
- case PROP_NAME:
- priv->name = g_value_dup_string (value);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-meta_context_dispose (GObject *object)
-{
- MetaContext *context = META_CONTEXT (object);
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- if (priv->backend)
- meta_backend_prepare_shutdown (priv->backend);
-
-#ifdef HAVE_WAYLAND
- if (priv->wayland_compositor)
- meta_wayland_compositor_prepare_shutdown (priv->wayland_compositor);
-#endif
-
- if (priv->display)
- meta_display_close (priv->display, META_CURRENT_TIME);
- g_clear_object (&priv->display);
-
-#ifdef HAVE_WAYLAND
- g_clear_object (&priv->wayland_compositor);
-#endif
-
- g_clear_pointer (&priv->backend, meta_backend_destroy);
-
- g_clear_pointer (&priv->option_context, g_option_context_free);
- g_clear_pointer (&priv->main_loop, g_main_loop_unref);
-
- G_OBJECT_CLASS (meta_context_parent_class)->dispose (object);
-}
-
-static void
-meta_context_finalize (GObject *object)
-{
- MetaContext *context = META_CONTEXT (object);
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- g_clear_pointer (&priv->gnome_wm_keybindings, g_free);
- g_clear_pointer (&priv->plugin_name, g_free);
- g_clear_pointer (&priv->name, g_free);
-
- G_OBJECT_CLASS (meta_context_parent_class)->finalize (object);
-}
-
-static void
-meta_context_class_init (MetaContextClass *klass)
-{
- GObjectClass *object_class = G_OBJECT_CLASS (klass);
-
- object_class->get_property = meta_context_get_property;
- object_class->set_property = meta_context_set_property;
- object_class->dispose = meta_context_dispose;
- object_class->finalize = meta_context_finalize;
-
- klass->configure = meta_context_real_configure;
- klass->setup = meta_context_real_setup;
-
- obj_props[PROP_NAME] =
- g_param_spec_string ("name",
- "name",
- "Human readable name",
- NULL,
- G_PARAM_READWRITE |
- G_PARAM_CONSTRUCT_ONLY |
- G_PARAM_STATIC_STRINGS);
- g_object_class_install_properties (object_class, N_PROPS, obj_props);
-}
-
-static void
-meta_context_init (MetaContext *context)
-{
- MetaContextPrivate *priv = meta_context_get_instance_private (context);
-
- priv->plugin_gtype = G_TYPE_NONE;
- priv->gnome_wm_keybindings = g_strdup ("Mutter");
-
- if (!setlocale (LC_ALL, ""))
- g_warning ("Locale not understood by C library");
- bindtextdomain (GETTEXT_PACKAGE, MUTTER_LOCALEDIR);
- bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
-
- priv->option_context = g_option_context_new (NULL);
- g_option_context_set_main_group (priv->option_context,
- g_option_group_new (NULL, NULL, NULL,
- context, NULL));
-}