- :specializers (list (find-class t) (find-class 'widget))
- :lambda-list '(value widget)
- :function #'(lambda (args next-methods)
- (declare (ignore next-methods))
- (destructuring-bind (value widget) args
- (setf
- (child-slot-value widget slot-name)
- value))))))
-
-
-(defmethod validate-superclass ((class child-class) (super pcl::standard-class))
- (subtypep (class-name super) 'container-child))
-
-
+ :specializers (list (find-class t) (find-class 'widget))
+ :lambda-list '(value widget)
+ :documentation (or #?(sbcl>= 1 0 2)slot-documentation "automatically generated reader method")
+ :function #'(lambda (args next-methods)
+ (declare (ignore next-methods))
+ (destructuring-bind (value widget) args
+ (setf (child-property-value widget slot-name) value))))))
+
+
+(defmethod validate-superclass ((class container-child-class) (super standard-class))
+ ;(subtypep (class-name super) 'container-child)
+ t)
+
+
+(defclass container-child (virtual-slots-object)
+ ((parent :initarg :parent :type container)
+ (child :initarg :child :type widget)))
+
+
+;;;;
+
+(defbinding %container-class-list-child-properties () pointer
+ (class pointer)
+ (n-properties unsigned-int :out))
+
+(defun query-container-class-child-properties (type-number)
+ (let ((class (type-class-ref type-number)))
+ (multiple-value-bind (array length)
+ (%container-class-list-child-properties class)
+ (unwind-protect
+ (map-c-vector 'list #'identity array 'param length)
+ (deallocate-memory array)))))
+
+(defun default-container-child-name (container-class)
+ (intern (format nil "~A-CHILD" container-class)))
+
+(defun expand-container-type (type forward-p options)
+ (let* ((class (type-from-number type))
+ (super (supertype type))
+ (child-class (default-container-child-name class)))
+ (if forward-p
+ (expand-gobject-type type t options)
+ `(progn
+ ,(expand-gobject-type type nil options)
+ (defclass ,child-class (,(default-container-child-name super))
+ ,(slot-definitions child-class
+ (query-container-class-child-properties type) nil)
+ (:metaclass container-child-class)
+ (:container ,class))))))
+
+(defun container-child-class (container-class)
+ (gethash container-class *container-to-child-class-mappings*))
+
+(defun container-dependencies (type options)
+ (delete-duplicates
+ (append
+ (gobject-dependencies type options)
+ (mapcar #'param-value-type (query-container-class-child-properties type)))))
+
+(register-derivable-type 'container "GtkContainer" 'expand-container-type 'container-dependencies)