--- /dev/null
+(defpackage :gtk-glext-demo
+ (:use :cl :gtk :gtkglext :gobject :glib)
+ (:export :run))
+
+(in-package :gtk-glext-demo)
+
+(defvar *theta* 30)
+
+(defun draw (widget event)
+ (declare (ignore event))
+ (with-gl-context (widget)
+ (gl:clear-color 0 0 0 0)
+ (gl:cull-face :back)
+ (gl:depth-func :less)
+ (gl:disable :dither)
+ (gl:shade-model :smooth)
+ (gl:light-model :light-model-local-viewer 1)
+ (gl:color-material :front :ambient-and-diffuse)
+ (gl:enable :light0 :lighting :cull-face :depth-test)
+ (gl:load-identity)
+ (gl:translate 0 0 -5)
+ (gl:rotate *theta* 1 1 0)
+ (gl:light :light0 :position '(0 1 1 0))
+ (gl:light :light0 :diffuse '(0.2 0.4 0.6 0))
+ (gl:clear :color-buffer-bit :depth-buffer-bit)
+ (gl:color 1 1 1)
+ (gl:front-face :cw)
+ (glut:solid-teapot 1.5)
+ (gl:front-face :ccw)
+ (gl:flush)))
+
+(defun run ()
+ (with-main-loop
+ (setf *theta* 30)
+ (let ((window (make-instance 'gtk-window
+ :type :toplevel
+ :window-position :center
+ :title "Hello world!"
+ :default-width 320
+ :default-height 240))
+ (v-box (make-instance 'v-box))
+ (label (make-instance 'label :label "Click me!"))
+ (drawing (make-instance 'gl-drawing-area :on-draw #'draw)))
+ (box-pack-start v-box drawing)
+ (box-pack-start v-box label :expand nil)
+ (container-add window v-box)
+ (let ((source-id (gtk-main-add-timeout 100 (lambda ()
+ (setf *theta*
+ (mod (+ *theta* 0.5) 360))
+ (widget-queue-draw drawing)
+ (setf (label-label label)
+ (format nil "Theta = ~A" *theta*))
+ t))))
+ (connect-signal window "delete-event" (lambda (w e)
+ (declare (ignore w e))
+ (g-source-remove source-id)
+ nil)))
+ (widget-show window :all t))))