chiark / gitweb /
Obsoleted code removed
[clg] / gtk / gtkcontainer.lisp
1 ;; Common Lisp bindings for GTK+ v2.0
2 ;; Copyright (C) 2000 Espen S. Johnsen <espejohn@online.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.2 2000-10-05 17:21: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
41
42 (define-foreign ("gtk_container_child_getv" container-child-get-arg) () nil
43   (container container)
44   (child widget)
45   (1 unsigned-int)
46   (arg arg))
47
48 (define-foreign ("gtk_container_child_setv" container-child-set-arg) () nil
49   (container container)
50   (child widget)
51   (1 unsigned-int)
52   (arg arg))
53
54 (defun container-child-arg (container child name)
55   (with-gc-disabled
56     (let ((arg (arg-new 0)))
57       (setf (arg-name arg) name)
58       (container-child-get-arg container child arg) ; probably memory leak
59       (let ((type (type-from-number (arg-type arg))))
60         (prog1
61             (arg-value arg type)
62           (arg-free arg nil))))))
63
64 (defun (setf container-child-arg) (value container child name)
65   (with-gc-disabled
66     (let ((arg (arg-new 0)))
67       (setf (arg-name arg) name)
68       (container-child-get-arg container child arg) ; probably memory leak
69       (let ((type (type-from-number (arg-type arg))))
70         (setf (arg-value arg type) value)
71         (container-child-set-arg container child arg)
72         (arg-free arg nil))))
73   value)
74
75
76 (define-foreign container-add () nil
77   (container container)
78   (widget widget))
79
80 (define-foreign container-remove () nil
81   (container container)
82   (widget widget))
83
84 (define-foreign container-check-resize () nil
85   (container container))
86
87 (define-foreign ("gtk_container_foreach_full" %container-foreach)
88     (container function) nil
89   (container container)
90   (0 unsigned-long)
91   (*callback-marshal* pointer)
92   ((register-callback-function function) unsigned-long)
93   (*destroy-marshal* pointer))
94
95 (defun map-container (seqtype func container)
96   (case seqtype
97     ((nil)
98      (%container-foreach container func)
99      nil)
100     (list
101      (let ((list nil))
102        (%container-foreach
103         container
104         #'(lambda (child)
105             (push (funcall func child) list)))
106        (nreverse list)))
107     (t
108      (let ((seq (make-sequence seqtype (container-num-children container)))
109            (index 0))
110        (%container-foreach
111         container
112         #'(lambda (child)
113             (setf (elt seq index) (funcall func child))
114             (incf index)))
115        seq))))
116
117 (defmacro do-container ((var container &optional (result nil)) &body body)
118   (let ((continue (make-symbol "CONTINUE")))
119     `(let ((,continue t))
120        (%container-foreach
121         ,container
122         #'(lambda (,var)
123             (when ,continue
124               (setq ,continue nil)
125               (block nil
126                 ,@body
127                 (setq ,continue t)))))
128        ,result)))
129
130 (define-foreign container-children () (glist widget)
131   (container container))
132
133 (defun (setf container-children) (children container)
134   (dolist (child (container-children container))
135     (container-remove container child))
136   (dolist (child children)
137     (container-add container child))
138   children)
139
140 ;; Should be implemented as a foreign function
141 (defun container-num-children (container)
142   (length (container-children container)))
143
144 (define-foreign container-resize-children () nil
145   (container container))