X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=glib%2Fgobject.foreign-gobject.lisp;h=a4cad2bf40c063ccc8339b15d85db3e7c0bc7ab9;hb=9f7be1143bc6087d6eb607a12f99b062663b33dd;hp=f462721029f95ce5fa8d0f4ffd793df89aaefcaa;hpb=d698b1bf570296ce54a543fdae4233d731f42f72;p=cl-gtk2.git diff --git a/glib/gobject.foreign-gobject.lisp b/glib/gobject.foreign-gobject.lisp index f462721..a4cad2b 100644 --- a/glib/gobject.foreign-gobject.lisp +++ b/glib/gobject.foreign-gobject.lisp @@ -13,6 +13,7 @@ (defvar *foreign-gobjects* (make-weak-hash-table :test 'equal :weakness :value)) (defvar *foreign-gobjects-ref-count* (make-hash-table :test 'equal)) +(defvar *lisp-objects-pointers* (make-hash-table :test 'equal)) (defvar *current-creating-object* nil) (defcstruct g-object-struct @@ -74,6 +75,13 @@ (declare (ignore data)) (debugf "g-object has finalized ~A ~A~%" (g-type-name (g-type-from-object object-pointer)) object-pointer)) +(defun erase-pointer (data object-pointer) + (declare (ignore data)) + (remhash (pointer-address object-pointer) *lisp-objects-pointers*)) + +(defcallback weak-notify-erase-pointer :void ((data :pointer) (object-pointer :pointer)) + (erase-pointer data object-pointer)) + (defun should-ref-sink-at-creation (object) ;;If object was not created from lisp-side, we should ref it ;;If an object is regular g-object, we should not ref-sink it @@ -91,6 +99,7 @@ (debugf "g_object_ref_sink(~A)~%" (pointer obj)) (g-object-ref-sink (pointer obj))) (g-object-weak-ref (pointer obj) (callback weak-notify-print) (null-pointer)) + (g-object-weak-ref (pointer obj) (callback weak-notify-erase-pointer) (null-pointer)) (setf (g-object-has-reference obj) t) (setf (gethash (pointer-address (pointer obj)) *foreign-gobjects*) obj) @@ -98,7 +107,7 @@ (defun g-object-dispose (pointer) (unless (gethash (pointer-address pointer) *foreign-gobjects-ref-count*) - (format t "GObject ~A is already disposed, signalling error~%" pointer) + (debugf "GObject ~A is already disposed, signalling error~%" pointer) (error "GObject ~A is already disposed" pointer)) (debugf "g_object_unref(~A) (of type ~A, lisp-value ~A) (lisp ref-count ~A, gobject ref-count ~A)~%" pointer @@ -125,6 +134,8 @@ (defvar *registered-object-types* (make-hash-table :test 'equal)) (defun register-object-type (name type) (setf (gethash name *registered-object-types*) type)) +(defun registered-object-type-by-name (name) + (gethash name *registered-object-types*)) (defun get-g-object-lisp-type (g-type) (loop while (not (zerop g-type)) @@ -184,33 +195,35 @@ (etypecase object (g-object (pointer object))))) +(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" + property-name + (g-type-name object-type))) + (when (and assert-readable + (not (member :readable + (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))) + (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))) + (foreign-slot-value param-spec 'g-param-spec 'value-type)) + (defun g-object-type-property-type (object-type property-name &key assert-readable assert-writable) (let* ((object-class (g-type-class-ref object-type)) (param-spec (g-object-class-find-property object-class property-name))) (unwind-protect - (progn - (when (null-pointer-p param-spec) - (error "Property ~A on type ~A is not found" - property-name - (g-type-name object-type))) - (when (and assert-readable - (not (member :readable - (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))) - (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))) - (foreign-slot-value param-spec 'g-param-spec 'value-type)) + (g-param-spec-property-type param-spec property-name object-type assert-readable assert-writable) (g-type-class-unref object-class)))) (defun g-object-property-type (object property-name