+(defun type-number-from-glib-name (name &optional (error-p t))
+ (let ((type-number (%type-from-name name)))
+ (cond
+ ((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))
+ ((not id) (warn "Can't register type with no foreign id: ~A" type))
+ (t
+ (pushnew (cons type id) *registered-types* :key #'car)
+ (let ((type-number
+ (typecase id
+ (string (type-number-from-glib-name id))
+ (symbol (funcall id)))))
+ (setf (gethash type *lisp-type-to-type-number*) type-number)
+ (setf (gethash type-number *type-number-to-lisp-type*) type)
+ type-number))))
+
+(defun register-type-alias (type alias)
+ (pushnew (cons type alias) *registered-type-aliases* :key #'car)
+ (setf
+ (gethash type *lisp-type-to-type-number*)
+ (find-type-number alias t)))
+
+(defun reinitialize-all-types ()
+ (clrhash *lisp-type-to-type-number*)
+ (clrhash *type-number-to-lisp-type*)
+ (type-init) ; initialize the glib type system
+ (mapc #'(lambda (type)
+ (register-type (car type) (cdr type)))
+ *registered-types*)
+ (mapc #'(lambda (type)
+ (apply #'register-new-type type))
+ (reverse *registered-static-types*))
+ (mapc #'(lambda (type)
+ (register-type-alias (car type) (cdr type)))
+ *registered-type-aliases*))
+
+(pushnew 'reinitialize-all-types
+ #+cmu *after-save-initializations*
+ #+sbcl *init-hooks*
+ #+clisp custom:*init-hooks*)
+
+#+cmu
+(pushnew 'system::reinitialize-global-table ; we shouldn't have to do this?
+ *after-save-initializations*)
+
+
+(defun find-type-number (type &optional error-p)