diff --git a/.gitignore b/.gitignore index 9ae964955..648049a09 100644 --- a/.gitignore +++ b/.gitignore @@ -44,6 +44,7 @@ POTFILES 50-metacity-key.xml inlinepixbufs.h libmutter-private.pc +libmutter-wm.pc mutter mutter-theme-viewer mutter.desktop diff --git a/configure.in b/configure.in index f5018ae65..a03cd8210 100644 --- a/configure.in +++ b/configure.in @@ -511,6 +511,7 @@ doc/man/Makefile src/Makefile src/wm-tester/Makefile src/libmutter-private.pc +src/libmutter-wm.pc src/mutter-plugins.pc src/tools/Makefile src/compositor/plugins/Makefile diff --git a/po/POTFILES.in b/po/POTFILES.in index aceb7179d..4a683d9d8 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -7,6 +7,7 @@ src/core/display.c src/core/errors.c src/core/keybindings.c src/core/main.c +src/core/mutter.c src/core/prefs.c src/core/screen.c src/core/session.c diff --git a/src/Makefile.am b/src/Makefile.am index 4740fccc9..3aa38ace4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,11 +1,28 @@ # Flag build for parallelism; see https://savannah.gnu.org/patch/?6905 .AUTOPARALLEL: -lib_LTLIBRARIES = libmutter-private.la +lib_LTLIBRARIES = libmutter-private.la libmutter-wm.la SUBDIRS=wm-tester tools compositor/plugins -INCLUDES=@MUTTER_CFLAGS@ -I $(srcdir)/include -I$(srcdir)/compositor -DMUTTER_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" -DMUTTER_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"mutter\" -DSN_API_NOT_YET_FROZEN=1 -DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) -DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) -DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) -DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) -DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\" +INCLUDES= \ + $(MUTTER_CFLAGS) \ + -I$(srcdir)/include \ + -I$(srcdir)/compositor \ + -DMUTTER_LIBEXECDIR=\"$(libexecdir)\" \ + -DHOST_ALIAS=\"@HOST_ALIAS@\" \ + -DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" \ + -DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" \ + -DMUTTER_DATADIR=\"$(datadir)\" \ + -DG_LOG_DOMAIN=\"mutter\" \ + -DSN_API_NOT_YET_FROZEN=1 \ + -DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) \ + -DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) \ + -DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) \ + -DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) \ + -DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" \ + -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\" \ + -DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" mutter_built_sources = \ mutter-marshal.h \ @@ -13,7 +30,7 @@ mutter_built_sources = \ mutter-enum-types.h \ mutter-enum-types.c -mutter_SOURCES= \ +libmutter_wm_la_SOURCES = \ core/async-getprop.c \ core/async-getprop.h \ core/bell.c \ @@ -134,6 +151,9 @@ mutter_SOURCES= \ include/all-keybindings.h \ $(mutter_built_sources) +libmutter_wm_la_LDFLAGS = -no-undefined +libmutter_wm_la_LIBADD = $(MUTTER_LIBS) + # by setting libmutter_private_la_CFLAGS, the files shared with # mutter proper will be compiled with different names. libmutter_private_la_CFLAGS = @@ -152,7 +172,7 @@ libmutter_private_la_SOURCES= \ ui/theme.h libmutter_private_la_LDFLAGS = -no-undefined -libmutter_private_la_LIBADD = @MUTTER_LIBS@ +libmutter_private_la_LIBADD = $(MUTTER_LIBS) # Headers installed for plugins; introspected information will # be extracted into Mutter-.gir @@ -196,6 +216,9 @@ mutter_theme_viewer_SOURCES= \ bin_PROGRAMS=mutter mutter-theme-viewer +mutter_SOURCES = core/mutter.c +mutter_LDADD = libmutter-wm.la + if HAVE_INTROSPECTION include $(INTROSPECTION_MAKEFILE) @@ -212,34 +235,30 @@ typelib_DATA = Meta-$(api_version).typelib INTROSPECTION_GIRS = Meta-$(api_version).gir -Meta-$(api_version).gir: mutter +Meta-$(api_version).gir: libmutter-wm.la @META_GIR@_INCLUDES = GObject-2.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 @META_GIR@_PACKAGES = clutter-1.0 gtk+-3.0 @META_GIR@_CFLAGS = $(INCLUDES) -@META_GIR@_PROGRAM = $(builddir)/mutter +@META_GIR@_LIBS = libmutter-wm.la @META_GIR@_FILES = \ mutter-enum-types.h \ $(libmutterinclude_base_headers) \ - $(filter %.c,$(mutter_SOURCES)) + $(filter %.c,$(libmutter_wm_la_SOURCES)) @META_GIR@_SCANNERFLAGS = --warn-all --warn-error endif -EFENCE= -mutter_LDADD=@MUTTER_LIBS@ $(EFENCE) -mutter_LDFLAGS=-export-dynamic +mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter-private.la -mutter_theme_viewer_LDADD= @MUTTER_LIBS@ libmutter-private.la - -testboxes_SOURCES=include/util.h core/util.c include/boxes.h core/boxes.c core/testboxes.c -testgradient_SOURCES=ui/gradient.h ui/gradient.c ui/testgradient.c -testasyncgetprop_SOURCES=core/async-getprop.h core/async-getprop.c core/testasyncgetprop.c +testboxes_SOURCES = core/testboxes.c +testgradient_SOURCES = ui/testgradient.c +testasyncgetprop_SOURCES = core/testasyncgetprop.c noinst_PROGRAMS=testboxes testgradient testasyncgetprop -testboxes_LDADD= @MUTTER_LIBS@ -testgradient_LDADD= @MUTTER_LIBS@ -testasyncgetprop_LDADD= @MUTTER_LIBS@ +testboxes_LDADD = libmutter-wm.la +testgradient_LDADD = libmutter-wm.la +testasyncgetprop_LDADD = libmutter-wm.la @INTLTOOL_DESKTOP_RULE@ @@ -253,7 +272,7 @@ wmproperties_in_files=mutter-wm.desktop.in wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop) wmproperties_DATA = $(wmproperties_files) -schemadir = @GCONF_SCHEMA_FILE_DIR@ +schemadir = $(GCONF_SCHEMA_FILE_DIR) schema_in_files = mutter.schemas.in schema_DATA = $(schema_in_files:.schemas.in=.schemas) @@ -288,7 +307,7 @@ inlinepixbufs.h: $(IMAGES) pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libmutter-private.pc mutter-plugins.pc +pkgconfig_DATA = libmutter-private.pc libmutter-wm.pc mutter-plugins.pc EXTRA_DIST=$(desktopfiles_files) \ $(wmproperties_files) \ @@ -297,6 +316,7 @@ EXTRA_DIST=$(desktopfiles_files) \ $(wmproperties_in_files) \ $(schema_in_files) \ libmutter-private.pc.in \ + libmutter-wm.pc.in \ mutter-plugins.pc.in \ mutter-enum-types.h.in \ mutter-enum-types.c.in \ 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" @@ -59,18 +60,6 @@ struct _MetaPluginPrivate gboolean debug : 1; }; -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) { @@ -102,6 +91,27 @@ meta_plugin_set_features (MetaPlugin *plugin) priv->features |= META_PLUGIN_SWITCH_WORKSPACE; } +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, @@ -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); +} diff --git a/src/core/main.c b/src/core/main.c index 970e83179..3fb8c4e8c 100644 --- a/src/core/main.c +++ b/src/core/main.c @@ -75,7 +75,6 @@ #ifdef HAVE_INTROSPECTION #include -#include "compositor/meta-plugin-manager.h" #endif /** @@ -112,23 +111,6 @@ log_handler (const gchar *log_domain, meta_print_backtrace (); } -/** - * Prints the version notice. This is shown when Mutter is called - * with the --version switch. - */ -static void -version (void) -{ - const int latest_year = 2010; - - g_print (_("mutter %s\n" - "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" - "This is free software; see the source for copying conditions.\n" - "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"), - VERSION, latest_year); - exit (0); -} - /** * Prints a list of which configure script options were used to * build this copy of Mutter. This is actually always called @@ -208,131 +190,72 @@ meta_print_self_identity (void) /** * The set of possible options that can be set on Mutter's - * command line. This type exists so that meta_parse_options() can - * write to an instance of it. + * command line. */ -typedef struct -{ - gchar *save_file; - gchar *display_name; - gchar *client_id; - gchar *mutter_plugins; - gboolean replace_wm; - gboolean disable_sm; - gboolean print_version; - gboolean sync; - gboolean composite; - gboolean no_composite; - gboolean no_force_fullscreen; - gboolean no_tab_popup; - gchar *introspect; -} MetaArguments; +static gchar *opt_save_file; +static gchar *opt_display_name; +static gchar *opt_client_id; +static gboolean opt_replace_wm; +static gboolean opt_disable_sm; +static gboolean opt_sync; -#define COMPOSITE_OPTS_FLAGS 0 +static GOptionEntry meta_options[] = { + { + "sm-disable", 0, 0, G_OPTION_ARG_NONE, + &opt_disable_sm, + N_("Disable connection to session manager"), + NULL + }, + { + "replace", 0, 0, G_OPTION_ARG_NONE, + &opt_replace_wm, + N_("Replace the running window manager"), + NULL + }, + { + "sm-client-id", 0, 0, G_OPTION_ARG_STRING, + &opt_client_id, + N_("Specify session management ID"), + "ID" + }, + { + "display", 'd', 0, G_OPTION_ARG_STRING, + &opt_display_name, N_("X Display to use"), + "DISPLAY" + }, + { + "sm-save-file", 0, 0, G_OPTION_ARG_FILENAME, + &opt_save_file, + N_("Initialize session from savefile"), + "FILE" + }, + { + "sync", 0, 0, G_OPTION_ARG_NONE, + &opt_sync, + N_("Make X calls synchronous"), + NULL + }, + {NULL} +}; /** - * Parses argc and argv and returns the - * arguments that Mutter understands in meta_args. + * meta_get_option_context: (skip) * - * The strange call signature has to be written like it is so - * that g_option_context_parse() gets a chance to modify argc and - * argv. + * Returns a #GOptionContext initialized with mutter-related options. + * Parse the command-line args with this before calling meta_init(). * - * \param argc Pointer to the number of arguments Mutter was given - * \param argv Pointer to the array of arguments Mutter was given - * \param meta_args The result of parsing the arguments. - **/ -static GOptionContext * -meta_parse_options (int *argc, char ***argv, - MetaArguments *meta_args) + * Return value: the #GOptionContext + */ +GOptionContext * +meta_get_option_context (void) { - MetaArguments my_args = {NULL, NULL, NULL, NULL, - FALSE, FALSE, FALSE, FALSE, FALSE}; - GOptionEntry options[] = { - { - "sm-disable", 0, 0, G_OPTION_ARG_NONE, - &my_args.disable_sm, - N_("Disable connection to session manager"), - NULL - }, - { - "replace", 0, 0, G_OPTION_ARG_NONE, - &my_args.replace_wm, - N_("Replace the running window manager with Mutter"), - NULL - }, - { - "sm-client-id", 0, 0, G_OPTION_ARG_STRING, - &my_args.client_id, - N_("Specify session management ID"), - "ID" - }, - { - "display", 'd', 0, G_OPTION_ARG_STRING, - &my_args.display_name, N_("X Display to use"), - "DISPLAY" - }, - { - "sm-save-file", 0, 0, G_OPTION_ARG_FILENAME, - &my_args.save_file, - N_("Initialize session from savefile"), - "FILE" - }, - { - "version", 0, 0, G_OPTION_ARG_NONE, - &my_args.print_version, - N_("Print version"), - NULL - }, - { - "sync", 0, 0, G_OPTION_ARG_NONE, - &my_args.sync, - N_("Make X calls synchronous"), - NULL - }, - { - "no-force-fullscreen", 0, COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE, - &my_args.no_force_fullscreen, - N_("Don't make fullscreen windows that are maximized and have no decorations"), - NULL - }, - { - "mutter-plugins", 0, 0, G_OPTION_ARG_STRING, - &my_args.mutter_plugins, - N_("Comma-separated list of compositor plugins"), - "PLUGINS" - }, - { - "no-tab-popup", 0, 0, G_OPTION_ARG_NONE, - &my_args.no_tab_popup, - N_("Whether window popup/frame should be shown when cycling windows."), - NULL - }, -#ifdef HAVE_INTROSPECTION - { - "introspect-dump", 0, 0, G_OPTION_ARG_STRING, - &my_args.introspect, - N_("Internal argument for GObject introspection"), "INTROSPECT" - }, -#endif - {NULL} - }; GOptionContext *ctx; - GError *error = NULL; ctx = g_option_context_new (NULL); - g_option_context_add_main_entries (ctx, options, "mutter"); + g_option_context_add_main_entries (ctx, meta_options, GETTEXT_PACKAGE); g_option_context_add_group (ctx, clutter_get_option_group_without_init ()); g_option_context_add_group (ctx, cogl_get_option_group ()); - if (!g_option_context_parse (ctx, argc, argv, &error)) - { - g_print ("mutter: %s\n", error->message); - exit(1); - } - - /* Return the parsed options through the meta_args param. */ - *meta_args = my_args; return ctx; } @@ -381,12 +304,12 @@ static GSourceFuncs event_funcs = { }; static void -meta_clutter_init (GOptionContext *ctx, int *argc, char ***argv) +meta_clutter_init (void) { clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); clutter_x11_disable_event_retrieval (); - if (CLUTTER_INIT_SUCCESS == clutter_init (argc, argv)) + if (CLUTTER_INIT_SUCCESS == clutter_init (NULL, NULL)) { GSource *source = g_source_new (&event_funcs, sizeof (GSource)); g_source_attach (source, NULL); @@ -452,34 +375,18 @@ on_sigterm (void) } /** - * This is where the story begins. It parses commandline options and - * environment variables, sets up the screen, hands control off to - * GTK, and cleans up afterwards. + * meta_init: (skip) * - * \param argc Number of arguments (as usual) - * \param argv Array of arguments (as usual) - * - * \bug It's a bit long. It would be good to split it out into separate - * functions. + * Initialize mutter. Call this after meta_get_option_context() and + * meta_plugin_type_register(), and before meta_run(). */ -int -main (int argc, char **argv) +void +meta_init (void) { struct sigaction act; sigset_t empty_mask; - MetaArguments meta_args; - const gchar *log_domains[] = { - NULL, G_LOG_DOMAIN, "Gtk", "Gdk", "GLib", - "Pango", "GLib-GObject", "GThread" - }; - guint i; GIOChannel *channel; - GOptionContext *ctx; - MetaPluginManager *mgr; - if (!g_thread_supported ()) - g_thread_init (NULL); - if (setlocale (LC_ALL, "") == NULL) meta_warning ("Locale not understood by C library, internationalization will not work\n"); @@ -523,8 +430,6 @@ main (int argc, char **argv) meta_warning ("Could not change to home directory %s.\n", g_get_home_dir ()); - g_type_init (); - meta_print_self_identity (); bindtextdomain (GETTEXT_PACKAGE, MUTTER_LOCALEDIR); @@ -535,79 +440,51 @@ main (int argc, char **argv) g_irepository_prepend_search_path (MUTTER_PKGLIBDIR); #endif - /* Parse command line arguments.*/ - ctx = meta_parse_options (&argc, &argv, &meta_args); + meta_set_syncing (opt_sync || (g_getenv ("MUTTER_SYNC") != NULL)); - if (meta_args.print_version) - version (); - - mgr = meta_plugin_manager_get_default (); - - /* This must come before the introspect below, so we load all the plugins - * in order to get their get_type functions. - */ - if (meta_args.mutter_plugins) - { - char **plugins = g_strsplit (meta_args.mutter_plugins, ",", -1); - char **plugin; - - for (plugin = plugins; *plugin; plugin++) - { - g_strstrip (*plugin); - meta_plugin_manager_load (mgr, *plugin); - } - g_strfreev (plugins); - } - -#ifdef HAVE_INTROSPECTION - if (meta_args.introspect) - { - GError *error = NULL; - - if (!g_irepository_dump (meta_args.introspect, &error)) - { - g_printerr ("failed to dump: %s\n", error->message); - return 1; - } - return 0; - } -#endif - - meta_set_syncing (meta_args.sync || (g_getenv ("MUTTER_SYNC") != NULL)); - - meta_select_display (meta_args.display_name); + meta_select_display (opt_display_name); - if (meta_args.replace_wm) + if (opt_replace_wm) meta_set_replace_current_wm (TRUE); - if (meta_args.save_file && meta_args.client_id) + if (opt_save_file && opt_client_id) meta_fatal ("Can't specify both SM save file and SM client id\n"); meta_main_loop = g_main_loop_new (NULL, FALSE); - meta_ui_init (&argc, &argv); + meta_ui_init (); /* * Clutter can only be initialized after the UI. */ - meta_clutter_init (ctx, &argc, &argv); + meta_clutter_init (); +} - g_option_context_free (ctx); +/** + * meta_run: (skip) + * + * Runs mutter. Call this after completing your own initialization. + * + * Return value: mutter's exit status + */ +int +meta_run (void) +{ + const gchar *log_domains[] = { + NULL, G_LOG_DOMAIN, "Gtk", "Gdk", "GLib", + "Pango", "GLib-GObject", "GThread" + }; + guint i; /* Load prefs */ meta_prefs_init (); meta_prefs_add_listener (prefs_changed_callback, NULL); - -#if 1 - for (i=0; i + +#include "main.h" +#include "util.h" +#ifdef HAVE_INTROSPECTION +#include "compositor/meta-plugin-manager.h" +#endif + +#include + +static gboolean +print_version (const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + const int latest_year = 2011; + + g_print (_("mutter %s\n" + "Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n" + "This is free software; see the source for copying conditions.\n" + "There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"), + VERSION, latest_year); + exit (0); +} + +static gchar *mutter_plugins; + +GOptionEntry mutter_options[] = { + { + "version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK, + print_version, + N_("Print version"), + NULL + }, + { + "mutter-plugins", 0, 0, G_OPTION_ARG_STRING, + &mutter_plugins, + N_("Comma-separated list of compositor plugins"), + "PLUGINS" + }, + { NULL } +}; + +int +main (int argc, char **argv) +{ + GOptionContext *ctx; + GError *error = NULL; + + ctx = meta_get_option_context (); + g_option_context_add_main_entries (ctx, mutter_options, GETTEXT_PACKAGE); + if (!g_option_context_parse (ctx, &argc, &argv, &error)) + { + g_printerr ("mutter: %s\n", error->message); + exit (1); + } + + if (mutter_plugins) + { + MetaPluginManager *mgr; + char **plugins = g_strsplit (mutter_plugins, ",", -1); + char **plugin; + + mgr = meta_plugin_manager_get_default (); + for (plugin = plugins; *plugin; plugin++) + { + g_strstrip (*plugin); + meta_plugin_manager_load (mgr, *plugin); + } + g_strfreev (plugins); + } + + meta_init (); + return meta_run (); +} diff --git a/src/core/prefs.c b/src/core/prefs.c index 3afc2c23d..25306314b 100644 --- a/src/core/prefs.c +++ b/src/core/prefs.c @@ -3020,12 +3020,6 @@ meta_prefs_set_no_tab_popup (gboolean whether) #endif } -void -meta_prefs_override_no_tab_popup (gboolean whether) -{ - no_tab_popup = whether; -} - #ifndef HAVE_GCONF static void init_button_layout(void) diff --git a/src/include/main.h b/src/include/main.h index b0c8dc8ec..23beebca3 100644 --- a/src/include/main.h +++ b/src/include/main.h @@ -26,6 +26,10 @@ #include +GOptionContext *meta_get_option_context (void); +void meta_init (void); +int meta_run (void); + typedef enum { META_EXIT_SUCCESS, diff --git a/src/include/meta-plugin.h b/src/include/meta-plugin.h index 36b7fbfd2..80d5312f8 100644 --- a/src/include/meta-plugin.h +++ b/src/include/meta-plugin.h @@ -220,6 +220,9 @@ struct _MetaPluginVersion return object_name##_register_type (type_module); \ } \ +void +meta_plugin_type_register (GType plugin_type); + void meta_plugin_switch_workspace_completed (MetaPlugin *plugin); diff --git a/src/include/prefs.h b/src/include/prefs.h index 2578451fa..f01e49b34 100644 --- a/src/include/prefs.h +++ b/src/include/prefs.h @@ -138,7 +138,6 @@ void meta_prefs_set_live_hidden_windows (gboolean whether); gboolean meta_prefs_get_no_tab_popup (void); void meta_prefs_set_no_tab_popup (gboolean whether); -void meta_prefs_override_no_tab_popup (gboolean whether); /* XXX FIXME This should be x-macroed, but isn't yet because it would be * difficult (or perhaps impossible) to add the suffixes using the current diff --git a/src/include/ui.h b/src/include/ui.h index 064ca3afd..2914133e9 100644 --- a/src/include/ui.h +++ b/src/include/ui.h @@ -41,7 +41,7 @@ typedef enum META_UI_DIRECTION_RTL } MetaUIDirection; -void meta_ui_init (int *argc, char ***argv); +void meta_ui_init (void); Display* meta_ui_get_display (void); diff --git a/src/libmutter-wm.pc.in b/src/libmutter-wm.pc.in new file mode 100644 index 000000000..e76d5598f --- /dev/null +++ b/src/libmutter-wm.pc.in @@ -0,0 +1,18 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ +girdir=@libdir@/mutter +typelibdir=@libdir@/mutter + +mutter_major_version=@MUTTER_MAJOR_VERSION@ +mutter_minor_version=@MUTTER_MINOR_VERSION@ +mutter_micro_version=@MUTTER_MICRO_VERSION@ +mutter_plugin_api_version=@MUTTER_PLUGIN_API_VERSION@ + +Name: libmutter-wm +Description: Mutter window manager library +Requires: gtk+-3.0 @CLUTTER_PACKAGE@ x11 +Version: @VERSION@ +Libs: -L${libdir} -lmutter-wm +Cflags: -I${includedir}/mutter/mutter-private -DMUTTER_MAJOR_VERSION=${mutter_major_version} -DMUTTER_MINOR_VERSION=${mutter_minor_version} -DMUTTER_MICRO_VERSION=${mutter_micro_version} -DMUTTER_PLUGIN_API_VERSION=${mutter_plugin_api_version} diff --git a/src/ui/ui.c b/src/ui/ui.c index 4221a2707..d115ae368 100644 --- a/src/ui/ui.c +++ b/src/ui/ui.c @@ -58,7 +58,7 @@ struct _MetaUI }; void -meta_ui_init (int *argc, char ***argv) +meta_ui_init (void) { /* As of 2.91.7, Gdk uses XI2 by default, which conflicts with the * direct X calls we use - in particular, events caused by calls to @@ -70,7 +70,7 @@ meta_ui_init (int *argc, char ***argv) gdk_disable_multidevice (); #endif - if (!gtk_init_check (argc, argv)) + if (!gtk_init_check (NULL, NULL)) meta_fatal ("Unable to open X display %s\n", XDisplayName (NULL)); meta_stock_icons_init ();