;; Common Lisp bindings for GTK+ v2.0
-;; Copyright (C) 2000 Espen S. Johnsen <espejohn@online.no>
+;; Copyright (C) 2000 Espen S. Johnsen <esj@stud.cs.uit.no>
;;
;; This library is free software; you can redistribute it and/or
;; modify it under the terms of the GNU Lesser General Public
;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-;; $Id: gtkcontainer.lisp,v 1.1 2000-08-14 16:45:02 espen Exp $
+;; $Id: gtkcontainer.lisp,v 1.16 2005-01-06 21:00:53 espen Exp $
(in-package "GTK")
-(defclass container (widget)
- ((border-width
- :allocation :arg
- :accessor container-border-width
- :initarg :border-width
- :type unsigned-long)
- (resize-mode
- :allocation :arg
- :accessor container-resize-mode
- :initarg :resize-mode
- :type resize-mode)
- (children
- :allocation :virtual
- :location container-children
-; :initarg :children
- )
- (focus-child
- :allocation :virtual
- :location ("gtk_container_get_focus_child" "gtk_container_set_focus_child")
- :accessor container-focus-child
- :initarg :focus-child
- :type widget)
- (focus-hadjustment
- :allocation :virtual
- :location (nil "gtk_container_set_focus_hadjustment")
- :writer (setf container-focus-hadjustment)
- :initarg :focus-hadjustment
- :type adjustment)
- (focus-vadjustment
- :allocation :virtual
- :location (nil "gtk_container_set_focus_vadjustment")
- :writer (setf container-focus-vadjustment)
- :initarg :focus-vadjustment
- :type adjustment))
- (:metaclass widget-class)
- (:alien-name "GtkContainer"))
-
-
-(defmethod initialize-instance ((container container) &rest initargs
- &key children)
- (declare (ignore initargs))
+
+(defmethod shared-initialize ((container container) names &rest initargs
+ &key child children child-args)
+ (declare (ignore child children))
(call-next-method)
- (dolist (child children)
- (cond
- ((consp child)
- (container-add container (first child))
- (setf
- (slot-value (first child) 'child-slots)
- (apply
- #'make-instance
- (slot-value (class-of container) 'child-class)
- :parent container :child (first child) (cdr child))))
- (t
- (container-add container child)))))
+ (initial-add container
+ #'(lambda (container args)
+ (apply #'container-add container (append (mklist args) child-args)))
+ initargs :child :children))
+(defmethod create-callback-function ((container container) function arg1)
+ (if (eq arg1 :children)
+ #'(lambda (&rest args)
+ (mapc #'(lambda (child)
+ (apply function child (rest args)))
+ (container-children container)))
+ (call-next-method)))
-(define-foreign ("gtk_container_child_getv" container-child-get-arg) () nil
- (container container)
- (child widget)
- (1 unsigned-int)
- (arg arg))
-(define-foreign ("gtk_container_child_setv" container-child-set-arg) () nil
- (container container)
- (child widget)
- (1 unsigned-int)
- (arg arg))
-
-(defun container-child-arg (container child name)
- (with-gc-disabled
- (let ((arg (arg-new 0)))
- (setf (arg-name arg) name)
- (container-child-get-arg container child arg) ; probably memory leak
- (let ((type (type-from-number (arg-type arg))))
- (prog1
- (arg-value arg type)
- (arg-free arg nil))))))
-
-(defun (setf container-child-arg) (value container child name)
- (with-gc-disabled
- (let ((arg (arg-new 0)))
- (setf (arg-name arg) name)
- (container-child-get-arg container child arg) ; probably memory leak
- (let ((type (type-from-number (arg-type arg))))
- (setf (arg-value arg type) value)
- (container-child-set-arg container child arg)
- (arg-free arg nil))))
- value)
-
-
-(define-foreign container-add () nil
+(defbinding %container-add () nil
(container container)
(widget widget))
-(define-foreign container-remove () nil
+(defmethod container-add ((container container) (widget widget) &rest args)
+ (%container-add container widget)
+ (when args
+ (setf
+ (slot-value widget 'child-properties)
+ (apply
+ #'make-instance
+ (gethash (class-of container) *container-to-child-class-mappings*)
+ :parent container :child widget args))))
+
+
+(defbinding %container-remove () nil
(container container)
(widget widget))
-(define-foreign container-check-resize () nil
+(defmethod container-remove ((container container) (widget widget))
+ (%container-remove container widget)
+ (slot-makunbound widget 'child-properties))
+
+
+(defbinding %container-child-get-property () nil
+ (container container)
+ (child widget)
+ (property-name string)
+ (value gvalue))
+
+(defbinding %container-child-set-property () nil
+ (container container)
+ (child widget)
+ (property-name string)
+ (value gvalue))
+
+
+(defbinding container-check-resize () nil
(container container))
-(define-foreign ("gtk_container_foreach_full" %container-foreach)
- (container function) nil
+(def-callback-marshal %foreach-callback (nil widget))
+
+(defbinding %container-foreach (container callback-id) nil
(container container)
- (0 unsigned-long)
- (*callback-marshal* pointer)
- ((register-callback-function function) unsigned-long)
- (*destroy-marshal* pointer))
+ ((callback %foreach-callback) pointer)
+ (callback-id unsigned-int))
+
+(defun container-foreach (container function)
+ (with-callback-function (id function)
+ (%container-foreach container id)))
+
+(defbinding %container-forall (container callback-id) nil
+ (container container)
+ ((callback %foreach-callback) pointer)
+ (callback-id unsigned-int))
+
+(defun container-forall (container function)
+ (with-callback-function (id function)
+ (%container-forall container id)))
(defun map-container (seqtype func container)
(case seqtype
((nil)
- (%container-foreach container func)
+ (container-foreach container func)
nil)
(list
(let ((list nil))
- (%container-foreach
+ (container-foreach
container
#'(lambda (child)
(push (funcall func child) list)))
(nreverse list)))
(t
- (let ((seq (make-sequence seqtype (container-num-children container)))
+ (let ((seq (make-sequence seqtype (container-length container)))
(index 0))
- (%container-foreach
+ (container-foreach
container
#'(lambda (child)
(setf (elt seq index) (funcall func child))
(incf index)))
seq))))
-(defmacro do-container ((var container &optional (result nil)) &body body)
- (let ((continue (make-symbol "CONTINUE")))
- `(let ((,continue t))
- (%container-foreach
- ,container
- #'(lambda (,var)
- (when ,continue
- (setq ,continue nil)
- (block nil
- ,@body
- (setq ,continue t)))))
- ,result)))
-
-(define-foreign container-children () (double-list widget)
- (container container))
+(defmethod container-children ((container container))
+ (map-container 'list #'identity container))
-(defun (setf container-children) (children container)
+(defmethod (setf container-children) (children (container container))
(dolist (child (container-children container))
(container-remove container child))
(dolist (child children)
- (container-add container child))
+ (apply #'container-add container (mklist child)))
children)
-;; Should be implemented as a foreign function
-(defun container-num-children (container)
- (length (container-children container)))
+(defun container-length (container)
+ (let ((n 0))
+ (container-foreach container
+ #'(lambda (child)
+ (declare (ignore child))
+ (incf n)))
+ n))
-(define-foreign container-resize-children () nil
+(defbinding container-resize-children () nil
(container container))
+
+(defbinding container-propagate-expose () nil
+ (container container)
+ (child widget)
+ (event gdk:expose-event))
+
+
+(defbinding %container-get-focus-chain () boolean
+ (container container)
+ (focusable-widgets (glist widget) :out))
+
+(defun container-focus-chain (container)
+ (multiple-value-bind (chain-set-p focusable-widgets)
+ (%container-get-focus-chain container)
+ (and chain-set-p focusable-widgets)))
+
+(defbinding %container-set-focus-chain () nil
+ (container container)
+ (focusable-widgets (glist widget)))
+
+(defbinding %container-unset-focus-chain () nil
+ (container container))
+
+(defun (setf container-focus-chain) (focusable-widgets container)
+ (if (null focusable-widgets)
+ (%container-unset-focus-chain container)
+ (%container-set-focus-chain container focusable-widgets)))