[grits] Move g_signal_connects to realize callback
- From: Andy Spencer <andys src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [grits] Move g_signal_connects to realize callback
- Date: Mon, 24 Jan 2011 05:28:59 +0000 (UTC)
commit 9346458e724fcd3a7f81551910ac6a3c9a7fdbb9
Author: Andy Spencer <andy753421 gmail com>
Date: Thu Nov 18 06:35:21 2010 +0000
Move g_signal_connects to realize callback
Under Mesa the "configure" callback is is triggered before the "realize"
callback. This causes a crash because some OpenGL initialization must be
performed after the widget is realized.
Moving the callback connects forces proper ordering.
src/gis-opengl.c | 75 ++++++++++++++++++++++++++++--------------------------
1 files changed, 39 insertions(+), 36 deletions(-)
---
diff --git a/src/gis-opengl.c b/src/gis-opengl.c
index e5f6468..d65ea3f 100644
--- a/src/gis-opengl.c
+++ b/src/gis-opengl.c
@@ -151,19 +151,6 @@ static gboolean on_configure(GisOpenGL *opengl, GdkEventConfigure *event, gpoint
return FALSE;
}
-static void on_realize(GisOpenGL *opengl, gpointer _)
-{
- g_debug("GisOpenGL: on_realize");
-
- GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(opengl));
- GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(opengl));
- if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
- g_assert_not_reached();
-
- _set_visuals(opengl);
- on_configure(opengl, NULL, NULL);
-}
-
static gboolean _draw_level(gpointer key, gpointer value, gpointer user_data)
{
g_debug("GisOpenGL: _draw_level - level=%-4d", (int)key);
@@ -280,6 +267,37 @@ static gboolean on_idle(GisOpenGL *opengl)
return TRUE;
}
+static void on_realize(GisOpenGL *opengl, gpointer _)
+{
+ g_debug("GisOpenGL: on_realize");
+
+ /* Start OpenGL */
+ GdkGLContext *glcontext = gtk_widget_get_gl_context(GTK_WIDGET(opengl));
+ GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(opengl));
+ if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
+ g_assert_not_reached();
+
+ /* Connect signals and idle functions now that opengl is fully initialized */
+ gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK);
+ g_signal_connect(opengl, "configure-event", G_CALLBACK(on_configure), NULL);
+ g_signal_connect(opengl, "expose-event", G_CALLBACK(on_expose), NULL);
+
+ g_signal_connect(opengl, "key-press-event", G_CALLBACK(on_key_press), NULL);
+
+ g_signal_connect(opengl, "location-changed", G_CALLBACK(on_view_changed), NULL);
+ g_signal_connect(opengl, "rotation-changed", G_CALLBACK(on_view_changed), NULL);
+
+#ifndef ROAM_DEBUG
+ opengl->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33, (GSourceFunc)on_idle, opengl, NULL);
+ opengl->sm_source[1] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+10, 500, (GSourceFunc)on_idle, opengl, NULL);
+#else
+ (void)on_idle;
+ (void)_update_errors_cb;
+#endif
+
+ /* Re-queue resize incase configure was triggered before realize */
+ gtk_widget_queue_resize(GTK_WIDGET(opengl));
+}
/*********************
* GisViewer methods *
@@ -431,7 +449,12 @@ G_DEFINE_TYPE(GisOpenGL, gis_opengl, GIS_TYPE_VIEWER);
static void gis_opengl_init(GisOpenGL *opengl)
{
g_debug("GisOpenGL: init");
- /* OpenGL setup */
+ opengl->objects = g_tree_new_full(_objects_cmp, NULL, NULL, _objects_free);
+ opengl->objects_lock = g_mutex_new();
+ opengl->sphere = roam_sphere_new(opengl);
+ opengl->sphere_lock = g_mutex_new();
+
+ /* Set OpenGL before "realize" */
GdkGLConfig *glconfig = gdk_gl_config_new_by_mode(
GDK_GL_MODE_RGBA | GDK_GL_MODE_DEPTH |
GDK_GL_MODE_DOUBLE | GDK_GL_MODE_ALPHA);
@@ -442,28 +465,8 @@ static void gis_opengl_init(GisOpenGL *opengl)
g_error("GL lacks required capabilities");
g_object_unref(glconfig);
- opengl->objects = g_tree_new_full(_objects_cmp, NULL, NULL, _objects_free);
- opengl->objects_lock = g_mutex_new();
- opengl->sphere = roam_sphere_new(opengl);
- opengl->sphere_lock = g_mutex_new();
-
-#ifndef ROAM_DEBUG
- opengl->sm_source[0] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+30, 33, (GSourceFunc)on_idle, opengl, NULL);
- opengl->sm_source[1] = g_timeout_add_full(G_PRIORITY_HIGH_IDLE+10, 500, (GSourceFunc)on_idle, opengl, NULL);
-#else
- (void)on_idle;
- (void)_update_errors_cb;
-#endif
-
- gtk_widget_add_events(GTK_WIDGET(opengl), GDK_KEY_PRESS_MASK);
- g_signal_connect(opengl, "realize", G_CALLBACK(on_realize), NULL);
- g_signal_connect(opengl, "configure-event", G_CALLBACK(on_configure), NULL);
- g_signal_connect(opengl, "expose-event", G_CALLBACK(on_expose), NULL);
-
- g_signal_connect(opengl, "key-press-event", G_CALLBACK(on_key_press), NULL);
-
- g_signal_connect(opengl, "location-changed", G_CALLBACK(on_view_changed), NULL);
- g_signal_connect(opengl, "rotation-changed", G_CALLBACK(on_view_changed), NULL);
+ /* Finish OpenGL init after it's realized */
+ g_signal_connect(opengl, "realize", G_CALLBACK(on_realize), NULL);
}
static void gis_opengl_dispose(GObject *_opengl)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]