X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/clg/blobdiff_plain/22a2e918431644dcf1df2d7b5434c26778a7cab4..e37c4285b808a73f6bea3c86cc3b9a38657d9d54:/glib/gobject.lisp diff --git a/glib/gobject.lisp b/glib/gobject.lisp index e87cfca..01409dc 100644 --- a/glib/gobject.lisp +++ b/glib/gobject.lisp @@ -15,7 +15,7 @@ ;; License along with this library; if not, write to the Free Software ;; Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -;; $Id: gobject.lisp,v 1.24 2004/12/21 00:04:48 espen Exp $ +;; $Id: gobject.lisp,v 1.26 2004/12/29 21:07:46 espen Exp $ (in-package "GLIB") @@ -41,7 +41,14 @@ (defclass effective-property-slot-definition (effective-virtual-slot-definition) ((pname :reader slot-definition-pname :initarg :pname) (readable :reader slot-readable-p :initarg :readable) (writable :reader slot-writable-p :initarg :writable) - (construct :initarg :construct)));) + (construct :initarg :construct))) + +(defclass direct-user-data-slot-definition (direct-virtual-slot-definition) + ()) + +(defclass effective-user-data-slot-definition (effective-virtual-slot-definition) + ()) + (defbinding %object-ref () pointer (location pointer)) @@ -74,11 +81,13 @@ (defun signal-name-to-string (name) (defmethod direct-slot-definition-class ((class gobject-class) &rest initargs) (case (getf initargs :allocation) (:property (find-class 'direct-property-slot-definition)) + (:user-data (find-class 'direct-user-data-slot-definition)) (t (call-next-method)))) (defmethod effective-slot-definition-class ((class gobject-class) &rest initargs) (case (getf initargs :allocation) (:property (find-class 'effective-property-slot-definition)) + (:user-data (find-class 'effective-user-data-slot-definition)) (t (call-next-method)))) (defmethod compute-effective-slot-definition-initargs ((class gobject-class) direct-slotds) @@ -103,7 +112,7 @@ (defmethod initialize-internal-slot-functions ((slotd effective-property-slot-de (let ((reader nil)) #'(lambda (object) (unless reader - (setq reader (reader-function (type-from-number type-number)))) + (setq reader (reader-function type))) ;(type-from-number type-number)))) (let ((gvalue (gvalue-new type-number))) (%object-get-property object pname gvalue) (unwind-protect @@ -116,7 +125,7 @@ (defmethod initialize-internal-slot-functions ((slotd effective-property-slot-de (let ((writer nil)) #'(lambda (value object) (unless writer - (setq writer (writer-function (type-from-number type-number)))) + (setq writer (writer-function type))) ;(type-from-number type-number)))) (let ((gvalue (gvalue-new type-number))) (funcall writer value gvalue +gvalue-value-offset+) (%object-set-property object pname gvalue) @@ -125,6 +134,22 @@ (defmethod initialize-internal-slot-functions ((slotd effective-property-slot-de (call-next-method)) +(defmethod initialize-internal-slot-functions ((slotd effective-user-data-slot-definition)) + (let ((slot-name (slot-definition-name slotd))) + (setf + (slot-value slotd 'getter) + #'(lambda (object) + (prog1 (user-data object slot-name)))) + (setf + (slot-value slotd 'setter) + #'(lambda (value object) + (setf (user-data object slot-name) value))) + (setf + (slot-value slotd 'boundp) + #'(lambda (object) + (user-data-p object slot-name)))) + (call-next-method)) + ;;;; Super class for all classes in the GObject type hierarchy @@ -249,19 +274,31 @@ (defbinding %object-set-qdata-full () nil ;;;; User data -(defun (setf object-data) (data object key &key (test #'eq)) +(defun (setf user-data) (data object key) (%object-set-qdata-full - object (quark-from-object key :test test) + object (quark-from-object key) (register-user-data data) (callback %destroy-user-data)) data) +;; depecated +(defun (setf object-data) (data object key &key (test #'eq)) + (assert (eq test #'eq)) + (setf (user-data object key) data)) + (defbinding %object-get-qdata () unsigned-long (object gobject) (id quark)) +(defun user-data (object key) + (find-user-data (%object-get-qdata object (quark-from-object key)))) + +;; depecated (defun object-data (object key &key (test #'eq)) - (find-user-data - (%object-get-qdata object (quark-from-object key :test test)))) + (assert (eq test #'eq)) + (user-data object key)) + +(defun user-data-p (object key) + (nth-value 1 (find-user-data (%object-get-qdata object (quark-from-object key))))) ;;;; @@ -314,10 +351,8 @@ (defun slot-definition-from-property (class property &optional args) `(,slot-name :allocation :property :pname ,name - ;; temporary hack ,@(cond - ((find :unbound args) (list :unbound (getf args :unbound))) - ((type-is-p slot-type 'gobject) (list :unbound nil))) + ((find :unbound args) (list :unbound (getf args :unbound)))) ;; accessors ,@(cond @@ -380,3 +415,24 @@ (defun expand-gobject-type (type &optional options (metaclass 'gobject-class)) (register-derivable-type 'gobject "GObject" 'expand-gobject-type) + + +;;; Pseudo type for gobject instances which have their reference count +;;; increased by the returning function + +(defmethod alien-type ((type (eql 'referenced)) &rest args) + (declare (ignore type args)) + (alien-type 'gobject)) + +(defmethod from-alien-form (form (type (eql 'referenced)) &rest args) + (declare (ignore type)) + (destructuring-bind (type) args + (if (subtypep type 'gobject) + (let ((instance (make-symbol "INSTANCE"))) + `(let ((,instance ,(from-alien-form form type))) + (when ,instance + (%object-unref (proxy-location ,instance))) + ,instance)) + (error "~A is not a subclass of GOBJECT" type)))) + +(export 'referenced)