+ ;(subtypep (class-name super) 'container-child)
+ t)
+
+
+(defclass container-child ()
+ ((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-array '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-number &optional slots)
+ (let* ((class (type-from-number type-number))
+ (super (supertype type-number))
+ (child-class (default-container-child-name class))
+ (expanded-child-slots
+ (mapcar
+ #'(lambda (param)
+ (with-slots (name flags value-type documentation) param
+ (let* ((slot-name (default-slot-name name))
+ (slot-type (type-from-number value-type #|t|#))
+ (accessor
+ (default-slot-accessor class slot-name slot-type)))
+ `(,slot-name
+ :allocation :property
+ :pname ,name
+ ,@(cond
+ ((and
+ (member :writable flags)
+ (member :readable flags))
+ (list :accessor accessor))
+ ((member :writable flags)
+ (list :writer `(setf ,accessor)))
+ ((member :readable flags)
+ (list :reader accessor)))
+ ,@(when (or
+ (member :construct flags)
+ (member :writable flags))
+ (list :initarg (intern (string slot-name) "KEYWORD")))
+ :type ,slot-type
+ ,@(when documentation
+ (list :documentation documentation))))))
+ (query-container-class-child-properties type-number))))
+ `(progn
+ ,(expand-gobject-type type-number slots)
+ (defclass ,child-class
+ (,(default-container-child-name super))
+ ,expanded-child-slots
+ (:metaclass child-class)
+ (:container ,class)))))
+
+(register-derivable-type 'container "GtkContainer" 'expand-container-type)