X-Git-Url: http://pileus.org/git/?p=grits;a=blobdiff_plain;f=src%2Fgtkgl.c;h=19f3219043273e18f82be3b976acf83d911b80ae;hp=b10c52d328f3186135376ae34a9ddf1f78c24027;hb=5c17e7d79895982036139dcffb5c17cefb1d4d9f;hpb=c605da71628f672c2ff94018e92eb245685d51a1 diff --git a/src/gtkgl.c b/src/gtkgl.c index b10c52d..19f3219 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,16 +92,33 @@ 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, False); + 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 */ + /* Fix up visual/colormap */ +#if GTK_CHECK_VERSION(3,0,0) + GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid); + gtk_widget_set_visual(widget, visual); +#else GdkVisual *visual = gdk_x11_screen_lookup_visual(screen, xvinfo->visualid); GdkColormap *cmap = gdk_colormap_new(visual, FALSE); gtk_widget_set_colormap(widget, cmap); + g_object_unref(cmap); +#endif + XFree(xvinfo); /* Disable GTK double buffering */ gtk_widget_set_double_buffered(widget, FALSE); @@ -256,6 +293,8 @@ void gtk_gl_begin(GtkWidget *widget) GtkAllocation alloc; gdk_window_ensure_native(gtk_widget_get_window(widget)); gtk_widget_get_allocation(widget, &alloc); + gtk_widget_translate_coordinates(widget, gtk_widget_get_toplevel(widget), + 0, 0, &alloc.x, &alloc.y); NSOpenGLContext *ctx = g_object_get_data(G_OBJECT(widget), "glcontext"); GdkWindow *win = gtk_widget_get_window(widget); @@ -266,6 +305,7 @@ void gtk_gl_begin(GtkWidget *widget) [ctx makeCurrentContext]; [ctx update]; [view setFrame:rect]; + [view setWantsBestResolutionOpenGLSurface:YES]; } void gtk_gl_end(GtkWidget *widget)