Check the libraries' versions requirement and throw compile-time error; add libraries...
[cl-gtk2.git] / glib / gobject.generating.lisp
index c91cdcf..2035784 100644 (file)
 (defun type-initializer-call (type-initializer)
   (etypecase type-initializer
     (string `(if (foreign-symbol-pointer ,type-initializer)
-                 (foreign-funcall ,type-initializer g-type)
+                 (foreign-funcall-pointer
+                  (foreign-symbol-pointer ,type-initializer) ()
+                  g-type)
                  (warn "Type initializer '~A' is not available" ,type-initializer)))
     (symbol `(funcall ',type-initializer))))
 
                                  (&rest properties))
   (setf properties (mapcar #'parse-property properties))
   `(progn
-     (defclass ,name (,superclass ,@(mapcar #'interface->lisp-class-name interfaces))
+     (defclass ,name (,@(when (and superclass (not (eq superclass 'g-object))) (list superclass)) ,@(mapcar #'interface->lisp-class-name interfaces))
        (,@(mapcar (lambda (property) (meta-property->slot name property)) properties))
        (:metaclass gobject-class)
        (:g-type-name . ,g-type-name)
@@ -451,6 +453,23 @@ If non-@code{NIL}, specifies the function that initializes the type: string spec
                                 probable-type-initializer)))
        ,@(mapcar #'flags-value->definition items))))
 
+(defun maybe-call-type-init (type)
+  (when (and (stringp type) (zerop (g-type-numeric type)))
+    (let ((type-init-name (probable-type-init-name type)))
+      (when (foreign-symbol-pointer type-init-name)
+        (foreign-funcall-pointer (foreign-symbol-pointer type-init-name) () :int)))))
+
+(defun get-g-type-definition (type &optional lisp-name-package)
+  (maybe-call-type-init type)
+  (cond
+    ((g-type-is-a type +g-type-enum+) (get-g-enum-definition type lisp-name-package))
+    ((g-type-is-a type +g-type-flags+) (get-g-flags-definition type lisp-name-package))
+    ((g-type-is-a type +g-type-interface+) (get-g-interface-definition type lisp-name-package))
+    ((g-type-is-a type +g-type-object+) (get-g-class-definition type lisp-name-package))
+    (t (error "Do not know how to automatically generate type definition for ~A type ~A"
+              (g-type-string (g-type-fundamental type))
+              (or (g-type-string type) type)))))
+
 (defun generate-types-hierarchy-to-file (file root-type &key include-referenced prefix package exceptions prologue interfaces enums flags objects exclusions additional-properties)
   (if (not (streamp file))
       (with-open-file (stream file :direction :output :if-exists :supersede)