;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: defpackage.lisp,v 1.26 2007-10-17 14:30:00 espen Exp $
+;; $Id: defpackage.lisp,v 1.27 2008-10-09 18:20:52 espen Exp $
(defpackage "GLIB"
"USER-DATA-DESTROY-CALLBACK" "USER-DATA-P" "UNSET-USER-DATA"
"QUERY-OBJECT-CLASS-PROPERTIES" "SLOT-DEFINITIONS"
"EXPAND-GOBJECT-TYPE" "GOBJECT-DEPENDENCIES" "SIGNAL-NAME-TO-STRING"
- "REFERENCED")
+ "REFERENCED" "INITIALLY-UNOWNED")
;; Symbols from ginterface.lisp
(:export "INTERFACE" "INTERFACE-CLASS" "QUERY-OBJECT-INTERFACE-PROPERTIES")
;; Symbols from gerror.lisp
;; 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.58 2008-10-09 18:20:52 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 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
;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-;; $Id: gtkobject.lisp,v 1.47 2008-03-06 22:02:08 espen Exp $
+;; $Id: gtkobject.lisp,v 1.48 2008-10-09 18:20:52 espen Exp $
(in-package "GTK")
;;;; Superclass for the gtk class hierarchy
(eval-when (:compile-toplevel :load-toplevel :execute)
- (init-types-in-library gtk "libgtk-2.0")
+ (init-types-in-library gtk "libgtk-2.0"))
- (defclass %object (gobject)
- ()
- (:metaclass gobject-class)
- (:gtype |gtk_object_get_type|)))
+(defclass %object (initially-unowned)
+ ()
+ (:metaclass gobject-class)
+ (:gtype |gtk_object_get_type|))
(defmethod initialize-instance ((object %object) &rest initargs &key signal)
(dolist (signal-definition (get-all initargs :signal))
(apply #'signal-connect object signal-definition)))
-(defmethod initialize-instance :around ((object %object) &rest initargs)
- (declare (ignore initargs))
- (call-next-method)
- ;; Add a temorary reference which will be removed when the object is
- ;; sinked
- (funcall (reference-function '%object) (foreign-location object))
- (%object-sink object))
-
-(defbinding %object-sink () nil
- (object %object))
+#?-(pkg-exists-p "glib-2.0" :atleast-version "2.10.0")
+(progn
+ (defmethod initialize-instance :around ((object %object) &rest initargs)
+ (declare (ignore initargs))
+ (call-next-method)
+ ;; Add a temorary reference which will be removed when the object is
+ ;; sinked
+ (funcall (reference-function '%object) (foreign-location object))
+ (%object-sink object))
+
+ (defbinding %object-sink () nil
+ (object %object)))
;;;; Main loop and event handling