X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgtkgl.c;h=af2c62bac5f888263fee7a61ee90e9189f50f2ad;hp=6a62e86a377dc910e6f72854e4b7d0a98d4daac0;hb=9bcf4114;hpb=8c7994f58481044abf01f706accb734340ab6971 diff --git a/src/gtkgl.c b/src/gtkgl.c index 6a62e86..af2c62b 100644 --- a/src/gtkgl.c +++ b/src/gtkgl.c @@ -56,6 +56,26 @@ void gtk_gl_disable(GtkWidget *widget) #elif defined(SYS_X11) #include #include +static gboolean gtk_gl_errors; +static int gtk_gl_handler(Display *xdisplay, XErrorEvent *xerror) +{ + gtk_gl_errors = TRUE; + return 0; +} +static GLXContext gtk_gl_create_context(Display *xdisplay, XVisualInfo *xvinfo, + GLXContext shared, Bool direct) +{ + gtk_gl_errors = FALSE; + XSync(xdisplay, False); + void *handler = XSetErrorHandler(gtk_gl_handler); + GLXContext context = glXCreateContext(xdisplay, xvinfo, shared, direct); + XSync(xdisplay, False); + XSetErrorHandler(handler); + + if (gtk_gl_errors) + return 0; + return context; +} void gtk_gl_enable(GtkWidget *widget) { g_debug("GtkGl: enable"); @@ -72,10 +92,20 @@ void gtk_gl_enable(GtkWidget *widget) GLX_DOUBLEBUFFER, GLX_DEPTH_SIZE, 1, None}; + XVisualInfo *xvinfo = glXChooseVisual(xdisplay, nscreen, attribs); if (!xvinfo) g_error("GtkGl: enable - unable to get valid OpenGL Visual"); - GLXContext context = glXCreateContext(xdisplay, xvinfo, NULL, True); + GLXContext context = 0; + if (!context) + context = gtk_gl_create_context(xdisplay, xvinfo, NULL, True); + if (!context) + context = gtk_gl_create_context(xdisplay, xvinfo, NULL, False); + if (!context) + g_error("Unable to create OpenGL context," + "possible graphics driver problem?"); + g_debug("GtkGl: direct rendering = %d\n", glXIsDirect(xdisplay, context)); + g_object_set_data(G_OBJECT(widget), "glcontext", context); /* Fix up colormap */