#elif defined(SYS_X11)
#include <GL/glx.h>
#include <gdk/gdkx.h>
+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");
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);
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);
[ctx makeCurrentContext];
[ctx update];
[view setFrame:rect];
+ [view setWantsBestResolutionOpenGLSurface:YES];
}
void gtk_gl_end(GtkWidget *widget)