;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: gobject.lisp,v 1.57 2007/06/01 10:46:15 espen Exp $
+;; $Id: gobject.lisp,v 1.59 2008/11/04 03:22:23 espen Exp $
(in-package "GLIB")
(defclass gobject-class (ginstance-class)
((instance-slots-p :initform nil :reader instance-slots-p
:documentation "Non NIL if the class has slots with instance allocation")))
- (defmethod shared-initialize ((class gobject-class) names &rest initargs)
- (declare (ignore names initargs))
- (call-next-method)
- (unless (slot-boundp class 'ref)
- (setf (slot-value class 'ref) '%object-ref))
- (unless (slot-boundp class 'unref)
- (setf (slot-value class 'unref) '%object-unref)))
(defmethod validate-superclass ((class gobject-class) (super standard-class))
; (subtypep (class-name super) 'gobject)
t))
+(defmethod slot-unbound (metaclass (class gobject-class) (slot (eql 'ref)))
+ (assert (class-direct-superclasses class))
+ (setf (slot-value class 'ref)
+ #?-(pkg-exists-p "glib-2.0" :atleast-version "2.10.0") '%object-ref
+ #?(pkg-exists-p "glib-2.0" :atleast-version "2.10.0")
+ ;; We do this hack instead of creating a new metaclass to avoid
+ ;; breaking backward compatibility
+ (if (subtypep (class-name class) 'initially-unowned)
+ '%object-ref-sink
+ '%object-ref)))
+
+(defmethod slot-unbound (metaclass (class gobject-class) (slot (eql 'unref)))
+ (setf (slot-value class 'unref) '%object-unref))
+
+
(defclass direct-property-slot-definition (direct-virtual-slot-definition)
((pname :reader slot-definition-pname :initarg :pname)
(readable :reader slot-readable-p :initarg :readable)
(declare (ignore signal-unbound-p))
(let* ((type (slot-definition-type slotd))
(pname (slot-definition-pname slotd))
- (reader (reader-function type :ref :get)))
+ (get-reader (reader-function type :ref :get))
+ (peek-reader (reader-function type :ref :peek)))
#'(lambda (object)
(with-memory (gvalue +gvalue-size+)
(%gvalue-init gvalue (find-type-number type))
(%object-get-property object pname gvalue)
- (funcall reader gvalue +gvalue-value-offset+)))))
+ (if (gvalue-static-p gvalue)
+ (funcall peek-reader gvalue +gvalue-value-offset+)
+ (funcall get-reader gvalue +gvalue-value-offset+))))))
(defmethod compute-slot-writer-function :around ((slotd effective-property-slot-definition))
(if (construct-only-property-p slotd)
(declare (ignore initargs))
(prog1
(call-next-method)
- #+debug-ref-counting(%object-weak-ref (foreign-location object))
- #?(pkg-exists-p "glib-2.0" :atleast-version "2.8.0")
- (when (slot-value (class-of object) 'instance-slots-p)
- (%object-add-toggle-ref (foreign-location object))
- (%object-unref (foreign-location object)))))
+ (let ((location (foreign-location object)))
+ #+debug-ref-counting(%object-weak-ref location)
+ #?(pkg-exists-p "glib-2.0" :atleast-version "2.8.0")
+ (when (slot-value (class-of object) 'instance-slots-p)
+ (%object-add-toggle-ref location)
+ (%object-unref location)))))
(defmethod instance-finalizer ((instance gobject))
(if (slot-value (class-of instance) 'instance-slots-p)
#'(lambda ()
#+debug-ref-counting
- (format t "Finalizing proxy for 0x~8,'0X~%" (pointer-address location))
+ (format t "Finalizing proxy for 0x~8,'0X (~A)~%"
+ (pointer-address location)
+ (find-foreign-type-name (%type-number-of-ginstance location)))
(%object-remove-toggle-ref location))
#'(lambda ()
#+debug-ref-counting
- (format t "Finalizing proxy for 0x~8,'0X~%" (pointer-address location))
+ (format t "Finalizing proxy for 0x~8,'0X (~A)~%"
+ (pointer-address location)
+ (find-foreign-type-name (%type-number-of-ginstance location)))
(%object-unref location)))
#?-(pkg-exists-p "glib-2.0" :atleast-version "2.8.0")
#'(lambda ()
(params pointer))
+;;;; Floating references
+
+#?(pkg-exists-p "glib-2.0" :atleast-version "2.10.0")
+(progn
+ (defclass initially-unowned (gobject)
+ ()
+ (:metaclass gobject-class)
+ (:gtype "GInitiallyUnowned"))
+
+ (defbinding %object-ref-sink () pointer
+ (location pointer))
+
+ (defbinding %object-is-floating () boolean
+ (location pointer))
+
+ (defmethod initialize-instance :before ((object initially-unowned) &rest initargs)
+ (declare (ignore initargs))
+ (%object-ref-sink (foreign-location object))))
+
;;;; Property stuff