;; 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: gobject.lisp,v 1.7 2001-05-11 16:08:08 espen Exp $
+;; $Id: gobject.lisp,v 1.8 2001-05-29 15:50:31 espen Exp $
(in-package "GLIB")
(defclass effective-gobject-slot-definition
(effective-virtual-slot-definition)))
+
; (defbinding object-class-install-param () nil
; (class pointer)
direct-slotds)
(with-slots (type) slotd
(let ((param-name (slot-definition-param (first direct-slotds)))
- (type-number (find-type-number type))
- (getter (intern-reader-function type))
- (setter (intern-writer-function type))
- (destroy (intern-destroy-function type)))
+ (type-number (find-type-number type)))
(list
#'(lambda (object)
(with-gc-disabled
(let ((gvalue (gvalue-new type-number)))
(%object-get-property object param-name gvalue)
(prog1
- (funcall getter gvalue +gvalue-value-offset+)
+ (funcall
+ (intern-reader-function type) gvalue +gvalue-value-offset+)
(gvalue-free gvalue t)))))
#'(lambda (value object)
(with-gc-disabled
(let ((gvalue (gvalue-new type-number)))
- (funcall setter value gvalue +gvalue-value-offset+)
+ (funcall
+ (intern-writer-function type)
+ value gvalue +gvalue-value-offset+)
(%object-set-property object param-name gvalue)
- (funcall destroy gvalue +gvalue-value-offset+)
+ (funcall
+ (intern-destroy-function type)
+ gvalue +gvalue-value-offset+)
(gvalue-free gvalue nil)
value)))))))
(defmethod validate-superclass ((class gobject-class)
(super pcl::standard-class))
- (subtypep (class-name super) 'gobject))
+; (subtypep (class-name super) 'gobject)
+ t)
(class pointer)
(n-properties unsigned-int :out))
-(defun query-object-class-properties (type)
- (let ((class (type-class-ref type)))
+(defun query-object-class-properties (type-number)
+ (let ((class (type-class-ref type-number)))
(multiple-value-bind (array length)
(%object-class-properties class)
(map-c-array 'list #'identity array 'param length))))
-(defun query-object-class-dependencies (class)
+(defun query-object-type-dependencies (type-number)
(delete-duplicates
(reduce
#'nconc
#'(lambda (param)
;; A gobject does not depend on it's supertypes due to forward
;; referenced superclasses
- (delete-if
- #'(lambda (type)
- (type-is-p class type))
+ (delete-if
+ #'(lambda (type)
+ (type-is-p type-number type))
(type-hierarchy (param-type param))))
- (query-object-class-properties class)))))
+ (query-object-class-properties type-number)))))
(defun default-slot-name (name)
(intern
(format
nil "~A-~A~A" class-name slot-name
- (if (eq 'boolean type) "-p" ""))))
+ (if (eq 'boolean type) "-P" ""))))
-(defun expand-gobject-type (type-number &optional slots)
+(defun expand-gobject-type (type-number &optional slots
+ (metaclass 'gobject-class))
(let* ((super (supertype type-number))
(class (type-from-number type-number))
(expanded-slots
#'(lambda (param)
(with-slots (name flags type documentation) param
(let* ((slot-name (default-slot-name name))
- (slot-type (type-from-number type))
+ (slot-type (type-from-number type #|t|#))
(accessor
(default-slot-accessor class slot-name slot-type)))
`(,slot-name
:allocation :param
:param ,name
- ,@(when (member :writable flags)
+ ,@(cond
+ ((and
+ (member :writable flags)
+ (member :readable flags))
+ (list :accessor accessor))
+ ((member :writable flags)
(list :writer `(setf ,accessor)))
- ,@(when (member :readable flags)
- (list :reader accessor))
- ,@(when (member :construct flags)
+ ((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
`(defclass ,class (,super)
,expanded-slots
- (:metaclass gobject-class)
+ (:metaclass ,metaclass)
(:alien-name ,(find-type-name type-number)))))
(register-derivable-type
'gobject "GObject"
- :query 'query-object-class-dependencies
+ :query 'query-object-type-dependencies
:expand 'expand-gobject-type)
;; 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: gtype.lisp,v 1.10 2001-05-11 16:04:33 espen Exp $
+;; $Id: gtype.lisp,v 1.11 2001-05-29 15:49:23 espen Exp $
(in-package "GLIB")
(and error (error "Type not registered: ~A" type)))))
(pcl::class (find-type-number (class-name type) error))))
-(defun type-from-number (type-number)
- (gethash type-number *number-to-type-hash*))
+(defun type-from-number (type-number &optional error)
+ (multiple-value-bind (type found)
+ (gethash type-number *number-to-type-hash*)
+ (when (and error (not found))
+ (let ((name (find-type-name type-number)))
+ (if name
+ (error "Type number not registered: ~A (~A)" type-number name)
+ (error "Invalid type number: ~A" type-number))))
+ type))
(defun type-from-name (name)
(etypecase name
(funcall (mkbinding fname 'type-number)))
(mklist init)))
-(defmacro init-types-in-library (pathname)
+(defun %init-types-in-library (pathname ignore)
(let ((process (ext:run-program
"nm" (list (namestring (truename pathname)))
:output :stream :wait nil))
(labels ((read-symbols ()
(let ((line (read-line (ext:process-output process) nil)))
(when line
- (when (search "_get_type" line)
- (push (subseq line 11) fnames))
+ (let ((symbol (subseq line 11)))
+ (when (and
+ (search "_get_type" symbol)
+ (not (member symbol ignore :test #'string=)))
+ (push symbol fnames)))
(read-symbols)))))
(read-symbols)
(ext:process-close process)
`(init-type ',fnames))))
+(defmacro init-types-in-library (pathname &key ignore)
+ (%init-types-in-library pathname ignore))
+
+
;;;; Superclass for wrapping types in the glib type system
(let* ((class-name (or name (class-name class)))
(type-number
(find-type-number
- (or (first alien-name) (default-alien-type-name class-name)))))
+ (or (first alien-name) (default-alien-type-name class-name)) t)))
(register-type class-name type-number)
(let ((size (or size (type-instance-size type-number))))
+ (declare (special size))
(call-next-method)))
(when ref
(register-type 'unsigned-long "gulong")
(register-type 'single-float "gfloat")
(register-type 'double-float "gdouble")
-(register-type 'string "GString")
+(register-type 'string "gchararray")
;;;;
(list type-number query expand)
*derivable-type-info*))))
+(defun find-type-info (type)
+ (dolist (super (cdr (type-hierarchy type)))
+ (let ((info (assoc super *derivable-type-info*)))
+ (return-if info))))
+
(defun type-dependencies (type)
- (let ((query (second (assoc (car (last (type-hierarchy type)))
- *derivable-type-info*))))
+ (let ((query (second (find-type-info type))))
(when query
(funcall query (find-type-number type t)))))
(defun expand-type-definition (type)
- (let ((expander (third (assoc (car (last (type-hierarchy type)))
- *derivable-type-info*))))
+ (let ((expander (third (find-type-info type))))
(funcall expander (find-type-number type t))))
-
(defbinding type-parent (type) type-number
((find-type-number type t) type-number))
(dolist (type-info *derivable-type-info*)
(map-subtypes
#'(lambda (type-number)
- (push type-number type-list))
+ (pushnew type-number type-list))
(first type-info) prefix))
type-list))
(defun expand-type-definitions (prefix &optional args)
(flet ((type-options (type-number)
(let ((name (find-type-name type-number)))
- (cdr (assoc name argss :test #'string=)))))
+ (cdr (assoc name args :test #'string=)))))
(let ((type-list
(delete-if
#'(lambda (type-number)
- (getf (type-options type-number) :ignore nil))
+ (let ((name (find-type-name type-number)))
+ (or
+ (getf (type-options type-number) :ignore)
+ (find-if
+ #'(lambda (options)
+ (and
+ (string-prefix-p (first options) name)
+ (getf (cdr options) :ignore-prefix)))
+ args))))
(find-types prefix))))
(dolist (type-number type-list)
(%sort-types-topologicaly type-list))))))
(defmacro define-types-by-introspection (prefix &rest args)
- `(eval-when (:compile-toplevel :load-toplevel :execute)
- ,(expand-type-definitions prefix args)))
\ No newline at end of file
+ (expand-type-definitions prefix args))