/* compile with : valac --pkg gtkgl-3.0 .... */ using Gtk; using GL; void on_glarea_realize_event (Widget widget) { print ("GTK+ version : %d.%d.%d\n", MAJOR_VERSION, MINOR_VERSION, MICRO_VERSION); var glarea = widget as GLArea; if (glarea.make_current () == true) { glViewport (0,0, glarea.get_allocated_width (), glarea.get_allocated_height ()); glMatrixMode (GL_PROJECTION); glLoadIdentity (); glOrtho (0,100, 100,0, -1,1); glMatrixMode (GL_MODELVIEW); } } bool on_glarea_draw_event (Widget widget, Cairo.Context cr) { var glarea = widget as GLArea; if (glarea.make_current () == true) { glViewport (0,0, glarea.get_allocated_width (), glarea.get_allocated_height ()); // Draw simple triangle glClearColor (0,0,0,1); glClear (GL_COLOR_BUFFER_BIT); glColor3f (1,1,1); glBegin (GL_TRIANGLES); glVertex2f (10,10); glVertex2f (10,90); glVertex2f (90,90); glEnd (); // Swap backbuffer to front glarea.swap_buffers (); } return true; } int main (string[] args) { int[] attrlist = { }; attrlist += Gdk.GLConfigAttrib.RGBA; attrlist += Gdk.GLConfigAttrib.RED_SIZE; attrlist += 1; attrlist += Gdk.GLConfigAttrib.GREEN_SIZE; attrlist += 1; attrlist += Gdk.GLConfigAttrib.BLUE_SIZE; attrlist += 1; attrlist += Gdk.GLConfigAttrib.DOUBLEBUFFER; attrlist += 1; attrlist += Gdk.GLConfigAttrib.NONE; Gtk.init (ref args); // test if OpenGL is available if (Gdk.gl_query () == false) { print ("OpenGL not supported \n"); return -1; } var window = new Window (WindowType.TOPLEVEL); window.title = "Simple"; window.destroy.connect (Gtk.main_quit); var box = new Box (Orientation.VERTICAL, 0); var glarea = new GLArea (attrlist); glarea.set_size_request (100, 100); glarea.realize.connect (on_glarea_realize_event); glarea.draw.connect (on_glarea_draw_event); var button = new Button.with_label ("Quit"); button.clicked.connect (Gtk.main_quit); box.pack_start (glarea, true, true); box.pack_start (button, false, false); window.add (box); window.show_all (); Gtk.main (); return 0; }