Renamed to export.lisp
[clg] / glib / gtype.lisp
index 478cab6..02f9677 100644 (file)
 ;; 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: gtype.lisp,v 1.12 2001-10-21 21:50:18 espen Exp $
+;; $Id: gtype.lisp,v 1.17 2004-10-27 14:59:00 espen Exp $
 
 (in-package "GLIB")
 
 (use-prefix "g")
 
+;(load-shared-library "libgobject-2.0" :init "g_type_init")
+
 ;;;; 
 
 (deftype type-number () '(unsigned 32))
   (let ((type-number
         (etypecase id
           (integer id)
-          (string (find-type-number id t)))))
+          (string (find-type-number id t))
+          (symbol (gethash id *type-to-number-hash*)))))
     (setf (gethash type *type-to-number-hash*) type-number)
-    (setf (gethash type-number *number-to-type-hash*) type)
+    (unless (symbolp id)
+      (setf (gethash type-number *number-to-type-hash*) type))
     type-number))
 
 (defbinding %type-from-name () type-number
 
 (defun %init-types-in-library (pathname ignore)
   (let ((process (ext:run-program
-                 "nm" (list (namestring (truename pathname)))
+                 "nm" (list "-D" (namestring (truename pathname)))
                  :output :stream :wait nil))
        (fnames ()))
     (labels ((read-symbols ()
       (ext:process-close process)
       `(init-type ',fnames))))
 
-(defmacro init-types-in-library (pathname &key ignore)
-  (%init-types-in-library pathname ignore))
+(defmacro init-types-in-library (filename &key ignore)
+  (%init-types-in-library
+   (format nil "~A/~A" *gtk-library-path* filename) ignore))
 
 
 
 ;;;; Metaclass for subclasses of ginstance
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (defclass ginstance-class (proxy-class)))
+  (defclass ginstance-class (proxy-class)
+    ()))
 
 
 (defmethod shared-initialize ((class ginstance-class) names
                              &rest initargs &key name alien-name
-                             size ref unref)
+                             ref unref)
   (declare (ignore initargs names))
   (let* ((class-name (or name (class-name class)))
         (type-number
          (find-type-number
           (or (first alien-name) (default-alien-type-name class-name)) t)))
     (register-type class-name type-number)
-    (let ((size (or size (type-instance-size type-number))))
-      (declare (special size))
-      (call-next-method)))
+    (if (getf initargs :size)
+       (call-next-method)
+      (let ((size (type-instance-size type-number)))
+       (apply #'call-next-method class names :size (list size) initargs))))
 
   (when ref
     (let ((ref (mkbinding (first ref) 'pointer 'pointer)))
        (slot-value class 'copy)
        #'(lambda (type location)
           (declare (ignore type))
-          (funcall ref location)))))     
+          (funcall ref location)))))
   (when unref
     (let ((unref (mkbinding (first unref) 'nil 'pointer)))
       (setf
 (defun supertype (type)
   (type-from-number (type-parent type)))
 
+(defbinding %type-interfaces (type) pointer
+  ((find-type-number type t) type-number)
+  (n-interfaces unsigned-int :out))
+
+(defun type-interfaces (type)
+  (multiple-value-bind (array length) (%type-interfaces type)
+    (unwind-protect
+       (map-c-array 'list #'identity array 'type-number length)
+      (deallocate-memory array))))
+
+(defun implements (type)
+  (mapcar #'type-from-number (type-interfaces type)))
+
 (defun type-hierarchy (type)
   (let ((type-number (find-type-number type t)))
     (unless (= type-number 0)
   (let ((sorted ()))
     (loop while unsorted do
       (dolist (type unsorted)
-       (let ((dependencies (rest (type-hierarchy type))))
+       (let ((dependencies
+              (append (rest (type-hierarchy type)) (type-interfaces type))))
          (cond
           ((null dependencies)
            (push type sorted)
                   #'(lambda (options)
                       (and
                        (string-prefix-p (first options) name)
-                       (getf (cdr options) :ignore-prefix)))
+                       (getf (cdr options) :ignore-prefix)
+                       (not (some
+                             #'(lambda (exception)
+                                 (string= name exception))
+                             (getf (cdr options) :except)))))
                   args))))
           (find-types prefix))))