X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;ds=sidebyside;f=glib%2Fgobject.generating.lisp;h=6cd58e636227b119e96e270c7ca741ac12691008;hb=36cd13df58dcc2952804ab6e296d2e71a911cde7;hp=79622f274e2f5551c8ce89dbb544b9bebeaada20;hpb=eed633a94bd6275ed3e882b5966145185cd9f0e9;p=cl-gtk2.git diff --git a/glib/gobject.generating.lisp b/glib/gobject.generating.lisp index 79622f2..6cd58e6 100644 --- a/glib/gobject.generating.lisp +++ b/glib/gobject.generating.lisp @@ -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) @@ -136,7 +136,9 @@ (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) @@ -144,11 +146,15 @@ :allocation ,(if (gobject-property-p property) :gobject-property :gobject-fn) :g-property-type ,(if (gobject-property-p property) (gobject-property-type property) (cffi-property-type property)) :accessor ,(intern (format nil "~A-~A" (symbol-name class-name) (property-name property)) (symbol-package class-name)) - :initarg ,(intern (string-upcase (property-name property)) (find-package :keyword)) + ,@(when (if (gobject-property-p property) + t + (not (null (cffi-property-writer property)))) + `(:initarg + ,(intern (string-upcase (property-name property)) (find-package :keyword)))) ,@(if (gobject-property-p property) `(:g-property-name ,(gobject-property-gname property)) `(:g-getter ,(cffi-property-reader property) - :g-setter ,(cffi-property-writer property))))) + :g-setter ,(cffi-property-writer property))))) (defmacro define-g-object-class (g-type-name name (&key (superclass 'g-object) @@ -231,8 +237,13 @@ (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) + (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)))) + (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)) @@ -241,10 +252,8 @@ (properties (class-properties g-type)) (type-init-name (probable-type-init-name g-name)) (own-properties - (remove-if-not (lambda (property) - (= g-type - (g-type-numeric (g-class-property-definition-owner-type property)))) - properties))) + (sort (copy-list (remove g-type properties :key #'g-class-property-definition-owner-type :test-not #'g-type=)) + #'string< :key #'g-class-property-definition-name))) `(define-g-object-class ,g-name ,name (:superclass ,superclass-name :export t @@ -257,11 +266,17 @@ 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) + (when (and (stringp interface) (zerop (g-type-numeric interface))) + (let ((type-init-name (probable-type-init-name interface))) + (when (foreign-symbol-pointer type-init-name) + (foreign-funcall-pointer (foreign-symbol-pointer type-init-name) () :int)))) + (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)) + (properties (sort (copy-list (interface-properties type)) + #'string< :key #'g-class-property-definition-name)) (probable-type-initializer (probable-type-init-name g-name))) `(define-g-interface ,g-name ,name (:export t @@ -273,11 +288,11 @@ (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 - (g-type-children type)))))) + (sort (copy-list (g-type-children type)) #'string< :key #'g-type-string)))))) (defun get-g-class-definitions-for-root (type) (setf type (ensure-g-type type)) @@ -288,25 +303,26 @@ (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)) - #'<) + #'string< + :key #'g-type-string) :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 '=)) + for property-type in (sort (copy-list (get-shallow-referenced-types type)) #'string> :key #'g-type-string) + do (pushnew property-type *referenced-types* :test 'g-type=)) (loop - for type in (g-type-children type) + for type in (sort (copy-list (g-type-children type)) #'string< :key #'g-type-string) do (get-referenced-types-1 type))) (defun get-referenced-types (root-type) @@ -357,8 +373,13 @@ 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) + (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)))) + (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 +422,13 @@ 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) + (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)))) + (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 +475,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 +500,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 +508,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