Added SB-THREAD to list of used packages and exporting a couple more symbols
[clg] / glib / gtype.lisp
index 8b41474..e24b6b8 100644 (file)
@@ -20,7 +20,7 @@
 ;; TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 ;; SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
-;; $Id: gtype.lisp,v 1.54 2006-08-16 11:02:46 espen Exp $
+;; $Id: gtype.lisp,v 1.62 2007-06-06 10:43:54 espen Exp $
 
 (in-package "GLIB")
 
 (defbinding type-init () nil)
 (type-init)
 
-(deftype type-number () 'unsigned-long)
+(eval-when (:compile-toplevel :load-toplevel :execute)
+  (defbinding (bitsize-of-gtype "bitsize_of_gtype") () unsigned-int))
+
+(deftype type-number () `(unsigned-byte ,(bitsize-of-gtype)))
 
 (deftype gtype () 'symbol)
 
      ((not (zerop type-number)) type-number)
      (error-p (error "Invalid gtype name: ~A" name)))))
 
+(defun type-from-glib-name (name)
+  (type-from-number (type-number-from-glib-name name) t))
+
 (defun register-type (type id)
   (cond
    ((find-type-number type))
        *registered-types*)
   (mapc #'(lambda (type) 
            (apply #'register-new-type type))
-       *registered-static-types*)
+       (reverse *registered-static-types*))
   (mapc #'(lambda (type) 
            (register-type-alias (car type) (cdr type)))
        *registered-type-aliases*))
           (run-program
            "/usr/bin/nm" 
            #+clisp :arguments
-           (list "--defined-only" "-D" (namestring (truename pathname)))
+           (list #-darwin"--defined-only" #-darwin"-D" "-g" #+darwin"-f" 
+                 #+darwin"-s" #+darwin"__TEXT" #+darwin"__text" 
+                 (namestring (truename pathname)))
            :output :stream :wait nil)))
       (unwind-protect
          (loop 
-          as symbol = (let ((line (read-line 
-                                   #+(or cmu sbcl)
-                                   (process-output process)
-                                   #+clisp process
-                                   nil)))
-                        (when line 
-                          (subseq line (1+ (position #\Space line :from-end t)))))
-          while symbol
+          as line = (read-line
+                     #+(or cmu sbcl) (process-output process)
+                     #+clisp process
+                     nil)
+          as symbol = (when line
+                        (let ((pos (position #\Space line :from-end t)))
+                          #-darwin(subseq line (1+ pos))
+                          #+darwin
+                          (when (char= (char line (1- pos)) #\T)
+                            (subseq line (+ pos 2)))))
+          while line
           when (and
-                (> (length symbol) 9)
+                symbol (> (length symbol) 9)
+                (not (char= (char symbol 0) #\_))
                 (or 
                  (not prefixes)
                  (some #'(lambda (prefix)
         process)))))
 
 
-(defmacro init-types-in-library (filename &key prefix ignore)
-  (let ((names (%find-types-in-library filename prefix ignore)))
+(defmacro init-types-in-library (system library &key prefix ignore)
+  (let* ((filename (asdf:component-pathname (asdf:find-component (asdf:find-system system) library)))
+        (names (%find-types-in-library filename prefix ignore)))
     `(progn
        ,@(mapcar #'(lambda (name)
                     `(progn
 ;;;; Superclass for wrapping types in the glib type system
 
 (eval-when (:compile-toplevel :load-toplevel :execute)
-  (defclass ginstance (proxy)
+  (defclass ginstance (ref-counted-object)
     (;(class :allocation :alien :type pointer :offset 0)
      )
     (:metaclass proxy-class)
       (error "Object at ~A has an unkown type number: ~A"
        location (%type-number-of-ginstance location)))))
 
-(define-type-method from-alien-form ((type ginstance) form &key (ref :copy))
-  (call-next-method type form :ref ref))
-
-(define-type-method from-alien-function ((type ginstance) &key (ref :copy))
-  (call-next-method type :ref ref))
-
 
 ;;;; Registering fundamental types
 
 
 ;; The argument is a list where each elements is on the form 
 ;; (type . dependencies). This function will not handle indirect
-;; dependencies and types depending on them selve.
+;; dependencies and types depending on them selves.
 (defun sort-types-topologicaly (unsorted)
   (flet ((depend-p (type1)
            (find-if #'(lambda (type2)
 
 ;;;; Initialize all non static types in GObject
 
-(init-types-in-library #.(concatenate 'string (pkg-config:pkg-variable "glib-2.0" "libdir") "/libgobject-2.0.so"))
+(init-types-in-library glib "libgobject-2.0")