X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=glib%2Fgobject.foreign-gboxed.lisp;h=abae705d71f4ae2163e50daa617f18ec908e19f9;hb=9f7be1143bc6087d6eb607a12f99b062663b33dd;hp=994e759602669b996a08d3c521068de2208984c6;hpb=1e321fb41ff4ce050eea037938dc0ec20e393a54;p=cl-gtk2.git diff --git a/glib/gobject.foreign-gboxed.lisp b/glib/gobject.foreign-gboxed.lisp index 994e759..abae705 100644 --- a/glib/gobject.foreign-gboxed.lisp +++ b/glib/gobject.foreign-gboxed.lisp @@ -85,8 +85,15 @@ (real-parse-g-boxed pointer object) object)) -(defun g-boxed->cstruct (object) - (let ((pointer (foreign-alloc (type-of object)))) +(defun boxed-alloc (type alloc-type) + (ecase alloc-type + (:cffi (foreign-alloc type)) + (:boxed (let ((pointer (foreign-alloc type))) + (prog1 (g-boxed-copy (g-type-from-name (boxed-type-gname type)) pointer) + (foreign-free pointer)))))) + +(defun g-boxed->cstruct (object &key (alloc-type :cffi)) + (let ((pointer (boxed-alloc (type-of object) alloc-type))) (real-unparse-g-boxed pointer object) pointer)) @@ -289,14 +296,14 @@ (setf (gethash (pointer-address value) *boxed-ref-owner*) owner)))) (defun g-boxed-ref-slot->methods (class slot) - (bind (((slot-name &key reader writer type) slot)) + (bind (((slot-name &key reader writer type (accessor slot-name)) slot)) `(progn ,@(when reader - (list `(defmethod ,slot-name ((object ,class)) + (list `(defmethod ,accessor ((object ,class)) ,(if (stringp reader) `(foreign-funcall ,reader :pointer (pointer object) ,type) `(,reader object))))) ,@(when writer - (list `(defmethod (setf ,slot-name) (new-value (object ,class)) + (list `(defmethod (setf ,accessor) (new-value (object ,class)) ,(if (stringp writer) `(foreign-funcall ,writer :pointer (pointer object) ,type new-value) `(,writer new-value object)))))))) @@ -337,16 +344,23 @@ result))) (defvar *registered-boxed-types* (make-hash-table :test 'equal)) +(defvar *registered-boxed-names* (make-hash-table)) (defun register-boxed-type (name type) - (setf (gethash name *registered-boxed-types*) type)) + (setf (gethash name *registered-boxed-types*) type + (gethash type *registered-boxed-names*) name)) (defun get-registered-boxed-type (name) (gethash name *registered-boxed-types*)) +(defun boxed-type-gname (type) + (gethash type *registered-boxed-names*)) + (defun set-gvalue-boxed (gvalue value) (if value (progn - (unless (typep value 'g-boxed-ref) (error "Can only set g-boxed-ref!")) - (g-value-set-boxed gvalue (pointer value))) + (cond + ((typep value 'g-boxed-ref) + (g-value-set-boxed gvalue (pointer value))) + (t (g-value-take-boxed gvalue (g-boxed->cstruct value :alloc-type :boxed))))) (g-value-set-boxed gvalue (null-pointer)))) (defun parse-gvalue-boxed (gvalue)