chiark / gitweb /
Initial checkin
[clg] / examples / testcairo.lisp
1 ;; This file contains the cairo C snippets translated to lisp 
2 ;; See http://cairographics.org/samples/
3
4 #+sbcl(require :gtk)
5 #+cmu(asdf:oos 'asdf:load-op :gtk)
6 #+sbcl(require :cairo)
7 #+cmu(asdf:oos 'asdf:load-op :cairo)
8
9 ;;#+sbcl(require :rsvg)
10 ;;#+cmu(asdf:oos 'asdf:load-op :avg-cairo)
11
12 (defpackage "TESTCAIRO"
13   (:use "COMMON-LISP" "GTK")
14   (:export "CREATE-TESTS"))
15
16 (in-package "TESTCAIRO")
17
18 (declaim (inline deg-to-rad))
19 (defun deg-to-rad (deg)
20   (* deg (/ pi 180)))
21
22 (declaim (inline rad-to-deg))
23 (defun rad-to-deg (rad)
24   (/ (* rad 180) pi))
25
26
27 (defvar *snippets* ())
28
29
30 (defmacro define-snippet (name (cr) &body body)
31   (let ((widget (make-symbol "WIDGET"))
32         (window (make-symbol "WINDOW"))
33         (pointer (make-symbol "POINTER")))
34     `(let ((,window nil))
35        (setq *snippets* (pushnew ',name *snippets*))
36        (defun ,name ()
37          (if (not ,window)
38              (let ((,widget (make-instance 'drawing-area)))
39                (setq ,window
40                 (make-instance 'window 
41                  :width-request 300 :height-request 300 
42                  :title ,(string-downcase name)
43                  :visible t :child ,widget))
44                (signal-connect ,window 'destroy 
45                 #'(lambda () (setq ,window nil)))
46                (signal-connect ,widget 'expose-event
47                 #'(lambda (,pointer)
48                     (declare (ignore ,pointer))
49                     (let ((,cr (gdk:cairo-create (widget-window ,widget))))
50                       (multiple-value-bind (width height) 
51                           (widget-get-size-allocation ,widget)
52                         (cairo:scale ,cr width height))
53                       (setf (cairo:line-width ,cr) 0.04)
54                       ,@body)))
55                (widget-show-all ,window))
56            (widget-destroy ,window))))))
57
58
59      
60
61 (defun arc-helper-lines (cr xc yc radius angle1 angle2)
62   (cairo:set-source-color cr 1 0.2 0.2 0.6)
63   (cairo:arc cr xc yc 0.05 0 (deg-to-rad 360))
64   (cairo:fill cr)
65   (setf (cairo:line-width cr) 0.03)
66   (cairo:move-to cr xc yc)
67   (cairo:rel-line-to cr (* radius (cos angle1)) (* radius (sin angle1)))
68   (cairo:stroke cr)
69   (cairo:move-to cr xc yc)
70   (cairo:rel-line-to cr (* radius (cos angle2)) (* radius (sin angle2)))
71   (cairo:stroke cr))
72
73 (define-snippet arc (cr)
74   (let ((xc 0.5)
75         (yc 0.5)
76         (radius 0.4)
77         (angle1 (deg-to-rad 45.0))
78         (angle2 (deg-to-rad 180.0)))
79
80     (cairo:with-context (cr)
81       (setf (cairo:line-cap cr) :round)
82       (cairo:arc cr xc yc radius angle1 angle2)
83       (cairo:stroke cr))
84
85     (arc-helper-lines cr xc yc radius angle1 angle2)))
86
87 (define-snippet arc-negative (cr)
88   (let ((xc 0.5)
89         (yc 0.5)
90         (radius 0.4)
91         (angle1 (deg-to-rad 45.0))
92         (angle2 (deg-to-rad 180.0)))
93
94     (cairo:with-context (cr)
95       (setf (cairo:line-cap cr) :round)
96       (cairo:arc-negative cr xc yc radius angle1 angle2)
97       (cairo:stroke cr))
98
99     (arc-helper-lines cr xc yc radius angle1 angle2)))
100
101
102 (define-snippet clip (cr)
103   (cairo:circle cr 0.5 0.5 0.3)
104   (cairo:clip cr)
105
106   (cairo:new-path cr) ; current path is not consumed by cairo:clip
107   (cairo:rectangle cr 0 0 1 1)
108   (cairo:fill cr)
109   (cairo:set-source-color cr 0 1 0)
110   (cairo:move-to cr 0 0)
111   (cairo:line-to cr 1 1)
112   (cairo:move-to cr 1 0)
113   (cairo:line-to cr 0 1)
114   (cairo:stroke cr))
115
116
117 (define-snippet clip-image (cr)
118   (cairo:circle cr 0.5 0.5 0.3)
119   (cairo:clip cr)
120   (cairo:new-path cr)
121
122   (let ((image (cairo:image-surface-create-from-png 
123                 #p"clg:examples;romedalen.png")))
124
125     (let ((width (cairo:surface-width image))
126           (height (cairo:surface-height image)))
127       (cairo:scale cr (/ 1.0 width) (/ 1.0 height)))
128
129     (cairo:set-source-surface cr image 0 0)
130     (cairo:paint cr)))
131
132 (define-snippet clip-rectangle (cr)
133   (cairo:new-path cr)
134   (cairo:move-to cr 0.25 0.25)
135   (cairo:line-to cr 0.25 0.75)
136   (cairo:line-to cr 0.75 0.75)
137   (cairo:line-to cr 0.75 0.25)
138   (cairo:line-to cr 0.25 0.25)
139   (cairo:close-path cr)
140
141   (cairo:clip cr)
142
143   (cairo:move-to cr 0 0)
144   (cairo:line-to cr 1 1)
145   (cairo:stroke cr))
146
147
148 ;; (define-snippet curve-rectangle (cr)
149 ;;   (let ((x0 0.1)
150 ;;      (y0 0.1)
151 ;;      (width 0.8)
152 ;;      (height 0.8)
153 ;;      (radius 0.4))
154 ;;     (unless (and (zerop width) (zerop height))
155 ;;       (let ((x1 (+ x0 width))
156 ;;          (y1 (+ y0 height)))
157 ;;      (cond
158 ;;       ((and (< (* 0.5 width) radius) (< (* 0.5 height) radius))
159 ;;        (cairo:move-to cr x0 (* 0.5 (+ y0 y1)))
160 ;;        (cairo:curve-to cr x0 y0 x0 y0 (* 0.5 (+ x0 x1)) y0)
161 ;;        (cairo:curve-to cr x1 y0 x1 y0 x1 (* 0.5 (+ y0 y1)))
162 ;;        (cairo:curve-to cr x1 y1 x1 y1 (* 0.5 (+ x0 x1)) y1)
163 ;;        (cairo:curve-to cr x0 y1 x0 y1 x0 (* 0.5 (+ y0 y1))))
164 ;;       ((< (* 0.5 width) radius)
165 ;;        (cairo:move-to  cr x0 (+ y0 radius))
166 ;;        (cairo:curve-to cr x0 y0 x0 y0 (* 0.5 (+ x0 x1)) y0)
167 ;;        (cairo:curve-to cr x1 y0 x1 y0 x1 (+ y0 radius))
168 ;;        (cairo:line-to cr x1  (- y1 radius))
169 ;;        (cairo:curve-to cr x1 y1 x1 y1 (* 0.5 (+ x0 x1)) y1)
170 ;;        (cairo:curve-to cr x0 y1 x0 y1 x0 (- y1 radius)))
171 ;;       ((< (* 0.5 height) radius)
172 ;;        (cairo:move-to cr x0 (* 0.5 (+ y0 y1)))
173 ;;        (cairo:curve-to cr x0  y0 x0  y0 (+ x0 radius) y0)
174 ;;        (cairo:line-to cr (- x1 radius) y0)
175 ;;        (cairo:curve-to cr x1 y0 x1 y0 x1 (* 0.5 (+ y0 y1)))
176 ;;        (cairo:curve-to cr x1 y1 x1 y1 (- x1 radius) y1)
177 ;;        (cairo:line-to cr (+ x0 radius) y1)
178 ;;        (cairo:curve-to cr x0 y1 x0 y1 x0 (* 0.5 (+ y0 y1))))
179 ;;       (t
180 ;;        (cairo:move-to cr x0 (+ y0 radius))
181 ;;        (cairo:curve-to cr x0 y0 x0 y0 (+ x0 radius) y0)
182 ;;        (cairo:line-to cr (- x1 radius) y0)
183 ;;        (cairo:curve-to cr x1 y0 x1 y0 x1 (+ y0 radius))
184 ;;        (cairo:line-to cr x1 (- y1 radius))
185 ;;        (cairo:curve-to cr x1 y1 x1 y1 (- x1 radius) y1)
186 ;;        (cairo:line-to cr (+ x0 radius) y1)
187 ;;        (cairo:curve-to cr x0 y1 x0 y1 x0 (- y1 radius))))
188 ;;      (cairo:close-path cr)
189
190 ;;      (cairo:set-source-color cr 0.5 0.5 1.0)
191 ;;      (cairo:fill cr t)
192 ;;      (cairo:set-source-color cr 0.5 0.0 0.0 0.5)
193 ;;      (cairo:stroke cr)))))
194
195
196
197 (define-snippet curve-to (cr)
198   (let ((x 0.1) (y 0.5)
199         (x1 0.4) (y1 0.9)
200         (x2 0.6) (y2 0.1)
201         (x3 0.9) (y3 0.5))
202
203     (cairo:move-to cr x y)
204     (cairo:curve-to cr x1 y1 x2 y2 x3 y3)
205
206     (cairo:stroke cr)
207
208     (cairo:set-source-color cr 1 0.2 0.2 0.6)
209     (setf (cairo:line-width cr) 0.03)
210     (cairo:move-to cr x y)
211     (cairo:line-to cr x1 y1)
212     (cairo:move-to cr x2 y2)
213     (cairo:line-to cr x3 y3)
214     (cairo:stroke cr)))
215
216
217 (define-snippet dash (cr)
218   (let ((dashes #(0.20 0.05 0.05 0.05))
219         (offset -0.2))
220     (cairo:set-dash cr dashes offset)
221     (cairo:move-to cr 0.5 0.1)
222     (cairo:line-to cr 0.9 0.9)
223     (cairo:rel-line-to cr -0.4 0.0)
224     (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5)
225     (cairo:stroke cr)))
226
227
228 (defun fill-and-stroke-common (cr)
229   (cairo:move-to cr 0.5 0.1)
230   (cairo:line-to cr 0.9 0.9)
231   (cairo:rel-line-to cr -0.4 0.0)
232   (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5)
233   (cairo:close-path cr))
234  
235
236 (define-snippet fill-and-stroke2 (cr)
237   (fill-and-stroke-common cr)
238   (cairo:move-to cr 0.25 0.1)
239   (cairo:rel-line-to cr 0.2 0.2)
240   (cairo:rel-line-to cr -0.2 0.2)
241   (cairo:rel-line-to cr -0.2 -0.2)
242   (cairo:close-path cr)
243
244   (cairo:set-source-color cr 0 0 1)
245   (cairo:fill cr t)
246   (cairo:set-source-color cr 0 0 0)
247   (cairo:stroke cr))
248
249
250 (define-snippet fill-and-stroke (cr)
251   (fill-and-stroke-common cr)
252
253   (cairo:set-source-color cr 0 0 1)
254   (cairo:fill cr t)
255   (cairo:set-source-color cr 0 0 0)
256   (cairo:stroke cr))
257
258
259 (define-snippet gradient (cr)
260   (let ((pattern (cairo:pattern-create-linear 0.0 0.0 0.0 1.0)))
261     (cairo:pattern-add-color-stop pattern 1 0 0 0 1)
262     (cairo:pattern-add-color-stop pattern 0 1 1 1 1)
263     (cairo:rectangle cr 0 0 1 1)
264     (setf (cairo:source cr) pattern)
265     (cairo:fill cr))
266   (let ((pattern (cairo:pattern-create-radial 0.45 0.4 0.1 0.4 0.4 0.5)))
267     (cairo:pattern-add-color-stop pattern 0 1 1 1 1)
268     (cairo:pattern-add-color-stop pattern 1 0 0 0 1)
269     (setf (cairo:source cr) pattern)
270     (cairo:circle cr 0.5 0.5 0.3)
271     (cairo:fill cr)))
272
273
274 (define-snippet image (cr)
275   (let ((image (cairo:image-surface-create-from-png 
276                 #p"clg:examples;romedalen.png")))
277     (cairo:translate cr 0.5 0.5)
278     (cairo:rotate cr (deg-to-rad 45))
279     (let ((width (cairo:surface-width image))
280           (height (cairo:surface-height image)))
281       (cairo:scale cr (/ 1.0 width) (/ 1.0 height))  
282       (cairo:translate cr (* -0.5 width) (* -0.5 height)))
283     (cairo:set-source-surface cr image 0 0)
284     (cairo:paint cr)))
285
286     
287 (define-snippet image-pattern (cr)
288   (let* ((image (cairo:image-surface-create-from-png 
289                  #p"clg:examples;romedalen.png"))
290          (pattern (cairo:pattern-create-for-surface image)))
291     (setf (cairo:pattern-extend pattern) :repeat)    
292     (cairo:translate cr 0.5 0.5)
293     (cairo:rotate cr (deg-to-rad 45))
294     (cairo:scale cr (/ 1.0 (sqrt 2)) (/ 1.0 (sqrt 2)))  
295     (cairo:translate cr -0.5 -0.5)
296     (let ((width (cairo:surface-width image))
297           (height (cairo:surface-height image))
298           (matrix (make-instance 'cairo:matrix)))
299       (cairo:matrix-init-scale matrix (* 5 width) (* 5 height))
300       (setf (cairo:pattern-matrix pattern) matrix))
301     (setf (cairo:source cr) pattern)
302     (cairo:rectangle cr 0.0 0.0 1.0 1.0)
303     (cairo:fill cr)))
304
305
306 ;; (defun snippet-set-bg-svg (cr filename)
307 ;;   (let ((handle (make-instance 'rsvg:handle :filename filename)))
308 ;;     (cairo:with-context (cr)
309 ;;       (with-slots (rsvg:width rsvg:height) (rsvg:handle-dimensions handle)
310 ;;      (cairo:scale cr (/ 1.0 rsvg:width) (/ 1.0 rsvg:height))
311 ;;      (rsvg:cairo-render cr handle)))))
312
313 ;; (define-snippet librsvg (cr)
314 ;;   (snippet-set-bg-svg cr "clg:examples;home.svg"))
315
316
317 (defmacro define-operator-snippet (operator)
318   (let ((name (intern (format nil "OPERATOR-~A" operator))))
319     `(define-snippet ,name (cr)
320        (snippet-set-bg-svg cr "clg:examples;freedesktop.svg")
321        (setf (cairo:operator cr) ,operator)
322        
323        (cairo:set-source-color cr 1.0 0.0 0.0 0.5)
324        (cairo:rectangle cr 0.2 0.2 0.5 0.5)
325        (cairo:fill)
326        
327        (cairo:set-source-color cr 0.0 1.0 0.0)
328        (cairo:rectangle cr 0.4 0.4 0.4 0.4)
329        (cairo:fill)
330        
331        (cairo:set-source-color cr 0.0 0.0 1.0)
332        (cairo:rectangle cr 0.6 0.6 0.3 0.3)
333        (cairo:fill))))
334
335 ;; (define-operator-snippet :add)
336 ;; (define-operator-snippet :atop)
337 ;; (define-operator-snippet :atop-reverse)
338 ;; (define-operator-snippet :in)
339 ;; (define-operator-snippet :in-reverse)
340 ;; (define-operator-snippet :out)
341 ;; (define-operator-snippet :out-reverse)
342 ;; (define-operator-snippet :over)
343 ;; (define-operator-snippet :over-reverse)
344 ;; (define-operator-snippet :saturate)
345 ;; (define-operator-snippet :xor)
346
347       
348
349 (define-snippet path (cr)
350   (cairo:move-to cr 0.5 0.1)
351   (cairo:line-to cr 0.9 0.9)
352   (cairo:rel-line-to cr -0.4 0.0)
353   (cairo:curve-to cr 0.2 0.9 0.2 0.5 0.5 0.5)
354   (cairo:stroke cr))
355
356
357 ;; (let ((path))
358 ;;   (define-snippet pattern-fill (cr)
359 ;;     (let ((spikes 10)
360 ;;        (text "KAPOW!"))
361 ;;       (unless path
362 ;;      (let ((x-fuzz 0.08)
363 ;;            (y-fuzz 0.08)
364 ;;            (x-inner-radius 0.3)
365 ;;            (y-inner-radius 0.2)
366 ;;            (x-outer-radius 0.45)
367 ;;            (y-outer-radius 0.35))
368 ;;        (setq path (make-array (* 2 spikes)))
369 ;;        (loop
370 ;;         for i from 0 below (* 2 spikes)
371 ;;         do (multiple-value-bind (x-radius y-radius)
372 ;;                (if (evenp i)
373 ;;                    (values x-inner-radius y-inner-radius)
374 ;;                  (values x-outer-radius y-outer-radius))
375 ;;              (setf 
376 ;;               (svref path i)
377 ;;               (cons
378 ;;                (+ 0.5 (* (cos (* pi (/ i spikes))) x-radius) 
379 ;;                   (* (random 1.0) x-fuzz))
380 ;;                (+ 0.5 (* (sin (* pi (/ i spikes))) y-radius)
381 ;;                   (* (random 1.0) y-fuzz))))))))
382       
383 ;;       (setf (cairo:line-width cr) 0.01)
384 ;;       (cairo:move-to cr (car (svref path 0)) (cdr (svref path 0)))
385 ;;       (loop
386 ;;        for i from 1 below (* 2 spikes)
387 ;;        do (cairo:line-to cr (car (svref path i)) (cdr (svref path i))))
388 ;;       (cairo:close-path cr)
389 ;;       (cairo:stroke cr)
390 ;;       (cairo:move-to cr 
391 ;;        (car (svref path (1- spikes))) (cdr (svref path (1- spikes))))
392
393 ;;       (cairo:select-font-face cr "Sans" :normal :bold)
394 ;;       (time (cairo:text-path cr text))
395 ;;       (cairo:set-source-color cr 1.0 1.0 0.5)
396 ;;       (cairo:fill cr)
397
398 ;;       (cairo:set-font-size cr 0.2)
399 ;;       (let* ((extents (cairo:text-extents cr text))
400 ;;           (x (- 0.5 (+ (* 0.5 (cairo:text-extents-width extents)) (cairo:text-extents-x-bearing extents))))
401 ;;           (y (- 0.5 (+ (* 0.5 (cairo:text-extents-height extents)) (cairo:text-extents-y-bearing extents)))))
402
403 ;;      (cairo:move-to cr x y)
404 ;;      (cairo:text-path cr text)
405 ;;      (cairo:set-source-color cr 0 0 0)
406 ;;      (cairo:stroke cr)))))
407
408
409
410 (define-snippet set-line-cap (cr)
411   (setf (cairo:line-width cr) 0.12)
412   (setf (cairo:line-cap cr) :butt)
413   (cairo:move-to cr 0.25 0.2)
414   (cairo:line-to cr 0.25 0.8)
415   (cairo:stroke cr)
416   (setf (cairo:line-cap cr) :round)
417   (cairo:move-to cr 0.5 0.2)
418   (cairo:line-to cr 0.5 0.8)
419   (cairo:stroke cr)
420   (setf (cairo:line-cap cr) :square)
421   (cairo:move-to cr 0.75 0.2)
422   (cairo:line-to cr 0.75 0.8)
423   (cairo:stroke cr)
424
425   ;; draw helping lines
426   (cairo:set-source-color cr 1 0.2 0.2)
427   (setf (cairo:line-width cr) 0.01)
428   (cairo:move-to cr 0.25 0.2)
429   (cairo:line-to cr 0.25 0.8)
430   (cairo:move-to cr 0.5 0.2) 
431   (cairo:line-to cr 0.5 0.8)
432   (cairo:move-to cr 0.75 0.2)
433   (cairo:line-to cr 0.75 0.8)
434   (cairo:stroke cr))
435
436
437 (define-snippet set-line-join (cr)
438   (setf (cairo:line-width cr) 0.16)
439   (cairo:move-to cr 0.3 0.33)
440   (cairo:rel-line-to cr 0.2 -0.2)
441   (cairo:rel-line-to cr 0.2 0.2)
442   (setf (cairo:line-join cr) :miter) ; default
443   (cairo:stroke cr)
444
445   (cairo:move-to cr 0.3 0.63)
446   (cairo:rel-line-to cr 0.2 -0.2)
447   (cairo:rel-line-to cr 0.2 0.2)
448   (setf (cairo:line-join cr) :bevel)
449   (cairo:stroke cr)
450                 
451   (cairo:move-to cr 0.3 0.93)
452   (cairo:rel-line-to cr 0.2 -0.2)
453   (cairo:rel-line-to cr 0.2 0.2)
454   (setf (cairo:line-join cr) :round)
455   (cairo:stroke cr))
456
457
458
459 (define-snippet text (cr)
460    (cairo:select-font-face cr "Sans" :normal :bold)
461 ;;   ;(setf (cairo:font-size cr) 0.35)
462    (cairo:set-font-size cr 0.35)
463
464    (cairo:move-to cr 0.04 0.53)
465    (cairo:show-text cr "Hello")
466
467   (cairo:move-to cr 0.27 0.65)
468   (cairo:text-path cr "void")
469   (cairo:set-source-color cr 0.5 0.5 1)
470   (cairo:fill cr t)
471
472   (cairo:set-source-color cr 0 0 0)
473   (setf (cairo:line-width cr) 0.01)
474   (cairo:stroke cr)
475
476   ;; draw helping lines
477   (cairo:set-source-color cr 1 0.2 0.2  0.6)
478   (cairo:arc cr 0.04 0.53 0.02 0 (deg-to-rad 360))
479   (cairo:arc cr 0.27 0.65 0.02 0 (deg-to-rad 360))
480   (cairo:fill cr))
481
482
483 (define-snippet text-align-center (cr)
484   (let ((text "cairo"))
485     (cairo:select-font-face cr "Sans" :normal :normal)
486     (cairo:set-font-size cr 0.2)
487
488     (let* ((extents (cairo:text-extents cr text))
489            (x (- 0.5 (+ (/ (cairo:text-extents-width extents) 2) (cairo:text-extents-x-bearing extents))))
490            (y (- 0.5 (+ (/ (cairo:text-extents-height extents) 2) (cairo:text-extents-y-bearing extents)))))
491       (cairo:move-to cr x y)
492       (cairo:show-text cr text)
493
494       ;; draw helping lines
495       (cairo:set-source-color cr 1.0 0.2 0.2 0.6)
496       (cairo:circle cr x y 0.05)
497       (cairo:fill cr)
498       (cairo:move-to cr 0.5 0.0)
499       (cairo:rel-line-to cr 0.0 1.0)
500       (cairo:move-to cr 0.0 0.5)
501       (cairo:rel-line-to cr 1.0 0.0)
502       (cairo:stroke cr))))
503
504 (define-snippet text-extents (cr)
505   (let ((text "cairo"))
506     (cairo:select-font-face cr "Sans" :normal :normal)
507     (cairo:set-font-size cr 0.4)
508
509     (let* ((extents (cairo:text-extents cr text))
510            (x 0.1)
511            (y 0.6))
512       (cairo:move-to cr x y)
513       (cairo:show-text cr text)
514
515       ;; draw helping lines
516       (cairo:set-source-color cr 1.0 0.2 0.2 0.6)
517       (cairo:circle cr x y 0.05)
518       (cairo:fill cr)
519       (cairo:move-to cr x y)
520       (cairo:rel-line-to cr 0 (- (cairo:text-extents-height extents)))
521       (cairo:rel-line-to cr (cairo:text-extents-width extents) 0)
522       (cairo:rel-line-to cr 
523        (cairo:text-extents-x-bearing extents)
524        (- (cairo:text-extents-y-bearing extents)))
525       (cairo:stroke cr))))
526
527
528 (defun create-tests ()
529 ;;   (rc-parse "clg:examples;testgtkrc2")
530 ;;   (rc-parse "clg:examples;testgtkrc")
531
532   (let* ((main-window (make-instance 'window
533                        :title "testcairo.lisp" :name "main-window"
534                        :default-width 200 :default-height 400
535                        :allow-grow t :allow-shrink nil))
536          (scrolled-window (make-instance 'scrolled-window
537                            :hscrollbar-policy :automatic 
538                            :vscrollbar-policy :automatic
539                            :border-width 10))
540          (close-button (make-instance 'button 
541                         :label "close" :can-default t
542                         :signal (list 'clicked #'widget-destroy 
543                                  :object main-window))))
544
545     (let ((icon (gdk:pixbuf-load #p"clg:examples;gtk.png")))
546       (setf 
547        (window-icon main-window) 
548        (gdk:pixbuf-add-alpha icon t 254 254 252)))
549
550     ;; Main box
551     (make-instance 'v-box
552      :parent main-window
553      :child-args '(:expand nil)
554      :child (list (make-instance 'label :label (gtk-version)) :fill nil)
555      :child (list (make-instance 'label :label (clg-version)) :fill nil)
556      :child (list (make-instance 'label                           
557                    :label #-cmu(format nil "~A (~A)" 
558                                 (lisp-implementation-type)
559                                 (lisp-implementation-version))
560                           ;; The version string in CMUCL is far too long
561                           #+cmu(lisp-implementation-type))
562                   :fill nil)
563      :child (list scrolled-window :expand t)
564      :child (make-instance 'h-separator)
565      :child (make-instance 'v-box 
566              :homogeneous nil :spacing 10 :border-width 10 
567              :child close-button))
568
569     (let ((content-box 
570            (make-instance 'v-box
571             :focus-vadjustment (scrolled-window-vadjustment scrolled-window)
572             :children (mapcar #'(lambda (snippet)
573                                   (create-button (string-downcase snippet) snippet))
574                               (sort *snippets* #'string<)))))
575       (scrolled-window-add-with-viewport scrolled-window content-box))
576     
577     (widget-grab-focus close-button)
578     (widget-show-all main-window)
579     main-window))
580
581
582 (clg-init)
583 ;;(rsvg:init)