GtkWidget * yui_gl_new(void) { GtkWidget * drawingArea; #ifdef HAVE_LIBGTKGLEXT int attribs[] = { GDK_GL_RGBA, GDK_GL_RED_SIZE, 1, GDK_GL_GREEN_SIZE, 1, GDK_GL_BLUE_SIZE, 1, GDK_GL_DOUBLEBUFFER, GDK_GL_DEPTH_SIZE ,1, GDK_GL_STENCIL_SIZE ,8, GDK_GL_ATTRIB_LIST_NONE }; #endif drawingArea = GTK_WIDGET(g_object_new(yui_gl_get_type(), NULL)); YUI_GL(drawingArea)->is_init = 0; #ifdef HAVE_LIBGTKGLEXT gtk_widget_set_gl_capability(drawingArea, gdk_gl_config_new(attribs), NULL, TRUE, GDK_GL_RGBA_TYPE); #endif g_signal_connect (GTK_OBJECT(drawingArea),"configure_event", GTK_SIGNAL_FUNC(yui_gl_resize),0); gtk_widget_set_events(drawingArea, GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); g_signal_connect(GTK_OBJECT(drawingArea), "motion-notify-event", GTK_SIGNAL_FUNC(yui_gl_hide_cursor),0); g_signal_connect(GTK_OBJECT(drawingArea), "button-press-event", GTK_SIGNAL_FUNC(yui_gl_button_press),0); g_signal_connect(GTK_OBJECT(drawingArea), "button-release-event", GTK_SIGNAL_FUNC(yui_gl_button_release),0); return drawingArea; }
static GdkGLConfig * gdk_gl_config_new_rgb (GdkScreen *screen, GdkGLConfigMode mode) { int list[32]; int n = 0; list[n++] = GDK_GL_RGBA; list[n++] = GDK_GL_RED_SIZE; list[n++] = 1; list[n++] = GDK_GL_GREEN_SIZE; list[n++] = 1; list[n++] = GDK_GL_BLUE_SIZE; list[n++] = 1; if (mode & GDK_GL_MODE_ALPHA) { list[n++] = GDK_GL_ALPHA_SIZE; list[n++] = 1; } if (mode & GDK_GL_MODE_DOUBLE) { list[n++] = GDK_GL_DOUBLEBUFFER; } if (mode & GDK_GL_MODE_STEREO) { list[n++] = GDK_GL_STEREO; } if (mode & GDK_GL_MODE_DEPTH) { list[n++] = GDK_GL_DEPTH_SIZE; list[n++] = 1; } if (mode & GDK_GL_MODE_STENCIL) { list[n++] = GDK_GL_STENCIL_SIZE; list[n++] = 1; } if (mode & GDK_GL_MODE_ACCUM) { list[n++] = GDK_GL_ACCUM_RED_SIZE; list[n++] = 1; list[n++] = GDK_GL_ACCUM_GREEN_SIZE; list[n++] = 1; list[n++] = GDK_GL_ACCUM_BLUE_SIZE; list[n++] = 1; if (mode & GDK_GL_MODE_ALPHA) { list[n++] = GDK_GL_ACCUM_ALPHA_SIZE; list[n++] = 1; } } list[n] = GDK_GL_ATTRIB_LIST_NONE; #ifdef GDKGLEXT_MULTIHEAD_SUPPORT return gdk_gl_config_new_for_screen (screen, list); #else /* GDKGLEXT_MULTIHEAD_SUPPORT */ return gdk_gl_config_new (list); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ }
static GdkGLConfig * gdk_gl_config_new_ci (GdkScreen *screen, GdkGLConfigMode mode) { GdkGLConfig *glconfig = NULL; static const int buf_size_list[] = { 16, 12, 8, 4, 2, 1, 0 }; int list[32]; int n = 0; int i; list[n++] = GDK_GL_BUFFER_SIZE; list[n++] = 1; if (mode & GDK_GL_MODE_DOUBLE) { list[n++] = GDK_GL_DOUBLEBUFFER; } if (mode & GDK_GL_MODE_STEREO) { list[n++] = GDK_GL_STEREO; } if (mode & GDK_GL_MODE_DEPTH) { list[n++] = GDK_GL_DEPTH_SIZE; list[n++] = 1; } if (mode & GDK_GL_MODE_STENCIL) { list[n++] = GDK_GL_STENCIL_SIZE; list[n++] = 1; } list[n] = GDK_GL_ATTRIB_LIST_NONE; /* from GLUT */ /* glXChooseVisual specify GLX_BUFFER_SIZE prefers the "smallest index buffer of at least the specified size". This would be reasonable if GLUT allowed the user to specify the required buffe size, but GLUT's display mode is too simplistic (easy to use?). GLUT should try to find the "largest". So start with a large buffer size and shrink until we find a matching one that exists. */ for (i = 0; buf_size_list[i]; i++) { /* XXX Assumes list[1] is where GDK_GL_BUFFER_SIZE parameter is. */ list[1] = buf_size_list[i]; #ifdef GDKGLEXT_MULTIHEAD_SUPPORT glconfig = gdk_gl_config_new_for_screen (screen, list); #else /* GDKGLEXT_MULTIHEAD_SUPPORT */ glconfig = gdk_gl_config_new (list); #endif /* GDKGLEXT_MULTIHEAD_SUPPORT */ if (glconfig != NULL) return glconfig; } return NULL; }
GdkGLConfig* glconfig_new(){ GdkGLConfig* glconfig = NULL; for ( configs_iterator i = configs, end = configs + 2; i != end && glconfig == NULL; ++i ) { glconfig = gdk_gl_config_new( *i ); } if ( glconfig == NULL ) { return gdk_gl_config_new_by_mode( (GdkGLConfigMode)( GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE ) ); } return glconfig; }
GdkGLConfig* glconfig_new(){ GdkGLConfig* glconfig = 0; for ( configs_iterator i = configs, end = configs + 2; i != end; ++i ) { glconfig = gdk_gl_config_new( ( *i ).attribs ); if ( glconfig != 0 ) { globalOutputStream() << "OpenGL window configuration: " << ( *i ).name << "\n"; return glconfig; } } globalOutputStream() << "OpenGL window configuration: colour-buffer = auto, depth-buffer = none\n"; return gdk_gl_config_new_by_mode( (GdkGLConfigMode)( GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE ) ); }
GdkGLConfig* GLWidget::createGLConfigWithDepth() { for (configs_iterator i = configs_with_depth, end = configs_with_depth + 6; i != end; ++i) { GdkGLConfig* glconfig = gdk_gl_config_new(i->attribs); if (glconfig != NULL) { globalOutputStream() << "OpenGL window configuration: " << i->name << "\n"; return glconfig; } } globalOutputStream() << "OpenGL window configuration: colour-buffer = auto, depth-buffer = auto (fallback)\n"; return gdk_gl_config_new_by_mode((GdkGLConfigMode) (GDK_GL_MODE_RGBA | GDK_GL_MODE_DOUBLE | GDK_GL_MODE_DEPTH)); }
static void cb_init_ext(GtkWidget *widget) { GdkGLConfig *config; // la config qui va aller avec static const gint attrList[] = { // les paramètres de la config GDK_GL_DOUBLEBUFFER, GDK_GL_RGBA, GDK_GL_RED_SIZE, 1, GDK_GL_GREEN_SIZE, 1, GDK_GL_BLUE_SIZE, 1, GDK_GL_ALPHA_SIZE, 1, GDK_GL_DEPTH_SIZE, 1, GDK_GL_ATTRIB_LIST_NONE }; config = gdk_gl_config_new(attrList); /* ajout du support Opengl */ gtk_widget_set_gl_capability(widget, config, NULL, TRUE, GDK_GL_RGBA_TYPE); }
int main (int argc, char *argv[]) { gint major, minor; GtkWidget *window; GtkWidget *vbox; GtkWidget *drawing_area; GtkWidget *button; /* * Init GTK. */ gtk_init (&argc, &argv); /* * Init GdkGLExt. */ gdk_gl_init (&argc, &argv); /* * Query OpenGL extension version. */ gdk_gl_query_version (&major, &minor); g_print ("\nOpenGL extension version - %d.%d\n", major, minor); /* * Configure OpenGL-capable visual. */ /* Try double-buffered visual */ glconfig = gdk_gl_config_new (&config_attributes[0]); if (glconfig == NULL) { g_print ("*** Cannot find the double-buffered visual.\n"); g_print ("*** Trying single-buffered visual.\n"); /* Try single-buffered visual */ glconfig = gdk_gl_config_new (&config_attributes[1]); if (glconfig == NULL) { g_print ("*** No appropriate OpenGL-capable visual found.\n"); exit (1); } } examine_gl_config_attrib (glconfig); /* * Top-level window. */ window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_title (GTK_WINDOW (window), "low-level"); /* * If window manager doesn't watch the WM_COLORMAP_WINDOWS property on * the top-level window, we have to set OpenGL window's colormap to the * top-level window. */ gtk_widget_set_colormap (window, gdk_gl_config_get_colormap (glconfig)); /* Get automatically redrawn if any of their children changed allocation. */ gtk_container_set_reallocate_redraws (GTK_CONTAINER (window), TRUE); g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (gtk_main_quit), NULL); /* * VBox. */ vbox = gtk_vbox_new (FALSE, 0); gtk_container_add (GTK_CONTAINER (window), vbox); gtk_widget_show (vbox); /* * Drawing area for drawing OpenGL scene. */ drawing_area = gtk_drawing_area_new (); gtk_widget_set_size_request (drawing_area, 200, 200); /* Set OpenGL-capable colormap. */ gtk_widget_set_colormap (drawing_area, gdk_gl_config_get_colormap (glconfig)); /* Disable backing store feature of the widget. */ gtk_widget_set_double_buffered (drawing_area, FALSE); g_signal_connect_after (G_OBJECT (drawing_area), "realize", G_CALLBACK (realize), NULL); g_signal_connect (G_OBJECT (drawing_area), "size_allocate", G_CALLBACK (size_allocate), NULL); g_signal_connect (G_OBJECT (drawing_area), "configure_event", G_CALLBACK (configure_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "expose_event", G_CALLBACK (expose_event), NULL); g_signal_connect (G_OBJECT (drawing_area), "unrealize", G_CALLBACK (unrealize), NULL); gtk_box_pack_start (GTK_BOX (vbox), drawing_area, TRUE, TRUE, 0); gtk_widget_show (drawing_area); /* * Simple quit button. */ button = gtk_button_new_with_label ("Quit"); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (gtk_main_quit), NULL); gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0); gtk_widget_show (button); /* * Show window. */ gtk_widget_show (window); /* * Main loop. */ /* Destroy the GLX context explicitly when application is terminated. */ gtk_quit_add_destroy (gtk_main_level () + 1, GTK_OBJECT (drawing_area)); gtk_main (); return 0; }