X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=glib%2Fgobject.meta.lisp;h=e4fc5e3d8b8e1ed8b2710460a77f314a18f9f41d;hb=a4ef7d75a39821a90d7a872e2b840140adb15216;hp=5835b4974f17d3e436eccee28902fcf6f280d183;hpb=031374d1cddb5f8a48f7955c94038d17f380db75;p=cl-gtk2.git diff --git a/glib/gobject.meta.lisp b/glib/gobject.meta.lisp index 5835b49..e4fc5e3 100644 --- a/glib/gobject.meta.lisp +++ b/glib/gobject.meta.lisp @@ -9,33 +9,35 @@ :reader gobject-class-g-type-initializer) (interface-p :initform nil :initarg :g-interface-p - :reader gobject-class-interface-p))) + :reader gobject-class-interface-p)) + (:documentation "Metaclass for GObject-based classes.")) -(defmethod initialize-instance :after ((object gobject-class) &key &allow-other-keys) - (register-object-type (gobject-class-g-type-name object) (class-name object)) - (if (gobject-class-g-type-initializer object) - (let* ((initializer-fn-ptr (foreign-symbol-pointer (gobject-class-g-type-initializer object))) +(defun initialize-gobject-class-g-type (class) + (if (gobject-class-g-type-initializer class) + (let* ((initializer-fn-ptr (foreign-symbol-pointer (gobject-class-g-type-initializer class))) (type (when initializer-fn-ptr (foreign-funcall-pointer initializer-fn-ptr nil g-type)))) (if (null initializer-fn-ptr) (warn "Type initializer for class '~A' (GType '~A') is invalid: foreign symbol '~A'" - (gobject-class-g-type-name object) (class-name object) (gobject-class-g-type-initializer object)) - + (gobject-class-g-type-name class) (class-name class) (gobject-class-g-type-initializer class)) (progn - (when (= +g-type-invalid+ type) + (when (g-type= +g-type-invalid+ type) (warn "Declared GType name '~A' for class '~A' is invalid ('~A' returned 0)" - (gobject-class-g-type-name object) (class-name object) - (gobject-class-g-type-initializer object))) - (unless (string= (gobject-class-g-type-name object) - (g-type-name type)) + (gobject-class-g-type-name class) (class-name class) + (gobject-class-g-type-initializer class))) + (unless (g-type= (gobject-class-g-type-name class) type) (warn "Declared GType name '~A' for class '~A' does not match actual GType name '~A'" - (gobject-class-g-type-name object) - (class-name object) + (gobject-class-g-type-name class) + (class-name class) (g-type-name type)))))) - (unless (g-type-from-name (gobject-class-g-type-name object)) + (unless (g-type-from-name (gobject-class-g-type-name class)) (warn "Declared GType name '~A' for class '~A' is invalid (g_type_name returned 0)" - (gobject-class-g-type-name object) (class-name object))))) + (gobject-class-g-type-name class) (class-name class))))) + +(defmethod initialize-instance :after ((object gobject-class) &key &allow-other-keys) + (register-object-type (gobject-class-g-type-name object) (class-name object)) + (at-init (object) (initialize-gobject-class-g-type object))) (defclass gobject-direct-slot-definition (standard-direct-slot-definition) ((g-property-type :initform nil @@ -204,24 +206,26 @@ (defmethod slot-boundp-using-class ((class gobject-class) object (slot gobject-property-effective-slot-definition)) (handler-case - (progn (g-object-property-type object (gobject-property-effective-slot-definition-g-property-name slot) :assert-readable t) t) + (progn (g-object-property-type (pointer object) (gobject-property-effective-slot-definition-g-property-name slot) :assert-readable t) t) (property-unreadable-error () nil))) (defmethod slot-value-using-class ((class gobject-class) object (slot gobject-property-effective-slot-definition)) - (g-object-call-get-property object + (g-object-call-get-property (pointer object) (gobject-property-effective-slot-definition-g-property-name slot) (gobject-effective-slot-definition-g-property-type slot))) (defmethod (setf slot-value-using-class) (new-value (class gobject-class) object (slot gobject-property-effective-slot-definition)) - (g-object-call-set-property object + (g-object-call-set-property (pointer object) (gobject-property-effective-slot-definition-g-property-name slot) new-value (gobject-effective-slot-definition-g-property-type slot))) +(defmethod slot-boundp-using-class ((class gobject-class) object (slot gobject-fn-effective-slot-definition)) + (not (null (gobject-fn-effective-slot-definition-g-getter-fn slot)))) + (defmethod slot-value-using-class ((class gobject-class) object (slot gobject-fn-effective-slot-definition)) (let ((fn (gobject-fn-effective-slot-definition-g-getter-fn slot))) - (when fn - (funcall fn object)))) + (funcall fn object))) (defmethod (setf slot-value-using-class) (new-value (class gobject-class) object (slot gobject-fn-effective-slot-definition)) (funcall (gobject-fn-effective-slot-definition-g-setter-fn slot) object new-value))