chiark / gitweb /
2d127d532688e1a36bbaf3233e87d7049b82d1ee
[clg] / gtk / gtkcontainer.lisp
1 ;; Common Lisp bindings for GTK+ v2.0
2 ;; Copyright (C) 2000 Espen S. Johnsen <esj@stud.cs.uit.no>
3 ;;
4 ;; This library is free software; you can redistribute it and/or
5 ;; modify it under the terms of the GNU Lesser General Public
6 ;; License as published by the Free Software Foundation; either
7 ;; version 2 of the License, or (at your option) any later version.
8 ;;
9 ;; This library is distributed in the hope that it will be useful,
10 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12 ;; Lesser General Public License for more details.
13 ;;
14 ;; You should have received a copy of the GNU Lesser General Public
15 ;; License along with this library; if not, write to the Free Software
16 ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17
18 ;; $Id: gtkcontainer.lisp,v 1.3 2001-05-29 16:03:04 espen Exp $
19
20 (in-package "GTK")
21
22
23 (defmethod initialize-instance ((container container) &rest initargs
24                                 &key children)
25   (declare (ignore initargs))
26   (call-next-method)
27   (dolist (child children)
28     (cond
29      ((consp child)
30       (container-add container (first child))
31       (setf
32        (slot-value (first child) 'child-slots)
33        (apply
34         #'make-instance
35         (slot-value (class-of container) 'child-class)
36         :parent container :child (first child) (cdr child))))
37      (t
38       (container-add container child)))))
39
40 (defbinding %container-child-getv () nil
41   (container container)
42   (child widget)
43   (1 unsigned-int)
44   (arg arg))
45
46 (defbinding %container-child-setv () nil
47   (container container)
48   (child widget)
49   (1 unsigned-int)
50   (arg arg))
51   
52
53 (defbinding container-add () nil
54   (container container)
55   (widget widget))
56
57 (defbinding container-remove () nil
58   (container container)
59   (widget widget))
60
61 (defbinding container-check-resize () nil
62   (container container))
63
64 (defbinding (%container-foreach "gtk_container_foreach_full")
65     (container function) nil
66   (container container)
67   (0 unsigned-long)
68   (*callback-marshal* pointer)
69   ((register-callback-function function) unsigned-long)
70   (*destroy-marshal* pointer))
71
72 (defun map-container (seqtype func container)
73   (case seqtype
74     ((nil)
75      (%container-foreach container func)
76      nil)
77     (list
78      (let ((list nil))
79        (%container-foreach
80         container
81         #'(lambda (child)
82             (push (funcall func child) list)))
83        (nreverse list)))
84     (t
85      (let ((seq (make-sequence seqtype (container-num-children container)))
86            (index 0))
87        (%container-foreach
88         container
89         #'(lambda (child)
90             (setf (elt seq index) (funcall func child))
91             (incf index)))
92        seq))))
93
94 (defmacro do-container ((var container &optional (result nil)) &body body)
95   (let ((continue (make-symbol "CONTINUE")))
96     `(let ((,continue t))
97        (%container-foreach
98         ,container
99         #'(lambda (,var)
100             (when ,continue
101               (setq ,continue nil)
102               (block nil
103                 ,@body
104                 (setq ,continue t)))))
105        ,result)))
106
107 (defbinding container-children () (glist widget)
108   (container container))
109
110 (defun (setf container-children) (children container)
111   (dolist (child (container-children container))
112     (container-remove container child))
113   (dolist (child children)
114     (container-add container child))
115   children)
116
117 ;; Should be implemented as a foreign function
118 (defun container-num-children (container)
119   (length (container-children container)))
120
121 (defbinding container-resize-children () nil
122   (container container))