2006-12-04 Emmanuele Bassi <ebassi@openedhand.com>

Avoid clutter segfaulting when used without invoking
	clutter_init().  This is needed when using api documentation
	tools and every other tool relying on the GObject
	introspection API (esp. on a headless box).  see the
	note in clutter/clutter-feature.c:clutter_feature_init
	for a full explanation.

	* clutter/clutter-feature.c: Call clutter_feature_init()
	when needed by one of the accessors of the features
	structure.

	* clutter/clutter-main.c:
	* clutter/clutter-private.h: Remove clutter_feature_init()
	public declaration: the features support check is done the
	first time a feature is needed.

	* clutter/clutter-main.c: Do not ever access the clutter
	main context pointer directly; instead, obtain a pointer
	to it via clutter_context_get_default(), which will always
	return something valid.
This commit is contained in:
Emmanuele Bassi
2006-12-04 19:19:53 +00:00
parent f83ffa3520
commit 6d87b1479c
6 changed files with 136 additions and 42 deletions

View File

@@ -235,16 +235,18 @@ clutter_dispatch_x_event (XEvent *xevent,
static void
events_init()
{
ClutterMainContext *clutter_context;
GMainContext *gmain_context;
int connection_number;
GSource *source;
ClutterXEventSource *display_source;
clutter_context = clutter_context_get_default ();
gmain_context = g_main_context_default ();
g_main_context_ref (gmain_context);
connection_number = ConnectionNumber (ClutterCntx->xdpy);
connection_number = ConnectionNumber (clutter_context->xdpy);
source = g_source_new ((GSourceFuncs *)&x_event_funcs,
sizeof (ClutterXEventSource));
@@ -253,7 +255,7 @@ events_init()
display_source->event_poll_fd.fd = connection_number;
display_source->event_poll_fd.events = G_IO_IN;
display_source->display = ClutterCntx->xdpy;
display_source->display = clutter_context->xdpy;
g_source_add_poll (source, &display_source->event_poll_fd);
g_source_set_can_recurse (source, TRUE);
@@ -444,7 +446,9 @@ clutter_threads_leave (void)
Display*
clutter_xdisplay (void)
{
return ClutterCntx->xdpy;
ClutterMainContext *context = CLUTTER_CONTEXT ();
return context->xdpy;
}
/**
@@ -457,7 +461,9 @@ clutter_xdisplay (void)
int
clutter_xscreen (void)
{
return ClutterCntx->xscreen;
ClutterMainContext *context = CLUTTER_CONTEXT ();
return context->xscreen;
}
/**
@@ -470,7 +476,9 @@ clutter_xscreen (void)
Window
clutter_root_xwindow (void)
{
return ClutterCntx->xwin_root;
ClutterMainContext *context = CLUTTER_CONTEXT ();
return context->xwin_root;
}
/**
@@ -867,9 +875,6 @@ clutter_init_with_args (int *argc,
return CLUTTER_INIT_ERROR_OPENGL;
}
/* Check available features */
clutter_feature_init ();
events_init ();
return CLUTTER_INIT_SUCCESS;
@@ -927,9 +932,6 @@ clutter_init (int *argc,
return CLUTTER_INIT_ERROR_OPENGL;
}
/* Check available features */
clutter_feature_init ();
events_init ();
return 1;