summaryrefslogtreecommitdiff
path: root/src/compositor
diff options
context:
space:
mode:
authorDan Winship <danw@gnome.org>2011-03-05 16:16:26 -0500
committerDan Winship <danw@gnome.org>2011-03-07 18:19:53 -0500
commitbb50f65532f8f513d483436de88b964f6ac0a343 (patch)
treeed438ac7b00156666125e8ad1c764905873fee69 /src/compositor
parent28752718c594201210217ba1f6d240d7f9a374a6 (diff)
downloadmutter-bb50f65532f8f513d483436de88b964f6ac0a343.tar.gz
Allow mutter to be used as a library
Move all of the mutter code into a new libmutter-wm.so, split its main() method into meta_get_option_context(), meta_init() and meta_run(), add methods for using in-process plugins, and add libmutter-wm.pc pointing to the new library. The mutter binary is now just a tiny program that links against libmutter-wm. The --version and --mutter-plugins options are handled at the mutter level, not in libmutter-wm, and a few strange unused command-line options (--no-force-fullscreen and --no-tab-popup) have been removed. https://bugzilla.gnome.org/show_bug.cgi?id=643959
Diffstat (limited to 'src/compositor')
-rw-r--r--src/compositor/meta-plugin-manager.c19
-rw-r--r--src/compositor/meta-plugin-manager.h2
-rw-r--r--src/compositor/meta-plugin.c52
3 files changed, 55 insertions, 18 deletions
diff --git a/src/compositor/meta-plugin-manager.c b/src/compositor/meta-plugin-manager.c
index 13171ffaf..1001a01d8 100644
--- a/src/compositor/meta-plugin-manager.c
+++ b/src/compositor/meta-plugin-manager.c
@@ -63,7 +63,6 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
gchar *path;
MetaModule *module;
GType plugin_type;
- MetaPlugin *plugin;
if (g_path_is_absolute (plugin_name))
path = g_strdup (plugin_name);
@@ -83,13 +82,25 @@ meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
}
plugin_type = meta_module_get_plugin_type (module);
+ meta_plugin_manager_register (plugin_mgr, plugin_type);
+
+ g_type_module_unuse (G_TYPE_MODULE (module));
+ g_free (path);
+}
+
+/*
+ * Registers the given plugin type
+ */
+void
+meta_plugin_manager_register (MetaPluginManager *plugin_mgr,
+ GType plugin_type)
+{
+ MetaPlugin *plugin;
+
plugin_types = g_slist_prepend (plugin_types, GSIZE_TO_POINTER (plugin_type));
plugin = g_object_new (plugin_type, NULL);
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
-
- g_type_module_unuse (G_TYPE_MODULE (module));
- g_free (path);
}
void
diff --git a/src/compositor/meta-plugin-manager.h b/src/compositor/meta-plugin-manager.h
index 888f2e890..ec09bdd45 100644
--- a/src/compositor/meta-plugin-manager.h
+++ b/src/compositor/meta-plugin-manager.h
@@ -51,6 +51,8 @@ MetaPluginManager * meta_plugin_manager_get_default (void);
void meta_plugin_manager_load (MetaPluginManager *mgr,
const gchar *plugin_name);
+void meta_plugin_manager_register (MetaPluginManager *mgr,
+ GType plugin_type);
void meta_plugin_manager_initialize (MetaPluginManager *mgr);
gboolean meta_plugin_manager_event_simple (MetaPluginManager *mgr,
diff --git a/src/compositor/meta-plugin.c b/src/compositor/meta-plugin.c
index a7786ffa8..b8af4423e 100644
--- a/src/compositor/meta-plugin.c
+++ b/src/compositor/meta-plugin.c
@@ -22,6 +22,7 @@
*/
#include "meta-plugin.h"
+#include "meta-plugin-manager.h"
#include "screen.h"
#include "display.h"
@@ -60,18 +61,6 @@ struct _MetaPluginPrivate
};
static void
-meta_plugin_dispose (GObject *object)
-{
- G_OBJECT_CLASS (meta_plugin_parent_class)->dispose (object);
-}
-
-static void
-meta_plugin_finalize (GObject *object)
-{
- G_OBJECT_CLASS (meta_plugin_parent_class)->finalize (object);
-}
-
-static void
meta_plugin_set_features (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = plugin->priv;
@@ -103,6 +92,27 @@ meta_plugin_set_features (MetaPlugin *plugin)
}
static void
+meta_plugin_constructed (GObject *object)
+{
+ meta_plugin_set_features (META_PLUGIN (object));
+
+ if (G_OBJECT_CLASS (meta_plugin_parent_class)->constructed)
+ G_OBJECT_CLASS (meta_plugin_parent_class)->constructed (object);
+}
+
+static void
+meta_plugin_dispose (GObject *object)
+{
+ G_OBJECT_CLASS (meta_plugin_parent_class)->dispose (object);
+}
+
+static void
+meta_plugin_finalize (GObject *object)
+{
+ G_OBJECT_CLASS (meta_plugin_parent_class)->finalize (object);
+}
+
+static void
meta_plugin_set_property (GObject *object,
guint prop_id,
const GValue *value,
@@ -161,6 +171,7 @@ meta_plugin_class_init (MetaPluginClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+ gobject_class->constructed = meta_plugin_constructed;
gobject_class->finalize = meta_plugin_finalize;
gobject_class->dispose = meta_plugin_dispose;
gobject_class->set_property = meta_plugin_set_property;
@@ -207,8 +218,6 @@ meta_plugin_init (MetaPlugin *self)
MetaPluginPrivate *priv;
self->priv = priv = META_PLUGIN_GET_PRIVATE (self);
-
- meta_plugin_set_features (self);
}
gulong
@@ -540,3 +549,18 @@ meta_plugin_get_screen (MetaPlugin *plugin)
return priv->screen;
}
+/**
+ * meta_plugin_type_register:
+ * @plugin_type: a #MetaPlugin type
+ *
+ * Register @plugin_type as a compositor plugin type to be used.
+ * You must call this before calling meta_init().
+ */
+void
+meta_plugin_type_register (GType plugin_type)
+{
+ MetaPluginManager *plugin_manager;
+
+ plugin_manager = meta_plugin_manager_get_default ();
+ meta_plugin_manager_register (plugin_manager, plugin_type);
+}