X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=glib%2Fgobject.foreign-gobject.lisp;h=c736aff38b9a6f27e9dbc12e9d9d68ec77c65d52;hb=81e0009ee540f42c64ab1670a4fe936681fbdb6c;hp=a4cad2bf40c063ccc8339b15d85db3e7c0bc7ab9;hpb=e9622209ae8a02f82c2813ea7d358d711e1ba2d0;p=cl-gtk2.git diff --git a/glib/gobject.foreign-gobject.lisp b/glib/gobject.foreign-gobject.lisp index a4cad2b..c736aff 100644 --- a/glib/gobject.foreign-gobject.lisp +++ b/glib/gobject.foreign-gobject.lisp @@ -115,9 +115,10 @@ (gethash (pointer-address pointer) *foreign-gobjects*) (gethash (pointer-address pointer) *foreign-gobjects-ref-count*) (ref-count pointer)) - (awhen (gethash (pointer-address pointer) *foreign-gobjects*) - (setf (pointer it) nil) - (cancel-finalization it)) + (let ((object (gethash (pointer-address pointer) *foreign-gobjects*))) + (when object + (setf (pointer object) nil) + (cancel-finalization object))) (remhash (pointer-address pointer) *foreign-gobjects*) (remhash (pointer-address pointer) *foreign-gobjects-ref-count*) (g-object-unref pointer)) @@ -149,6 +150,7 @@ (unless lisp-type (error "Type ~A is not registered with REGISTER-OBJECT-TYPE" (g-type-name g-type))) + (g-object-ref pointer) (make-instance lisp-type :pointer pointer))) (define-foreign-type foreign-g-object-type () @@ -160,6 +162,9 @@ (defmethod translate-to-foreign (object (type foreign-g-object-type)) (cond + ((null object) + (null-pointer)) + ((pointerp object) object) ((null (pointer object)) (error "Object ~A has been disposed" object)) ((typep object 'g-object) @@ -167,16 +172,16 @@ nil "Object ~A is not a subtype of ~A" object (sub-type type)) (pointer object)) - ((pointerp object) object) (t (error "Object ~A is not translatable as GObject*" object)))) (defun get-g-object-for-pointer (pointer) (unless (null-pointer-p pointer) - (aif (gethash (pointer-address pointer) *foreign-gobjects*) - (prog1 it - (incf (gethash (pointer-address pointer) *foreign-gobjects-ref-count*)) - (debugf "increfering object ~A~%" pointer)) - (make-g-object-from-pointer pointer)))) + (let ((object (gethash (pointer-address pointer) *foreign-gobjects*))) + (if object + (prog1 object + (incf (gethash (pointer-address pointer) *foreign-gobjects-ref-count*)) + (debugf "increfering object ~A~%" pointer)) + (make-g-object-from-pointer pointer))))) (defmethod translate-from-foreign (pointer (type foreign-g-object-type)) (get-g-object-for-pointer pointer)) @@ -195,6 +200,24 @@ (etypecase object (g-object (pointer object))))) +(define-condition property-access-error (error) + ((property-name :initarg :property-name :reader property-access-error-property-name) + (class-name :initarg :class-name :reader property-access-error-class-name) + (message :initarg :message :reader property-access-error-message)) + (:report (lambda (condition stream) + (format stream "Error accessing property '~A' on class '~A': ~A" + (property-access-error-property-name condition) + (property-access-error-class-name condition) + (property-access-error-message condition))))) + +(define-condition property-unreadable-error (property-access-error) + () + (:default-initargs :message "property is not readable")) + +(define-condition property-unwritable-error (property-access-error) + () + (:default-initargs :message "property is not writable")) + (defun g-param-spec-property-type (param-spec property-name object-type assert-readable assert-writable) (when (null-pointer-p param-spec) (error "Property ~A on type ~A is not found" @@ -205,17 +228,17 @@ (foreign-slot-value param-spec 'g-param-spec 'flags)))) - (error "Property ~A on type ~A is not readable" - property-name - (g-type-name object-type))) + (error 'property-unreadable-error + :property-name property-name + :class-name (g-type-name object-type))) (when (and assert-writable (not (member :writable (foreign-slot-value param-spec 'g-param-spec 'flags)))) - (error "Property ~A on type ~A is not writable" - property-name - (g-type-name object-type))) + (error 'property-unwritable-error + :property-name property-name + :class-name (g-type-name object-type))) (foreign-slot-value param-spec 'g-param-spec 'value-type)) (defun g-object-type-property-type (object-type property-name @@ -248,7 +271,7 @@ for arg-name in args-names for arg-value in args-values for arg-type in args-types - for arg-g-type = (ensure-g-type arg-type) + for arg-g-type = (if arg-type (ensure-g-type arg-type) (g-object-type-property-type object-type arg-name)) for parameter = (mem-aref parameters 'g-parameter i) do (setf (foreign-slot-value parameter 'g-parameter 'name) arg-name) do (set-g-value (foreign-slot-value parameter 'g-parameter 'value) @@ -266,9 +289,11 @@ (foreign-slot-pointer parameter 'g-parameter 'value))))))) (defun g-object-call-get-property (object property-name &optional property-type) - (unless property-type - (setf property-type - (g-object-property-type object property-name :assert-readable t))) + (restart-case + (unless property-type + (setf property-type + (g-object-property-type object property-name :assert-readable t))) + (return-nil () (return-from g-object-call-get-property nil))) (setf property-type (ensure-g-type property-type)) (with-foreign-object (value 'g-value) (g-value-zero value)