4 #include <gdk/gdkkeysyms.h>
8 static GtkWidget *rotate_button;
22 static float ang = 30.;
24 gboolean expose (GtkWidget *da, GdkEventExpose *event, gpointer user_data)
26 GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
27 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
29 // g_print (" :: expose\n");
31 if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
33 g_assert_not_reached ();
37 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
40 glRotatef (ang, 1, 0, 1);
42 glShadeModel(GL_FLAT);
45 glColor3f (1., 0., 0.);
46 glVertex3f (0., 0., 0.);
47 glVertex3f (1., 0., 0.);
51 glColor3f (0., 1., 0.);
52 glVertex3f (0., 0., 0.);
53 glVertex3f (0., 1., 0.);
57 glColor3f (0., 0., 1.);
58 glVertex3f (0., 0., 0.);
59 glVertex3f (0., 0., 1.);
63 glColor3f (1., 1., 1.);
103 if (gdk_gl_drawable_is_double_buffered (gldrawable))
104 gdk_gl_drawable_swap_buffers (gldrawable);
109 gdk_gl_drawable_gl_end (gldrawable);
114 gboolean configure(GtkWidget *da, GdkEventConfigure *event, gpointer user_data)
116 GdkGLContext *glcontext = gtk_widget_get_gl_context (da);
117 GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (da);
119 if (!gdk_gl_drawable_gl_begin (gldrawable, glcontext))
121 g_assert_not_reached ();
125 glViewport (0, 0, da->allocation.width, da->allocation.height);
126 glOrtho (-10,10,-10,10,-20050,10000);
128 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
130 glScalef (10., 10., 10.);
132 gdk_gl_drawable_gl_end (gldrawable);
137 gboolean rotate (gpointer user_data)
139 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(rotate_button)))
142 GtkWidget *da = GTK_WIDGET (user_data);
146 gdk_window_invalidate_rect (da->window, &da->allocation, FALSE);
147 gdk_window_process_updates (da->window, FALSE);
152 gboolean cube_init(GtkDrawingArea *drawing, GtkNotebook *config)
154 /* Add configuration tab */
155 GtkWidget *label = gtk_label_new("Cube");
156 rotate_button = gtk_toggle_button_new_with_label("Rotate");
157 gtk_notebook_append_page(GTK_NOTEBOOK(config), rotate_button, label);
159 /* Set up OpenGL Stuff */
160 g_signal_connect(drawing, "configure-event", G_CALLBACK(configure), NULL);
161 g_signal_connect(drawing, "expose-event", G_CALLBACK(expose), NULL);
162 g_timeout_add(1000/60, rotate, drawing);