int main (int argc, char* argv[]) { GtkWidget* window; GtkWidget* drawarea; GdkGLConfig* glconfig; gtk_init (&argc, &argv); gdk_gl_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); drawarea = gtk_drawing_area_new (); gtk_widget_set_size_request (drawarea, 400, 300); gtk_container_add (GTK_CONTAINER (window), drawarea); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); gtk_widget_set_events (drawarea, GDK_EXPOSURE_MASK); glconfig = gdk_gl_config_new_by_mode (GDK_GL_MODE_RGB | GDK_GL_MODE_DEPTH | GDK_GL_MODE_DOUBLE); gtk_widget_set_gl_capability (drawarea, glconfig, NULL, TRUE, GDK_GL_RGBA_TYPE); gtk_signal_connect (GTK_OBJECT (drawarea), "expose-event", G_CALLBACK (display), NULL); gtk_signal_connect (GTK_OBJECT (drawarea), "configure-event", G_CALLBACK (reshape), NULL); g_idle_add (idle, drawarea); gtk_widget_show_all (window); gtk_main (); return 0; }
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; }