- (let* ((type (ensure-g-type (gvalue-type gvalue)))
- (fundamental-type (ensure-g-type (g-type-fundamental type))))
- (cond
- ((= type (ensure-g-type (g-strv-get-type))) (convert-from-foreign (g-value-get-boxed gvalue) '(glib:gstrv :free-from-foreign nil)))
- (t (ev-case fundamental-type
- (+g-type-invalid+ (error "GValue is of invalid type (~A)" (g-type-name type)))
- (+g-type-void+ nil)
- (+g-type-char+ (g-value-get-char gvalue))
- (+g-type-uchar+ (g-value-get-uchar gvalue))
- (+g-type-boolean+ (g-value-get-boolean gvalue))
- (+g-type-int+ (g-value-get-int gvalue))
- (+g-type-uint+ (g-value-get-uint gvalue))
- (+g-type-long+ (g-value-get-long gvalue))
- (+g-type-ulong+ (g-value-get-ulong gvalue))
- (+g-type-int64+ (g-value-get-int64 gvalue))
- (+g-type-uint64+ (g-value-get-uint64 gvalue))
- (+g-type-enum+ (parse-gvalue-enum gvalue))
- (+g-type-flags+ (parse-gvalue-flags gvalue))
- (+g-type-float+ (g-value-get-float gvalue))
- (+g-type-double+ (g-value-get-double gvalue))
- (+g-type-string+ (g-value-get-string gvalue))
- (+g-type-pointer+ (g-value-get-pointer gvalue))
- (+g-type-boxed+ (parse-gvalue-boxed gvalue))
- (+g-type-param+ (parse-g-param-spec (g-value-get-param gvalue)))
- (+g-type-object+ (parse-gvalue-object gvalue))
- (+g-type-interface+ (parse-gvalue-object gvalue))
- (t (error "Unknown type: ~A (~A)" type (g-type-name type))))))))
+ (let* ((type (g-value-type gvalue))
+ (fundamental-type (g-type-fundamental type)))
+ (ev-case fundamental-type
+ ((gtype +g-type-invalid+) (error "GValue is of invalid type (~A)" (gtype-name type)))
+ ((gtype +g-type-void+) nil)
+ ((gtype +g-type-char+) (g-value-get-char gvalue))
+ ((gtype +g-type-uchar+) (g-value-get-uchar gvalue))
+ ((gtype +g-type-boolean+) (g-value-get-boolean gvalue))
+ ((gtype +g-type-int+) (g-value-get-int gvalue))
+ ((gtype +g-type-uint+) (g-value-get-uint gvalue))
+ ((gtype +g-type-long+) (g-value-get-long gvalue))
+ ((gtype +g-type-ulong+) (g-value-get-ulong gvalue))
+ ((gtype +g-type-int64+) (g-value-get-int64 gvalue))
+ ((gtype +g-type-uint64+) (g-value-get-uint64 gvalue))
+ ((gtype +g-type-enum+) (parse-g-value-enum gvalue))
+ ((gtype +g-type-flags+) (parse-g-value-flags gvalue))
+ ((gtype +g-type-float+) (g-value-get-float gvalue))
+ ((gtype +g-type-double+) (g-value-get-double gvalue))
+ ((gtype +g-type-string+) (g-value-get-string gvalue))
+ (t (parse-g-value-for-type gvalue type parse-kind)))))
+
+(defmethod parse-g-value-for-type (gvalue-ptr (type (eql (gtype +g-type-pointer+))) parse-kind)
+ (declare (ignore parse-kind))
+ (g-value-get-pointer gvalue-ptr))
+
+(defmethod parse-g-value-for-type (gvalue-ptr (type (eql (gtype +g-type-param+))) parse-kind)
+ (declare (ignore parse-kind))
+ (parse-g-param-spec (g-value-get-param gvalue-ptr)))
+
+(defgeneric set-gvalue-for-type (gvalue-ptr type value))
+
+(defmethod set-gvalue-for-type :around (gvalue-ptr type value)
+ (assert (typep type '(or gtype null)))
+ (call-next-method))
+
+(defmethod set-gvalue-for-type (gvalue-ptr type value)
+ (if (eq type (g-type-fundamental type))
+ (call-next-method)
+ (set-gvalue-for-type gvalue-ptr (g-type-fundamental type) value)))