diff --git a/clutter/clutter-main.c b/clutter/clutter-main.c
index f6cd904b8..7e1b85089 100644
--- a/clutter/clutter-main.c
+++ b/clutter/clutter-main.c
@@ -1772,11 +1772,13 @@ clutter_get_option_group (void)
* Returns a #GOptionGroup for the command line arguments recognized
* by Clutter. You should add this group to your #GOptionContext with
* g_option_context_add_group(), if you are using g_option_context_parse()
- * to parse your commandline arguments. Unlike clutter_get_option_group(),
- * calling g_option_context_parse() with the #GOptionGroup returned by this
- * function requires a subsequent explicit call to clutter_init(); use this
- * function when needing to set foreign display connection with
- * clutter_x11_set_display(), or with gtk_clutter_init().
+ * to parse your commandline arguments.
+ *
+ * Unlike clutter_get_option_group(), calling g_option_context_parse() with
+ * the #GOptionGroup returned by this function requires a subsequent explicit
+ * call to clutter_init(); use this function when needing to set foreign
+ * display connection with clutter_x11_set_display(), or with
+ * gtk_clutter_init().
*
* Return value: (transfer full): a #GOptionGroup for the commandline arguments
* recognized by Clutter
@@ -1903,16 +1905,17 @@ clutter_init_with_args (int *argc,
}
static gboolean
-clutter_parse_args (int *argc,
- char ***argv)
+clutter_parse_args (int *argc,
+ char ***argv,
+ GError **error)
{
GOptionContext *option_context;
- GOptionGroup *clutter_group, *cogl_group;
+ GOptionGroup *clutter_group, *cogl_group;
#ifdef CLUTTER_ENABLE_PROFILE
- GOptionGroup *uprof_group;
+ GOptionGroup *uprof_group;
#endif
- GError *error = NULL;
- gboolean ret = TRUE;
+ GError *internal_error = NULL;
+ gboolean ret = TRUE;
if (clutter_is_initialized)
return TRUE;
@@ -1922,7 +1925,6 @@ clutter_parse_args (int *argc,
g_option_context_set_help_enabled (option_context, FALSE);
/* Initiate any command line options from the backend */
-
clutter_group = clutter_get_option_group ();
g_option_context_set_main_group (option_context, clutter_group);
@@ -1934,14 +1936,9 @@ clutter_parse_args (int *argc,
g_option_context_add_group (option_context, uprof_group);
#endif
- if (!g_option_context_parse (option_context, argc, argv, &error))
+ if (!g_option_context_parse (option_context, argc, argv, &internal_error))
{
- if (error)
- {
- g_warning ("%s", error->message);
- g_error_free (error);
- }
-
+ g_propagate_error (error, internal_error);
ret = FALSE;
}
@@ -1956,12 +1953,20 @@ clutter_parse_args (int *argc,
* @argv: (array length=argc) (inout) (allow-none): A pointer to an array
* of arguments.
*
- * It will initialise everything needed to operate with Clutter and
- * parses some standard command line options. @argc and @argv are
- * adjusted accordingly so your own code will never see those standard
- * arguments.
+ * Initialises everything needed to operate with Clutter and parses some
+ * standard command line options; @argc and @argv are adjusted accordingly
+ * so your own code will never see those standard arguments.
*
- * Return value: 1 on success, < 0 on failure.
+ * It is safe to call this function multiple times.
+ *
+ * This function will not abort in case of errors during
+ * initialization; clutter_init() will print out the error message on
+ * stderr, and will return an error code. It is up to the application
+ * code to handle this case. If you need to display the error message
+ * yourself, you can use clutter_init_with_args(), which takes a #GError
+ * pointer.
+ *
+ * Return value: a #ClutterInitError value
*/
ClutterInitError
clutter_init (int *argc,
@@ -1969,6 +1974,7 @@ clutter_init (int *argc,
{
ClutterMainContext *ctx;
GError *error = NULL;
+ ClutterInitError res;
if (clutter_is_initialized)
return CLUTTER_INIT_SUCCESS;
@@ -1987,16 +1993,27 @@ clutter_init (int *argc,
/* parse_args will trigger backend creation and things like
* DISPLAY connection etc.
*/
- if (clutter_parse_args (argc, argv) == FALSE)
+ if (!clutter_parse_args (argc, argv, &error))
{
- CLUTTER_NOTE (MISC, "failed to parse arguments.");
- return CLUTTER_INIT_ERROR_INTERNAL;
- }
+ g_critical ("Unable to initialize Clutter: %s", error->message);
+ g_error_free (error);
- return CLUTTER_INIT_SUCCESS;
+ res = CLUTTER_INIT_ERROR_INTERNAL;
+ }
+ else
+ res = CLUTTER_INIT_SUCCESS;
}
else
- return clutter_init_real (&error);
+ {
+ res = clutter_init_real (&error);
+ if (error != NULL)
+ {
+ g_critical ("Unable to initialize Clutter: %s", error->message);
+ g_error_free (error);
+ }
+ }
+
+ return res;
}
gboolean