X-Git-Url: https://git.distorted.org.uk/~mdw/clg/blobdiff_plain/d168bafdb3b5b6614755bb431778e895122f2be5..637525325db34a2c4e4de288711d97bb84adffee:/glib/gtype.lisp diff --git a/glib/gtype.lisp b/glib/gtype.lisp index 70f9eeb..165c06e 100644 --- a/glib/gtype.lisp +++ b/glib/gtype.lisp @@ -15,7 +15,7 @@ ;; 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.19 2004-11-07 01:21:04 espen Exp $ +;; $Id: gtype.lisp,v 1.23 2005-01-12 13:33:06 espen Exp $ (in-package "GLIB") @@ -27,6 +27,47 @@ (deftype type-number () '(unsigned 32)) +(deftype gtype () 'symbol) + +(defmethod alien-type ((type (eql 'gtype)) &rest args) + (declare (ignore type args)) + (alien-type 'type-number)) + +(defmethod size-of ((type (eql 'gtype)) &rest args) + (declare (ignore type args)) + (size-of 'type-number)) + +(defmethod to-alien-form (gtype (type (eql 'gtype)) &rest args) + (declare (ignore type args)) + `(find-type-number ,gtype t)) + +(defmethod to-alien-function ((type (eql 'gtype)) &rest args) + (declare (ignore type args)) + #'(lambda (gtype) + (find-type-number gtype t))) + +(defmethod from-alien-form (type-number (type (eql 'gtype)) &rest args) + (declare (ignore type args)) + `(type-from-number ,type-number)) + +(defmethod from-alien-function ((type (eql 'gtype)) &rest args) + (declare (ignore type args)) + #'(lambda (type-number) + (type-from-number type-number))) + +(defmethod writer-function ((type (eql 'gtype)) &rest args) + (declare (ignore type)) + (let ((writer (writer-function 'type-number))) + #'(lambda (gtype location &optional (offset 0)) + (funcall writer (find-type-number gtype t) location offset)))) + +(defmethod reader-function ((type (eql 'gtype)) &rest args) + (declare (ignore type)) + (let ((reader (reader-function 'type-number))) + #'(lambda (location &optional (offset 0)) + (type-from-number (funcall reader location offset))))) + + (eval-when (:compile-toplevel :load-toplevel :execute) (defclass type-query (struct) ((type-number :allocation :alien :type type-number) @@ -36,14 +77,9 @@ (:metaclass struct-class))) -(defbinding %type-query () nil - (type type-number) - (query type-query)) - -(defun type-query (type) - (let ((query (make-instance 'type-query))) - (%type-query (find-type-number type t) query) - query)) +(defbinding type-query (type) nil + ((find-type-number type t) type-number) + ((make-instance 'type-query) type-query :return)) (defun type-instance-size (type) (slot-value (type-query type) 'instance-size)) @@ -111,7 +147,7 @@ (etypecase name (string (type-from-number (find-type-number name t))))) -(defbinding (find-type-name "g_type_name") (type) string +(defbinding (find-type-name "g_type_name") (type) (copy-of string) ((find-type-number type t) type-number)) (defun type-number-of (object) @@ -167,6 +203,19 @@ ;; TODO: (make-instance 'ginstance ...) location))) +(defmethod copy-from-alien-form (location (class ginstance-class) &rest args) + (declare (ignore location class args)) + (error "Doing copy-from-alien on a ref. counted class is most certainly an error, but if it really is what you want you should use REFERENCE-FOREIGN on the returned instance instead.")) + +(defmethod copy-from-alien-function ((class ginstance-class) &rest args) + (declare (ignore class args)) + (error "Doing copy-from-alien on a ref. counted class is most certainly an error, but if it really is what you want you should use REFERENCE-FOREIGN on the returned instance instead.")) + +(defmethod reader-function ((class ginstance-class) &rest args) + (declare (ignore args)) + #'(lambda (location &optional (offset 0)) + (ensure-proxy-instance class (sap-ref-sap location offset)))) + ;;;; Metaclass for subclasses of ginstance @@ -195,6 +244,7 @@ ;;;; Registering fundamental types +(register-type 'nil "void") (register-type 'pointer "gpointer") (register-type 'char "gchar") (register-type 'unsigned-char "guchar") @@ -206,6 +256,7 @@ (register-type 'unsigned-long "gulong") (register-type 'single-float "gfloat") (register-type 'double-float "gdouble") +(register-type 'pathname "gchararray") (register-type 'string "gchararray")