X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgrits-opengl.c;h=794d776f660a6471f08c273c7fb926d7ce5ba9fd;hp=277c11e47ac9092e17bf9a8de0d80529329fc310;hb=b45085a627ceb0a99418a18121e1b70d8abe32ac;hpb=0d16e0c4ea08302f7a40a15a10311785061d498b diff --git a/src/grits-opengl.c b/src/grits-opengl.c index 277c11e..794d776 100644 --- a/src/grits-opengl.c +++ b/src/grits-opengl.c @@ -24,7 +24,7 @@ * algorithm for updating surface mesh the planet. The only thing GritsOpenGL * can actually render on it's own is a wireframe of a sphere. * - * GritsOpenGL requires (at least) OpenGL 2.0. + * GritsOpenGL relies on #GtkGlExt and requires (at least) OpenGL 2.0. */ #include @@ -32,12 +32,12 @@ #include #include #include +#include #include #include #include "grits-opengl.h" #include "grits-util.h" -#include "gtkgl.h" #include "roam.h" // #define ROAM_DEBUG @@ -223,7 +223,8 @@ static gboolean on_expose(GritsOpenGL *opengl, GdkEventExpose *event, gpointer _ g_mutex_unlock(opengl->objects_lock); #endif - gtk_gl_end(GTK_WIDGET(opengl)); + GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(GTK_WIDGET(opengl)); + gdk_gl_drawable_swap_buffers(gldrawable); g_debug("GritsOpenGL: on_expose - end\n"); return FALSE; @@ -342,7 +343,12 @@ static gboolean on_idle(GritsOpenGL *opengl) static void on_realize(GritsOpenGL *opengl, gpointer _) { g_debug("GritsOpenGL: on_realize"); - gtk_gl_begin(GTK_WIDGET(opengl)); + + /* 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); @@ -528,7 +534,19 @@ static void grits_opengl_init(GritsOpenGL *opengl) opengl->objects_lock = g_mutex_new(); opengl->sphere = roam_sphere_new(opengl); opengl->sphere_lock = g_mutex_new(); - gtk_gl_enable(GTK_WIDGET(opengl)); + + /* 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); + if (!glconfig) + g_error("Failed to create glconfig"); + if (!gtk_widget_set_gl_capability(GTK_WIDGET(opengl), + glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE)) + g_error("GL lacks required capabilities"); + g_object_unref(glconfig); + + /* Finish OpenGL init after it's realized */ g_signal_connect(opengl, "realize", G_CALLBACK(on_realize), NULL); } static void grits_opengl_dispose(GObject *_opengl)