Added new gobject code to glib
[cl-gtk2.git] / glib / gobject.generating.lisp
index 7c3a807..cac7f48 100644 (file)
@@ -1,6 +1,6 @@
 (in-package :gobject)
 
-(defvar *lisp-name-package* (find-package :gobject)
+(defvar *lisp-name-package* nil
   "For internal use (used by class definitions generator). Specifies the package in which symbols are interned.")
 (defvar *strip-prefix* "")
 (defvar *lisp-name-exceptions* nil)
 
 (defun type-initializer-call (type-initializer)
   (etypecase type-initializer
-    (string `(foreign-funcall ,type-initializer g-type))
+    (string `(if (foreign-symbol-pointer ,type-initializer)
+                 (foreign-funcall ,type-initializer g-type)
+                 (warn "Type initializer '~A' is not available" ,type-initializer)))
     (symbol `(funcall ',type-initializer))))
 
 (defun meta-property->slot (class-name property)
           (write-char (char-downcase c) stream))
     (write-string "_get_type" stream)))
 
-(defun get-g-class-definition (type)
-  (let* ((g-type (ensure-g-type type))
+(defun get-g-class-definition (type &optional lisp-name-package)
+  (let* ((*lisp-name-package* (or lisp-name-package *lisp-name-package* *package*))
+         (g-type (ensure-g-type type))
          (g-name (g-type-name g-type))
          (name (g-name->name g-name))
          (superclass-g-type (g-type-parent g-type))
          (type-init-name (probable-type-init-name g-name))
          (own-properties
           (remove-if-not (lambda (property)
-                           (= g-type
-                              (g-class-property-definition-owner-type property)))
+                           (g-type= g-type (g-class-property-definition-owner-type property)))
                          properties)))
     `(define-g-object-class ,g-name ,name 
          (:superclass ,superclass-name
                   own-properties)
           ,@(cdr (find g-name *additional-properties* :key 'car :test 'string=))))))
 
-(defun get-g-interface-definition (interface)
-  (let* ((type (ensure-g-type interface))
+(defun get-g-interface-definition (interface &optional lisp-name-package)
+  (let* ((*lisp-name-package* (or lisp-name-package *lisp-name-package* *package*))
+         (type (ensure-g-type interface))
          (g-name (g-type-name type))
          (name (g-name->name g-name))
          (properties (interface-properties type))
                  (cdr (find g-name *additional-properties* :key 'car :test 'string=))))))
 
 (defun get-g-class-definitions-for-root-1 (type)
-  (unless (member (ensure-g-type type) *generation-exclusions* :test '=)
+  (unless (member type *generation-exclusions* :test 'g-type=)
     (cons (get-g-class-definition type)
           (reduce #'append
                   (mapcar #'get-g-class-definitions-for-root-1
 (defun class-or-interface-properties (type)
   (setf type (ensure-g-type type))
   (cond 
-    ((= (g-type-fundamental type) +g-type-object+) (class-properties type))
-    ((= (g-type-fundamental type) +g-type-interface+) (interface-properties type))))
+    ((g-type= (g-type-fundamental type) +g-type-object+) (class-properties type))
+    ((g-type= (g-type-fundamental type) +g-type-interface+) (interface-properties type))))
 
 (defun get-shallow-referenced-types (type)
   (setf type (ensure-g-type type))
   (remove-duplicates (sort (loop
                               for property in (class-or-interface-properties type)
-                              when (= type (g-class-property-definition-owner-type property))
+                              when (g-type= type (g-class-property-definition-owner-type property))
                               collect (g-class-property-definition-type property))
-                           #'<)
+                           #'<
+                           :key #'g-type-numeric)
                      :test 'equal))
 
 (defun get-referenced-types-1 (type)
   (setf type (ensure-g-type type))
   (loop
      for property-type in (get-shallow-referenced-types type)
-     do (pushnew property-type *referenced-types* :test '=))
+     do (pushnew property-type *referenced-types* :test 'g-type=))
   (loop
      for type in (g-type-children type)
      do (get-referenced-types-1 type)))
@@ -357,8 +361,9 @@ If non-@code{NIL}, specifies the function that initializes the type: string spec
         (numeric-value (enum-item-value enum-value)))
     `(,value-name ,numeric-value)))
 
-(defun get-g-enum-definition (type)
-  (let* ((g-type (ensure-g-type type))
+(defun get-g-enum-definition (type &optional lisp-name-package)
+  (let* ((*lisp-name-package* (or lisp-name-package *lisp-name-package* *package*))
+         (g-type (ensure-g-type type))
          (g-name (g-type-name g-type))
          (name (g-name->name g-name))
          (items (get-enum-items g-type))
@@ -401,8 +406,9 @@ If non-@code{NIL}, specifies the function that initializes the type: string spec
         (numeric-value (flags-item-value flags-value)))
     `(,value-name ,numeric-value)))
 
-(defun get-g-flags-definition (type)
-  (let* ((g-type (ensure-g-type type))
+(defun get-g-flags-definition (type &optional lisp-name-package)
+  (let* ((*lisp-name-package* (or lisp-name-package *lisp-name-package* *package*))
+         (g-type (ensure-g-type type))
          (g-name (g-type-name g-type))
          (name (g-name->name g-name))
          (items (get-flags-items g-type))
@@ -449,24 +455,24 @@ If non-@code{NIL}, specifies the function that initializes the type: string spec
              for interface in interfaces
              do (loop
                    for referenced-type in (get-shallow-referenced-types interface)
-                   do (pushnew referenced-type referenced-types :test 'equal)))
+                   do (pushnew referenced-type referenced-types :test 'g-type=)))
           (loop
              for object in objects
              do (loop
                    for referenced-type in (get-shallow-referenced-types object)
-                   do (pushnew referenced-type referenced-types :test 'equal)))
+                   do (pushnew referenced-type referenced-types :test 'g-type=)))
           (loop
              for enum-type in (filter-types-by-fund-type
                                referenced-types "GEnum")
              for def = (get-g-enum-definition enum-type)
-             unless (member (ensure-g-type enum-type) exclusions :test '=)
+             unless (member enum-type exclusions :test 'g-type=)
              do (format file "~S~%~%" def))
             
           (loop
              for flags-type in (filter-types-by-fund-type
                                 referenced-types "GFlags")
              for def = (get-g-flags-definition flags-type)
-             unless (member (ensure-g-type flags-type) exclusions :test '=)
+             unless (member flags-type exclusions :test 'g-type=)
              do (format file "~S~%~%" def)))
         (loop
            with auto-enums = (and include-referenced
@@ -474,7 +480,7 @@ If non-@code{NIL}, specifies the function that initializes the type: string spec
                                    referenced-types "GEnum"))
            for enum in enums
            for def = (get-g-enum-definition enum)
-           unless (find (ensure-g-type enum) auto-enums :test 'equal)
+           unless (find enum auto-enums :test 'g-type=)
            do (format file "~S~%~%" def))
         (loop
            with auto-flags = (and include-referenced
@@ -482,7 +488,7 @@ If non-@code{NIL}, specifies the function that initializes the type: string spec
                                    referenced-types "GFlags"))
            for flags-type in flags
            for def = (get-g-flags-definition flags-type)
-           unless (find (ensure-g-type flags-type) auto-flags :test 'equal)
+           unless (find flags-type auto-flags :test 'g-type=)
            do (format file "~S~%~%" def))
         (loop
            for interface in interfaces