support for setting gvalue to values of g-boxed-class
authorDmitry Kalyanov <Kalyanov.Dmitry@gmail.com>
Tue, 17 Mar 2009 19:05:39 +0000 (22:05 +0300)
committerDmitry Kalyanov <Kalyanov.Dmitry@gmail.com>
Tue, 17 Mar 2009 19:05:39 +0000 (22:05 +0300)
glib/gobject.foreign-gboxed.lisp
glib/gobject.gparams.lisp
glib/gobject.package.lisp

index a6525c3..abae705 100644 (file)
     (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))
 
       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)
index a4593ed..005be28 100644 (file)
   (g-value (:pointer g-value))
   (new-value :pointer))
 
+(defcfun g-value-take-boxed :void
+  (g-value (:pointer g-value))
+  (new-value :pointer))
+
 (defcfun g-value-get-boxed :pointer
   (g-value (:pointer g-value)))
 
index 3ac9dab..05fb448 100644 (file)
@@ -42,7 +42,8 @@
            #:parse-gvalue
            #:emit-signal
            #:g-value-unset
-           #:g-value-zero))
+           #:g-value-zero
+           #:g-value-take-boxed))
 
 (in-package :gobject)