License --> to head
Sun Mar 13 20:40:35 CET 2011 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix loading on OSX.
Thanks to Elliott Slaughter
hunk ./src/qt.core.lisp 36
- (:unix "libclsmokeqtcore.so")
+ (:darwin "libclsmokeqtcore.dylib")
+ (:unix "libclsmokeqtcore.so")
Sat Apr 3 14:34:21 CEST 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Account for possible lisp-object metatype id change when loading an image.
hunk ./src/variant.lisp 79
-(macrolet
- ((variant-conversions ((variant) &body types)
- (let* ((special-types '(long-long ulong-long map list hash))
- (exclude-types
- (append '(63) ;; ColorGroup
- (mapcar #'(lambda (s)
- (value
- (symbol-value
- (intern (format nil "VARIANT.+~A+" s)
- :qt))))
- special-types)))
- (qt-types (loop for i from 1 to (value qt:variant.+user-type+)
- when (and (qt:variant.type-to-name i)
- ;; type-to-name returns longlong but
- ;; should be LongLong
- (not (member i exclude-types)))
- collect
- (smoke::lispify (qt:variant.type-to-name i)
- :qt))))
- `(ecase (cxx:user-type ,variant)
- ,@(loop for type in (append types special-types
- (remove nil qt-types))
- collect
- (if (symbolp type)
- `(,(value (symbol-value [_$_]
- (let ((*package*
- (find-package :cl-smoke.qt)))
- (symbolicate 'variant.+ type '+))))
- ,(if (fboundp (intern (format nil "TO-~A" type) :cxx))
- `(,(intern (format nil "TO-~A" type) :cxx) ,variant)
- `(copy-object-from-pointer
- ;; intern since these types are in
- ;; qt.gui not qt.core
- (intern ,(symbol-name type) :qt)
- (cxx:const-data ,variant))))
- type))))))
- (defun qt:from-variant (variant)
- "Returns the value of VARIANT."
- (variant-conversions (variant)
- (#.(value qt:variant.+invalid+)
- (cerror "Return (VALUES)" "Type of variant ~A is invalid." variant)
- (values))
- (#.*cxx-lisp-object-metatype*
- (let* ((lisp-object (cl-smoke-lisp-object-value (pointer variant)))
- (value))
- (setf value (translate-cxx-lisp-object lisp-object))
- (free-cxx-lisp-object lisp-object)
- value)))))
+(eval-startup ()
+;; *cxx-lisp-object-metatype* can change when loading an image
+(eval '
+ (macrolet
+ ((variant-conversions ((variant) &body types)
+ (let* ((special-types '(long-long ulong-long map list hash))
+ (exclude-types
+ (append '(63) ;; ColorGroup
+ (mapcar #'(lambda (s)
+ (value
+ (symbol-value
+ (intern (format nil "VARIANT.+~A+" s)
+ :qt))))
+ special-types)))
+ (qt-types (loop for i from 1 to (value qt:variant.+user-type+)
+ when (and (qt:variant.type-to-name i)
+ ;; type-to-name returns longlong but
+ ;; should be LongLong
+ (not (member i exclude-types)))
+ collect
+ (smoke::lispify (qt:variant.type-to-name i)
+ :qt))))
+ `(ecase (cxx:user-type ,variant)
+ ,@(loop for type in (append special-types
+ (remove nil qt-types))
+ collect
+ `(,(value (symbol-value [_$_]
+ (let ((*package*
+ (find-package :cl-smoke.qt)))
+ (symbolicate 'variant.+ type '+))))
+ ,(if (fboundp (intern (format nil "TO-~A" type) :cxx))
+ `(,(intern (format nil "TO-~A" type) :cxx) ,variant)
+ `(copy-object-from-pointer
+ ;; intern since these types are in
+ ;; qt.gui not qt.core
+ (intern ,(symbol-name type) :qt)
+ (cxx:const-data ,variant)))))
+ ,@(loop for type in types
+ collect
+ `(,(eval (first type))
+ ,@(rest type)))))))
+ (defun qt:from-variant (variant)
+ "Returns the value of VARIANT."
+ (variant-conversions (variant)
+ ((value qt:variant.+invalid+)
+ (cerror "Return (VALUES)" "Type of variant ~A is invalid." variant)
+ (values))
+ (*cxx-lisp-object-metatype*
+ (let* ((lisp-object (cl-smoke-lisp-object-value (pointer variant)))
+ (value))
+ (setf value (translate-cxx-lisp-object lisp-object))
+ (free-cxx-lisp-object lisp-object)
+ value)))))))
Sat Feb 20 22:04:46 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* cleanup
hunk ./src/list.lisp 75
- list-pointer))))
+ list-pointer))))
hunk ./src/list.lisp 80
- (smoke:object-to-lisp
+ (object-to-lisp
hunk ./src/list.lisp 83
- (smoke:make-smoke-type ,(symbolicate '*smoke-module*)
- ,type-name)))))))
+ (make-smoke-type ,(symbolicate '*smoke-module*)
+ ,type-name)))))))
hunk ./src/vector.lisp 96
-(defun from-vector-point (elements)
- (make-cleanup-pointer
- (make-qvector (make-smoke-type *smoke-module* "QPoint")
- elements)
- #'free-qvector))
-
-(defun vector-point-p (sequence)
- (every #'(lambda (element) (typep element 'qt:point))
- sequence))
-
Sat Feb 20 22:02:38 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Make qt:application cleanup more stable
hunk ./src/application.lisp 60
- (cxx:quit application)
- ;; Call the destructor; -> destructed callback is called,
- ;; (~QApplication() is virtual) which takes care of cleanup on the
- ;; Lisp side.
- (smoke::delete-pointer (smoke:pointer application) (class-of application))
- (setf (slot-value application 'pointer) (null-pointer))
+ (unless (null-pointer-p (smoke:pointer application))
+ (cxx:quit application)
+ ;; Call the destructor; -> destructed callback is called,
+ ;; (~QApplication() is virtual) which takes care of cleanup on the
+ ;; Lisp side.
+ (smoke::delete-pointer (smoke:pointer application) (class-of application)))
Sat Feb 20 22:00:30 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* support all from qt:variant conversions.
hunk ./src/variant.lisp 76
-(defmacro variant-conversions ((variant) &body types)
- `(ecase (cxx:user-type ,variant)
- [_$_]
- ,@(loop for type in types collect
- (if (symbolp type)
- `(,(value (symbol-value [_$_]
- (let ((*package* (find-package :cl-smoke.qt)))
- (alexandria:symbolicate 'variant.+ type '+))))
- (,(intern (format nil "TO-~A" type) :cxx) ,variant))
- type))))
+(defun copy-object-from-pointer (class pointer)
+ (make-instance class :arg0 (make-instance class :pointer pointer)))
hunk ./src/variant.lisp 79
-(defun qt:from-variant (variant)
- "Returns the value of VARIANT."
- (variant-conversions (variant)
- (#.(value qt:variant.+invalid+)
- (cerror "Return (VALUES)" "Type of variant ~A is invalid." variant)
- (values))
- bit-array bool byte-array
- char
- date date-time double
- int
- line line-f list locale long-long
- point point-f
- rect rect-f reg-exp
- size size-f string string-list
- time
- uint
- ulong-long
- url
- (#.*cxx-lisp-object-metatype*
- (let* ((lisp-object (cl-smoke-lisp-object-value (pointer variant)))
- (value))
- (setf value (translate-cxx-lisp-object lisp-object))
- (free-cxx-lisp-object lisp-object)
- value))))
+(macrolet
+ ((variant-conversions ((variant) &body types)
+ (let* ((special-types '(long-long ulong-long map list hash))
+ (exclude-types
+ (append '(63) ;; ColorGroup
+ (mapcar #'(lambda (s)
+ (value
+ (symbol-value
+ (intern (format nil "VARIANT.+~A+" s)
+ :qt))))
+ special-types)))
+ (qt-types (loop for i from 1 to (value qt:variant.+user-type+)
+ when (and (qt:variant.type-to-name i)
+ ;; type-to-name returns longlong but
+ ;; should be LongLong
+ (not (member i exclude-types)))
+ collect
+ (smoke::lispify (qt:variant.type-to-name i)
+ :qt))))
+ `(ecase (cxx:user-type ,variant)
+ ,@(loop for type in (append types special-types
+ (remove nil qt-types))
+ collect
+ (if (symbolp type)
+ `(,(value (symbol-value [_$_]
+ (let ((*package*
+ (find-package :cl-smoke.qt)))
+ (symbolicate 'variant.+ type '+))))
+ ,(if (fboundp (intern (format nil "TO-~A" type) :cxx))
+ `(,(intern (format nil "TO-~A" type) :cxx) ,variant)
+ `(copy-object-from-pointer
+ ;; intern since these types are in
+ ;; qt.gui not qt.core
+ (intern ,(symbol-name type) :qt)
+ (cxx:const-data ,variant))))
+ type))))))
+ (defun qt:from-variant (variant)
+ "Returns the value of VARIANT."
+ (variant-conversions (variant)
+ (#.(value qt:variant.+invalid+)
+ (cerror "Return (VALUES)" "Type of variant ~A is invalid." variant)
+ (values))
+ (#.*cxx-lisp-object-metatype*
+ (let* ((lisp-object (cl-smoke-lisp-object-value (pointer variant)))
+ (value))
+ (setf value (translate-cxx-lisp-object lisp-object))
+ (free-cxx-lisp-object lisp-object)
+ value)))))
Mon Feb 15 16:33:05 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Build a shared library not a module.
Fixes a build error on OS X.
hunk ./src/lib/CMakeLists.txt 14
-add_library(clsmokeqtcore MODULE ${QT_SMOKE_SOURCES})
+add_library(clsmokeqtcore SHARED ${QT_SMOKE_SOURCES})
Thu Feb 4 16:06:38 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Test building libclsmokeqtcore
hunk ./test.lisp 2
+cmake ./ || exit 1
+make || exit 1
Thu Feb 4 10:22:53 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Add qvector.cpp
addfile ./src/lib/qvector.cpp
hunk ./src/lib/qvector.cpp 1
+#include "cl_smoke_qt.h"
+
+#include <QVector>
+#include <QPoint>
+
+extern "C" {
+
+/** Construct a 0 sized QVector.
+ * Since the QVectorData is QVectorData::shared_null the template type does not matter.
+ * @return A null QVector
+ */
+CL_SMOKE_QT_EXPORT void*
+cl_smoke_make_qvector()
+{
+ return new QVector<QPoint>();
+}
+
+/** Deletes a null QVector. i.e.: The QVectorData pointer is 0.
+ * @param qvector a null QVector
+ */
+CL_SMOKE_QT_EXPORT void
+cl_smoke_delete_qvector(void* qvector)
+{
+ delete static_cast<QVector<QPoint>*>(qvector);
+}
+
+} // extern "C"
Sat Jan 30 16:40:15 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Get the QList size using Lisp instead of an external C function.
hunk ./src/lib/qlist.h 35
-CL_SMOKE_QT_EXPORT int \
-cl_smoke_list_ ## NAME ## _size(const void* list) \
-{ \
- return static_cast<const QList< TYPE >*>(list)->size(); \
-} \
-\
hunk ./src/list.lisp 3
+(defbitfield qlist-data-flags
+ :sharable)
+
+(defcstruct qlist-data
+ (ref :char :count #.(class-size (find-class 'qt:basic-atomic-int)))
+ (alloc :int)
+ (begin :int)
+ (end :int)
+ (flags qlist-data-flags)
+ (array :pointer))
+
+(defcstruct qlist
+ (data (:pointer qlist-data)))
+
+(defun qlist-size (qlist)
+ (let ((data (foreign-slot-value qlist 'qlist 'data)))
+ (- (foreign-slot-value data 'qlist-data 'end)
+ (foreign-slot-value data 'qlist-data 'begin))))
+
hunk ./src/list.lisp 44
- (fun-names-let ((list-size "cl-smoke-list-" "-size")
- (list-free "cl-smoke-free-list-")
+ (fun-names-let ((list-free "cl-smoke-free-list-")
hunk ./src/list.lisp 56
- (defcfun ,(c-name (list-size type)) :int
- "Returns the size of LIST."
- (list :pointer))
hunk ./src/list.lisp 73
- (let ((vector (make-array (,(list-size type)
+ (declare (optimize (speed 3)))
+ (let ((vector (make-array (qlist-size
Tue Jan 26 17:19:51 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix define-qlist-wrapper usage for other modules. (i.e. qt.gui)
hunk ./src/list.lisp 3
-(eval-when (:compile-toplevel :execute)
+(eval-when (:compile-toplevel :load-toplevel :execute)
Mon Jan 25 20:07:22 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Export delete-app since other modules (qt.gui) might like to add methods to it.
hunk ./src/package.lisp 5
+ #:delete-app
Mon Jan 25 19:53:36 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Use ELT instead of AREF for sequences in vector translations.
hunk ./src/vector.lisp 36
-(defun qvector-aref (qvector index element-type)
+(defun qvector-elt (qvector index element-type)
hunk ./src/vector.lisp 47
- (setf (aref result i)
- (qvector-aref qvector i element-type)))))
+ (setf (elt result i)
+ (qvector-elt qvector i element-type)))))
hunk ./src/vector.lisp 67
- (pointer (aref elements i))
+ (pointer (elt elements i))
hunk ./src/vector.lisp 71
- (aref elements i))))
+ (elt elements i))))
Mon Jan 25 19:45:04 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Allow other modules to define QList<Foo*> conversions.
hunk ./src/list.lisp 3
-(defmacro define-qlist-wrapper (type-name element-type &optional c-name)
- (let* ((c-name (or c-name type-name))
- (type (string-upcase c-name))
- (list-type (symbolicate 'qlist- type)))
- `(progn
- (defcfun ,(concatenate 'string "cl_smoke_list_" c-name "_size") :int
- "Returns the size of LIST."
- (list :pointer))
- (defcfun ,(concatenate 'string "cl_smoke_free_list_" c-name) :void
- "Frees LIST."
- (list :pointer))
- (defcfun ,(concatenate 'string "cl_smoke_make_list_" c-name) :pointer
- "Makes a list.")
- (defcfun ,(concatenate 'string "cl_smoke_list_" c-name "_at") :pointer
- "Returns the a newly constructed copy of the element at position AT of LIST."
- (list :pointer)
- (index :int))
- (defcfun ,(concatenate 'string "cl_smoke_list_" c-name "_append") :pointer
- "Appends NEW-ELEMENT to LIST."
- (list :pointer)
- (new-element :pointer))
- ;; To Lisp
- ,@(loop for type-name in (ensure-list type-name) collect
- `(defun ,(symbolicate 'from- type-name) (list-pointer)
- (let ((vector (make-array (,(symbolicate 'cl-smoke-list-
- type '-size)
- list-pointer))))
- (dotimes (index (length vector) vector)
- (setf (aref vector index)
- ;; FIXME the returned object is not wrapped by Smoke
- ;; -> change this? [_$_]
- (smoke::object-to-lisp
- (,(symbolicate 'cl-smoke-list-
- type '-at)
- list-pointer index)
- (smoke::make-smoke-type *smoke-module*
- ,type-name)))))))
- ,@(loop for type-name in (ensure-list type-name) collect
- `(define-to-lisp-translation
- (,(format nil "const QList<~A>&" type-name)
- ,(format nil "QList<~A>" type-name))
- ,(symbolicate 'from- type-name)
- ,(symbolicate 'cl-smoke-free-list- type)))
- ;; From Lisp
- (defun ,(symbolicate 'coerce- list-type) (list)
- (let ((qlist (,(symbolicate 'cl-smoke-make-list- type))))
- (loop for element across list do
- (,(symbolicate 'cl-smoke-list- type '-append)
- qlist (pointer (make-instance ',element-type :args (list element)))))
- (make-cleanup-pointer
- qlist
- (function ,(symbolicate 'cl-smoke-free-list- type)))))
- (defun ,(symbolicate list-type '-p) (list)
- (every #'(lambda (element)
- (typep element ',element-type))
- list))
- ,@(loop for type-name in (ensure-list type-name) collect
- `(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
- ,(format nil "QList<~A>" type-name))
- ;; FIXME allow sequence
- (and (vector ,element-type)
- (satisfies ,(symbolicate list-type '-p)))
- ,(symbolicate 'coerce- list-type))))))
+(eval-when (:compile-toplevel :execute)
+ (macrolet ((c-name (name)
+ `(nth-value 1 ,name))
+ (fun-names-let (name-pre-post-fixes &body body)
+ `(flet (,@(mapcar
+ #'(lambda (npp)
+ `(,(first npp) (type)
+ (values
+ (intern (string-upcase
+ (concatenate 'string
+ ,(second npp)
+ type
+ ,(third npp)))
+ ,*package*)
+ (concatenate 'string
+ (substitute #\_ #\-
+ ,(second npp))
+ type
+ (substitute #\_ #\-
+ ,(third npp))))))
+ name-pre-post-fixes))
+ ,@body)))
+ (fun-names-let ((list-size "cl-smoke-list-" "-size")
+ (list-free "cl-smoke-free-list-")
+ (list-make "cl-smoke-make-list-")
+ (list-at "cl-smoke-list-" "-at")
+ (list-append "cl-smoke-list-" "-append"))
+ (defmacro define-qlist-wrapper (type-name element-type &optional (c-name nil c-name-p)
+ &key def-cfuns)
+ (let* ((c-name (or c-name type-name))
+ (type c-name)
+ (lisp-type (symbolicate 'qlist- element-type)))
+ `(progn
+ ,(when (or (not c-name-p) def-cfuns)
+ `(progn
+ (defcfun ,(c-name (list-size type)) :int
+ "Returns the size of LIST."
+ (list :pointer))
+ (defcfun ,(c-name (list-free type)) :void
+ "Frees LIST."
+ (list :pointer))
+ (defcfun ,(c-name (list-make type)) :pointer
+ "Makes a list.")
+ (defcfun ,(c-name (list-at type)) :pointer
+ "Returns the a newly constructed copy of the element at
+ position AT of LIST."
+ (list :pointer)
+ (index :int))
+ (defcfun ,(c-name (list-append type)) :pointer
+ "Appends NEW-ELEMENT to LIST."
+ (list :pointer)
+ (new-element :pointer))))
+ ;; To Lisp
+ ,@(loop for type-name in (ensure-list type-name) collect
+ `(defun ,(symbolicate 'from-list- type-name) (list-pointer)
+ (let ((vector (make-array (,(list-size type)
+ list-pointer))))
+ (dotimes (index (length vector) vector)
+ (setf (elt vector index)
+ ;; FIXME the returned object is not wrapped by Smoke
+ ;; -> change this? [_$_]
+ (smoke:object-to-lisp
+ (,(list-at type)
+ list-pointer index)
+ (smoke:make-smoke-type ,(symbolicate '*smoke-module*)
+ ,type-name)))))))
+ ,@(loop for type-name in (ensure-list type-name) collect
+ `(define-to-lisp-translation
+ (,(format nil "const QList<~A>&" type-name)
+ ,(format nil "QList<~A>" type-name))
+ ,(symbolicate 'from-list- type-name)
+ ,(list-free type)))
+ ;; From Lisp
+ (defun ,(symbolicate 'coerce- lisp-type) (list)
+ (let ((qlist (,(list-make type))))
+ (loop for element across list do
+ (,(list-append type)
+ qlist (pointer (make-instance ',element-type :args (list element)))))
+ (make-cleanup-pointer
+ qlist
+ (function ,(list-free type)))))
+ (defun ,(symbolicate lisp-type '-p) (list)
+ (every #'(lambda (element)
+ ;(typep element ',element-type))
+ (typep element (find-class ',element-type)))
+ list))
+ ,@(loop for type-name in (ensure-list type-name) collect
+ `(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
+ ,(format nil "QList<~A>" type-name))
+ ;; FIXME allow sequence
+ (and (vector );,element-type)
+ (satisfies ,(symbolicate lisp-type '-p)))
+ ,(symbolicate 'coerce- lisp-type)))))))))
hunk ./src/list.lisp 97
-;; FIXME it would be nice to have QList<QVariant> as fallback for any
-;; list we can not convert otherwise. e.g.: '("a" 1)
hunk ./src/list.lisp 99
-(define-qlist-wrapper ("QObject*" "QWidget*") qt:object "void")
hunk ./src/list.lisp 100
+
+(define-qlist-wrapper "QObject*" qt:object "void" :def-cfuns t)
Mon Jan 25 19:43:56 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix error reporting on signal-slot connection failure.
hunk ./src/signal-slot/connect.lisp 118
- (cerror "Failed to connect ~A ~A to ~A ~A."
+ (cerror "Ignore"
+ "Failed to connect ~A ~A to ~A ~A."
hunk ./src/signal-slot/connect.lisp 125
- (receiver qt-slot) (qt:qslot (name qt-slot)))
- (cerror "Failed to disconnect ~A ~A from ~A ~A."
+ (receiver qt-slot) (qt:qslot (name qt-slot)))
+ (cerror "Ignore"
+ "Failed to disconnect ~A ~A from ~A ~A."
hunk ./src/signal-slot/connect.lisp 133
- (cerror "Failed to disconnect everything connected to ~A."
+ (cerror "Ignore"
+ "Failed to disconnect everything connected to ~A."
Sat Jan 23 23:17:35 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* QVector<T> translation
hunk ./cl-smoke.qt.core.asd 22
+ (:file "vector" :depends-on ("qt.core" "signal-slot"))
hunk ./src/event.lisp 7
- (setf (slot-value event 'smoke::pointer)
- (smoke::upcast event (find-class 'qt:child-event)))
+ (setf (slot-value event 'pointer)
+ (upcast event (find-class 'qt:child-event)))
hunk ./src/lib/CMakeLists.txt 11
-set(QT_SMOKE_SOURCES qt_smoke.cpp qstring.cpp qstringlist.cpp lisp_object.cpp qlist.cpp)
+set(QT_SMOKE_SOURCES qt_smoke.cpp
+ qstring.cpp qstringlist.cpp lisp_object.cpp qlist.cpp qvector.cpp)
+
hunk ./src/lib/qlist.cpp 15
-
hunk ./src/operator.lisp 9
- (if (typep object 'smoke::smoke-standard-object)
+ (if (typep object 'smoke-standard-object)
hunk ./src/operator.lisp 11
- (smoke::no-applicable-cxx-method ()
+ (no-applicable-cxx-method ()
hunk ./src/package.lisp 2
- (:use :cl :smoke :cffi :bordeaux-threads :cxx-support :alexandria))
+ (:use :cl :smoke :cffi :bordeaux-threads :cxx-support :alexandria)
+ (:export #:define-qvector-translations
+ #:with-application
+ #:ensure-app
+ #:kill-app))
hunk ./src/signal-slot/connect.lisp 16
- (if (typep signal-arg 'smoke::smoke-type)
+ (if (typep signal-arg 'smoke-type)
hunk ./src/signal-slot/signal.lisp 71
- (smoke:make-cleanup-pointer (make-cxx-lisp-object object)
- #'cl-smoke-free-lisp-object))
+ (make-cleanup-pointer (make-cxx-lisp-object object)
+ #'cl-smoke-free-lisp-object))
hunk ./src/signal-slot/signal.lisp 78
- (if (typep type 'smoke::smoke-type)
- (smoke::convert-argument argument type)
+ (if (typep type 'smoke-type)
+ (smoke:convert-argument argument type)
hunk ./src/signal-slot/signal.lisp 98
- (loop for i from 1 to (smoke::size stack)
+ (loop for i from 1 to (smoke:size stack)
hunk ./src/signal-slot/signal.lisp 102
- (if (or (not (typep type (find-class 'smoke::smoke-type)))
- (= 0 (smoke::type-id type))
- (= 13 (smoke::type-id type)))
+ (if (or (not (typep type (find-class 'smoke-type)))
+ (= 0 (type-id type))
+ (= 13 (type-id type)))
hunk ./src/signal-slot/translate.lisp 4
- (let ((type (smoke::make-smoke-type smoke-module (subseq name start end))))
+ (let ((type (make-smoke-type smoke-module (subseq name start end))))
hunk ./src/signal-slot/translate.lisp 19
- (smoke-module (smoke::smoke (class-of object))))
+ (smoke-module (smoke (class-of object))))
hunk ./src/signal-slot/translate.lisp 37
- (smoke::smoke-type
+ (smoke-type
hunk ./src/signal-slot/translate.lisp 47
- (unless (smoke::virtual-destructor-p (class-of object))
- (smoke::remove-object (pointer object)))
+ (unless (virtual-destructor-p (class-of object))
+ (remove-object (pointer object)))
hunk ./src/signal-slot/translate.lisp 53
- (if (smoke::class-p type)
- (if (smoke::pointer-p type)
- (smoke::object-to-lisp (mem-ref pointer :pointer) type)
+ (if (class-p type)
+ (if (pointer-p type)
+ (object-to-lisp (mem-ref pointer :pointer) type)
hunk ./src/signal-slot/translate.lisp 60
- (disown-object (smoke::object-to-lisp pointer type)))
- (ecase (smoke::type-id type)
- (0 (if-let ((translation (gethash (name type) smoke::*to-lisp-translations*)))
+ (disown-object (object-to-lisp pointer type)))
+ (ecase (type-id type)
+ (0 (if-let ((translation (gethash (name type) *to-lisp-translations*)))
hunk ./src/signal-slot/translate.lisp 94
- (smoke::smoke-standard-object
- (if (smoke::pointer-p smoke-type)
+ (smoke-standard-object
+ (if (pointer-p smoke-type)
hunk ./src/signal-slot/translate.lisp 97
- (let ((type (qt:meta-type.type (smoke::name smoke-type))))
+ (let ((type (qt:meta-type.type (name smoke-type))))
hunk ./src/signal-slot/translate.lisp 101
- (smoke::name smoke-type))
+ (name smoke-type))
hunk ./src/variant.lisp 106
- (let* ((lisp-object (cl-smoke-lisp-object-value (smoke::pointer variant)))
+ (let* ((lisp-object (cl-smoke-lisp-object-value (pointer variant)))
addfile ./src/vector.lisp
hunk ./src/vector.lisp 1
+;; see: "Inside the Qt 4 Containers"
+;; http://doc.trolltech.com/qq/qq19-containers.html#sequentialcontainers
+
+(in-package :cl-smoke.qt.core)
+
+(defcfun cl-smoke-make-qvector :pointer)
+(defcfun cl-smoke-delete-qvector :void
+ (vector :pointer))
+
+(defbitfield qvector-data-flags
+ :sharable
+ :capacity)
+
+(defcstruct qvector-data
+ (ref :char :count #.(class-size (find-class 'qt:basic-atomic-int)))
+ (alloc :int)
+ (size :int)
+ (flags qvector-data-flags))
+
+(defcstruct qvector-type-data
+ (ref :char :count #.(class-size (find-class 'qt:basic-atomic-int)))
+ (alloc :int)
+ (size :int)
+ (flags qvector-data-flags)
+ (array :pointer))
+
+;; FIXME We assume QVector to be a POD struct, which is not
+;; neccesarily the case.
+(defcstruct qvector
+ (data (:pointer qvector-data)))
+
+(defun qvector-size (qvector)
+ (foreign-slot-value (foreign-slot-value qvector 'qvector 'data)
+ 'qvector-data 'size))
+
+(defun qvector-aref (qvector index element-type)
+ (pointer-to-lisp
+ (cffi:inc-pointer
+ (foreign-slot-pointer (foreign-slot-value qvector 'qvector 'data)
+ 'qvector-type-data 'array)
+ (* index (type-size element-type)))
+ element-type))
+
+(defun from-qvector (qvector element-type)
+ (let ((result (make-array (qvector-size qvector))))
+ (dotimes (i (length result) result)
+ (setf (aref result i)
+ (qvector-aref qvector i element-type)))))
+
+(defcfun memcpy :pointer
+ (destination :pointer)
+ (source :pointer)
+ (size :unsigned-int))
+
+(defun make-qvector (element-type elements)
+ (let* ((length (length elements))
+ (element-size (type-size element-type))
+ (data (foreign-alloc :char :count (+ (foreign-type-size 'qvector-data)
+ (* length element-size))))
+ (darray (foreign-slot-pointer data 'qvector-type-data 'array))
+ (vector (cl-smoke-make-qvector)))
+ (unless (stack-p element-type)
+ (error "FIXME: TODO"))
+ (if (class-p element-type)
+ (dotimes (i length)
+ (memcpy (inc-pointer darray (* i element-size))
+ (pointer (aref elements i))
+ element-size))
+ (dotimes (i length)
+ (setf (mem-aref darray (type-foreign-keyword element-type) i)
+ (aref elements i))))
+ (setf (mem-ref data :int) 1) ;; ref count
+ (with-foreign-slots ((ref alloc size flags)
+ data qvector-data)
+ (setf alloc length ;; allocated size
+ size length [_$_]
+ flags :sharable)
+ (setf (foreign-slot-value vector 'qvector 'data)
+ data))
+ vector))
+
+(defun deref (basic-atomic-int-pointer)
+ ;; decrement and return true when the new value is non-zero
+ (cxx:deref
+ (make-instance 'qt:basic-atomic-int :pointer basic-atomic-int-pointer)))
+
+(defun free-qvector (vector)
+ (unless (null-pointer-p (foreign-slot-value vector 'qvector 'data))
+ (let ((data (foreign-slot-value vector 'qvector 'data)))
+ (unless (deref (foreign-slot-pointer data 'qvector-type-data 'ref))
+ (foreign-free data)))
+ (setf (foreign-slot-value vector 'qvector 'data)
+ (null-pointer)))
+ (cl-smoke-delete-qvector vector))
+
+(defun from-vector-point (elements)
+ (make-cleanup-pointer
+ (make-qvector (make-smoke-type *smoke-module* "QPoint")
+ elements)
+ #'free-qvector))
+
+(defun vector-point-p (sequence)
+ (every #'(lambda (element) (typep element 'qt:point))
+ sequence))
+
+(defmacro define-qvector-translations (element-type lisp-type)
+ `(progn
+ (defun ,(symbolicate 'from-vector- element-type) (elements)
+ (make-cleanup-pointer
+ (make-qvector (make-smoke-type *smoke-module* ,element-type)
+ elements)
+ #'free-qvector))
+ (defun ,(symbolicate 'vector- element-type '-p) (sequence)
+ (every #'(lambda (element)
+ (typep element ',lisp-type))
+ sequence))
+ (defun ,(symbolicate 'to-vector- element-type) (pointer)
+ (from-qvector pointer (make-smoke-type *smoke-module* ,element-type)))
+ (define-from-lisp-translation (,(format nil "QVector<~A>" element-type)
+ ;; FIXME QImage::setColorTable
+ ;; has an "const QVector<QRgb>"
+ ;; argument!
+ ,(format nil "const QVector<~A>" element-type)
+ ,(format nil "const QVector<~A>&" element-type))
+ (and vector
+ (satisfies ,(symbolicate 'vector- element-type '-p)))
+ ,(symbolicate 'from-vector- element-type))
+ (define-to-lisp-translation (,(format nil "QVector<~A>" element-type)
+ ,(format nil "const QVector<~A>&" element-type))
+ ,(symbolicate 'to-vector- element-type)
+ free-qvector)))
+ [_$_]
+(define-qvector-translations "double" double-float)
Sun Jan 10 09:52:09 CET 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Split up in qt.core.
- Fix qt:with-core-app
- cleanup name prefixes
move ./qt.asd ./cl-smoke.qt.core.asd
move ./src/lib/lisp-object.cpp ./src/lib/lisp_object.cpp
move ./src/lib/lisp-object.h ./src/lib/lisp_object.h
move ./src/lib/qt-smoke.cpp ./src/lib/qt_smoke.cpp
move ./src/qt.lisp ./src/qt.core.lisp
hunk ./cl-smoke.qt.core.asd 1
-(defpackage qt-system
- (:use :cl :asdf))
-
-(in-package qt-system)
-
-(asdf:defsystem :qt
- :name :qt
+(defsystem :cl-smoke.qt.core
+ :name :cl-smoke.qt.core
hunk ./cl-smoke.qt.core.asd 6
- :description "Smoke Qt bindings."
- :depends-on (:smoke :smoke :cffi :alexandria)
+ :description "Smoke Qt core bindings."
+ :depends-on (:cl-smoke.smoke :cffi :alexandria)
hunk ./cl-smoke.qt.core.asd 14
- (:file "qt" :depends-on ("package" "lib"))
- (:file "ownership" :depends-on ("qt"))
- (:file "event" :depends-on ("qt"))
- (:file "object" :depends-on ("qt" "signal-slot" "qstring" "event"))
- (:file "operator" :depends-on ("qt" "object"))
- (:file "application" :depends-on ("qt" "properties"))
- (:file "qstring" :depends-on ("qt"))
- (:file "list" :depends-on ("qt"))
- (:file "msg-handler" :depends-on ("lib" "qt"))
- (:file "painter" :depends-on ("qt"))
- (:file "timer" :depends-on ("qt"))
- (:file "i18n" :depends-on ("qt"))
- (:file "lisp-object" :depends-on ("qt" "lib"))
+ (:file "qt.core" :depends-on ("package" "lib"))
+ (:file "ownership" :depends-on ("qt.core"))
+ (:file "event" :depends-on ("qt.core"))
+ (:file "object" :depends-on ("qt.core" "signal-slot" "qstring" "event"))
+ (:file "operator" :depends-on ("qt.core" "object"))
+ (:file "application" :depends-on ("qt.core" "properties"))
+ (:file "qstring" :depends-on ("qt.core"))
+ (:file "list" :depends-on ("qt.core"))
+ (:file "msg-handler" :depends-on ("lib" "qt.core"))
+ (:file "timer" :depends-on ("qt.core"))
+ (:file "i18n" :depends-on ("qt.core"))
+ (:file "lisp-object" :depends-on ("qt.core" "lib"))
hunk ./cl-smoke.qt.core.asd 35
- (:file "string-list" :depends-on ("qt" "lib" "qstring"))
- (:file "variant" :depends-on ("qt" "qstring" "lisp-object"))
+ (:file "string-list" :depends-on ("qt.core" "lib" "qstring"))
+ (:file "variant" :depends-on ("qt.core" "qstring" "lisp-object"))
hunk ./cl-smoke.qt.core.asd 39
-(defmethod asdf:perform ((operation test-op) (c (eql (find-system :qt))))
- (operate 'asdf:load-op :qt.tests)
- (operate 'asdf:test-op :qt.tests))
+(defmethod operation-done-p ((o test-op) (c (eql (find-system :cl-smoke.qt.core))))
+ nil)
+
+(defmethod perform ((operation test-op) (c (eql (find-system :cl-smoke.qt.core))))
+ (operate 'asdf:load-op :cl-smoke.qt.tests)
+ (operate 'asdf:test-op :cl-smoke.qt.tests))
hunk ./examples/hello-world.lisp 1
-(in-package :qt-examples)
-(declaim (optimize (debug 3)))
-
-(defun hello-world ()
- "Hello world"
- (qt:with-app
- (let ((widget (make-instance 'qt:push-button :args '("Hello world"))))
- (cxx:show widget)
- (qt:exec))))
-
-
-(defun hello-world-quit ()
- "Quit on push-button click"
- (qt:with-app
- (let ((quit (make-instance 'qt:push-button :args '("Quit"))))
- (cxx:resize quit 75 30)
- (cxx:set-font quit (make-instance 'qt:font :args (list "Times"
- 18
- qt:font.+bold+)))
- [_$_]
- (qt:object.connect quit (qt:qsignal "clicked()")
- (qt:app) (qt:qslot "quit()"))
- (cxx:show quit)
- (qt:exec))))
-
-(defun hello-world-gc ()
- "GC on push-button click"
- (qt:with-app
- (let ((gc (make-instance 'qt:widget)))
- (let ((layout (make-instance 'qt:vbox-layout))
- (button (make-instance 'qt:push-button :args '("GC"))))
- (trivial-garbage:gc :full t)
- (cxx:add-widget layout button)
- (trivial-garbage:gc :full t)
- (cxx:set-layout gc layout)
- (trivial-garbage:gc :full t)
- (qt:connect-function button "clicked()"
- #'(lambda () [_$_]
- (format t "GC-ing~%")
- (trivial-garbage:gc :full t))))
- (trivial-garbage:gc :full t)
- (cxx:show gc)
- (trivial-garbage:gc :full t)
- (qt:exec))))
-
-;; You need to run cmake & make to generate the .po and .qm files
-(defun i18n-hello-world ()
- "i18n hello world"
- (qt:with-app
- (qt:with-translator "hello-world"
- (let ((widget (make-instance 'qt:label)))
- (setf (qt:property widget 'window-title)
- (qt:tr "Lisp Qt Example" "hello-world"))
- (cxx:set-text widget
- (format nil (qt:tr "<h1>Hello world</h1>
-
-You are running ~A version ~A on a ~A ~A")
- (lisp-implementation-type)
- (lisp-implementation-version)
- (software-type)
- (software-version)))
- (cxx:show widget)
- (qt:exec)))))
rmfile ./examples/hello-world.lisp
hunk ./examples/package.lisp 1
-(defpackage #:qt-examples
- (:use #:cl)
- (:export #:hello-world
- #:i18n-hello-world
- #:hello-world-quit
- #:hello-world-gc
-
- #:class-browser
-
- #:tick-tack-toe
- #:repl
-
- #:launcher
- [_$_]
- #:load-ui-file))
rmfile ./examples/package.lisp
rmdir ./examples
hunk ./cl-smoke.qt.core.asd 39
-(defmethod operation-done-p ((o test-op) (c (eql (find-system :cl-smoke.qt.core))))
- nil)
-
hunk ./src/application.lisp 4
-(defvar *widgets* nil)
hunk ./src/application.lisp 20
- (application 'qt:application)
+ (application 'qt:core-application)
hunk ./src/application.lisp 51
- (app (make-instance 'qt:application :args (list argc argv))))
+ (app (make-instance application :args (list argc argv))))
hunk ./src/application.lisp 58
+(defgeneric delete-app (application)
+ (:method (application)
+ (cxx:quit application)
+ ;; Call the destructor; -> destructed callback is called,
+ ;; (~QApplication() is virtual) which takes care of cleanup on the
+ ;; Lisp side.
+ (smoke::delete-pointer (smoke:pointer application) (class-of application))
+ (setf (slot-value application 'pointer) (null-pointer))
+ (makunbound '*app*)))
+
hunk ./src/application.lisp 69
- (when (typep (qt:app) 'qt:application)
- (qt:application.close-all-windows)
- ;; widgets are only valid as long, as an application object
- ;; exists. QApplication::~QApplication() deletes all widgets in
- ;; QApplication::allWidgets().
- ;; [_$_]
- ;; see: qt4/src/gui/kernel/qapplication.cpp
- (loop for widget across (qt:application.all-widgets) do
- (tg:cancel-finalization widget)))
- (cxx:quit (qt:app))
- (setf *widgets* nil)
- ;; Call the destructor; -> destructed callback is called,
- ;; (~QApplication() is virtual) which takes care of cleanup on the
- ;; Lisp side.
- (smoke::delete-pointer (smoke:pointer (qt:app)) (class-of (qt:app)))
- (setf (slot-value (qt:app) 'pointer) (null-pointer))
- (makunbound '*app*))
+ (delete-app (qt:app)))
hunk ./src/application.lisp 79
-(defmacro qt:with-app (options &body body)
- "Ensures that a APPLICATION instance exists, [_$_]
-evaluates BODY and executes the APPLICATION instance after BODY.
-The instance can be accessed with:
-QT:APP.
-
-Can be nested.
-
-When a APPLICATION was created, it will be deleted when returning
-from BODY."
- (assert (null options)
- (options)
- "Currently no options can be passed to QT:WITH-APP.")
- `(with-application ((cl-smoke.qt-impl::ensure-app 'qt:application) (kill-app))
- ,@body))
-
hunk ./src/application.lisp 90
- (if qt:*exec-p*
- (restart-bind ((qt::abort-app #'(lambda ()
- (cxx:quit (qt:app))
- (invoke-restart (find-restart 'continue)))
- :report-function
- #'(lambda (stream)
- (format stream "Return from the application event loop."))
- :test-function
- #'(lambda (condition)
- (declare (ignore condition))
- (and (qt:app-p)
- (find-restart 'continue)))))
- (let ((qt:*exec-p* nil))
- (cxx:exec (qt:app))))
- (when (typep (qt:app) 'qt:application)
- (setf *widgets* (qt:application.top-level-widgets)))))
+ (when qt:*exec-p*
+ (restart-bind ((qt::abort-app #'(lambda ()
+ (cxx:quit (qt:app))
+ (invoke-restart (find-restart 'continue)))
+ :report-function
+ #'(lambda (stream)
+ (format stream "Return from the application event loop."))
+ :test-function
+ #'(lambda (condition)
+ (declare (ignore condition))
+ (and (qt:app-p)
+ (find-restart 'continue)))))
+ (let ((qt:*exec-p* nil))
+ (cxx:exec (qt:app))))))
replace ./src/application.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/event.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/i18n.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/lib/CMakeLists.txt 11
-set(QT_SMOKE_SOURCES qt-smoke.cpp qstring.cpp qstringlist.cpp lisp-object.cpp qlist.cpp)
-add_library(qt-smoke-extra MODULE ${QT_SMOKE_SOURCES})
-target_link_libraries(qt-smoke-extra ${QT_LIBRARIES})
-set_target_properties(qt-smoke-extra [_$_]
+set(QT_SMOKE_SOURCES qt_smoke.cpp qstring.cpp qstringlist.cpp lisp_object.cpp qlist.cpp)
+add_library(clsmokeqtcore MODULE ${QT_SMOKE_SOURCES})
+target_link_libraries(clsmokeqtcore ${QT_LIBRARIES})
+set_target_properties(clsmokeqtcore
hunk ./src/lib/CMakeLists.txt 19
-install(TARGETS qt-smoke-extra
- LIBRARY DESTINATION lib)
+install(TARGETS clsmokeqtcore LIBRARY DESTINATION lib)
hunk ./src/lib/lisp_object.cpp 1
-#include "lisp-object.h"
+#include "lisp_object.h"
+
+#include "cl_smoke_qt.h"
hunk ./src/lib/lisp_object.cpp 7
+#include <QVariant>
hunk ./src/lib/lisp_object.cpp 112
-int
-qt_smoke_setup_lisp_object(void* destruct)
+CL_SMOKE_QT_EXPORT int
+cl_smoke_setup_lisp_object(void* destruct)
hunk ./src/lib/lisp_object.cpp 127
-unsigned int
-qt_smoke_lisp_object_id(const void* object)
+CL_SMOKE_QT_EXPORT unsigned int
+cl_smoke_lisp_object_id(const void* object)
hunk ./src/lib/lisp_object.cpp 140
-int
-qt_smoke_lisp_object_is_set(const void* object)
+CL_SMOKE_QT_EXPORT int
+cl_smoke_lisp_object_is_set(const void* object)
hunk ./src/lib/lisp_object.cpp 152
-void*
-qt_smoke_make_lisp_object(unsigned int id)
+CL_SMOKE_QT_EXPORT void*
+cl_smoke_make_lisp_object(unsigned int id)
hunk ./src/lib/lisp_object.cpp 162
-void*
-qt_smoke_free_lisp_object(void* object)
+CL_SMOKE_QT_EXPORT void*
+cl_smoke_free_lisp_object(void* object)
hunk ./src/lib/lisp_object.cpp 168
-#include <QVariant>
hunk ./src/lib/lisp_object.cpp 174
-void*
-qt_smoke_lisp_object_value(const void* variant)
+CL_SMOKE_QT_EXPORT void*
+cl_smoke_lisp_object_value(const void* variant)
hunk ./src/lib/lisp_object.h 4
+#include "cl_smoke_qt.h"
+
hunk ./src/lib/lisp_object.h 11
-#include "cl_smoke_qt.h"
-
hunk ./src/lib/lisp_object.h 14
- qt_smoke_setup_lisp_object(void* destruct);
+ cl_smoke_setup_lisp_object(void* destruct);
hunk ./src/lib/lisp_object.h 17
- qt_smoke_lisp_object_id(const void* object);
+ cl_smoke_lisp_object_id(const void* object);
hunk ./src/lib/lisp_object.h 20
- qt_smoke_lisp_object_is_set(const void* object);
+ cl_smoke_lisp_object_is_set(const void* object);
hunk ./src/lib/lisp_object.h 23
- qt_smoke_make_lisp_object(unsigned int id);
+ cl_smoke_make_lisp_object(unsigned int id);
hunk ./src/lib/lisp_object.h 26
- qt_smoke_free_lisp_object(void* object);
+ cl_smoke_free_lisp_object(void* object);
hunk ./src/lib/lisp_object.h 29
- qt_smoke_lisp_object_value(const void* variant);
+ cl_smoke_lisp_object_value(const void* variant);
hunk ./src/lib/lisp_object.h 58
- ::qt_smoke_setup_lisp_object(void* destruct);
+ ::cl_smoke_setup_lisp_object(void* destruct);
hunk ./src/lib/qlist.h 4
-#include <QList>
hunk ./src/lib/qlist.h 6
+#include <QList>
+
hunk ./src/lib/qlist.h 36
-qt_smoke_list_ ## NAME ## _size(const void* list) \
+cl_smoke_list_ ## NAME ## _size(const void* list) \
hunk ./src/lib/qlist.h 42
-qt_smoke_free_list_ ## NAME (void* list) \
+cl_smoke_free_list_ ## NAME (void* list) \
hunk ./src/lib/qlist.h 48
-qt_smoke_make_list_ ## NAME () \
+cl_smoke_make_list_ ## NAME () \
hunk ./src/lib/qlist.h 59
-qt_smoke_list_ ## NAME ## _at(const void* list, int index) \
+cl_smoke_list_ ## NAME ## _at(const void* list, int index) \
hunk ./src/lib/qlist.h 66
-qt_smoke_list_ ## NAME ## _append(void* list, void* data) \
+cl_smoke_list_ ## NAME ## _append(void* list, void* data) \
hunk ./src/lib/qlist.h 77
-qt_smoke_list_ ## NAME ## _at(const void* list, int index) \
+cl_smoke_list_ ## NAME ## _at(const void* list, int index) \
hunk ./src/lib/qlist.h 84
-qt_smoke_list_ ## NAME ## _append(void* list, void* data) \
+cl_smoke_list_ ## NAME ## _append(void* list, void* data) \
hunk ./src/lib/qstring.cpp 2
-#include <QtDebug>
hunk ./src/lib/qstring.cpp 16
-qt_smoke_qstring_to_byte_array(const void* qstring)
+cl_smoke_qstring_to_byte_array(const void* qstring)
hunk ./src/lib/qstring.cpp 18
- Q_ASSERT(qstring);
hunk ./src/lib/qstring.cpp 27
-qt_smoke_free_qstring(void* qstring)
+cl_smoke_free_qstring(void* qstring)
hunk ./src/lib/qstring.cpp 39
-qt_smoke_string_to_qstring(const char* data, int length)
+cl_smoke_string_to_qstring(const char* data, int length)
hunk ./src/lib/qstringlist.cpp 1
+#include "cl_smoke_qt.h"
+
hunk ./src/lib/qstringlist.cpp 5
-#include <cstring>
-
-#include "cl_smoke_qt.h"
hunk ./src/lib/qstringlist.cpp 17
-qt_smoke_string_list_size(const void* string_list)
+cl_smoke_string_list_size(const void* string_list)
hunk ./src/lib/qstringlist.cpp 30
-qt_smoke_string_list_at(const void* string_list, int index)
+cl_smoke_string_list_at(const void* string_list, int index)
hunk ./src/lib/qstringlist.cpp 44
-qt_smoke_free_string_list(void* string_list)
+cl_smoke_free_string_list(void* string_list)
hunk ./src/lib/qstringlist.cpp 54
-qt_smoke_make_string_list()
+cl_smoke_make_string_list()
hunk ./src/lib/qstringlist.cpp 65
-qt_smoke_string_list_append(void* string_list, const char* data, int length)
+cl_smoke_string_list_append(void* string_list, const char* data, int length)
hunk ./src/lib/qt_smoke.cpp 1
+#include "cl_smoke_qt.h"
+
hunk ./src/lib/qt_smoke.cpp 7
-#include "cl_smoke_qt.h"
-
hunk ./src/lib/qt_smoke.cpp 28
-qt_smoke_register_event_notify(void* callback)
+cl_smoke_register_event_notify(void* callback)
hunk ./src/lib/qt_smoke.cpp 46
-qt_smoke_meta_object(void* object)
+cl_smoke_meta_object(void* object)
hunk ./src/lisp-object.lisp 17
-(defcfun qt-smoke-setup-lisp-object :int
+(defcfun cl-smoke-setup-lisp-object :int
hunk ./src/lisp-object.lisp 20
-(defcfun qt-smoke-lisp-object-id :unsigned-int
+(defcfun cl-smoke-lisp-object-id :unsigned-int
hunk ./src/lisp-object.lisp 23
-(defcfun qt-smoke-lisp-object-is-set :int
+(defcfun cl-smoke-lisp-object-is-set :int
hunk ./src/lisp-object.lisp 26
-(defcfun qt-smoke-make-lisp-object :pointer
+(defcfun cl-smoke-make-lisp-object :pointer
hunk ./src/lisp-object.lisp 29
-(defcfun qt-smoke-free-lisp-object :void
+(defcfun cl-smoke-free-lisp-object :void
hunk ./src/lisp-object.lisp 40
- (qt-smoke-setup-lisp-object (callback destruct-cxx-lisp-object)))
+ (cl-smoke-setup-lisp-object (callback destruct-cxx-lisp-object)))
hunk ./src/lisp-object.lisp 50
- (qt-smoke-make-lisp-object id)))
+ (cl-smoke-make-lisp-object id)))
hunk ./src/lisp-object.lisp 54
- (qt-smoke-free-lisp-object pointer))
+ (cl-smoke-free-lisp-object pointer))
hunk ./src/lisp-object.lisp 63
- (gethash (qt-smoke-lisp-object-id pointer)
+ (gethash (cl-smoke-lisp-object-id pointer)
replace ./src/lisp-object.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/list.lisp 8
- (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_size") :int
+ (defcfun ,(concatenate 'string "cl_smoke_list_" c-name "_size") :int
hunk ./src/list.lisp 11
- (defcfun ,(concatenate 'string "qt_smoke_free_list_" c-name) :void
+ (defcfun ,(concatenate 'string "cl_smoke_free_list_" c-name) :void
hunk ./src/list.lisp 14
- (defcfun ,(concatenate 'string "qt_smoke_make_list_" c-name) :pointer
+ (defcfun ,(concatenate 'string "cl_smoke_make_list_" c-name) :pointer
hunk ./src/list.lisp 16
- (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_at") :pointer
+ (defcfun ,(concatenate 'string "cl_smoke_list_" c-name "_at") :pointer
hunk ./src/list.lisp 20
- (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_append") :pointer
+ (defcfun ,(concatenate 'string "cl_smoke_list_" c-name "_append") :pointer
hunk ./src/list.lisp 27
- (let ((vector (make-array (,(symbolicate 'qt-smoke-list-
+ (let ((vector (make-array (,(symbolicate 'cl-smoke-list-
hunk ./src/list.lisp 35
- (,(symbolicate 'qt-smoke-list-
+ (,(symbolicate 'cl-smoke-list-
hunk ./src/list.lisp 45
- ,(symbolicate 'qt-smoke-free-list- type)))
+ ,(symbolicate 'cl-smoke-free-list- type)))
hunk ./src/list.lisp 48
- (let ((qlist (,(symbolicate 'qt-smoke-make-list- type))))
+ (let ((qlist (,(symbolicate 'cl-smoke-make-list- type))))
hunk ./src/list.lisp 50
- (,(symbolicate 'qt-smoke-list- type '-append)
+ (,(symbolicate 'cl-smoke-list- type '-append)
hunk ./src/list.lisp 54
- (function ,(symbolicate 'qt-smoke-free-list- type)))))
+ (function ,(symbolicate 'cl-smoke-free-list- type)))))
replace ./src/list.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/msg-handler.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/object.lisp 9
-(defcfun qt-smoke-meta-object :pointer (object :pointer))
+(defcfun cl-smoke-meta-object :pointer (object :pointer))
hunk ./src/object.lisp 12
- :pointer (qt-smoke-meta-object (pointer object))))
+ :pointer (cl-smoke-meta-object (pointer object))))
hunk ./src/object.lisp 229
- (cffi:defcfun qt-smoke-register-event-notify :boolean
+ (cffi:defcfun cl-smoke-register-event-notify :boolean
hunk ./src/object.lisp 233
- (let ((ret (qt-smoke-register-event-notify (cffi:callback event-notify))))
+ (let ((ret (cl-smoke-register-event-notify (cffi:callback event-notify))))
replace ./src/object.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/operator.lisp 2
-(declaim (optimize (debug 3)))
replace ./src/operator.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/ownership.lisp 3
-;; undo-stack
-(define-takes-ownership cxx:push ((undo-stack qt:undo-stack) undo-command)
- undo-command)
-
-
-#|
-;; FIXME TODO
-;; application
-(define-takes-ownership cxx:set-style ((application application) (style style))
- ;; NOT QString style
- style) ;; STATIC [_$_]
-
-
-;; core-application
-(define-takes-ownership cxx:post-event ((app core-application) receiver (event event))
- event) ;; STATIC
-(define-takes-ownership cxx:post-event ((app core-application) receiver event priority)
- event) ;; STATIC
-|#
-
-;; AbstractFileEngine::beginEntryList return value
-
-;; grid-layout
-(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
- row column)
- item)
-(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
- row column row-span)
- item)
-(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
- row column row-span colum-span)
- item)
-(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
- row column row-span colum-span aligment)
- item)
-
-(define-takes-ownership cxx:add-item ((layout qt:layout) (item qt:layout-item))
- item)
-
-;; QIcon::QIcon(QIconEngine* engine)
-
-(define-takes-ownership cxx:register-editor ((factory qt:item-editor-factory)
- type creator)
- creator)
-
-
-(define-takes-ownership cxx:set-child ((this qt:standard-item) row colum item)
- item)
-(define-takes-ownership cxx:set-child ((this qt:standard-item) row item)
- item)
-(define-takes-ownership cxx:set-horizontal-header-item ((this qt:standard-item-model)
- column item)
- item)
-(define-takes-ownership cxx:set-vertical-header-item ((this qt:standard-item-model)
- row item)
- item)
-(define-takes-ownership cxx:set-item ((this qt:standard-item-model)
- row column item)
- item)
-(define-takes-ownership cxx:set-item ((this qt:standard-item-model)
- row item)
- item)
-(define-takes-ownership cxx:set-item-prototype ((this qt:standard-item-model)
- item)
- item)
-
-
-;; Allocates return value
-;; QLineEdit::createStandardContextMenu()
-
-;; parent
-;; QListwidgetitem
-
-
-;; Releases ownership
-;;QList<QStandardItem *> QStandardItemModel::takeColumn ( int column )
-;; etc
-
replace ./src/ownership.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/package.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/painter.lisp 1
-(in-package :cl-smoke.qt-impl)
-
-(defmacro qt:with-painter ((painter paint-device) &body body)
- "Binds a PAINTER instance for PAINT-DEVICE to PAINTER
- during the evaluation of BODY.
-
-Makes sure the painter ends after BODY; thus preventing problems with [_$_]
-still active and not yet garbage collected painters in CXX:PAINT-EVENT."
- `(let ((,painter (make-instance 'qt:painter :arg0 ,paint-device)))
- (assert (cxx:is-active ,painter)
- (,painter)
- "Painter ~A for ~A is not active"
- ,painter ,paint-device)
- (unwind-protect
- (progn ,@body)
- (cxx:end ,painter))))
rmfile ./src/painter.lisp
replace ./src/properties.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/qstring.lisp 3
-(defcfun qt-smoke-string-to-qstring :pointer
+(defcfun cl-smoke-string-to-qstring :pointer
hunk ./src/qstring.lisp 7
-(defcfun qt-smoke-free-qstring :void
+(defcfun cl-smoke-free-qstring :void
hunk ./src/qstring.lisp 10
-(defcfun qt-smoke-qstring-to-byte-array :pointer
+(defcfun cl-smoke-qstring-to-byte-array :pointer
hunk ./src/qstring.lisp 37
- :pointer (qt-smoke-qstring-to-byte-array qstring))))
+ :pointer (cl-smoke-qstring-to-byte-array qstring))))
hunk ./src/qstring.lisp 40
- from-qstring qt-smoke-free-qstring)
+ from-qstring cl-smoke-free-qstring)
hunk ./src/qstring.lisp 45
- (qt-smoke-string-to-qstring data length))
- #'qt-smoke-free-qstring))
+ (cl-smoke-string-to-qstring data length))
+ #'cl-smoke-free-qstring))
replace ./src/qstring.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/qt.core.lisp 1
-;;; Copyright (C) 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
+;;; Copyright (C) 2009, 2010 Tobias Rautenkranz <tobias@rautenkranz.ch>
hunk ./src/qt.core.lisp 30
-(define-smoke-module :cl-smoke.qt libsmokeqt
- (*qt-smoke* "qt_Smoke")
- (init-qt-smoke "init_qt_Smoke"))
-
hunk ./src/qt.core.lisp 31
- (define-foreign-library libqt-smoke-extra
- (:unix "libqt-smoke-extra.so")
- (t (:default "libqt-smoke-extra")))
- (use-foreign-library libqt-smoke-extra))
+ (define-smoke-module :cl-smoke.qt libsmokeqtcore
+ (*qt-core-smoke* "qtcore_Smoke")
+ (init-qt-smoke "init_qtcore_Smoke"))
+
+ (define-foreign-library libclsmokeqtcore
+ (:unix "libclsmokeqtcore.so")
+ (t (:default "libclsmokeqtcore")))
+ (use-foreign-library libclsmokeqtcore))
replace ./src/qt.core.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/signal-slot/connect.lisp 141
- (method-arguments-type
- (cxx:meta-object (qsender qt-signal))
- signal-id))))
+ (method-arguments-type (qsender qt-signal)
+ signal-id))))
hunk ./src/signal-slot/connect.lisp 162
- (check-argument-types (method-arguments-type (cxx:meta-object
- (qsender qt-signal))
+ (check-argument-types (method-arguments-type (qsender qt-signal)
hunk ./src/signal-slot/connect.lisp 166
- (method-arguments-type (cxx:meta-object (qsender qt-signal))
- signal-id)))
+ (method-arguments-type (qsender qt-signal) signal-id)))
hunk ./src/signal-slot/connect.lisp 179
- (method-arguments-type (cxx:meta-object
- (receiver slot))
+ (method-arguments-type (receiver slot)
hunk ./src/signal-slot/connect.lisp 182
- (method-arguments-type (cxx:meta-object (receiver slot))
- slot-id)))
+ (method-arguments-type (receiver slot) slot-id)))
replace ./src/signal-slot/connect.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/signal-slot/signal-slot.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/signal-slot/signal.lisp 72
- #'qt-smoke-free-lisp-object))
+ #'cl-smoke-free-lisp-object))
hunk ./src/signal-slot/signal.lisp 82
- "The argument ~S is not of type ~S.")
+ "The argument ~S is not of type ~S."
+ argument type)
replace ./src/signal-slot/signal.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/signal-slot/slot.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/signal-slot/translate.lisp 3
-(defun find-type (name &optional start end)
- (smoke::make-smoke-type *smoke-module* (subseq name start end)))
+(defun find-type (smoke-module name &optional start end)
+ (let ((type (smoke::make-smoke-type smoke-module (subseq name start end))))
+ (assert (not (zerop (id type)))
+ ()
+ "No type named ~S found in ~A."
+ (subseq name start end) smoke-module)
+ type))
hunk ./src/signal-slot/translate.lisp 11
-(defun method-arguments-type (metaobject index)
- "Returns a type name list for the arguments of method INDEX of METAOBJECT."
- (let* ((signature (cxx:signature (cxx:method metaobject index)))
+(defun method-arguments-type (object index)
+ "Returns a type name list for the arguments of method INDEX of OBJECTs metaobject."
+ (let* ((metaobject (cxx:meta-object object))
+ (signature (cxx:signature (cxx:method metaobject index)))
hunk ./src/signal-slot/translate.lisp 18
- (last-pos (length arguments)))
+ (last-pos (length arguments))
+ (smoke-module (smoke::smoke (class-of object))))
hunk ./src/signal-slot/translate.lisp 23
- (push (find-type arguments (1+ pos) last-pos) argument-types)
+ (push (find-type smoke-module arguments (1+ pos) last-pos) argument-types)
hunk ./src/signal-slot/translate.lisp 26
- (push (find-type arguments 0 last-pos) argument-types))))
+ (push (find-type smoke-module arguments 0 last-pos) argument-types))))
replace ./src/signal-slot/translate.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/string-list.lisp 3
-(defcfun qt-smoke-string-list-size :int
+(defcfun cl-smoke-string-list-size :int
hunk ./src/string-list.lisp 6
-(defcfun qt-smoke-string-list-at :pointer
+(defcfun cl-smoke-string-list-at :pointer
hunk ./src/string-list.lisp 10
-(defcfun qt-smoke-free-string-list :void
+(defcfun cl-smoke-free-string-list :void
hunk ./src/string-list.lisp 13
-(defcfun qt-smoke-make-string-list :pointer)
+(defcfun cl-smoke-make-string-list :pointer)
hunk ./src/string-list.lisp 15
-(defcfun qt-smoke-string-list-append :void
+(defcfun cl-smoke-string-list-append :void
hunk ./src/string-list.lisp 21
- (let ((vector (make-array (qt-smoke-string-list-size string-list)
+ (let ((vector (make-array (cl-smoke-string-list-size string-list)
hunk ./src/string-list.lisp 27
- :pointer (qt-smoke-string-list-at
+ :pointer (cl-smoke-string-list-at
hunk ./src/string-list.lisp 31
- from-string-list qt-smoke-free-string-list)
+ from-string-list cl-smoke-free-string-list)
hunk ./src/string-list.lisp 34
- (let ((string-list (qt-smoke-make-string-list)))
+ (let ((string-list (cl-smoke-make-string-list)))
hunk ./src/string-list.lisp 38
- (qt-smoke-string-list-append string-list data length)))
+ (cl-smoke-string-list-append string-list data length)))
hunk ./src/string-list.lisp 41
- string-list #'qt-smoke-free-string-list)))
+ string-list #'cl-smoke-free-string-list)))
replace ./src/string-list.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
replace ./src/timer.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./src/variant.lisp 69
-(defcfun qt-smoke-lisp-object-value :pointer
+(defcfun cl-smoke-lisp-object-value :pointer
hunk ./src/variant.lisp 106
- (let* ((lisp-object (qt-smoke-lisp-object-value (smoke::pointer variant)))
+ (let* ((lisp-object (cl-smoke-lisp-object-value (smoke::pointer variant)))
replace ./src/variant.lisp [A-Za-z_0-9\-\.] cl-smoke.qt-impl cl-smoke.qt.core
hunk ./test.lisp 6
-(asdf:operate 'asdf:load-op :qt)
-(asdf:operate 'asdf:test-op :qt)
+(asdf:operate 'asdf:load-op :cl-smoke.qt.core)
+(asdf:operate 'asdf:test-op :cl-smoke.qt.core)
changepref test
sh test.lisp
Sun Dec 13 13:44:37 CET 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Support ASDF instead of Mudballs.
addfile ./qt.asd
hunk ./qt.mbd 1
-;;;; -*- Mode: lisp; indent-tabs-mode: nil -*-
-
-;;; SYSDEF.CMAKE
-(defpackage :sysdef.cmake
- (:use :cl :sysdef)
- (:export :cmake-file :cmake-library))
-
-(in-package :sysdef.cmake)
-(defclass sysdef.cmake:cmake-file (source-file)
- ()
- (:default-initargs :type "txt"))
-
-(defclass sysdef.cmake:cmake-library (component)
- ((package :initarg :package)))
-;;; end SYSDEF.CMAKE
-
-(in-package :sysdef-user)
-(eval-when (:compile-toplevel :load-toplevel :execute)
- (use-package :sysdef.cmake))
-
-(define-system :qt ()
- (:version 0 0 1)
- (:documentation "Smoke Qt bindings.")
- (:keywords "GUI" "Qt")
- (:author "Tobias Rautenkranz")
- (:license "GPL with linking exception")
- (:components [_$_]
- ("CMakeLists" sysdef.cmake:cmake-file)
- ("src" module
- (:needs "CMakeLists")
- (:components
- ("CMakeLists.txt" static-file)
- "package"
- ("lib" module
- (:needs "package")
- (:components [_$_]
- ("libqt-smoke-extra" sysdef.cmake:cmake-library (:package :cl-smoke.qt-impl))
-
- ("CMakeLists.txt" static-file)
- ("qt-smoke.cpp" static-file)
- ("lisp-object.h" static-file)
- ("lisp-object.cpp" static-file)
- ("qstring.cpp" static-file)
- ("qstringlist.cpp" static-file)))
-
- ("qt" (:needs "package" "lib"))
- ("ownership" (:needs "qt"))
- ("event" (:needs "qt"))
- ("object" (:needs "qt" "signal-slot" "qstring" "event"))
- ("operator" (:needs "qt" "object"))
- ("application" (:needs "qt" "properties"))
- ("qstring" (:needs "qt"))
- ("list" (:needs "qt"))
- ("msg-handler" (:needs "lib" "qt"))
- ("painter" (:needs "qt"))
- ("timer" (:needs "qt"))
- ("i18n" (:needs "qt"))
- ("lisp-object" (:needs "qt" "lib"))
- ("signal-slot" module
- (:needs "lisp-object")
- (:serial t)
- (:components
- "signal-slot"
- "translate"
- "signal"
- "slot"
- "connect"))
- ("string-list" (:needs "qt" "lib" "qstring"))
- ("variant" (:needs "qt" "qstring" "lisp-object"))
- ("properties" (:needs "variant")))))
- (:uses-macros-from :smoke)
- (:needs :smoke :sysdef.cmake :cffi :alexandria))
rmfile ./qt.mbd
hunk ./tests/test.lisp 1
-(mb:test :qt.tests)
rmfile ./tests/test.lisp
rmdir ./tests
hunk ./qt.asd 1
+(defpackage qt-system
+ (:use :cl :asdf))
+
+(in-package qt-system)
+
+(asdf:defsystem :qt
+ :name :qt
+ :version (0 0 1)
+ :author "Tobias Rautenkranz"
+ :license "GPL with linking exception"
+ :description "Smoke Qt bindings."
+ :depends-on (:smoke :smoke :cffi :alexandria)
+
+ :components [_$_]
+ ((:module "src"
+ :components
+ ((:file "package")
+ (:module "lib" :depends-on ("package"))
+ (:file "qt" :depends-on ("package" "lib"))
+ (:file "ownership" :depends-on ("qt"))
+ (:file "event" :depends-on ("qt"))
+ (:file "object" :depends-on ("qt" "signal-slot" "qstring" "event"))
+ (:file "operator" :depends-on ("qt" "object"))
+ (:file "application" :depends-on ("qt" "properties"))
+ (:file "qstring" :depends-on ("qt"))
+ (:file "list" :depends-on ("qt"))
+ (:file "msg-handler" :depends-on ("lib" "qt"))
+ (:file "painter" :depends-on ("qt"))
+ (:file "timer" :depends-on ("qt"))
+ (:file "i18n" :depends-on ("qt"))
+ (:file "lisp-object" :depends-on ("qt" "lib"))
+ (:module "signal-slot"
+ :serial t
+ :depends-on ("lisp-object")
+ :components
+ ((:file "signal-slot")
+ (:file "translate" :depends-on ("signal-slot"))
+ (:file "signal" :depends-on ("translate"))
+ (:file "slot" :depends-on ("signal"))
+ (:file "connect" :depends-on ("slot"))))
+ (:file "string-list" :depends-on ("qt" "lib" "qstring"))
+ (:file "variant" :depends-on ("qt" "qstring" "lisp-object"))
+ (:file "properties" :depends-on ("variant"))))))
+
+(defmethod asdf:perform ((operation test-op) (c (eql (find-system :qt))))
+ (operate 'asdf:load-op :qt.tests)
+ (operate 'asdf:test-op :qt.tests))
hunk ./src/qt.lisp 35
- #-mudballs
hunk ./test.lisp 3
-# do not use --script to allow loading mudballs with ${HOME}/.sbclrc
hunk ./test.lisp 6
-
-(in-package :sysdef-user)
-
-(defun load-sysdef (pathname system)
- (load pathname)
- (setf (mb.sysdef::pathname-of (find-system system)) pathname))
-
-(defun load-sysdef-file (system-name)
- "Loads a mbd file in the current directory."
- (load-sysdef (make-pathname :defaults *default-pathname-defaults*
- :name (string-downcase system-name)
- :type "mbd")
- system-name))
-
-(load-sysdef-file :qt)
-(mb:clean :qt)
-(mb:test :qt)
+(asdf:operate 'asdf:load-op :qt)
+(asdf:operate 'asdf:test-op :qt)
changepref test
sh ./test.lisp
Sun Dec 13 11:50:24 CET 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Install msg-handler also when starting from an image
hunk ./src/msg-handler.lisp 23
-(eval-when (:load-toplevel)
+(eval-startup (:load-toplevel)
hunk ./src/qt.lisp 31
- (*qt-smoke* "qt_Smoke")
+ (*qt-smoke* "qt_Smoke")
hunk ./src/qt.lisp 34
-
Sun Dec 13 11:49:35 CET 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Convert C++ exceptions to a qFatal
hunk ./src/lib/qt-smoke.cpp 10
+#include <exception>
+
+static void
+terminate()
+{
+ qFatal("caught an exception.");
+}
+
hunk ./src/lib/qt-smoke.cpp 31
+ std::set_terminate(terminate);
Wed Sep 9 15:18:08 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Cleanup msg-handler
hunk ./src/msg-handler.lisp 3
-(cffi:defcenum qt-msg-type
- (:debug-message)
- (:warning-message)
- (:critical-message)
- (:fatal-message))
+;; FIXME Determine the actual size of the QtMsgType enum.
+(cffi:defctype qt-msg-type :int)
hunk ./src/msg-handler.lisp 8
-;; Smokegenerator
+
hunk ./src/msg-handler.lisp 16
- (:debug-message
- (write-string "qDebug: " *debug-io*)
- (write-line message *debug-io*))
- (:warning-message (warn message))
- (:critical-message (cerror "Ignore" "~A" message))
- (:fatal-message (error message))))
-
-(defun register-msg-handler ()
- (with-foreign-object (handler :pointer)
- (setf (mem-ref handler :pointer) (callback qt-msg-handler))
- (qt:q-install-msg-handler handler)))
+ (#.(value qt:+qt-debug-msg+)
+ (write-string "qDebug: " *debug-io*)
+ (write-line message *debug-io*))
+ (#.(value qt:+qt-warning-msg+) (warn message))
+ (#.(value qt:+qt-critical-msg+) (cerror "Ignore" "~A" message))
+ (#.(value qt:+qt-fatal-msg+) (error message))))
hunk ./src/msg-handler.lisp 24
- (register-msg-handler))
+ (qt:q-install-msg-handler (callback qt-msg-handler)))
Wed Sep 2 14:00:35 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Better Lisp vector to QList<*> conversion.
hunk ./src/list.lisp 3
-(defmacro define-qlist-wrapper (type-name &optional c-name)
+(defmacro define-qlist-wrapper (type-name element-type &optional c-name)
hunk ./src/list.lisp 49
- (loop for element in list do
+ (loop for element across list do
hunk ./src/list.lisp 51
- qlist (pointer (make-instance ',type :args (list element)))))
+ qlist (pointer (make-instance ',element-type :args (list element)))))
hunk ./src/list.lisp 55
+ (defun ,(symbolicate list-type '-p) (list)
+ (every #'(lambda (element)
+ (typep element ',element-type))
+ list))
hunk ./src/list.lisp 62
- list ;; FIXME allow sequence and define element type
+ ;; FIXME allow sequence
+ (and (vector ,element-type)
+ (satisfies ,(symbolicate list-type '-p)))
hunk ./src/list.lisp 67
-(define-qlist-wrapper "QVariant")
-(define-qlist-wrapper ("QObject*" "QWidget*") "void")
-(define-qlist-wrapper "QByteArray")
+;; FIXME it would be nice to have QList<QVariant> as fallback for any
+;; list we can not convert otherwise. e.g.: '("a" 1)
+(define-qlist-wrapper "QVariant" qt:variant)
+
+(define-qlist-wrapper ("QObject*" "QWidget*") qt:object "void")
+(define-qlist-wrapper "QByteArray" qt:byte-array)
hunk ./src/signal-slot/signal.lisp 91
-;;; The first element of args would be used for the return value by
-;;; QMetaObject::invokeMethod(), but for signal-slot connection it is
-;;; ignored.
+ ;;; The first element of args would be used for the return value by
+ ;;; QMetaObject::invokeMethod(), but for signal-slot connection it is
+ ;;; ignored.
hunk ./src/signal-slot/signal.lisp 96
- (cffi:with-foreign-object (args :pointer (1+ (length arguments)))
+ (with-foreign-object (args :pointer (1+ (length arguments)))
hunk ./src/string-list.lisp 43
+(defun string-list-p (sequence)
+ (every #'stringp sequence))
+
hunk ./src/string-list.lisp 47
- (vector string) coerce-string-list)
+ (and (vector string)
+ (satisfies string-list-p))
+ coerce-string-list)
Thu Aug 27 10:37:36 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Update to the new smokegenerator.
hunk ./qt.mbd 54
- ("msg-handler" (:needs "lib"))
+ ("msg-handler" (:needs "lib" "qt"))
hunk ./src/msg-handler.lisp 11
+;; Smokegenerator
+(define-pointer-typedef "void(*)(QtMsgType,const char*)" foreign-pointer)
+(define-pointer-typedef "unsigned char*" foreign-pointer)
hunk ./src/object.lisp 14
-(eval-startup (:load-toplevel :compile-toplevel :execute)
- (let ((object (make-instance 'qt:object)))
- (defmethod cxx:static-meta-object ((class (eql (find-class 'qt:object))))
- "No OBJECT.STATIC-META-OBJECT (r558420)."
- (cxx:meta-object object))))
-
hunk ./src/object.lisp 37
- (print-unreadable-object (object stream :type t :identity t))
hunk ./src/object.lisp 38
+ (when (smoke::const-p object)
+ (princ "CONST " stream)))
+ (print-unreadable-object (object stream :type t :identity t)
+ (when (smoke::const-p object)
+ (princ "CONST " stream))
hunk ./src/object.lisp 86
-(eval-startup ()
+(eval-startup (:compile-toplevel :execute)
hunk ./src/object.lisp 93
+(defvar *toplevel-objects* nil)
+
hunk ./src/object.lisp 119
- (smoke::transfer-ownership-to parent (ensure-smoke-parent parent)))
+ (if (null-pointer-p (smoke:pointer (cxx:parent parent)))
+ (push parent *toplevel-objects*)
+ (smoke::transfer-ownership-to parent (ensure-smoke-parent parent))))
hunk ./src/operator.lisp 2
+(declaim (optimize (debug 3)))
hunk ./src/operator.lisp 10
- (handler-case (qt:operator== object o)
- (smoke::no-applicable-cxx-method ()
- (cxx:operator== object o))))
+ (if (typep object 'smoke::smoke-standard-object)
+ (handler-case (qt:operator== object o)
+ (smoke::no-applicable-cxx-method ()
+ (cxx:operator== object o)))
+ (qt:operator== object o)))
hunk ./src/operator.lisp 94
- ;; FIXME smoke generates no destructor for QByteRef
- ;; kaylptusCxxToSmoke.pm 954:
- ;; # Also, if the class has no explicit destructor, generate a default one.
- ;; if ( !$hasDestructor && !$hasPrivatePureVirtual && !$isGlobalSpace && $classNode->{NodeType} ne 'namespace' ) {
- ;; > $hasPublicDestructor = 1;
- ;; > $hasPublicProtectedConstructor = 1;
- ;; [_$_]
- ;; RESOLUTION:
- ;; wait for KDE 4.4 -- the new smoke_generator should fix this.
hunk ./src/qstring.lisp 28
- "data")))
- (defmethod cxx:data ((array qt:byte-array))
+ "constData")))
+ (defmethod cxx:const-data ((array qt:byte-array))
hunk ./src/qstring.lisp 36
- (cxx:data (make-instance 'qt:byte-array
- :pointer (qt-smoke-qstring-to-byte-array qstring))))
+ (cxx:const-data (make-instance 'qt:byte-array
+ :pointer (qt-smoke-qstring-to-byte-array qstring))))
hunk ./src/qstring.lisp 55
- (prin1 (cxx:data object) stream))))
+ (when (smoke::const-p object)
+ (princ "CONST " stream))
+ (prin1 (cxx:const-data object) stream))))
hunk ./src/signal-slot/connect.lisp 117
- (or type qt:+auto-connection+))
+ (or type qt:+auto-connection+))
hunk ./src/signal-slot/connect.lisp 199
- (value qt:+auto-connection+)
- (value type))
+ qt:+auto-connection+
+ type)
Sun Aug 2 13:29:13 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix double space when printing a qt:object.
hunk ./src/object.lisp 42
- (print-unreadable-object (object stream :type t :identity t)
- (princ (cxx:object-name object) stream))))
+ (if (string= "" (cxx:object-name object))
+ (print-unreadable-object (object stream :type t :identity t))
+ (print-unreadable-object (object stream :type t :identity t)
+ (princ (cxx:object-name object) stream)))))
+
+(defmethod print-object ((object qt:meta-object) stream)
+ (if (or (not (slot-boundp object 'pointer))
+ (null-pointer-p (pointer object)))
+ (call-next-method)
+ (print-unreadable-object (object stream :type t :identity t)
+ (princ (cxx:class-name object) stream))))
hunk ./src/qstring.lisp 51
+(defmethod print-object ((object qt:byte-array) stream)
+ (if (null-pointer-p (pointer object))
+ (call-next-method)
+ (print-unreadable-object (object stream :type t :identity t)
+ (prin1 (cxx:data object) stream))))
+
Sun Aug 2 13:29:02 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* qt:event upcasting cleanup
hunk ./qt.mbd 48
- ("object" (:needs "qt" "signal-slot" "qstring"))
+ ("event" (:needs "qt"))
+ ("object" (:needs "qt" "signal-slot" "qstring" "event"))
addfile ./src/event.lisp
hunk ./src/event.lisp 1
+(in-package :cl-smoke.qt-impl)
+
+(defun cast-event (event)
+ (enum-case (cxx:type event)
+ ((qt:event.+child-added+ qt:event.+child-removed+
+ qt:event.+child-polished+)
+ (setf (slot-value event 'smoke::pointer)
+ (smoke::upcast event (find-class 'qt:child-event)))
+ (change-class event 'qt:child-event)))
+ event)
hunk ./src/object.lisp 198
- (event (make-instance 'qt:event
- :pointer (cffi:mem-aref data :pointer 1))))
+ (event (cast-event
+ (make-instance 'qt:event
+ :pointer (cffi:mem-aref data :pointer 1)))))
hunk ./src/object.lisp 203
- (let ((child-event (make-instance 'qt:child-event
- :pointer
- (smoke::upcast event (find-class 'qt:child-event)))))
- (tg:cancel-finalization (cxx:child child-event))
- (when (smoke::has-pointer-p (smoke::pointer (cxx:child child-event)))
- (unless receiver
- (setf receiver (ensure-smoke-parent (cxx:child child-event))))
- (smoke::transfer-ownership-to (cxx:child child-event) receiver))))
+ (tg:cancel-finalization (cxx:child event))
+ (when (smoke::has-pointer-p (smoke::pointer (cxx:child event)))
+ (unless receiver
+ (setf receiver (ensure-smoke-parent (cxx:child event))))
+ (smoke::transfer-ownership-to (cxx:child event) receiver)))
hunk ./src/object.lisp 209
- (let* ((child-event (make-instance 'qt:child-event
- :pointer (smoke::upcast event
- (find-class 'qt:child-event)))))
- ;; We receive child removed events for any QObject, whether
- ;; it was constructed by Smoke or not. Only take ownership of
- ;; objects that have been constructed by Smoke.
- (when (smoke::has-pointer-p (smoke::pointer (cxx:child child-event)))
- (assert receiver)
- (smoke::take-ownership (cxx:child child-event) receiver))))))
+ ;; We receive child removed events for any QObject, whether
+ ;; it was constructed by Smoke or not. Only take ownership of
+ ;; objects that have been constructed by Smoke.
+ (when (smoke::has-pointer-p (smoke::pointer (cxx:child event)))
+ (assert receiver)
+ (smoke::take-ownership (cxx:child event) receiver)))))
Sun Aug 2 13:15:21 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Support ownership transfer to non smoke wrapped QObjects & cleanup C++ to Lisp translation.
hunk ./qt.mbd 48
- ("object" (:needs "qt"))
+ ("object" (:needs "qt" "signal-slot" "qstring"))
hunk ./src/application.lisp 43
- (cerror "Delete the active application." "Active application not created by QT:WITH-APP.")
+ (cerror (format nil "Delete the active application ~A."
+ (qt:core-application.instance))
+ "Active application not created by QT:WITH-APP.")
hunk ./src/lib/qt-smoke.cpp 17
- * @return @c true on success and @c false when the callback table is full.
+ * @return @c true on success and @c false otherwise
hunk ./src/lib/qt-smoke.cpp 28
+/** Returns the most specific QMetaObject of the QObject instance @a object.
+ * Used to determine the actual class of an object. Smoke can not be used since it calls the
+ * metaObject() of the class the method was called for.
+ *
+ * @param object A QObject
+ *
+ * @return QMetaObject
+ */
+CL_SMOKE_QT_EXPORT void*
+qt_smoke_meta_object(void* object)
+{
+ Q_ASSERT(object);
+ static_cast<QObject*>(object)->metaObject();[_^I_][_$_]
+}
+
+
hunk ./src/list.lisp 24
- (define-foreign-type ,list-type ()
- ()
- (:actual-type :pointer))
- (define-parse-method ,list-type ()
- (make-instance ',list-type))
- (eval-when (:load-toplevel :execute)
- ,@(loop for type-name in (ensure-list type-name) collect [_$_]
- `(smoke::add-type ,(format nil "const QList<~A>&" type-name)
- ',list-type))
- ,@(loop for type-name in (ensure-list type-name) collect [_$_]
- `(smoke::add-type ,(format nil "QList<~A>" type-name) ',list-type)))
+ ;; To Lisp
hunk ./src/list.lisp 26
- `(defmethod translate-from-foreign (list (type ,list-type))
+ `(defun ,(symbolicate 'from- type-name) (list-pointer)
hunk ./src/list.lisp 29
- list))))
+ list-pointer))))
hunk ./src/list.lisp 37
- list index)
- (smoke::make-smoke-type *smoke-module* ,type-name)))))))
- (defmethod free-translated-object (pointer (type ,list-type) param)
- (declare (ignore param))
- (,(symbolicate 'qt-smoke-free-list- type)
- pointer))
+ list-pointer index)
+ (smoke::make-smoke-type *smoke-module*
+ ,type-name)))))))
+ ,@(loop for type-name in (ensure-list type-name) collect
+ `(define-to-lisp-translation
+ (,(format nil "const QList<~A>&" type-name)
+ ,(format nil "QList<~A>" type-name))
+ ,(symbolicate 'from- type-name)
+ ,(symbolicate 'qt-smoke-free-list- type)))
+ ;; From Lisp
hunk ./src/list.lisp 52
- (smoke::make-cleanup-pointer
+ (make-cleanup-pointer
hunk ./src/list.lisp 57
- ,(format nil "QLIst<~A>" type-name))
+ ,(format nil "QList<~A>" type-name))
hunk ./src/msg-handler.lisp 9
+;; QtMsgHandler is a typedef for a pointer.
+(define-pointer-typedef "QtMsgHandler" foreign-pointer)
+
hunk ./src/object.lisp 3
-(smoke:eval-startup (:load-toplevel :compile-toplevel :execute)
+;; Smoke always calls the method of the class the object is assumed to
+;; be and not the most specific method like required for virtual
+;; methods. Thus we implement a virtual metaObject() method to
+;; determine the actual class. This is only needed for objects not
+;; constructed by Smoke, since otherwise we would know the most
+;; specific class.
+(defcfun qt-smoke-meta-object :pointer (object :pointer))
+(defun meta-object (object)
+ (make-instance 'qt:meta-object
+ :pointer (qt-smoke-meta-object (pointer object))))
+
+(eval-startup (:load-toplevel :compile-toplevel :execute)
hunk ./src/object.lisp 71
- (not (null-pointer-p (smoke::pointer-call (smoke::make-smoke-method-from-name (find-class 'qt:object)
- "parent")
- (smoke::pointer object)))))
+ (not (null-pointer-p (smoke::pointer-call
+ (smoke::make-smoke-method-from-name [_$_]
+ (find-class 'qt:object)
+ "parent")
+ (smoke::pointer object)))))
+
hunk ./src/object.lisp 78
-(defun find-smoke-parent (object)
- "Returns the first parent of OBJECT or OBJECT that is a Smoke class.
- (the destructed callback is called when the object is freed.)"
- ;; FIXME allow usage of non smoke objects by connecting to the
- ;; destroyed() signal.
+;; FIXME this might not be that smart.
+(eval-startup ()
+ (defparameter *destroyed-slot* (qt:make-slot
+ #'(lambda (object)
+ (foreign-funcall-pointer
+ (get-callback 'smoke::destructed)
+ () :pointer (smoke:pointer object))))))
+
+(defun ensure-smoke-parent (object)
hunk ./src/object.lisp 89
- (if (not (null-pointer-p (smoke::pointer parent)))
- (if (smoke::has-pointer-p (smoke::pointer parent))
- parent
- (find-smoke-parent parent))
- (error "No smoke parent found for ~A." object))))
+ (assert (not (null-pointer-p (smoke:pointer parent)))
+ ()
+ "The object ~A has not parent." object)
+ (unless (smoke::has-pointer-p (smoke:pointer parent))
+ ;; Before we ADD-OBJECT PARENT it must know its real class to
+ ;; prevent a clash when the same pointer is returned by a
+ ;; function with a more specific type.
+ (change-class parent [_$_]
+ ;; Note: there can be classes that are not known
+ ;; to Smoke, like KDE's OxygenStyle that might
+ ;; be seen by the event-notify callback. But
+ ;; it's probably save to assume the user will
+ ;; never use those.
+ (let ((class-name (cxx:class-name (meta-object parent))))
+ (smoke::lispify class-name (ecase (char class-name 0)
+ (#\Q :qt)
+ (#\K :kde)))))
+ (smoke::add-object parent)
+ (qt:connect (qt:get-signal parent "destroyed(QObject*)")
+ *destroyed-slot* qt:+direct-connection+)
+ (tg:cancel-finalization parent)
+ (smoke::transfer-ownership-to parent (ensure-smoke-parent parent)))
+ parent))
hunk ./src/object.lisp 125
- (find-smoke-parent object))))
+ (ensure-smoke-parent object))))
hunk ./src/object.lisp 128
- ((class-name :initarg :class-name
- :documentation "The class name of the gc'ed object.")
+ ((object-class :initarg :object-class
+ :documentation "The class of the gc'ed object.")
hunk ./src/object.lisp 132
- (format stream "The object ~A ~A of type cxx:class
-has a parent but got garbage collected."
- (slot-value condition 'class-name)
- (slot-value condition 'pointer)))))
+ (format stream "The object ~A ~A of type cxx:class
+has the parent but got garbage collected."
+ (slot-value condition 'object-class)
+ (slot-value condition 'pointer)))))
hunk ./src/object.lisp 137
-(smoke:eval-startup (:compile-toplevel :execute)
+(eval-startup (:compile-toplevel :execute)
hunk ./src/object.lisp 160
- :class-name (name class)
+ :object-class class
hunk ./src/object.lisp 208
- (setf receiver (find-smoke-parent (cxx:child child-event))))
+ (setf receiver (ensure-smoke-parent (cxx:child child-event))))
hunk ./src/object.lisp 229
- (error "The Qt event-notify callback table is full."))))
+ (error "Registering event-notify callback failed."))))
+
+(defun check-child-parent-ownership ()
+ (loop for parent being the hash-values of smoke::*object-map* do
+ (loop for child in (smoke::owned-objects parent) do
+ (when (typep child 'qt:object)
+ (assert (eql (cxx:parent child) parent)
+ (child parent)
+ "cl-smoke thinks ~A has the parent ~A, but ~A is its parent."
+ child parent (cxx:parent child))))))
hunk ./src/object.lisp 240
-(smoke:eval-startup ()
+(eval-startup ()
hunk ./src/qstring.lisp 13
-(define-foreign-type qstring ()
- ()
- (:actual-type :pointer))
-
-(defun setup-type-map ()
- (smoke::add-type "QString" 'qstring)
- (smoke::add-type "const QString&" 'qstring))
-
-(eval-when (:load-toplevel :execute)
- (setup-type-map))
-
hunk ./src/qstring.lisp 26
-(define-parse-method qstring ()
- (make-instance 'qstring))
-
hunk ./src/qstring.lisp 27
- (let ((method (smoke::make-smoke-method-from-name (find-class 'qt:byte-array)
- "data")))
- (defmethod cxx:data ((array qt:byte-array))
- (values ;; Discharge second return value (length of string)
- (foreign-string-to-lisp (smoke::pointer-call method
- (smoke::pointer array))
- :count (cxx:size array))))))
+ (let ((method (smoke::make-smoke-method-from-name (find-class 'qt:byte-array)
+ "data")))
+ (defmethod cxx:data ((array qt:byte-array))
+ (values ;; Discharge second return value (length of string)
+ (foreign-string-to-lisp (smoke::pointer-call method
+ (smoke::pointer array))
+ :count (cxx:size array))))))
hunk ./src/qstring.lisp 35
-(defmethod translate-from-foreign (string (type qstring))
+(defun from-qstring (qstring)
hunk ./src/qstring.lisp 37
- :pointer (qt-smoke-qstring-to-byte-array string))))
+ :pointer (qt-smoke-qstring-to-byte-array qstring))))
hunk ./src/qstring.lisp 39
-(defmethod free-translated-object (pointer (type qstring) param)
- (declare (ignore param))
- (qt-smoke-free-qstring pointer))
+(define-to-lisp-translation ("QString" "const QString&")
+ from-qstring qt-smoke-free-qstring)
hunk ./src/qstring.lisp 46
- #'(lambda (pointer)
- (free-translated-object pointer (make-instance 'qstring)
- nil))))
+ #'qt-smoke-free-qstring))
hunk ./src/signal-slot/connect.lisp 16
- (assert (subtypep signal-arg slot-arg))))
+ (if (typep signal-arg 'smoke::smoke-type)
+ (assert (smoke-type= signal-arg slot-arg))
+ (assert (subtypep signal-arg slot-arg)))))
hunk ./src/signal-slot/connect.lisp 44
- :args (list (signal-object sender))
+ :arg0 (signal-object sender)
hunk ./src/signal-slot/connect.lisp 47
+
hunk ./src/signal-slot/connect.lisp 69
+(defmethod print-object ((qt-signal qt-signal) stream)
+ (print-unreadable-object (qt-signal stream :type t :identity t)
+ (when (slot-boundp qt-signal 'sender)
+ (princ (qsender qt-signal) stream))
+ (princ " " stream)
+ (when (slot-boundp qt-signal 'name)
+ (princ (name qt-signal) stream))))
+
hunk ./src/signal-slot/connect.lisp 84
- (let ((slot (qt:make-slot #'(lambda (&rest args)
- (apply function (cxx:parent *this*)
- args)))))
- (cxx:set-parent slot receiver)
- slot)))
+ (make-instance 'qslot [_$_]
+ :arg0 receiver
+ :slot-function #'(lambda (&rest args)
+ (apply function (cxx:parent *this*)
+ args)))))
hunk ./src/signal-slot/connect.lisp 95
- (if (string= name normalized-name) ;; Avoid loop
+ (if (string= name normalized-name) ;; Avoid infinite recursion
hunk ./src/signal-slot/connect.lisp 109
- (if (string= name normalized-name) ;; Avoid loop
+ (if (string= name normalized-name) ;; Avoid infinite recursion
hunk ./src/signal-slot/connect.lisp 138
+ :arg0 (qsender qt-signal)
hunk ./src/signal-slot/connect.lisp 152
- (if (smoke::has-pointer-p (smoke:pointer (qsender qt-signal)))
- (setf (cxx:parent slot) (qsender qt-signal))
- ;; when QT-SIGNAL is not a Smoke instance.
- (progn
- (unless (qt:property-p (qsender qt-signal) 'connected-slots)
- (setf (qt:property (qsender qt-signal) 'connected-slots)
- (qt:make-lisp-variant (list))))
- (setf (qt:property (qsender qt-signal) 'connected-slots)
- (qt:make-lisp-variant
- (cons slot
- (qt:property (qsender qt-signal) 'connected-slots))))))
hunk ./src/signal-slot/slot.lisp 7
- :initform (error "no function specified")
+ :initform (error "no slot function specified")
hunk ./src/signal-slot/translate.lisp 55
- (0 (let ((cffi-type (smoke::get-type (name type))))
- (if (null cffi-type)
- (progn [_$_]
- pointer)
- (convert-from-foreign pointer
- cffi-type))))
+ (0 (if-let ((translation (gethash (name type) smoke::*to-lisp-translations*)))
+ ;; Do not free stack allocated stuff (e.g.: QString); that is the callers
+ ;; responisbility.
+ (funcall (car translation) pointer)
+ (error "Do not know how to convert the type ~A to Lisp." type)))
hunk ./src/string-list.lisp 20
-(define-foreign-type string-list ()
- ()
- (:actual-type :pointer))
-
-(eval-when (:load-toplevel)
- (smoke::add-type "QStringList" 'string-list)
- (smoke::add-type "const QStringList&" 'string-list))
-
-
-(define-parse-method string-list ()
- (make-instance 'string-list))
-
-(defmethod translate-to-foreign (sequence (type string-list))
- (let ((string-list (qt-smoke-make-string-list)))
- (map nil #'(lambda (string)
- (with-foreign-string ((data length) string :null-terminated-p nil)
- (qt-smoke-string-list-append string-list data length)))
- sequence)
- string-list))
-
-
-(defmethod translate-from-foreign (string-list (type string-list))
- (let ((vector (make-array (qt-smoke-string-list-size string-list))))
+(defun from-string-list (string-list)
+ (let ((vector (make-array (qt-smoke-string-list-size string-list)
+ :initial-element ""
+ :element-type 'string)))
hunk ./src/string-list.lisp 29
+ [_$_]
+(define-to-lisp-translation ("QStringList" "const QStringList&")
+ from-string-list qt-smoke-free-string-list)
hunk ./src/string-list.lisp 33
-(defmethod free-translated-object (string-list (type string-list) param)
- (declare (ignore param))
- (qt-smoke-free-string-list string-list))
-
-(defun coerce-string-list (list)
- (make-cleanup-pointer
- (translate-to-foreign list (make-instance 'string-list))
- #'(lambda (pointer)
- (free-translated-object pointer (make-instance 'string-list)
- nil))))
+(defun coerce-string-list (sequence)
+ (let ((string-list (qt-smoke-make-string-list)))
+ (map nil
+ #'(lambda (string)
+ (with-foreign-string ((data length) string :null-terminated-p nil)
+ (qt-smoke-string-list-append string-list data length)))
+ sequence)
+ (make-cleanup-pointer
+ string-list #'qt-smoke-free-string-list)))
Mon Jul 27 21:39:43 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix ownership transfer for lambda slot to no Smoke object.
hunk ./src/signal-slot/connect.lisp 127
- ;; Set the sender as the slots parent,
- ;; to ensure it does not get gc'ed.
- ;;
- ;; FIXME: unset parent on disconnect.
- ;; This no not critical because the slot
- ;; object is not accessible to the user,
- ;; who thus can not connect it to other
- ;; signals.
- :args (list (qsender qt-signal))
hunk ./src/signal-slot/connect.lisp 132
+ ;; Ensure that the slot is not gc'ed as long as the QT-SIGNAL
+ ;; exists.
+ ;;
+ ;; FIXME: remove on disconnect.
+ ;; This no not critical because the slot
+ ;; object is not accessible to the user,
+ ;; who thus can not connect it to other
+ ;; signals.
+ (if (smoke::has-pointer-p (smoke:pointer (qsender qt-signal)))
+ (setf (cxx:parent slot) (qsender qt-signal))
+ ;; when QT-SIGNAL is not a Smoke instance.
+ (progn
+ (unless (qt:property-p (qsender qt-signal) 'connected-slots)
+ (setf (qt:property (qsender qt-signal) 'connected-slots)
+ (qt:make-lisp-variant (list))))
+ (setf (qt:property (qsender qt-signal) 'connected-slots)
+ (qt:make-lisp-variant
+ (cons slot
+ (qt:property (qsender qt-signal) 'connected-slots))))))
Fri Jul 24 15:40:52 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Remove unnecessary #'cxx:data calls.
hunk ./src/signal-slot/signal.lisp 61
- (cxx:data (qt:meta-object.normalized-signature slot)))))
+ (qt:meta-object.normalized-signature slot))))
hunk ./src/signal-slot/slot.lisp 58
- (cxx:data (qt:meta-object.normalized-signature signal)))))
+ (qt:meta-object.normalized-signature signal))))
Thu Jul 23 00:21:01 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* support packages for symbols as property names.
hunk ./TODO 1
-* QApplication and KCmdLineArgs.init call exit() on e.g. "--help"
rmfile ./TODO
hunk ./qt.mbd 50
- ("application" (:needs "qt"))
+ ("application" (:needs "qt" "properties"))
hunk ./src/application.lisp 20
-(let ((argv (null-pointer))
- (argc (null-pointer)))
- (declare (cffi:foreign-pointer argv argc))
- (defun ensure-app (&optional [_$_]
- (application 'qt:application)
- (args #+sbcl sb-ext:*posix-argv*
- #+ccl ccl:*command-line-argument-list*
- #-(or sbcl ccl) (list (lisp-implementation-type))))
- "Constructs the global application object, when there is none,
+(defun ensure-app (&optional [_$_]
+ (application 'qt:application)
+ (args #+sbcl sb-ext:*posix-argv*
+ #+ccl ccl:*command-line-argument-list*
+ #-(or sbcl ccl) (list (lisp-implementation-type))))
+ "Constructs the global application object, when there is none,
hunk ./src/application.lisp 30
- (assert (not (null args))
- (args)
- "No program name supplied.")
- (if (qt:app-p)
- (progn
- (assert (typep (qt:app) (find-class application))
- (application)
- "The existing application object ~A is
+ (assert (not (null args))
+ (args)
+ "No program name supplied.")
+ (if (qt:app-p)
+ (progn
+ (assert (typep (qt:app) (find-class application))
+ (application)
+ "The existing application object ~A is
hunk ./src/application.lisp 39
- (values (qt:app) nil))
- (progn
- (when (not (null-pointer-p (smoke::pointer
- (qt:core-application.instance))))
- (cerror "Delete the active application." "Active application not created by QT:WITH-APP.")
- (smoke::delete-pointer (smoke::pointer (qt:core-application.instance))
- (find-class 'qt:core-application)))
- (foreign-free argv)
- (foreign-free argc)
+ (values (qt:app) nil))
+ (progn
+ (when (not (null-pointer-p (smoke::pointer
+ (qt:core-application.instance))))
+ (cerror "Delete the active application." "Active application not created by QT:WITH-APP.")
+ (smoke::delete-pointer (smoke::pointer (qt:core-application.instance))
+ (find-class 'qt:core-application)))
+ (let* ((argc (smoke:make-auto-pointer
+ (foreign-alloc :int :initial-element (length args))))
+ (argv (smoke:make-auto-pointer
+ (foreign-alloc :string :initial-contents args)))
+ (app (make-instance 'qt:application :args (list argc argv))))
+ ;; argc and argv must remain valid during the lifetime of APP.
+ (setf (qt:property app 'cmdline-args) [_$_]
+ (qt:make-lisp-variant (list argc argv)))
+ (tg:cancel-finalization app)
+ (values app t)))))
hunk ./src/application.lisp 57
- (setf argc (foreign-alloc :int :initial-element (length args)))
- (setf argv (foreign-alloc :string :initial-contents args))
- (let ((app (make-instance 'qt:application :args (list argc argv))))
- (tg:cancel-finalization app)
- (values app t)))))
- (defun kill-app ()
- (when (typep (qt:app) 'qt:application)
- (qt:application.close-all-windows)
- ;; widgets are only valid as long, as an application object exists.
- ;; QApplication::~QApplication() deletes all widgets in
- ;; QApplication::allWidgets().
- ;; [_$_]
- ;; see: qt4/src/gui/kernel/qapplication.cpp
- (loop for widget across (qt:application.all-widgets) do
- (trivial-garbage:cancel-finalization widget)))
- (cxx:quit (qt:app))
- (setf *widgets* nil)
- ;; Call the destructor; -> destructed callback is called,
- ;; (~QApplication() is virtual) which takes care of cleanup
- ;; on the Lisp side.
- (smoke::delete-pointer (smoke::pointer (qt:app)) (class-of (qt:app)))
- (setf (slot-value (qt:app) 'pointer) (null-pointer))
- (makunbound '*app*)))
+(defun kill-app ()
+ (when (typep (qt:app) 'qt:application)
+ (qt:application.close-all-windows)
+ ;; widgets are only valid as long, as an application object
+ ;; exists. QApplication::~QApplication() deletes all widgets in
+ ;; QApplication::allWidgets().
+ ;; [_$_]
+ ;; see: qt4/src/gui/kernel/qapplication.cpp
+ (loop for widget across (qt:application.all-widgets) do
+ (tg:cancel-finalization widget)))
+ (cxx:quit (qt:app))
+ (setf *widgets* nil)
+ ;; Call the destructor; -> destructed callback is called,
+ ;; (~QApplication() is virtual) which takes care of cleanup on the
+ ;; Lisp side.
+ (smoke::delete-pointer (smoke:pointer (qt:app)) (class-of (qt:app)))
+ (setf (slot-value (qt:app) 'pointer) (null-pointer))
+ (makunbound '*app*))
hunk ./src/object.lisp 102
-(defparameter *get-parent*
- (smoke::make-smoke-method-from-name (find-class 'qt:object) "parent"))
- ;; FIXME this leaks memory when QCoreApplication::exec is never called,
- ;; beause then, deleteLater has no effect.
-(defparameter *delete-later*
- (smoke::make-smoke-method-from-name (find-class 'qt:object) "deleteLater")))
+ (defparameter *get-parent*
+ (smoke::make-smoke-method-from-name (find-class 'qt:object) "parent"))
+
+ ;; FIXME this leaks memory when QCoreApplication::exec() is never
+ ;; called, beause then, deleteLater() has no effect.
+ (defparameter *delete-later*
+ (smoke::make-smoke-method-from-name (find-class 'qt:object) "deleteLater")))
hunk ./src/object.lisp 141
-;;; The event-notify callback get called by QCoreApplication,
-;;; on notification of an event.
+;;; The event-notify callback get called by QCoreApplication, on
+;;; notification of an event.
+;;;
+;;; The DATA argument is an array of size three, containing the
+;;; pointers:
hunk ./src/object.lisp 147
-;;; The DATA argument is an array of size three, containing the pointers:
hunk ./src/object.lisp 155
-;;; See: QCoreApplication::notifyInternal(QObject *receiver, QEvent *event)
+;;; See: QCoreApplication::notifyInternal(QObject *receiver, QEvent
+;;; *event)
hunk ./src/object.lisp 179
- ;; it was constructed by Smoke or not. Only take ownership of objects
- ;; that have been constructed by Smoke.
+ ;; it was constructed by Smoke or not. Only take ownership of
+ ;; objects that have been constructed by Smoke.
hunk ./src/operator.lisp 98
+ ;; RESOLUTION:
+ ;; wait for KDE 4.4 -- the new smoke_generator should fix this.
hunk ./src/painter.lisp 8
-still active and not yet garbage collected painters."
- `(let ((,painter (make-instance 'qt:painter :args (list ,paint-device))))
+still active and not yet garbage collected painters in CXX:PAINT-EVENT."
+ `(let ((,painter (make-instance 'qt:painter :arg0 ,paint-device)))
hunk ./src/properties.lisp 5
- (smoke::lisp-to-cxx (symbol-name symbol)))
+ (if (eq (symbol-package symbol)
+ (find-package :keyword))
+ (smoke::lisp-to-cxx (symbol-name symbol))
+ (concatenate 'string
+ (package-name (symbol-package symbol))
+ "::"
+ (symbol-name symbol))))
+
+(defun property-package (name)
+ (let ((package-end (search "::" name)))
+ (if package-end
+ (values [_$_]
+ (find-package (intern (subseq name 0 package-end) :keyword))
+ (+ 2 package-end))
+ (values (find-package :keyword) 0))))
+
+(defun lispify-property-name (name)
+ (multiple-value-bind (package name-start)
+ (property-package name)
+ (if (= 0 name-start)
+ (smoke::lispify name package)
+ (intern (subseq name name-start) package))))
hunk ./src/properties.lisp 36
+ (declare (type qt:object object)
+ (type (or string symbol) name))
+ (assert (qt:property-p object name)
+ (object name)
+ "~A has no property ~A." object name)
hunk ./src/properties.lisp 43
-
hunk ./src/properties.lisp 44
- (cxx:set-property object (property-name name)
- (make-instance 'qt:variant
- :args (list new-value)))
+ (declare (type qt:object object)
+ (type (or string symbol) name))
+ (cxx:set-property object (property-name name)
+ (make-instance 'qt:variant :arg0 new-value))
hunk ./src/properties.lisp 52
+ (declare (type qt:object object)
+ (type (or string symbol) name))
hunk ./src/properties.lisp 58
+ (declare (type qt:object object)
+ (type (or string symbol) name))
hunk ./src/properties.lisp 66
- collect (smoke::lispify (cxx:name (cxx:property meta-object index)))))
+ collect (lispify-property-name (cxx:name (cxx:property meta-object index)))))
+
+(defun sort-symbols (symbols)
+ (sort symbols
+ #'(lambda (a b)
+ (string<= (write-to-string a) (write-to-string b)))))
hunk ./src/properties.lisp 76
- (meta-object-properties (cxx:static-meta-object class)))
+ (sort-symbols
+ (meta-object-properties (cxx:static-meta-object class))))
hunk ./src/properties.lisp 89
- (map 'list (compose #'smoke::lispify #'cxx:data)
+ (map 'list (compose #'lispify-property-name #'cxx:data)
hunk ./src/properties.lisp 94
- (nconc (dynamic-properties object)
- (meta-object-properties (cxx:meta-object object))))
+ (declare (type qt:object object))
+ (sort-symbols
+ (nconc (dynamic-properties object)
+ (meta-object-properties (cxx:meta-object object)))))
hunk ./src/qstring.lisp 25
-;;; e.g.
+;;; e.g.:
hunk ./src/qstring.lisp 30
+;;; Use emacs 23 for better unicode support.
hunk ./src/qstring.lisp 37
-
hunk ./src/signal-slot/connect.lisp 129
- ;; FIXME: unset parent on disconnect
- ;; this no not critical because the slot object
- ;; is hidden from the user, who thus can not
- ;; connect it to other signals.
+ ;;
+ ;; FIXME: unset parent on disconnect.
+ ;; This no not critical because the slot
+ ;; object is not accessible to the user,
+ ;; who thus can not connect it to other
+ ;; signals.
hunk ./src/signal-slot/signal.lisp 51
- (apply #'emit (signal-object object) args))) [_$_]
- )
+ (apply #'emit (signal-object object) args))))
hunk ./src/signal-slot/signal.lisp 55
- ;; For efficiency assume that SLOT is normalized and fallback
- ;; to normalizing when not. (Just like Qt does.)
+ ;; For efficiency assume that SLOT is normalized and fallback to
+ ;; normalizing when not. (Just like Qt does.)
hunk ./src/signal-slot/signal.lisp 71
- (smoke::make-cleanup-pointer (make-cxx-lisp-object object)
- #'qt-smoke-free-lisp-object))
+ (smoke:make-cleanup-pointer (make-cxx-lisp-object object)
+ #'qt-smoke-free-lisp-object))
hunk ./src/signal-slot/signal.lisp 91
-;;; The first element of args would be used for the return value
-;;; by QMetaObject::invokeMethod(), but for signal-slot connection
-;;; it is ignored.
+;;; The first element of args would be used for the return value by
+;;; QMetaObject::invokeMethod(), but for signal-slot connection it is
+;;; ignored.
hunk ./src/signal-slot/slot.lisp 52
- ;; For efficiency assume that SIGNAL is normalized and fallback
- ;; to normalizing when not. (Just like Qt does.)
+ ;; For efficiency assume that SIGNAL is normalized and fallback to
+ ;; normalizing when not. (Just like Qt does.)
hunk ./src/signal-slot/translate.lisp 16
- (push (find-type arguments (1+ pos) last-pos) argument-types)
- (setf last-pos pos))
+ (push (find-type arguments (1+ pos) last-pos) argument-types)
+ (setf last-pos pos))
hunk ./src/signal-slot/translate.lisp 49
- ;; By value means that they are allocated by the C++ signal
- ;; code and have dynamic extend in the slot. The C++ signal code
- ;; frees the object when the slot returns.
+ ;; By-value means that the object at POINTER is allocated by
+ ;; the C++ signal code and has dynamic extend in the
+ ;; slot. The C++ signal code frees the object when the slot
+ ;; returns.
hunk ./src/signal-slot/translate.lisp 79
- (arguments-to-lisp2 (inc-pointer arguments ;; index 0 is for the return value
- (foreign-type-size :pointer))
- types ()))
+ (arguments-to-lisp2
+ (inc-pointer arguments ;; index 0 is for the return value
+ (foreign-type-size :pointer))
+ types ()))
hunk ./src/signal-slot/translate.lisp 90
- (error "FOO");;qmetatype.+voidstar+
+ (error "Not implemented: pointer type.") ;;qmetatype.+voidstar+
hunk ./src/signal-slot/translate.lisp 103
- ;;FIXME free TYPES on error.
+ ;; FIXME free TYPES on error.
hunk ./src/variant.lisp 18
- (make-instance 'qt:variant :args (list value))
+ (make-instance 'qt:variant :arg0 value)
hunk ./src/variant.lisp 25
- (1 (make-instance 'qt:char :args (list (aref octets 0))))
+ (1 (make-instance 'qt:char :arg0 (aref octets 0)))
hunk ./src/variant.lisp 27
- (aref octets 1))))
+ (aref octets 1))))
hunk ./src/variant.lisp 37
- "Returns the lisp character represented by CHAR."
+ "Returns the Lisp character represented by CHAR."
hunk ./src/variant.lisp 57
-;; FIXME include in MAKE-VARIANT?
+;; FIXME include in MAKE-VARIANT? how??
hunk ./src/variant.lisp 61
-The variant contains the actual Lisp object
+The variant contains the actual Lisp object VALUE
Wed Jul 8 22:55:24 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* The smoke call stack is now a struct -> adapt.
hunk ./src/object.lisp 75
- (error "No smoke parent found."))))
+ (error "No smoke parent found for ~A." object))))
hunk ./src/signal-slot/signal.lisp 106
- (mem-aref (pointer stack)
+ (mem-aref (smoke::call-stack-pointer stack)
hunk ./src/signal-slot/signal.lisp 111
- (mem-aref (pointer stack)
+ (mem-aref (smoke::call-stack-pointer stack)
hunk ./src/signal-slot/translate.lisp 5
- [_$_]
+
Fri Jul 3 12:14:09 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix nested #'qt:exec
hunk ./src/application.lisp 123
- (cxx:exec (qt:app)))
+ (let ((qt:*exec-p* nil))
+ (cxx:exec (qt:app))))
Thu Jul 2 21:37:42 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix potential lisp-object ID generation overflow for excessive lisp-object creation.
hunk ./src/lib/lisp-object.cpp 32
-lisp_object::data::data(int id)
+lisp_object::data::data(unsigned int id)
hunk ./src/lib/lisp-object.cpp 64
-lisp_object::lisp_object(int id)
+lisp_object::lisp_object(unsigned int id)
hunk ./src/lib/lisp-object.cpp 91
-lisp_object::set_id(int id)
+lisp_object::set_id(unsigned int id)
hunk ./src/lib/lisp-object.cpp 124
-int
+unsigned int
hunk ./src/lib/lisp-object.cpp 138
-qt_smoke_lisp_object_set(const void* object)
+qt_smoke_lisp_object_is_set(const void* object)
hunk ./src/lib/lisp-object.cpp 150
-qt_smoke_make_lisp_object(int id)
+qt_smoke_make_lisp_object(unsigned int id)
hunk ./src/lib/lisp-object.h 16
- CL_SMOKE_QT_EXPORT int
+ CL_SMOKE_QT_EXPORT unsigned int
hunk ./src/lib/lisp-object.h 20
- qt_smoke_lisp_object_set(const void* object);
+ qt_smoke_lisp_object_is_set(const void* object);
hunk ./src/lib/lisp-object.h 23
- qt_smoke_make_lisp_object(int id);
+ qt_smoke_make_lisp_object(unsigned int id);
hunk ./src/lib/lisp-object.h 38
- typedef void (*destructor)(int id);
+ typedef void (*destructor)(unsigned int id);
hunk ./src/lib/lisp-object.h 42
- lisp_object(int id);
+ lisp_object(unsigned int id);
hunk ./src/lib/lisp-object.h 46
- inline int
+ inline unsigned int
hunk ./src/lib/lisp-object.h 51
- set_id(int id);
+ set_id(unsigned int id);
hunk ./src/lib/lisp-object.h 64
- data(int id);
+ data(unsigned int id);
hunk ./src/lib/lisp-object.h 66
- int id;
+ unsigned int id;
hunk ./src/lisp-object.lisp 7
+ (declare (type (smoke::c-integer :unsigned-int) id))
hunk ./src/lisp-object.lisp 10
- (incf id)))
-
+ (loop do
+ (setf id
+ (logand (1- (expt 2 (* 8 (foreign-type-size :unsigned-int) )))
+ (1+ id)))
+ while (nth-value 1 (gethash id *cxx-lisp-objects*)))
+ id))
+ [_$_]
hunk ./src/lisp-object.lisp 20
-(defcfun qt-smoke-lisp-object-id :int
+(defcfun qt-smoke-lisp-object-id :unsigned-int
hunk ./src/lisp-object.lisp 23
-(defcfun qt-smoke-lisp-object-set :int
+(defcfun qt-smoke-lisp-object-is-set :int
hunk ./src/lisp-object.lisp 27
- (id :int))
+ (id :unsigned-int))
hunk ./src/lisp-object.lisp 33
- ((id :int))
+ ((id :unsigned-int))
Thu Jul 2 21:12:45 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* move emit slot code to new function ACTIVATE & image startup fix for STATIC-META-OBJECT
hunk ./src/object.lisp 3
-(let ((object (make-instance 'qt:object)))
- (defmethod cxx:static-meta-object ((class (eql (find-class 'qt:object))))
- "No OBJECT.STATIC-META-OBJECT (r558420)."
- (cxx:meta-object object))
- (defmethod cxx:static-meta-object ((class cxx:class))
- (cxx:static-meta-object (smoke::find-smoke-class class))))
+(smoke:eval-startup (:load-toplevel :compile-toplevel :execute)
+ (let ((object (make-instance 'qt:object)))
+ (defmethod cxx:static-meta-object ((class (eql (find-class 'qt:object))))
+ "No OBJECT.STATIC-META-OBJECT (r558420)."
+ (cxx:meta-object object))))
+
+(defmethod cxx:static-meta-object ((class cxx:class))
+ (cxx:static-meta-object (smoke::find-smoke-class class)))
hunk ./src/signal-slot/signal.lisp 89
+ (activate qsignal (id qsignal) (argument-types qsignal) arguments))
+
+(defun activate (object id types arguments)
hunk ./src/signal-slot/signal.lisp 95
- (let ((types (argument-types qsignal)))
- (smoke::with-stack (stack (convert-arguments arguments types)
- types)
- (cffi:with-foreign-object (args :pointer (1+ (length arguments)))
- (loop for i from 1 to (smoke::size stack)
- for type in (argument-types qsignal)
- do
+ (smoke::with-stack (stack (convert-arguments arguments types)
+ types)
+ (cffi:with-foreign-object (args :pointer (1+ (length arguments)))
+ (loop for i from 1 to (smoke::size stack)
+ for type in types
+ do
hunk ./src/signal-slot/signal.lisp 115
- (setf (mem-aref args :pointer 0)
- (null-pointer))
- (qt:meta-object.activate qsignal (cxx:meta-object qsignal)
- (id qsignal)
- args)))))
+ (setf (mem-aref args :pointer 0)
+ (null-pointer))
+ (qt:meta-object.activate object id args))))
Wed Jul 1 12:58:06 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Break API compatibility for qt:with-app and qt:exec & spellcheck
hunk ./src/application.lisp 3
-(declaim (optimize (debug 3)))
-
hunk ./src/application.lisp 20
-
hunk ./src/application.lisp 69
- ;; Call the destructer; -> destructed callback is called,
+ ;; Call the destructor; -> destructed callback is called,
hunk ./src/application.lisp 84
-(defmacro qt:with-app (&body body)
+(defmacro qt:with-app (options &body body)
hunk ./src/application.lisp 88
-APP.
+QT:APP.
hunk ./src/application.lisp 94
+ (assert (null options)
+ (options)
+ "Currently no options can be passed to QT:WITH-APP.")
hunk ./src/application.lisp 98
- ,@body))
+ ,@body))
hunk ./src/application.lisp 100
-(defmacro qt:with-core-app (&body body)
+(defmacro qt:with-core-app (options &body body)
+ (assert (null options)
+ (options)
+ "Currently no options can be passed to QT:WITH-CORE-APP.")
hunk ./src/application.lisp 105
- ,@body))
+ ,@body))
hunk ./src/application.lisp 107
-
-(defun qt:exec (&rest widgets)
- "Executes APP."
- (setf *widgets* (append widgets *widgets*))
- (when qt:*exec-p*
- (restart-bind ((qt::abort-app #'(lambda ()
- (cxx:quit (qt:app))
- (invoke-restart (find-restart 'continue)))
- :report-function
- #'(lambda (stream)
- (format stream "Return from the application event loop."))
- :test-function
- #'(lambda (condition)
- (declare (ignore condition))
- (and (qt:app-p)
- (find-restart 'continue)))))
- (cxx:exec (qt:app)))))
+(defun qt:exec ()
+ "Executes APP. When QT:*EXEC-P* is false it returns immediately
+and transfers the ownership of the top-level widgets to the qt:application
+instance."
+ (if qt:*exec-p*
+ (restart-bind ((qt::abort-app #'(lambda ()
+ (cxx:quit (qt:app))
+ (invoke-restart (find-restart 'continue)))
+ :report-function
+ #'(lambda (stream)
+ (format stream "Return from the application event loop."))
+ :test-function
+ #'(lambda (condition)
+ (declare (ignore condition))
+ (and (qt:app-p)
+ (find-restart 'continue)))))
+ (cxx:exec (qt:app)))
+ (when (typep (qt:app) 'qt:application)
+ (setf *widgets* (qt:application.top-level-widgets)))))
hunk ./src/lisp-object.lisp 54
-When beeing received as an argument by a slot,
+When being received as an argument by a slot,
hunk ./src/list.lisp 31
- `(smoke::add-type ,(format nil "const QList<~A>&" type-name)
- ',list-type))
+ `(smoke::add-type ,(format nil "const QList<~A>&" type-name)
+ ',list-type))
hunk ./src/list.lisp 34
- `(smoke::add-type ,(format nil "QList<~A>" type-name) ',list-type)))
+ `(smoke::add-type ,(format nil "QList<~A>" type-name) ',list-type)))
hunk ./src/list.lisp 36
- `(defmethod translate-from-foreign (list (type ,list-type))
- (let ((vector (make-array (,(symbolicate 'qt-smoke-list-
- type '-size)
- list))))
- (dotimes (index (length vector) vector)
- (setf (aref vector index)
- ;; FIXME the retuned object is not wrapped by Smoke
- ;; -> change this? [_$_]
- (smoke::object-to-lisp
- (,(symbolicate 'qt-smoke-list-
- type '-at)
- list index)
- (smoke::make-smoke-type *smoke-module* ,type-name)))))))
+ `(defmethod translate-from-foreign (list (type ,list-type))
+ (let ((vector (make-array (,(symbolicate 'qt-smoke-list-
+ type '-size)
+ list))))
+ (dotimes (index (length vector) vector)
+ (setf (aref vector index)
+ ;; FIXME the returned object is not wrapped by Smoke
+ ;; -> change this? [_$_]
+ (smoke::object-to-lisp
+ (,(symbolicate 'qt-smoke-list-
+ type '-at)
+ list index)
+ (smoke::make-smoke-type *smoke-module* ,type-name)))))))
hunk ./src/list.lisp 62
- `(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
- ,(format nil "QLIst<~A>" type-name))
- list ;; FIXME allow seqence and define element type
- ,(symbolicate 'coerce- list-type))))))
+ `(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
+ ,(format nil "QLIst<~A>" type-name))
+ list ;; FIXME allow sequence and define element type
+ ,(symbolicate 'coerce- list-type))))))
hunk ./src/object.lisp 172
- ;; We receive child removed events for any QObject, wherter
- ;; it was construted by Smoke or not. Only take ownership of objects
+ ;; We receive child removed events for any QObject, whether
+ ;; it was constructed by Smoke or not. Only take ownership of objects
hunk ./src/ownership.lisp 77
-;; Relases ownership
+;; Releases ownership
hunk ./src/package.lisp 5
- (:use) ;; do not use :cl to prevent collition with TIME and CHAR
+ (:use) ;; do not use :cl to prevent collision with TIME and CHAR
hunk ./src/painter.lisp 5
- during the evaulation of BODY.
+ during the evaluation of BODY.
hunk ./src/painter.lisp 7
-Makes sure the painter ends after BODY; thus prevening problems with [_$_]
+Makes sure the painter ends after BODY; thus preventing problems with [_$_]
hunk ./src/qstring.lisp 24
-;;; make sure, that you have configured slime corretly.
+;;; make sure, that you have configured slime correctly.
hunk ./src/qstring.lisp 44
- (values ;; Discarge second return value (length of string)
+ (values ;; Discharge second return value (length of string)
hunk ./src/signal-slot/connect.lisp 130
- ;; this no not critical beause the slot object
+ ;; this no not critical because the slot object
hunk ./src/signal-slot/signal.lisp 2
-(declaim (optimize (debug 3)))
hunk ./src/signal-slot/signal.lisp 56
- ;; For efficency assume that SLOT is normalized and fallback
- ;; to normalzing when not. (Just like Qt does.)
+ ;; For efficiency assume that SLOT is normalized and fallback
+ ;; to normalizing when not. (Just like Qt does.)
hunk ./src/signal-slot/slot.lisp 33
+ (declare (ignore id))
hunk ./src/signal-slot/slot.lisp 52
- ;; For efficency assume that SIGNAL is normalized and fallback
- ;; to normalzing when not. (Just like Qt does.)
+ ;; For efficiency assume that SIGNAL is normalized and fallback
+ ;; to normalizing when not. (Just like Qt does.)
hunk ./src/signal-slot/translate.lisp 50
- ;; code and have dynamic extend in the slot. The C++ singal code
+ ;; code and have dynamic extend in the slot. The C++ signal code
hunk ./src/timer.lisp 28
+ (declare (ignore event))
Sun Jun 21 11:29:25 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* *SMOKE-MODULE* must be passed instead of *QT-SMOKE*.
hunk ./src/application.lisp 7
-(defvar *exec-p* t
+(defvar qt:*exec-p* t
hunk ./src/application.lisp 108
- (when *exec-p*
+ (when qt:*exec-p*
hunk ./src/list.lisp 48
- (smoke::make-smoke-type *qt-smoke* ,type-name)))))))
+ (smoke::make-smoke-type *smoke-module* ,type-name)))))))
hunk ./src/object.lisp 58
- (not (null-pointer-p (smoke::pointer-call (smoke::make-smoke-method (find-class 'qt:object)
+ (not (null-pointer-p (smoke::pointer-call (smoke::make-smoke-method-from-name (find-class 'qt:object)
hunk ./src/object.lisp 64
-(the destructed callback is called when the object is freed.)"
+ (the destructed callback is called when the object is freed.)"
hunk ./src/object.lisp 67
+ (declare (optimize (speed 3)))
hunk ./src/object.lisp 79
+ (declare (optimize (speed 3)))
hunk ./src/object.lisp 101
- (smoke::make-smoke-method (smoke::make-smoke-class
- *qt-smoke*
- "QObject")
- "parent"))
+ (smoke::make-smoke-method-from-name (find-class 'qt:object) "parent"))
hunk ./src/object.lisp 105
- (smoke::make-smoke-method (smoke::make-smoke-class
- *qt-smoke*
- "QObject")
- "deleteLater")))
-(defun print-object-to-string (object)
- (with-output-to-string (stream)
- (print-object object stream)))
+ (smoke::make-smoke-method-from-name (find-class 'qt:object) "deleteLater")))
hunk ./src/object.lisp 108
- "Delete the qt:object OBJECT,
+ "Delete the qt:object OBJECT,
hunk ./src/object.lisp 110
- (let ((pointer (pointer object))
- (class (class-of object))
- (next (call-next-method)))
- (if (typep (class-of object) 'cxx:class)
- #'(lambda ()
- (handler-case [_$_]
- (if (null-pointer-p (smoke::pointer-call *get-parent* pointer))
- (smoke::pointer-call *delete-later* pointer)
- (error (make-condition 'wrapper-gc
- :class-name (name class)
- :pointer pointer)))
- (error (condition)
- (smoke::report-finalize-error condition "qt:object wrap"
- (name class) pointer))))
- #'(lambda ()
- (handler-case [_$_]
- (if (null-pointer-p (smoke::pointer-call *get-parent* pointer))
+ (let ((pointer (pointer object))
+ (class (class-of object))
+ (next (call-next-method)))
+ (declare (function next))
+ (if (typep (class-of object) 'cxx:class)
+ #'(lambda ()
+ (declare (optimize (speed 3)))
+ (handler-case [_$_]
+ (if (null-pointer-p (smoke::pointer-call *get-parent* pointer))
+ (smoke::pointer-call *delete-later* pointer)
+ (error (make-condition 'wrapper-gc
+ :class-name (name class)
+ :pointer pointer)))
+ (error (condition)
+ (smoke::report-finalize-error condition "qt:object wrap"
+ (name class) pointer))))
+ #'(lambda ()
+ (declare (optimize (speed 3)))
+ (handler-case [_$_]
+ (if (null-pointer-p (smoke::pointer-call *get-parent* pointer))
hunk ./src/object.lisp 132
- (error (condition)
- (smoke::report-finalize-error condition "qt:object"
- (name class) pointer)))))))
+ (error (condition)
+ (smoke::report-finalize-error condition "qt:object"
+ (name class) pointer)))))))
hunk ./src/object.lisp 187
- (error "The event-notify callback table is full."))))
+ (error "The Qt event-notify callback table is full."))))
hunk ./src/qstring.lisp 41
-(let ((method (smoke::make-smoke-method (find-class 'qt:byte-array)
+ (let ((method (smoke::make-smoke-method-from-name (find-class 'qt:byte-array)
hunk ./src/signal-slot/connect.lisp 43
+ :argument-types (argument-types (signal-object sender))
hunk ./src/signal-slot/connect.lisp 48
- (types (arguments sender)))
+ (types (argument-types (signal-object sender))))
hunk ./src/signal-slot/translate.lisp 4
- (smoke::make-smoke-type *qt-smoke* (subseq name start end)))
+ (smoke::make-smoke-type *smoke-module* (subseq name start end)))
hunk ./src/signal-slot/translate.lisp 89
- (let ((type (meta-type.type (smoke::name smoke-type))))
+ (let ((type (qt:meta-type.type (smoke::name smoke-type))))
Thu Jun 11 20:50:26 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* The CLISP null pointer is NIL
hunk ./src/object.lisp 75
- &key pointer &allow-other-keys)
+ &key (pointer nil pointer-p) &allow-other-keys)
hunk ./src/object.lisp 78
- (when (and (null pointer)
+ (when (and (not pointer-p)
Thu Jun 11 16:59:48 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* :qt and :qt-impl packages to prevent collision with :cl symbols and fix object with non smoke parent.
hunk ./qt.mbd 14
- ())
+ ((package :initarg :package)))
hunk ./qt.mbd 37
- ("libqt-smoke-extra" sysdef.cmake:cmake-library)
+ ("libqt-smoke-extra" sysdef.cmake:cmake-library (:package :cl-smoke.qt-impl))
hunk ./src/application.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/application.lisp 10
-(defun app ()
+(defun qt:app ()
hunk ./src/application.lisp 13
- (assert (app-p)
+ (assert (qt:app-p)
hunk ./src/application.lisp 18
-(defun app-p ()
+(defun qt:app-p ()
hunk ./src/application.lisp 27
- (application 'application)
+ (application 'qt:application)
hunk ./src/application.lisp 39
- (if (app-p)
+ (if (qt:app-p)
hunk ./src/application.lisp 41
- (assert (typep (app) (find-class application))
+ (assert (typep (qt:app) (find-class application))
hunk ./src/application.lisp 44
-not of type ~A." (app) (find-class application))
- (values (app) nil))
+not of type ~A." (qt:app) (find-class application))
+ (values (qt:app) nil))
hunk ./src/application.lisp 47
- (assert (null-pointer-p (smoke::pointer (core-application.instance)))
- ()
- "Active QCoreApplication not created by QT:WITH-APP.")
+ (when (not (null-pointer-p (smoke::pointer
+ (qt:core-application.instance))))
+ (cerror "Delete the active application." "Active application not created by QT:WITH-APP.")
+ (smoke::delete-pointer (smoke::pointer (qt:core-application.instance))
+ (find-class 'qt:core-application)))
hunk ./src/application.lisp 61
- (when (typep (app) 'application)
- (application.close-all-windows)
+ (when (typep (qt:app) 'qt:application)
+ (qt:application.close-all-windows)
hunk ./src/application.lisp 68
- (loop for widget across (application.all-widgets) do
+ (loop for widget across (qt:application.all-widgets) do
hunk ./src/application.lisp 70
- (cxx:quit (app))
+ (cxx:quit (qt:app))
hunk ./src/application.lisp 75
- (smoke::delete-pointer (smoke::pointer (app)) (class-of (app)))
- (setf (slot-value (app) 'pointer) (null-pointer))
+ (smoke::delete-pointer (smoke::pointer (qt:app)) (class-of (qt:app)))
+ (setf (slot-value (qt:app) 'pointer) (null-pointer))
hunk ./src/application.lisp 87
-(defmacro with-app (&body body)
+(defmacro qt:with-app (&body body)
hunk ./src/application.lisp 97
- `(with-application ((ensure-app 'application) (kill-app))
+ `(with-application ((cl-smoke.qt-impl::ensure-app 'qt:application) (kill-app))
hunk ./src/application.lisp 100
-(defmacro with-core-app (&body body)
- `(with-application ((ensure-app 'core-application) (kill-app))
+(defmacro qt:with-core-app (&body body)
+ `(with-application ((cl-smoke.qt-impl::ensure-app 'qt:core-application) (kill-app))
hunk ./src/application.lisp 105
-(defun exec (&rest widgets)
+(defun qt:exec (&rest widgets)
hunk ./src/application.lisp 109
- (restart-bind ((abort-app #'(lambda ()
- (cxx:quit (app))
+ (restart-bind ((qt::abort-app #'(lambda ()
+ (cxx:quit (qt:app))
hunk ./src/application.lisp 118
- (and (app-p)
+ (and (qt:app-p)
hunk ./src/application.lisp 120
- (cxx:exec (app)))))
+ (cxx:exec (qt:app)))))
hunk ./src/i18n.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/i18n.lisp 3
-(defun tr (message &optional context)
+(defun qt:tr (message &optional context)
hunk ./src/i18n.lisp 17
-(defmacro with-translator ((base-name &rest paths) &body body)
+(defmacro qt:with-translator ((base-name &rest paths) &body body)
hunk ./src/i18n.lisp 23
- `(let ((,translator (make-instance 'translator)))
+ `(let ((,translator (make-instance 'qt:translator)))
hunk ./src/i18n.lisp 36
-(defmacro with-libqt-translator (&body body)
+(defmacro qt:with-libqt-translator (&body body)
hunk ./src/i18n.lisp 41
- `(let ((,translator (make-instance 'translator)))
+ `(let ((,translator (make-instance 'qt:translator)))
hunk ./src/i18n.lisp 49
-(defun search-file (name &rest paths)
+(defun qt:search-file (name &rest paths)
hunk ./src/lisp-object.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/lisp-object.lisp 36
- (smoke::value meta-type.+user+))
+ (smoke::value qt:meta-type.+user+))
hunk ./src/list.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/msg-handler.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/object.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/object.lisp 3
-(let ((object (make-instance 'object)))
- (defmethod cxx:static-meta-object ((class (eql (find-class 'object))))
+(let ((object (make-instance 'qt:object)))
+ (defmethod cxx:static-meta-object ((class (eql (find-class 'qt:object))))
hunk ./src/object.lisp 10
-(defmethod documentation :around ((class cxx:class)
- (doc-type t))
- (if (and (subtypep class (find-class 'object))
+(defmethod documentation :around ((class smoke::smoke-standard-class)
+ (doc-type (eql 't)))
+ (if (and (subtypep class (find-class 'qt:object))
hunk ./src/object.lisp 20
- (call-next-method) (sort (class-properties class) #'string<=)
+ (call-next-method) (sort (qt:class-direct-properties class) #'string<=)
hunk ./src/object.lisp 25
-(defmethod print-object ((object object) stream)
+(defmethod print-object ((object qt:object) stream)
hunk ./src/object.lisp 38
-(defun meta-object-signals (meta-object)
+(defun meta-object-signals (meta-object &key all)
hunk ./src/object.lisp 42
- (meta-object-methods meta-object))))
+ (meta-object-methods meta-object (not all)))))
hunk ./src/object.lisp 44
-(defun class-signals (class)
- (meta-object-signals (cxx:static-meta-object class)))
+(defun class-signals (class &key all)
+ (meta-object-signals (cxx:static-meta-object class) :all all))
hunk ./src/object.lisp 47
-(defun meta-object-slots (meta-object)
+(defun meta-object-slots (meta-object &key all)
hunk ./src/object.lisp 51
- (meta-object-methods meta-object))))
+ (meta-object-methods meta-object (not all)))))
hunk ./src/object.lisp 54
-(defun class-slots (class)
- (meta-object-slots (cxx:static-meta-object class)))
+(defun class-slots (class &key all)
+ (meta-object-slots (cxx:static-meta-object class) :all all))
hunk ./src/object.lisp 57
+(defun parent-p (object)
+ (not (null-pointer-p (smoke::pointer-call (smoke::make-smoke-method (find-class 'qt:object)
+ "parent")
+ (smoke::pointer object)))))
hunk ./src/object.lisp 62
-(defmethod initialize-instance :after ((object object)
+(defun find-smoke-parent (object)
+ "Returns the first parent of OBJECT or OBJECT that is a Smoke class.
+(the destructed callback is called when the object is freed.)"
+ ;; FIXME allow usage of non smoke objects by connecting to the
+ ;; destroyed() signal.
+ (let ((parent (cxx:parent object)))
+ (if (not (null-pointer-p (smoke::pointer parent)))
+ (if (smoke::has-pointer-p (smoke::pointer parent))
+ parent
+ (find-smoke-parent parent))
+ (error "No smoke parent found."))))
+
+(defmethod initialize-instance :after ((object qt:object)
hunk ./src/object.lisp 83
-; (typep (class-of object) 'cxx:class)
- (not (null-pointer-p (smoke::pointer (cxx:parent object)))))
- (smoke::transfer-ownership-to object (cxx:parent object))))
+ (parent-p object))
+ (smoke::transfer-ownership-to object
+ (find-smoke-parent object))))
hunk ./src/object.lisp 114
-(defmethod smoke::make-finalize ((object object))
+(defmethod smoke::make-finalize ((object qt:object))
hunk ./src/object.lisp 140
+
hunk ./src/object.lisp 160
- (event (make-instance 'event :pointer (cffi:mem-aref data :pointer 1))))
+ (event (make-instance 'qt:event
+ :pointer (cffi:mem-aref data :pointer 1))))
hunk ./src/object.lisp 163
- (event.+child-added+
- (let ((child-event (make-instance 'child-event
+ (qt:event.+child-added+
+ (let ((child-event (make-instance 'qt:child-event
hunk ./src/object.lisp 166
- (smoke::upcast event (find-class 'child-event)))))
+ (smoke::upcast event (find-class 'qt:child-event)))))
+ (tg:cancel-finalization (cxx:child child-event))
hunk ./src/object.lisp 169
- (assert receiver)
+ (unless receiver
+ (setf receiver (find-smoke-parent (cxx:child child-event))))
hunk ./src/object.lisp 172
- (event.+child-removed+
- (let* ((child-event (make-instance 'child-event
+ (qt:event.+child-removed+
+ (let* ((child-event (make-instance 'qt:child-event
hunk ./src/object.lisp 175
- (find-class 'child-event)))))
+ (find-class 'qt:child-event)))))
hunk ./src/operator.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/ownership.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/ownership.lisp 4
-(define-takes-ownership cxx:push ((undo-stack undo-stack) undo-command)
+(define-takes-ownership cxx:push ((undo-stack qt:undo-stack) undo-command)
hunk ./src/ownership.lisp 26
-(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
hunk ./src/ownership.lisp 29
-(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
hunk ./src/ownership.lisp 32
-(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
hunk ./src/ownership.lisp 35
-(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+(define-takes-ownership cxx:add-item ((layout qt:grid-layout) (item qt:layout-item)
hunk ./src/ownership.lisp 39
-(define-takes-ownership cxx:add-item ((layout layout) (item layout-item))
+(define-takes-ownership cxx:add-item ((layout qt:layout) (item qt:layout-item))
hunk ./src/ownership.lisp 44
-(define-takes-ownership cxx:register-editor ((factory item-editor-factory)
+(define-takes-ownership cxx:register-editor ((factory qt:item-editor-factory)
hunk ./src/ownership.lisp 49
-(define-takes-ownership cxx:set-child ((this standard-item) row colum item)
+(define-takes-ownership cxx:set-child ((this qt:standard-item) row colum item)
hunk ./src/ownership.lisp 51
-(define-takes-ownership cxx:set-child ((this standard-item) row item)
+(define-takes-ownership cxx:set-child ((this qt:standard-item) row item)
hunk ./src/ownership.lisp 53
-(define-takes-ownership cxx:set-horizontal-header-item ((this standard-item-model)
+(define-takes-ownership cxx:set-horizontal-header-item ((this qt:standard-item-model)
hunk ./src/ownership.lisp 56
-(define-takes-ownership cxx:set-vertical-header-item ((this standard-item-model)
+(define-takes-ownership cxx:set-vertical-header-item ((this qt:standard-item-model)
hunk ./src/ownership.lisp 59
-(define-takes-ownership cxx:set-item ((this standard-item-model)
+(define-takes-ownership cxx:set-item ((this qt:standard-item-model)
hunk ./src/ownership.lisp 62
-(define-takes-ownership cxx:set-item ((this standard-item-model)
+(define-takes-ownership cxx:set-item ((this qt:standard-item-model)
hunk ./src/ownership.lisp 65
-(define-takes-ownership cxx:set-item-prototype ((this standard-item-model)
+(define-takes-ownership cxx:set-item-prototype ((this qt:standard-item-model)
hunk ./src/package.lisp 1
-(defpackage :qt
- (:use :cl :smoke :cffi :bordeaux-threads :cxx-support :alexandria)
+(defpackage :cl-smoke.qt-impl
+ (:use :cl :smoke :cffi :bordeaux-threads :cxx-support :alexandria))
+
+(defpackage :cl-smoke.qt
+ (:use) ;; do not use :cl to prevent collition with TIME and CHAR
+ (:nicknames :qt)
hunk ./src/package.lisp 33
+ #:make-char
+ #:from-char
+ [_$_]
hunk ./src/package.lisp 45
+ #:disconnect
+ #:disconnect-all
hunk ./src/painter.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/painter.lisp 3
-(defmacro with-painter ((painter paint-device) &body body)
+(defmacro qt:with-painter ((painter paint-device) &body body)
hunk ./src/painter.lisp 9
- `(let ((,painter (make-instance 'painter :args (list ,paint-device))))
+ `(let ((,painter (make-instance 'qt:painter :args (list ,paint-device))))
hunk ./src/properties.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/properties.lisp 13
-(defun property (object name)
+(defun qt:property (object name)
hunk ./src/properties.lisp 15
- (from-variant (cxx:property object (property-name name))))
+ (qt:from-variant (cxx:property object (property-name name))))
hunk ./src/properties.lisp 18
-(defun (setf property) (new-value object name)
+(defun (setf qt:property) (new-value object name)
hunk ./src/properties.lisp 24
-(defun remove-property (object name)
+(defun qt:remove-property (object name)
hunk ./src/properties.lisp 26
- (setf (property object name) (qt:make-variant)))
+ (setf (qt:property object name) (qt:make-variant)))
hunk ./src/properties.lisp 28
-(defun property-p (object name)
+(defun qt:property-p (object name)
hunk ./src/properties.lisp 30
- (variant-boundp (cxx:property object (property-name name))))
+ (qt:variant-boundp (cxx:property object (property-name name))))
hunk ./src/properties.lisp 38
-(defgeneric class-properties (class)
+(defgeneric qt:class-properties (class)
hunk ./src/properties.lisp 43
- (class-properties (find-class symbol))))
+ (qt:class-properties (find-class symbol))))
hunk ./src/properties.lisp 45
-(defgeneric class-direct-properties (class)
+(defgeneric qt:class-direct-properties (class)
hunk ./src/properties.lisp 50
- (class-direct-properties (find-class symbol))))
+ (qt:class-direct-properties (find-class symbol))))
hunk ./src/properties.lisp 56
-(defun properties (object)
+(defun qt:properties (object)
hunk ./src/qstring.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/qstring.lisp 31
- (text-codec.set-codec-for-cstrings
- (text-codec.codec-for-name (string *default-foreign-encoding*)))
- (text-codec.set-codec-for-locale
- (text-codec.codec-for-name (string *default-foreign-encoding*))))
+ (qt:text-codec.set-codec-for-cstrings
+ (qt:text-codec.codec-for-name (string *default-foreign-encoding*)))
+ (qt:text-codec.set-codec-for-locale
+ (qt:text-codec.codec-for-name (string *default-foreign-encoding*))))
hunk ./src/qstring.lisp 41
-(let ((method (smoke::make-smoke-method (find-class 'byte-array)
+(let ((method (smoke::make-smoke-method (find-class 'qt:byte-array)
hunk ./src/qstring.lisp 43
- (defmethod cxx:data ((array byte-array))
+ (defmethod cxx:data ((array qt:byte-array))
hunk ./src/qstring.lisp 50
- (cxx:data (make-instance 'byte-array
+ (cxx:data (make-instance 'qt:byte-array
hunk ./src/qstring.lisp 62
- (free-translated-object pointer (make-instance 'qt::qstring)
+ (free-translated-object pointer (make-instance 'qstring)
hunk ./src/qt.lisp 28
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/qt.lisp 30
-(define-smoke-module libsmokeqt
+(define-smoke-module :cl-smoke.qt libsmokeqt
hunk ./src/signal-slot/connect.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/signal-slot/connect.lisp 3
-(defgeneric connect (qsignal slot &optional type)
+(defgeneric qt:connect (qsignal slot &optional type)
hunk ./src/signal-slot/connect.lisp 6
-(defgeneric disconnect (qsignal slot)
+(defgeneric qt:disconnect (qsignal slot)
hunk ./src/signal-slot/connect.lisp 9
-(defgeneric disconnect-all (qsignal)
+(defgeneric qt:disconnect-all (qsignal)
hunk ./src/signal-slot/connect.lisp 19
-(defmethod connect ((qsignal qsignal) (qslot qslot) &optional type)
+(defmethod qt:connect ((qsignal qsignal) (qslot qslot) &optional type)
hunk ./src/signal-slot/connect.lisp 40
-(defmethod connect ((sender qsignal) (function function) &optional type)
+(defmethod qt:connect ((sender qsignal) (function function) &optional type)
hunk ./src/signal-slot/connect.lisp 65
-(defgeneric get-slot (receiver name)
+(defgeneric qt:get-slot (receiver name)
hunk ./src/signal-slot/connect.lisp 72
- (let ((slot (make-slot #'(lambda (&rest args)
- (apply function (cxx:parent *this*)
- args)))))
+ (let ((slot (qt:make-slot #'(lambda (&rest args)
+ (apply function (cxx:parent *this*)
+ args)))))
hunk ./src/signal-slot/connect.lisp 78
-(define-compiler-macro get-slot (&whole form receiver name)
+(define-compiler-macro qt:get-slot (&whole form receiver name)
hunk ./src/signal-slot/connect.lisp 81
- (let ((normalized-name (cxx:data (meta-object.normalized-signature name))))
+ (let ((normalized-name (cxx:data
+ (qt:meta-object.normalized-signature name))))
hunk ./src/signal-slot/connect.lisp 85
- `(get-slot ,receiver ,normalized-name)))
+ `(qt:get-slot ,receiver ,normalized-name)))
hunk ./src/signal-slot/connect.lisp 88
-(defun get-signal (sender name)
+(defun qt:get-signal (sender name)
hunk ./src/signal-slot/connect.lisp 92
-(define-compiler-macro get-signal (&whole form sender name)
+(define-compiler-macro qt:get-signal (&whole form sender name)
hunk ./src/signal-slot/connect.lisp 95
- (let ((normalized-name (cxx:data (meta-object.normalized-signature name))))
+ (let ((normalized-name (cxx:data [_$_]
+ (qt:meta-object.normalized-signature name))))
hunk ./src/signal-slot/connect.lisp 99
- `(get-signal ,sender ,normalized-name)))
+ `(qt:get-signal ,sender ,normalized-name)))
hunk ./src/signal-slot/connect.lisp 102
-(defmethod connect ((qt-signal qt-signal) (qt-slot qt-slot) &optional type)
- (unless (object.connect (qsender qt-signal) (qsignal (name qt-signal))
- (receiver qt-slot) (qslot (name qt-slot))
- (or type +auto-connection+))
+(defmethod qt:connect ((qt-signal qt-signal) (qt-slot qt-slot) &optional type)
+ (unless (qt:object.connect (qsender qt-signal) (qt:qsignal (name qt-signal))
+ (receiver qt-slot) (qt:qslot (name qt-slot))
+ (or type qt:+auto-connection+))
hunk ./src/signal-slot/connect.lisp 110
-(defmethod disconnect ((qt-signal qt-signal) (qt-slot qt-slot))
- (unless (object.disconnect (qsender qt-signal) (qsignal (name qt-signal))
- (receiver qt-slot) (qslot (name qt-slot)))
+(defmethod qt:disconnect ((qt-signal qt-signal) (qt-slot qt-slot))
+ (unless (qt:object.disconnect (qsender qt-signal) (qt:qsignal (name qt-signal))
+ (receiver qt-slot) (qt:qslot (name qt-slot)))
hunk ./src/signal-slot/connect.lisp 117
-(defmethod disconnect-all ((sender object))
- (unless (object.disconnect sender 0 0 0)
+(defmethod qt:disconnect-all ((sender qt:object))
+ (unless (qt:object.disconnect sender 0 0 0)
hunk ./src/signal-slot/connect.lisp 123
-(defmethod connect ((qt-signal qt-signal) (function function) &optional type)
+(defmethod qt:connect ((qt-signal qt-signal) (function function) &optional type)
hunk ./src/signal-slot/connect.lisp 146
-(defmethod connect ((qt-signal qt-signal) (slot qslot) &optional type)
+(defmethod qt:connect ((qt-signal qt-signal) (slot qslot) &optional type)
hunk ./src/signal-slot/connect.lisp 164
-(defmethod connect ((qsignal qsignal) (slot qt-slot) &optional type)
+(defmethod qt:connect ((qsignal qsignal) (slot qt-slot) &optional type)
hunk ./src/signal-slot/connect.lisp 182
- (meta-object.connect sender signal-id
+ (qt:meta-object.connect sender signal-id
hunk ./src/signal-slot/connect.lisp 185
- (value +auto-connection+)
+ (value qt:+auto-connection+)
hunk ./src/signal-slot/connect.lisp 190
- (meta-object.disconnect sender signal-id receiver slot-id))
+ (qt:meta-object.disconnect sender signal-id receiver slot-id))
hunk ./src/signal-slot/signal-slot.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/signal-slot/signal-slot.lisp 21
-(defun qmethod (name)
+(defun qt:qmethod (name)
hunk ./src/signal-slot/signal-slot.lisp 26
-(defun qslot (name)
+(defun qt:qslot (name)
hunk ./src/signal-slot/signal-slot.lisp 31
-(defun qsignal (name)
+(defun qt:qsignal (name)
hunk ./src/signal-slot/signal.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/signal-slot/signal.lisp 15
-(defclass signal-object (object)
+(defclass signal-object (qt:object)
hunk ./src/signal-slot/signal.lisp 33
-(defun make-signal (&rest argument-types)
+(defun qt:make-signal (&rest argument-types)
hunk ./src/signal-slot/signal.lisp 63
- (cxx:data (meta-object.normalized-signature slot)))))
+ (cxx:data (qt:meta-object.normalized-signature slot)))))
hunk ./src/signal-slot/signal.lisp 116
- (meta-object.activate qsignal (cxx:meta-object qsignal)
+ (qt:meta-object.activate qsignal (cxx:meta-object qsignal)
hunk ./src/signal-slot/signal.lisp 120
-(defmethod disconnect-all ((qsignal qsignal))
+(defmethod qt:disconnect-all ((qsignal qsignal))
hunk ./src/signal-slot/slot.lisp 1
-(in-package :qt)
-(declaim (optimize (debug 3)))
+(in-package :cl-smoke.qt-impl)
hunk ./src/signal-slot/slot.lisp 3
-(defclass qslot (object)
+(defclass qslot (qt:object)
hunk ./src/signal-slot/slot.lisp 12
-(defun make-slot (function &optional (arguments nil arguments-p))
+(defun qt:make-slot (function &optional (arguments nil arguments-p))
hunk ./src/signal-slot/slot.lisp 26
-(defmacro sender ()
+(defmacro qt:sender ()
hunk ./src/signal-slot/slot.lisp 36
- (if (enum= call meta-object.+invoke-meta-method+)
+ (if (enum= call qt:meta-object.+invoke-meta-method+)
hunk ./src/signal-slot/slot.lisp 57
- (cxx:data (meta-object.normalized-signature signal)))))
+ (cxx:data (qt:meta-object.normalized-signature signal)))))
hunk ./src/signal-slot/translate.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/string-list.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/string-list.lisp 55
- (translate-to-foreign list (make-instance 'qt::string-list))
+ (translate-to-foreign list (make-instance 'string-list))
hunk ./src/string-list.lisp 57
- (free-translated-object pointer (make-instance 'qt::string-list)
+ (free-translated-object pointer (make-instance 'string-list)
hunk ./src/timer.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/timer.lisp 21
-(defmacro do-delayed-initialize (&body body)
+(defmacro qt:do-delayed-initialize (&body body)
hunk ./src/variant.lisp 1
-(in-package :qt)
+(in-package :cl-smoke.qt-impl)
hunk ./src/variant.lisp 3
-(defmethod print-object ((variant variant) stream)
+(defmethod print-object ((variant qt:variant) stream)
hunk ./src/variant.lisp 11
- (handler-case (from-variant variant)
+ (handler-case (qt:from-variant variant)
hunk ./src/variant.lisp 14
-(defun make-variant (&optional (value nil value-p))
+(defun qt:make-variant (&optional (value nil value-p))
hunk ./src/variant.lisp 18
- (make-instance 'variant :args (list value))
- (make-instance 'variant)))
+ (make-instance 'qt:variant :args (list value))
+ (make-instance 'qt:variant)))
hunk ./src/variant.lisp 21
-(defun make-char (character)
+(defun qt:make-char (character)
hunk ./src/variant.lisp 25
- (1 (make-instance 'char :args (list (aref octets 0))))
- (2 (make-instance 'char :args (list (aref octets 0)
+ (1 (make-instance 'qt:char :args (list (aref octets 0))))
+ (2 (make-instance 'qt:char :args (list (aref octets 0)
hunk ./src/variant.lisp 36
-(defun from-char (char)
+(defun qt:from-char (char)
hunk ./src/variant.lisp 49
-(defmethod print-object ((char char) stream)
+(defmethod print-object ((char qt:char) stream)
hunk ./src/variant.lisp 54
- (princ (from-char char) stream))))
+ (princ (qt:from-char char) stream))))
hunk ./src/variant.lisp 58
-(defun make-lisp-variant (value)
+(defun qt:make-lisp-variant (value)
hunk ./src/variant.lisp 65
- (make-instance 'variant :args (list *cxx-lisp-object-metatype*
- object))
+ (make-instance 'qt:variant :args (list *cxx-lisp-object-metatype*
+ object))
hunk ./src/variant.lisp 72
-(defun variant-boundp (variant)
+(defun qt:variant-boundp (variant)
hunk ./src/variant.lisp 81
- `(,(value (symbol-value (alexandria:symbolicate 'variant.+ type '+)))
+ `(,(value (symbol-value [_$_]
+ (let ((*package* (find-package :cl-smoke.qt)))
+ (alexandria:symbolicate 'variant.+ type '+))))
hunk ./src/variant.lisp 87
-(defun from-variant (variant)
+(defun qt:from-variant (variant)
hunk ./src/variant.lisp 90
- (#.(value variant.+invalid+)
+ (#.(value qt:variant.+invalid+)
hunk ./src/variant.lisp 112
-(defmethod value ((variant variant))
+(defmethod qt:value ((variant qt:variant))
hunk ./src/variant.lisp 114
- (from-variant variant))
+ (qt:from-variant variant))
hunk ./src/variant.lisp 116
-(defmethod (setf value) (new-value (variant variant))
- (cxx:operator= variant (make-variant new-value))
+(defmethod (setf qt:value) (new-value (variant qt:variant))
+ (cxx:operator= variant (qt:make-variant new-value))
Wed Jun 10 14:14:34 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Transfer ownerhip only for smoke classes.
hunk ./src/application.lisp 53
- (setf argv (foreign-alloc :string :initial-contents args))
hunk ./src/application.lisp 54
+ (setf argv (foreign-alloc :string :initial-contents args))
hunk ./src/object.lisp 69
- (smoke::disown-object object)))
+ (smoke::transfer-ownership-to object (cxx:parent object))))
hunk ./src/object.lisp 94
-
hunk ./src/object.lisp 109
- (error (make-condition 'wrapper-gc :class-name name
+ (error (make-condition 'wrapper-gc
+ :class-name (name class)
hunk ./src/object.lisp 119
- (cerror 'continue "Finalizer for object with a parent called."))
+ (cerror "Ignore" "Finalizer for object with a parent called."))
hunk ./src/object.lisp 142
- (let ((event (make-instance 'event :pointer (cffi:mem-aref data :pointer 1))))
+ (let ((receiver (smoke::get-object (cffi:mem-aref data :pointer 0)))
+ (event (make-instance 'event :pointer (cffi:mem-aref data :pointer 1))))
hunk ./src/object.lisp 146
- (let* ((child-event (make-instance 'child-event
+ (let ((child-event (make-instance 'child-event
hunk ./src/object.lisp 149
- (smoke::disown-object (cxx:child child-event))))
+ (when (smoke::has-pointer-p (smoke::pointer (cxx:child child-event)))
+ (assert receiver)
+ (smoke::transfer-ownership-to (cxx:child child-event) receiver))))
hunk ./src/object.lisp 160
- (smoke::take-ownership (cxx:child child-event)))))))
+ (assert receiver)
+ (smoke::take-ownership (cxx:child child-event) receiver))))))
hunk ./src/ownership.lisp 3
+;; undo-stack
hunk ./src/ownership.lisp 6
+
+
+#|
+;; FIXME TODO
+;; application
+(define-takes-ownership cxx:set-style ((application application) (style style))
+ ;; NOT QString style
+ style) ;; STATIC [_$_]
+
+
+;; core-application
+(define-takes-ownership cxx:post-event ((app core-application) receiver (event event))
+ event) ;; STATIC
+(define-takes-ownership cxx:post-event ((app core-application) receiver event priority)
+ event) ;; STATIC
+|#
+
+;; AbstractFileEngine::beginEntryList return value
+
+;; grid-layout
+(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+ row column)
+ item)
+(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+ row column row-span)
+ item)
+(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+ row column row-span colum-span)
+ item)
+(define-takes-ownership cxx:add-item ((layout grid-layout) (item layout-item)
+ row column row-span colum-span aligment)
+ item)
+
+(define-takes-ownership cxx:add-item ((layout layout) (item layout-item))
+ item)
+
+;; QIcon::QIcon(QIconEngine* engine)
+
+(define-takes-ownership cxx:register-editor ((factory item-editor-factory)
+ type creator)
+ creator)
+
+
+(define-takes-ownership cxx:set-child ((this standard-item) row colum item)
+ item)
+(define-takes-ownership cxx:set-child ((this standard-item) row item)
+ item)
+(define-takes-ownership cxx:set-horizontal-header-item ((this standard-item-model)
+ column item)
+ item)
+(define-takes-ownership cxx:set-vertical-header-item ((this standard-item-model)
+ row item)
+ item)
+(define-takes-ownership cxx:set-item ((this standard-item-model)
+ row column item)
+ item)
+(define-takes-ownership cxx:set-item ((this standard-item-model)
+ row item)
+ item)
+(define-takes-ownership cxx:set-item-prototype ((this standard-item-model)
+ item)
+ item)
+
+
+;; Allocates return value
+;; QLineEdit::createStandardContextMenu()
+
+;; parent
+;; QListwidgetitem
+
+
+;; Relases ownership
+;;QList<QStandardItem *> QStandardItemModel::takeColumn ( int column )
+;; etc
hunk ./src/qt.lisp 40
-
Wed Jun 10 14:02:01 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* more qt:variant conversions
hunk ./src/variant.lisp 76
+(defmacro variant-conversions ((variant) &body types)
+ `(ecase (cxx:user-type ,variant)
+ [_$_]
+ ,@(loop for type in types collect
+ (if (symbolp type)
+ `(,(value (symbol-value (alexandria:symbolicate 'variant.+ type '+)))
+ (,(intern (format nil "TO-~A" type) :cxx) ,variant))
+ type))))
+
hunk ./src/variant.lisp 87
- (ecase (cxx:user-type variant)
+ (variant-conversions (variant)
hunk ./src/variant.lisp 91
- (#.(value variant.+string+)
- (cxx:to-string variant))
- (#.(value variant.+string-list+)
- (cxx:to-string-list variant))
- (#.(value variant.+uint+)
- (cxx:to-uint variant))
- (#.(value variant.+int+)
- (cxx:to-int variant))
- (#.(value variant.+double+)
- (cxx:to-double variant))
- (#.(value variant.+char+)
- (cxx:to-char variant))
- (#.(value variant.+bool+)
- (cxx:to-bool variant))
+ bit-array bool byte-array
+ char
+ date date-time double
+ int
+ line line-f list locale long-long
+ point point-f
+ rect rect-f reg-exp
+ size size-f string string-list
+ time
+ uint
+ ulong-long
+ url
hunk ./src/variant.lisp 109
-
+ [_$_]
Fri Jun 5 09:45:07 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* get-slot for function with this argument
hunk ./src/package.lisp 42
- #:connect-signal
- #:connect-function
hunk ./src/signal-slot/connect.lisp 65
-(defun get-slot (receiver name)
- "Returns the slot of RECEIVER with NAME."
- (make-instance 'qt-slot :receiver receiver :name name))
+(defgeneric get-slot (receiver name)
+ (:documentation "Returns the slot of RECEIVER with NAME.")
+ (:method (receiver name)
+ (make-instance 'qt-slot :receiver receiver :name name))
+ (:method (receiver (function function))
+ "Returns a slot for RECEIVER that calls function
+with RECEIVER as the first argument."
+ (let ((slot (make-slot #'(lambda (&rest args)
+ (apply function (cxx:parent *this*)
+ args)))))
+ (cxx:set-parent slot receiver)
+ slot)))
hunk ./src/signal-slot/signal.lisp 71
-(defun connect-signal (qsignal receiver slot &optional (type 0))
- "Connects a signal to a slot. Returns T on success and NIL otherwise."
- [_$_]
- (let ((qsignal (signal-object qsignal))
- (slot-id (find-slot-id receiver slot)))
- (when (not (slot-boundp qsignal 'argument-types))
- (setf (argument-types qsignal)
- (method-arguments-type (cxx:meta-object receiver)
- slot-id)))
- (assert (>= slot-id 0)
- ()
- "No slot ~S for class ~S."
- slot (class-name receiver))
- (or (meta-object.connect qsignal (id qsignal)
- receiver slot-id
- type
- ;; QMetaObject::connect is responsible [_$_]
- ;; for freeing the types array.
- (types (method-arguments-type
- (cxx:meta-object receiver)
- slot-id)))
- (cerror "Ignore"
- "Failed to connect ~S to the slot ~S of ~S."
- qsignal slot receiver))))
-
-(defun disconnect-signal (qsignal receiver slot)
- (let ((qsignal (signal-object qsignal))
- (slot-id (cxx:index-of-slot (cxx:meta-object receiver)
- (cxx:data
- (meta-object.normalized-signature slot)))))
- (assert (>= slot-id 0)
- ()
- "No slot ~S for class ~S."
- slot (class-name receiver))
- (or (meta-object.disconnect qsignal (id qsignal)
- receiver slot-id)
- (cerror "Ignore" [_$_]
- "Failed to disconnect ~S to the slot ~S of ~S."
- qsignal slot receiver))))
hunk ./src/signal-slot/slot.lisp 25
-(defparameter *sender* nil)
+(defparameter *sender* nil "The sender of the signal.")
+(defparameter *this* nil "The slot that is invoked.")
hunk ./src/signal-slot/slot.lisp 40
- (0 (let ((*sender* (cxx:sender slot)))
+ (0 (let ((*sender* (cxx:sender slot))
+ (*this* slot))
hunk ./src/signal-slot/slot.lisp 64
-(defun connect-function (sender signal function &optional (type 0))
- "Connects FUNCTION to the SIGNAL of SENDER.
-The return value of FUNCTION is ignored."
- (let* ((signal-id (find-signal-id sender signal))
- (slot (make-instance 'qslot
- :args (list sender)
- :slot-function function
- :argument-types (method-arguments-type
- (cxx:meta-object sender)
- signal-id))))
- (let ((ret (meta-object.connect sender signal-id
- slot (id slot)
- type (types (arguments slot)))))
- (if ret
- (cxx:connect-notify sender signal)
- (cerror "Failed to connect the signal ~S of ~S to the function ~S."
- signal sender function)))))
Thu Jun 4 12:58:29 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Normalize signal and slot names at compile time.
hunk ./src/signal-slot/connect.lisp 53
- :reader name)))
+ :reader name)))
hunk ./src/signal-slot/connect.lisp 69
+(define-compiler-macro get-slot (&whole form receiver name)
+ "Normalize the slot name."
+ (if (stringp name)
+ (let ((normalized-name (cxx:data (meta-object.normalized-signature name))))
+ (if (string= name normalized-name) ;; Avoid loop
+ form
+ `(get-slot ,receiver ,normalized-name)))
+ form))
+
hunk ./src/signal-slot/connect.lisp 81
- [_$_]
+
+(define-compiler-macro get-signal (&whole form sender name)
+ "Normalize the signal name."
+ (if (stringp name)
+ (let ((normalized-name (cxx:data (meta-object.normalized-signature name))))
+ (if (string= name normalized-name) ;; Avoid loop
+ form
+ `(get-signal ,sender ,normalized-name)))
+ form))
+ [_$_]
hunk ./src/signal-slot/signal.lisp 57
+ ;; For efficency assume that SLOT is normalized and fallback
+ ;; to normalzing when not. (Just like Qt does.)
hunk ./src/signal-slot/signal.lisp 60
- (cxx:data (meta-object.normalized-signature slot)))))
+ slot)))
+ (when (< id 0)
+ (setf id (cxx:index-of-slot (cxx:meta-object receiver)
+ (cxx:data (meta-object.normalized-signature slot)))))
hunk ./src/signal-slot/slot.lisp 50
+ ;; For efficency assume that SIGNAL is normalized and fallback
+ ;; to normalzing when not. (Just like Qt does.)
hunk ./src/signal-slot/slot.lisp 53
- (cxx:data (meta-object.normalized-signature signal)))))
+ signal)))
+ (when (< id 0)
+ (setf id (cxx:index-of-signal (cxx:meta-object sender)
+ (cxx:data (meta-object.normalized-signature signal)))))
Thu Jun 4 00:02:12 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix QT:APPLICATION cleanup in QT:WITH-APP and add restart to slot invocation.
hunk ./src/application.lisp 47
- ;(assert (null-pointer-p (smoke::pointer (core-application.instance))))
+ (assert (null-pointer-p (smoke::pointer (core-application.instance)))
+ ()
+ "Active QCoreApplication not created by QT:WITH-APP.")
hunk ./src/application.lisp 55
- (values (make-instance 'qt:application :args (list argc argv)) t))))
+ (let ((app (make-instance 'qt:application :args (list argc argv))))
+ (tg:cancel-finalization app)
+ (values app t)))))
hunk ./src/application.lisp 59
+ (when (typep (app) 'application)
+ (application.close-all-windows)
+ ;; widgets are only valid as long, as an application object exists.
+ ;; QApplication::~QApplication() deletes all widgets in
+ ;; QApplication::allWidgets().
+ ;; [_$_]
+ ;; see: qt4/src/gui/kernel/qapplication.cpp
+ (loop for widget across (application.all-widgets) do
+ (trivial-garbage:cancel-finalization widget)))
hunk ./src/application.lisp 69
- (when (typep (app) (find-class 'qt:application))
- (application.close-all-windows))
hunk ./src/application.lisp 70
- (trivial-garbage:cancel-finalization (app))
- (smoke::remove-object (smoke::pointer (app)))
- ;; FIXME leak memory or memory fault!
- ;(smoke::delete-pointer (smoke::pointer (app)) (class-of (app)))
- (cxx:delete-later (app))
+ ;; Call the destructer; -> destructed callback is called,
+ ;; (~QApplication() is virtual) which takes care of cleanup
+ ;; on the Lisp side.
+ (smoke::delete-pointer (smoke::pointer (app)) (class-of (app)))
hunk ./src/application.lisp 108
- (application.close-all-windows)
hunk ./src/application.lisp 116
- (find-restart 'continue))))
+ (and (app-p)
+ (find-restart 'continue)))))
hunk ./src/operator.lisp 77
- ;;FIXME smoke does not support casting operators => can not
- ;; return a useful value with operator[]."
- ;;(cxx:operator[] object index))
hunk ./src/operator.lisp 91
+ ;; FIXME smoke generates no destructor for QByteRef
+ ;; kaylptusCxxToSmoke.pm 954:
+ ;; # Also, if the class has no explicit destructor, generate a default one.
+ ;; if ( !$hasDestructor && !$hasPrivatePureVirtual && !$isGlobalSpace && $classNode->{NodeType} ne 'namespace' ) {
+ ;; > $hasPublicDestructor = 1;
+ ;; > $hasPublicProtectedConstructor = 1;
+ ;; [_$_]
hunk ./src/signal-slot/slot.lisp 38
- (case id
+ (ccase id
hunk ./src/signal-slot/slot.lisp 40
- (apply (slot-function slot)
- (arguments-to-lisp arguments (arguments slot))))))
+ (with-simple-restart
+ (continue "Skip the function ~A of slot ~A."
+ (slot-function slot) slot)
+ (apply (slot-function slot)
+ (arguments-to-lisp arguments (arguments slot)))))))
Mon Jun 1 00:39:13 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* QList<QWidget*>
hunk ./src/list.lisp 30
- (smoke::add-type ,(format nil "const QList<~A>&" type-name)
- ',list-type)
- (smoke::add-type ,(format nil "QList<~A>" type-name) ',list-type))
- (defmethod translate-from-foreign (list (type ,list-type))
+ ,@(loop for type-name in (ensure-list type-name) collect [_$_]
+ `(smoke::add-type ,(format nil "const QList<~A>&" type-name)
+ ',list-type))
+ ,@(loop for type-name in (ensure-list type-name) collect [_$_]
+ `(smoke::add-type ,(format nil "QList<~A>" type-name) ',list-type)))
+ ,@(loop for type-name in (ensure-list type-name) collect
+ `(defmethod translate-from-foreign (list (type ,list-type))
hunk ./src/list.lisp 48
- (smoke::make-smoke-type *qt-smoke* ,type-name))))))
+ (smoke::make-smoke-type *qt-smoke* ,type-name)))))))
hunk ./src/list.lisp 61
- (define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
+ ,@(loop for type-name in (ensure-list type-name) collect
+ `(define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
hunk ./src/list.lisp 65
- ,(symbolicate 'coerce- list-type)))))
+ ,(symbolicate 'coerce- list-type))))))
hunk ./src/list.lisp 68
-(define-qlist-wrapper "QObject*" "void")
+(define-qlist-wrapper ("QObject*" "QWidget*") "void")
Mon Jun 1 00:22:22 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* QList<QObject*>
hunk ./src/list.lisp 3
-(defmacro define-qlist-wrapper (type-name)
- (let* ((type (string-upcase type-name))
- (list-type (symbolicate 'qlist- type)))
+(defmacro define-qlist-wrapper (type-name &optional c-name)
+ (let* ((c-name (or c-name type-name))
+ (type (string-upcase c-name))
+ (list-type (symbolicate 'qlist- type)))
hunk ./src/list.lisp 8
- (defcfun ,(concatenate 'string "qt_smoke_list_" type-name "_size") :int
+ (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_size") :int
hunk ./src/list.lisp 11
- (defcfun ,(concatenate 'string "qt_smoke_free_list_" type-name) :void
+ (defcfun ,(concatenate 'string "qt_smoke_free_list_" c-name) :void
hunk ./src/list.lisp 14
- (defcfun ,(concatenate 'string "qt_smoke_make_list_" type-name) :pointer
+ (defcfun ,(concatenate 'string "qt_smoke_make_list_" c-name) :pointer
hunk ./src/list.lisp 16
- (defcfun ,(concatenate 'string "qt_smoke_list_" type-name "_at") :pointer
+ (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_at") :pointer
hunk ./src/list.lisp 20
- (defcfun ,(concatenate 'string "qt_smoke_list_" type-name "_append") :pointer
+ (defcfun ,(concatenate 'string "qt_smoke_list_" c-name "_append") :pointer
hunk ./src/list.lisp 60
- list ;; FIXME allow seqence and define element type
+ list ;; FIXME allow seqence and define element type
hunk ./src/list.lisp 64
-;(define-qlist-wrapper "void")
+(define-qlist-wrapper "QObject*" "void")
Sun May 31 23:59:55 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* cxx:push undo-stack takes ownership
hunk ./qt.mbd 47
+ ("ownership" (:needs "qt"))
addfile ./src/ownership.lisp
hunk ./src/ownership.lisp 1
+(in-package :qt)
+
+(define-takes-ownership cxx:push ((undo-stack undo-stack) undo-command)
+ undo-command)
Sun May 31 19:33:32 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Rework QObject parent ownership transfer
hunk ./src/application.lisp 103
- (format stream "Return from the application event loop."))))
+ (format stream "Return from the application event loop."))
+ :test-function
+ #'(lambda (condition)
+ (declare (ignore condition))
+ (find-restart 'continue))))
hunk ./src/lisp-object.lisp 2
-(declaim (optimize (debug 3)))
hunk ./src/lisp-object.lisp 3
-(defvar *cxx-lisp-objects* (make-hash-table)
+(defvar *cxx-lisp-objects* (smoke::make-synchronized-hash-table)
hunk ./src/lisp-object.lisp 30
-(defvar *cxx-lisp-object-metatype*)
+(defvar *cxx-lisp-object-metatype* "Metatype ID of the C++ lisp_object.")
hunk ./src/object.lisp 2
-(declaim (optimize (debug 3)))
hunk ./src/object.lisp 7
- (defmethod cxx:static-meta-object ((class smoke::smoke-wrapper-class))
+ (defmethod cxx:static-meta-object ((class cxx:class))
hunk ./src/object.lisp 10
-(defmethod documentation :around ((class smoke::smoke-standard-class)
+(defmethod documentation :around ((class cxx:class)
hunk ./src/object.lisp 13
- (not (subtypep class (find-class 'smoke::smoke-wrapper-class))))
+ (not (subtypep class (find-class 'cxx:class))))
hunk ./src/object.lisp 58
-(defvar *children* (make-hash-table)
- "A list of custom subclasses of QObject which have a parent
-and therefor must not be garbage collected.")
-
hunk ./src/object.lisp 67
-; (typep (class-of object) 'smoke::smoke-wrapper-class)
+; (typep (class-of object) 'cxx:class)
hunk ./src/object.lisp 69
- (setf (gethash (smoke::pointer object) *children*) object)))
+ (smoke::disown-object object)))
hunk ./src/object.lisp 76
- (format stream "The object ~A ~A of type smoke-wrapper-class
+ (format stream "The object ~A ~A of type cxx:class
hunk ./src/object.lisp 95
- (defmethod smoke::make-finalize ((object object))
+(defun print-object-to-string (object)
+ (with-output-to-string (stream)
+ (print-object object stream)))
+
+(defmethod smoke::make-finalize ((object object))
hunk ./src/object.lisp 103
- (name (class-name (class-of object)))
+ (class (class-of object))
hunk ./src/object.lisp 105
- (if (typep (class-of object) 'smoke::smoke-wrapper-class)
+ (if (typep (class-of object) 'cxx:class)
hunk ./src/object.lisp 112
- (condition (condition)
- (format *debug-io* "error: wrap finalize ~A ~A~%" name
- condition))))
+ (error (condition)
+ (smoke::report-finalize-error condition "qt:object wrap"
+ (name class) pointer))))
hunk ./src/object.lisp 117
- (progn
- (when (null-pointer-p (smoke::pointer-call *get-parent* pointer))
- (funcall next)))
- (condition (condition)
- (format *debug-io* "error: qfinalize ~A ~A ~A~%" name
- pointer
- condition))))))
- ;(smoke::pointer-call delete-later pointer)))))))
- )
+ (if (null-pointer-p (smoke::pointer-call *get-parent* pointer))
+ (funcall next)
+ (cerror 'continue "Finalizer for object with a parent called."))
+ (error (condition)
+ (smoke::report-finalize-error condition "qt:object"
+ (name class) pointer)))))))
hunk ./src/object.lisp 142
- (let ((event (make-instance 'event :pointer (cffi:mem-aref data :pointer 1)
- :owned-p nil)))
+ (let ((event (make-instance 'event :pointer (cffi:mem-aref data :pointer 1))))
hunk ./src/object.lisp 147
- (smoke::upcast event (find-class 'child-event))
- :owned-p nil))
- (child (smoke::get-object
- (smoke::pointer (cxx:child child-event)))))
-; (when (and child
-; (typep (class-of child)
-; 'smoke::smoke-wrapper-class))
- (when child
- (setf (gethash (smoke::pointer child) *children*) child))))
+ (smoke::upcast event (find-class 'child-event)))))
+ (smoke::disown-object (cxx:child child-event))))
hunk ./src/object.lisp 152
- (find-class 'child-event))
- :owned-p nil)))
- (remhash (smoke::pointer (cxx:child child-event)) *children*)))))
+ (find-class 'child-event)))))
+ ;; We receive child removed events for any QObject, wherter
+ ;; it was construted by Smoke or not. Only take ownership of objects
+ ;; that have been constructed by Smoke.
+ (when (smoke::has-pointer-p (smoke::pointer (cxx:child child-event)))
+ (smoke::take-ownership (cxx:child child-event)))))))
hunk ./src/package.lisp 24
+ #:remove-property
hunk ./src/properties.lisp 17
+
hunk ./src/properties.lisp 24
+(defun remove-property (object name)
+ "Removes the property NAME from OBJECT."
+ (setf (property object name) (qt:make-variant)))
+
hunk ./src/signal-slot/signal-slot.lisp 5
- smoke::smoke-wrapper-class)
+ cxx:class)
hunk ./src/signal-slot/slot.lisp 10
- (:metaclass smoke::smoke-wrapper-class)
+ (:metaclass cxx:class)
Sat May 30 14:16:53 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* soversion for wrapper
hunk ./src/lib/CMakeLists.txt 14
+set_target_properties(qt-smoke-extra [_$_]
+ PROPERTIES
+ SOVERSION "0.0"
+ VERSION "0.0.1")
Thu May 28 16:13:57 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* ASDF
hunk ./src/qt.lisp 34
+
hunk ./src/qt.lisp 36
+ #-mudballs
+ (define-foreign-library libqt-smoke-extra
+ (:unix "libqt-smoke-extra.so")
+ (t (:default "libqt-smoke-extra")))
+
Wed May 27 19:18:41 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* QList<QByteArray> and QList<QVariant> conversion & use cxx:operator== and qt:operator== in cxx:=
hunk ./qt.mbd 51
+ ("list" (:needs "qt"))
hunk ./qt.mbd 70
- (:needs :smoke :sysdef.cmake :cffi))
+ (:needs :smoke :sysdef.cmake :cffi :alexandria))
hunk ./src/lib/qlist.cpp 15
+
hunk ./src/lib/qlist.h 35
-qt_smoke_list_ ## NAME ## size(const void* list) \
+qt_smoke_list_ ## NAME ## _size(const void* list) \
hunk ./src/lib/qlist.h 65
-qt_smoke_list_ ## NAME ## _append(void* list, void* data, int length) \
+qt_smoke_list_ ## NAME ## _append(void* list, void* data) \
hunk ./src/lib/qlist.h 79
- return &qlist->at(index); \
+ return new TYPE(qlist->at(index)); \
hunk ./src/lib/qlist.h 83
-qt_smoke_list_ ## NAME ## _append(void* list, void* data, int length) \
+qt_smoke_list_ ## NAME ## _append(void* list, void* data) \
addfile ./src/list.lisp
hunk ./src/list.lisp 1
+(in-package :qt)
+
+(defmacro define-qlist-wrapper (type-name)
+ (let* ((type (string-upcase type-name))
+ (list-type (symbolicate 'qlist- type)))
+ `(progn
+ (defcfun ,(concatenate 'string "qt_smoke_list_" type-name "_size") :int
+ "Returns the size of LIST."
+ (list :pointer))
+ (defcfun ,(concatenate 'string "qt_smoke_free_list_" type-name) :void
+ "Frees LIST."
+ (list :pointer))
+ (defcfun ,(concatenate 'string "qt_smoke_make_list_" type-name) :pointer
+ "Makes a list.")
+ (defcfun ,(concatenate 'string "qt_smoke_list_" type-name "_at") :pointer
+ "Returns the a newly constructed copy of the element at position AT of LIST."
+ (list :pointer)
+ (index :int))
+ (defcfun ,(concatenate 'string "qt_smoke_list_" type-name "_append") :pointer
+ "Appends NEW-ELEMENT to LIST."
+ (list :pointer)
+ (new-element :pointer))
+ (define-foreign-type ,list-type ()
+ ()
+ (:actual-type :pointer))
+ (define-parse-method ,list-type ()
+ (make-instance ',list-type))
+ (eval-when (:load-toplevel :execute)
+ (smoke::add-type ,(format nil "const QList<~A>&" type-name)
+ ',list-type)
+ (smoke::add-type ,(format nil "QList<~A>" type-name) ',list-type))
+ (defmethod translate-from-foreign (list (type ,list-type))
+ (let ((vector (make-array (,(symbolicate 'qt-smoke-list-
+ type '-size)
+ list))))
+ (dotimes (index (length vector) vector)
+ (setf (aref vector index)
+ ;; FIXME the retuned object is not wrapped by Smoke
+ ;; -> change this? [_$_]
+ (smoke::object-to-lisp
+ (,(symbolicate 'qt-smoke-list-
+ type '-at)
+ list index)
+ (smoke::make-smoke-type *qt-smoke* ,type-name))))))
+ (defmethod free-translated-object (pointer (type ,list-type) param)
+ (declare (ignore param))
+ (,(symbolicate 'qt-smoke-free-list- type)
+ pointer))
+ (defun ,(symbolicate 'coerce- list-type) (list)
+ (let ((qlist (,(symbolicate 'qt-smoke-make-list- type))))
+ (loop for element in list do
+ (,(symbolicate 'qt-smoke-list- type '-append)
+ qlist (pointer (make-instance ',type :args (list element)))))
+ (smoke::make-cleanup-pointer
+ qlist
+ (function ,(symbolicate 'qt-smoke-free-list- type)))))
+ (define-from-lisp-translation (,(format nil "const QList<~A>&" type-name)
+ ,(format nil "QLIst<~A>" type-name))
+ list ;; FIXME allow seqence and define element type
+ ,(symbolicate 'coerce- list-type)))))
+
+(define-qlist-wrapper "QVariant")
+;(define-qlist-wrapper "void")
+(define-qlist-wrapper "QByteArray")
hunk ./src/operator.lisp 7
- (qt:operator== object o))
+ ;; Consider Class::operator== and operator==
+ ;; FIXME integrate this in the overload resolution
+ (handler-case (qt:operator== object o)
+ (smoke::no-applicable-cxx-method ()
+ (cxx:operator== object o))))
hunk ./src/package.lisp 2
- (:use :cl :smoke :cffi :bordeaux-threads :cxx-support)
+ (:use :cl :smoke :cffi :bordeaux-threads :cxx-support :alexandria)
hunk ./src/properties.lisp 47
+(defun dynamic-properties (object)
+ (map 'list (compose #'smoke::lispify #'cxx:data)
+ (cxx:dynamic-property-names object)))
+
hunk ./src/properties.lisp 53
- (warn "FIXME: dynamicPropertyNames not implemented")
- (meta-object-properties (cxx:meta-object object)))
+ (nconc (dynamic-properties object)
+ (meta-object-properties (cxx:meta-object object))))
hunk ./src/qstring.lisp 40
-(defmethod translate-to-foreign (string (type qstring))
- (with-foreign-string ((data length) string :null-terminated-p nil)
- (qt-smoke-string-to-qstring data length)))
-
hunk ./src/qstring.lisp 59
- (translate-to-foreign string (make-instance 'qt::qstring))
+ (with-foreign-string ((data length) string :null-terminated-p nil)
+ (qt-smoke-string-to-qstring data length))
hunk ./src/variant.lisp 5
- (if (null-pointer-p (pointer variant))
+ (if (or (not (slot-boundp variant 'pointer))
+ (null-pointer-p (pointer variant)))
Wed May 27 14:26:25 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* cleanup
hunk ./src/signal-slot/signal.lisp 106
-(defmethod smoke::push-lisp-object (stack object class)
- (let ((cxx-object (make-cxx-lisp-object object)))
- (smoke::push-cleanup stack
-
- #'(lambda ()
- (qt-smoke-free-lisp-object cxx-object)))
- (smoke::push-stack2 stack
- cxx-object
- 0)))
-
hunk ./src/signal-slot/slot.lisp 30
-(defun method-argument-count (metaobject index)
- "Returns the number of arguments for the method INDEX of METAOBJECT."
- (let ((signature (cxx:signature (cxx:method metaobject index))))
- (setf signature (subseq signature (1+ (position #\( signature))
- (position #\) signature :from-end t)))
- (if (= 0 (length signature))
- 0
- (1+ (count #\, signature)))))
-
hunk ./src/signal-slot/translate.lisp 3
-(defun method-argument-count (metaobject index)
- "Returns the number of arguments the method INDEX of METAOBJECT."
- (let ((signature (cxx:signature (cxx:method metaobject index))))
- (setf signature (subseq signature (1+ (position #\( signature))
- (position #\) signature :from-end t)))
- (if (= 0 (length signature))
- 0
- (1+ (count #\, signature)))))
-
Tue May 26 11:57:44 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Use argument conversion/promotion when emiting signals
hunk ./src/qstring.lisp 68
-(define-from-lisp-translation "const QString&" string
+(define-from-lisp-translation ("const QString&" "QString") string
hunk ./src/signal-slot/signal.lisp 115
+
+(defun make-lisp-object (object)
+ (smoke::make-cleanup-pointer (make-cxx-lisp-object object)
+ #'qt-smoke-free-lisp-object))
hunk ./src/signal-slot/signal.lisp 121
+(defun convert-arguments (arguments types)
+ "Returns a list of ARGUMENTS converted to TYPES."
+ (mapcar #'(lambda (argument type)
+ (if (typep type 'smoke::smoke-type)
+ (smoke::convert-argument argument type)
+ (progn (assert (typep argument type)
+ ()
+ "The argument ~S is not of type ~S.")
+ (make-lisp-object argument))))
+ arguments types))
+ [_$_]
hunk ./src/signal-slot/signal.lisp 137
- (smoke::with-stack (stack arguments
- (argument-types qsignal))
- (cffi:with-foreign-object (args :pointer (1+ (length arguments)))
- (loop for i from 1 to (smoke::size stack)
- for type in (argument-types qsignal)
- do
- (setf (mem-aref args :pointer i)
- (if (or (not (typep type (find-class 'smoke::smoke-type)))
- (= 0 (smoke::type-id type))
- (= 13 (smoke::type-id type)))
- (foreign-slot-value
- (mem-aref (pointer stack)
- 'smoke::smoke-stack-item
- i)
- 'smoke::smoke-stack-item 'smoke::voidp)
- (foreign-slot-pointer
- (mem-aref (pointer stack)
- 'smoke::smoke-stack-item
- i)
- 'smoke::smoke-stack-item 'smoke::voidp))))
- (setf (mem-aref args :pointer 0)
- (null-pointer))
- (meta-object.activate qsignal (cxx:meta-object qsignal)
- (id qsignal)
- args))))
+ (let ((types (argument-types qsignal)))
+ (smoke::with-stack (stack (convert-arguments arguments types)
+ types)
+ (cffi:with-foreign-object (args :pointer (1+ (length arguments)))
+ (loop for i from 1 to (smoke::size stack)
+ for type in (argument-types qsignal)
+ do
+ (setf (mem-aref args :pointer i)
+ (if (or (not (typep type (find-class 'smoke::smoke-type)))
+ (= 0 (smoke::type-id type))
+ (= 13 (smoke::type-id type)))
+ (foreign-slot-value
+ (mem-aref (pointer stack)
+ 'smoke::smoke-stack-item
+ i)
+ 'smoke::smoke-stack-item 'smoke::voidp)
+ (foreign-slot-pointer
+ (mem-aref (pointer stack)
+ 'smoke::smoke-stack-item
+ i)
+ 'smoke::smoke-stack-item 'smoke::voidp))))
+ (setf (mem-aref args :pointer 0)
+ (null-pointer))
+ (meta-object.activate qsignal (cxx:meta-object qsignal)
+ (id qsignal)
+ args)))))
Sun May 24 17:02:00 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* *exec-p* allows disabling qt:exec
hunk ./src/application.lisp 7
+(defvar *exec-p* t
+ "Run exec if true and not otherwise.")
hunk ./src/application.lisp 96
- (restart-bind ((abort-app #'(lambda ()
- (application.close-all-windows)
- (cxx:quit (app))
- (invoke-restart (find-restart 'continue)))
- :report-function
- #'(lambda (stream)
- (format stream "Return from the application event loop."))))
- (cxx:exec (app))))
+ (when *exec-p*
+ (restart-bind ((abort-app #'(lambda ()
+ (application.close-all-windows)
+ (cxx:quit (app))
+ (invoke-restart (find-restart 'continue)))
+ :report-function
+ #'(lambda (stream)
+ (format stream "Return from the application event loop."))))
+ (cxx:exec (app)))))
hunk ./src/package.lisp 6
+ #:*exec-p*
Sun May 24 16:42:40 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Clozure CL Cmd line args for with-app
hunk ./src/application.lisp 27
- #-sbcl (list (lisp-implementation-type))))
+ #+ccl ccl:*command-line-argument-list*
+ #-(or sbcl ccl) (list (lisp-implementation-type))))
Sun May 24 16:40:11 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Use overload resolution instead of static-call
hunk ./src/application.lisp 53
-; (when (typep (app) (find-class 'qt:application))
-; (application.close-all-windows))
+ (when (typep (app) (find-class 'qt:application))
+ (application.close-all-windows))
hunk ./src/application.lisp 60
+ (cxx:delete-later (app))
hunk ./src/package.lisp 3
- (:export #:call
-
- #:app
+ (:export #:app
hunk ./src/qt.lisp 37
-(defun static-call (class-name method-name &rest args)
- (apply #'smoke::static-call *qt-smoke* class-name method-name args))
-
hunk ./src/signal-slot/connect.lisp 153
- (static-call "QMetaObject" "connect#$#$$$"
- sender
- signal-id
- receiver
- slot-id
- (if (null type)
- (value +auto-connection+)
- (value type))
- types))
+ (meta-object.connect sender signal-id
+ receiver slot-id
+ (if (null type)
+ (value +auto-connection+)
+ (value type))
+ types))
hunk ./src/signal-slot/connect.lisp 161
- (static-call "QMetaObject" "disconnect#$#$"
- sender
- signal-id
- receiver
- slot-id))
+ (meta-object.disconnect sender signal-id receiver slot-id))
hunk ./src/signal-slot/signal.lisp 79
- (assert (static-call "QMetaObject" "connect#$#$$$"
- qsignal
- (id qsignal)
- receiver
- slot-id
- type
- ;; QMetaObject::connect is responsible for freeing
- ;; the types array.
- (types (method-arguments-type
- (cxx:meta-object receiver)
- slot-id)))
- ()
- "Failed to connect ~S to the slot ~S of ~S."
- qsignal slot receiver)))
+ (or (meta-object.connect qsignal (id qsignal)
+ receiver slot-id
+ type
+ ;; QMetaObject::connect is responsible [_$_]
+ ;; for freeing the types array.
+ (types (method-arguments-type
+ (cxx:meta-object receiver)
+ slot-id)))
+ (cerror "Ignore"
+ "Failed to connect ~S to the slot ~S of ~S."
+ qsignal slot receiver))))
hunk ./src/signal-slot/signal.lisp 94
- (cxx:data
- (meta-object.normalized-signature slot)))))
+ (cxx:data
+ (meta-object.normalized-signature slot)))))
hunk ./src/signal-slot/signal.lisp 100
- (assert (static-call "QMetaObject" "disconnect#$#$"
- qsignal
- (id qsignal)
- receiver
- slot-id)
- ()
- "Failed to disconnect ~S to the slot ~S of ~S."
- qsignal slot receiver)))
+ (or (meta-object.disconnect qsignal (id qsignal)
+ receiver slot-id)
+ (cerror "Ignore" [_$_]
+ "Failed to disconnect ~S to the slot ~S of ~S."
+ qsignal slot receiver))))
hunk ./src/signal-slot/signal.lisp 144
- (smoke::static-call *qt-smoke* "QMetaObject" "activate##$?"
- qsignal
- (cxx:meta-object qsignal)
+ (meta-object.activate qsignal (cxx:meta-object qsignal)
hunk ./src/signal-slot/slot.lisp 73
- (let ((ret (static-call "QMetaObject" "connect#$#$$$"
- sender
- signal-id
- slot
- (id slot)
- type
- (types (arguments slot)))))
+ (let ((ret (meta-object.connect sender signal-id
+ slot (id slot)
+ type (types (arguments slot)))))
hunk ./src/signal-slot/slot.lisp 77
- (cxx:connect-notify sender signal)
- (cerror "Failed to connect the signal ~S of ~S to the function ~S."
- signal sender function)))))
+ (cxx:connect-notify sender signal)
+ (cerror "Failed to connect the signal ~S of ~S to the function ~S."
+ signal sender function)))))
Sun May 24 16:30:31 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Cleanup app in with-app
hunk ./src/application.lisp 12
- (*app*))
+ (*app*)
+ "No application.")
hunk ./src/application.lisp 44
-; (assert (null-pointer-p (smoke::pointer (core-application.instance))))
- (foreign-free argv)
- (foreign-free argc)
+ ;(assert (null-pointer-p (smoke::pointer (core-application.instance))))
+ (foreign-free argv)
+ (foreign-free argc)
hunk ./src/application.lisp 50
- (values (qt:new "QApplication" "QApplication$?" argc argv) t))))
+ (values (make-instance 'qt:application :args (list argc argv)) t))))
hunk ./src/application.lisp 53
- (when (typep (app) (find-class 'qt:application))
- (application.close-all-windows))
+; (when (typep (app) (find-class 'qt:application))
+; (application.close-all-windows))
hunk ./src/application.lisp 57
- ;(smoke::remove-object (smoke::pointer (app)))
- (smoke::delete-pointer (smoke::pointer (app)) (class-of (app)))
+ (smoke::remove-object (smoke::pointer (app)))
+ ;; FIXME leak memory or memory fault!
+ ;(smoke::delete-pointer (smoke::pointer (app)) (class-of (app)))
hunk ./src/application.lisp 61
-; (foreign-free argc)
- (setf argc (null-pointer))
-; (foreign-free argv)
- (setf argv (null-pointer))
hunk ./src/application.lisp 64
- `(progn (setf *app* ,ensure-app)
- (unwind-protect
- (progn
- ,@body))))
+ (let ((cleanup-p (gensym)))
+ `(multiple-value-bind (*app* ,cleanup-p) ,ensure-app
+ (unwind-protect
+ (progn ,@body)
+ (when ,cleanup-p
+ ,remove-app)))))
hunk ./src/package.lisp 3
- (:export #:new
- #:call
+ (:export #:call
hunk ./src/qt.lisp 37
-(defun new (class-name method-name &rest args)
- (apply #'new-object (smoke::binding *qt-smoke*) class-name method-name args))
-
Sun May 24 13:42:39 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Signal slot finalization fix
hunk ./src/signal-slot/translate.lisp 47
+(defun disown-object (object)
+ (tg:cancel-finalization object)
+ (unless (smoke::virtual-destructor-p (class-of object))
+ (smoke::remove-object (pointer object)))
+ object)
+
hunk ./src/signal-slot/translate.lisp 54
+ "Returns the lisp value or object at POINTER of type TYPE."
hunk ./src/signal-slot/translate.lisp 58
- (smoke::object-to-lisp pointer type))
+ ;; By value means that they are allocated by the C++ signal
+ ;; code and have dynamic extend in the slot. The C++ singal code
+ ;; frees the object when the slot returns.
+ (disown-object (smoke::object-to-lisp pointer type)))
hunk ./src/signal-slot/translate.lisp 86
+ "Returns ARGUMENTS for a slot invocation as lisp objects."
hunk ./src/signal-slot/translate.lisp 93
+ "Returns the QMetaType ID for SMOKE-TYPE."
hunk ./src/signal-slot/translate.lisp 109
+ "Returns a newly allocated array of QMetaType IDs of SMOKE-TYPES."
hunk ./src/variant.lisp 7
- (print-unreadable-object (variant stream :type t)
+ (print-unreadable-object (variant stream :type t :identity t)
Tue May 19 17:16:49 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Search paths in with-translator
hunk ./src/i18n.lisp 28
- (cxx:name (qt:locale.system)))))
+ (cxx:name (qt:locale.system)))
+ (namestring path)))
Tue May 19 16:32:42 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Clozure CL save-application fixes
hunk ./src/lib/CMakeLists.txt 15
+install(TARGETS qt-smoke-extra
+ LIBRARY DESTINATION lib)
+
hunk ./src/object.lisp 169
-(cffi:defcfun qt-smoke-register-event-notify :boolean
- (event-notify :pointer))
+(eval-when (:compile-toplevel :load-toplevel :execute)
+ (cffi:defcfun qt-smoke-register-event-notify :boolean
+ (event-notify :pointer)))
hunk ./src/qt.lisp 34
-(smoke:eval-startup (:compile-toplevel :execute)
+(eval-when (:load-toplevel :compile-toplevel :execute)
Thu May 14 14:11:11 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Lisp image loading
hunk ./src/i18n.lisp 17
-(defmacro with-translator (base-name &body body)
- "Loads the translations in the BASE-NAME_LANGCODE.qm file.
+(defmacro with-translator ((base-name &rest paths) &body body)
+ "Loads the translations in the BASE-NAME_LANGCODE.qm file;
+searching PATHS.
hunk ./src/i18n.lisp 24
- (unless (cxx:load ,translator (format nil "~A_~A"
- ,base-name
- (cxx:name (qt:locale.system))))
+ (unless [_$_]
+ (find-if #'(lambda (path)
+ (cxx:load ,translator
+ (format nil "~A_~A" ,base-name
+ (cxx:name (qt:locale.system)))))
+ (list ,@paths))
hunk ./src/i18n.lisp 47
+
+(defun search-file (name &rest paths)
+ "Searches the file NAME in PATHS and returns its path."
+ (let ((file-path (find-if #'(lambda (path)
+ (probe-file (merge-pathnames name path)))
+ paths)))
+ (unless file-path
+ (error "The file ~S not found in the paths ~S" name paths))
+ (merge-pathnames name file-path)))
+
hunk ./src/lisp-object.lisp 33
-(eval-when (:load-toplevel)
+(eval-startup ()
hunk ./src/object.lisp 27
- (if (null-pointer-p (pointer object))
+ (if (or (not (slot-boundp object 'pointer))
+ (null-pointer-p (pointer object)))
hunk ./src/object.lisp 86
-(let ((get-parent (smoke::make-smoke-method (smoke::make-smoke-class
+(smoke:eval-startup (:compile-toplevel :execute)
+(defparameter *get-parent*
+ (smoke::make-smoke-method (smoke::make-smoke-class
hunk ./src/object.lisp 94
- (delete-later (smoke::make-smoke-method (smoke::make-smoke-class
+(defparameter *delete-later*
+ (smoke::make-smoke-method (smoke::make-smoke-class
hunk ./src/object.lisp 99
+
hunk ./src/object.lisp 109
- (if (null-pointer-p (smoke::pointer-call get-parent pointer))
- (smoke::pointer-call delete-later pointer)
+ (if (null-pointer-p (smoke::pointer-call *get-parent* pointer))
+ (smoke::pointer-call *delete-later* pointer)
hunk ./src/object.lisp 119
- (when (null-pointer-p (smoke::pointer-call get-parent pointer))
+ (when (null-pointer-p (smoke::pointer-call *get-parent* pointer))
hunk ./src/object.lisp 124
- condition)))))))
+ condition))))))
hunk ./src/object.lisp 177
-(eval-when (:load-toplevel)
+(smoke:eval-startup ()
hunk ./src/package.lisp 36
+ #:search-file
+
hunk ./src/qstring.lisp 30
-(eval-when (:compile-toplevel :load-toplevel :execute)
+(smoke:eval-startup (:compile-toplevel :execute)
hunk ./src/qstring.lisp 44
+(smoke:eval-startup (:compile-toplevel :execute)
hunk ./src/qstring.lisp 51
- :count (cxx:size array)))))
+ :count (cxx:size array))))))
hunk ./src/qt.lisp 30
-(eval-when (:load-toplevel :compile-toplevel :execute)
- (define-foreign-library libsmokeqt
- (:unix "libsmokeqt.so.2")
- (t (:default "libsmokeqt")))
-
- (use-foreign-library libsmokeqt)
-
- (use-foreign-library libqt-smoke-extra)
- [_$_]
- (defcvar ("qt_Smoke" :read-only t) :pointer
- "The Smoke Qt binding")
-
- (defcfun (init-qt-smoke "_Z13init_qt_Smokev") :void)
-
- (defvar *qt-binding* (null-pointer))
-
- (init-qt-smoke))
-
-(eval-when (:load-toplevel :compile-toplevel)
- (when (null-pointer-p *qt-binding*)
- (setf *qt-binding* (init *qt-smoke*))))
-
-(define-methods *qt-smoke*)
+(define-smoke-module libsmokeqt
+ (*qt-smoke* "qt_Smoke")
+ (init-qt-smoke "init_qt_Smoke"))
hunk ./src/qt.lisp 34
+(smoke:eval-startup (:compile-toplevel :execute)
+ (use-foreign-library libqt-smoke-extra))
hunk ./src/qt.lisp 38
- (apply #'new-object *qt-binding* class-name method-name args))
+ (apply #'new-object (smoke::binding *qt-smoke*) class-name method-name args))
hunk ./src/variant.lisp 58
- "Returns a new VARIANT that wraps VALUE."
+ "Returns a new VARIANT that wraps VALUE.
+
+The variant contains the actual Lisp object
+and not its C++ value like in MAKE-VARIANT."
Tue May 12 17:42:35 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Make *qt-smoke* read only
hunk ./src/qt.lisp 39
- (defcvar "qt_Smoke" :pointer
+ (defcvar ("qt_Smoke" :read-only t) :pointer
Mon May 11 21:50:13 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* print-object qt:object object-name
hunk ./src/object.lisp 26
+(defmethod print-object ((object object) stream)
+ (if (null-pointer-p (pointer object))
+ (call-next-method)
+ (print-unreadable-object (object stream :type t :identity t)
+ (princ (cxx:object-name object) stream))))
+
Mon May 11 16:15:30 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Cleanup remove unnecessary smoke:: in translation code.
hunk ./src/qstring.lisp 61
- (smoke::make-cleanup-pointer
+ (make-cleanup-pointer
hunk ./src/qstring.lisp 67
-(smoke::define-from-lisp-translation "const QString&" string
+(define-from-lisp-translation "const QString&" string
hunk ./src/string-list.lisp 54
- (smoke::make-cleanup-pointer
+ (make-cleanup-pointer
hunk ./src/string-list.lisp 60
-(smoke::define-from-lisp-translation "const QStringList&"
+(define-from-lisp-translation "const QStringList&"
Mon May 11 16:14:14 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* Fix setf value and export variant-boundp.
hunk ./src/package.lisp 33
+ #:value
+ #:variant-boundp
hunk ./src/properties.lisp 25
- (valid-p (cxx:property object (property-name name))))
+ (variant-boundp (cxx:property object (property-name name))))
hunk ./src/variant.lisp 21
+ "Returns a char for a lisp CHARACTER."
hunk ./src/variant.lisp 68
-(defun valid-p (variant)
+(defun variant-boundp (variant)
hunk ./src/variant.lisp 104
- (cxx:operator= variant (make-variant new-value)))
+ (cxx:operator= variant (make-variant new-value))
+ new-value)
Mon May 11 14:07:17 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* GCC visibility support for C wrapper symbols
hunk ./src/lib/CMakeLists.txt 5
+include(CheckCXXCompilerFlag)
+check_cxx_compiler_flag("-fvisibility=hidden" CXX_VISIBILITY)
+if(CXX_VISIBILITY)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -fvisibility-inlines-hidden")
+endif(CXX_VISIBILITY)
+
addfile ./src/lib/cl_smoke_qt.h
hunk ./src/lib/cl_smoke_qt.h 1
+#ifndef CL_SMOKE_QT_H
+#define CL_SMOKE_QT_H
+
+#if defined _WIN32 || defined __CYGWIN__
+ #define CL_SMOKE_QT_EXPORT __declspec(dllexport)
+#else
+ #if __GNUC__ >= 4
+ #define CL_SMOKE_QT_EXPORT __attribute__((visibility("default")))
+ #else
+ #define CL_SMOKE_QT_EXPORT
+ #endif
+#endif
+
+#endif // CL_SMOKE_QT_H
hunk ./src/lib/lisp-object.h 9
+#include "cl_smoke_qt.h"
hunk ./src/lib/lisp-object.h 13
- int
+ CL_SMOKE_QT_EXPORT int
hunk ./src/lib/lisp-object.h 16
- int
+ CL_SMOKE_QT_EXPORT int
hunk ./src/lib/lisp-object.h 19
- int
+ CL_SMOKE_QT_EXPORT int
hunk ./src/lib/lisp-object.h 22
- void*
+ CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/lisp-object.h 25
- void*
+ CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/lisp-object.h 28
- void*
+ CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/qlist.h 5
+#include "cl_smoke_qt.h"
hunk ./src/lib/qlist.h 34
-int \
+CL_SMOKE_QT_EXPORT int \
hunk ./src/lib/qlist.h 40
-void \
+CL_SMOKE_QT_EXPORT void \
hunk ./src/lib/qlist.h 46
-void* \
+CL_SMOKE_QT_EXPORT void* \
hunk ./src/lib/qlist.h 57
-const void* \
+CL_SMOKE_QT_EXPORT const void* \
hunk ./src/lib/qlist.h 64
-void \
+CL_SMOKE_QT_EXPORT void \
hunk ./src/lib/qlist.h 75
-const void* \
+CL_SMOKE_QT_EXPORT const void* \
hunk ./src/lib/qlist.h 82
-void \
+CL_SMOKE_QT_EXPORT void \
hunk ./src/lib/qstring.cpp 4
+#include "cl_smoke_qt.h"
+
hunk ./src/lib/qstring.cpp 16
-void*
+CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/qstring.cpp 28
-void
+CL_SMOKE_QT_EXPORT void
hunk ./src/lib/qstring.cpp 40
-void*
+CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/qstringlist.cpp 5
+#include "cl_smoke_qt.h"
+
hunk ./src/lib/qstringlist.cpp 17
-int
+CL_SMOKE_QT_EXPORT int
hunk ./src/lib/qstringlist.cpp 30
-void*
+CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/qstringlist.cpp 44
-void
+CL_SMOKE_QT_EXPORT void
hunk ./src/lib/qstringlist.cpp 54
-void*
+CL_SMOKE_QT_EXPORT void*
hunk ./src/lib/qstringlist.cpp 65
-void
+CL_SMOKE_QT_EXPORT void
hunk ./src/lib/qt-smoke.cpp 5
+#include "cl_smoke_qt.h"
+
hunk ./src/lib/qt-smoke.cpp 19
-int
+CL_SMOKE_QT_EXPORT int
Mon May 11 13:21:14 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* QList translations C wrapper
hunk ./src/lib/CMakeLists.txt 5
-set(QT_SMOKE_SOURCES qt-smoke.cpp qstring.cpp qstringlist.cpp lisp-object.cpp)
+set(QT_SMOKE_SOURCES qt-smoke.cpp qstring.cpp qstringlist.cpp lisp-object.cpp qlist.cpp)
addfile ./src/lib/qlist.cpp
hunk ./src/lib/qlist.cpp 1
+#include "qlist.h"
+
+/** @file
+ * @brief QList conversions. */
+
+#include <QVariant>
+#include <QByteArray>
+
+extern "C" {
+
+DEFINE_QLIST_WRAPPER(QVariant)
+DEFINE_QLIST_WRAPPER_PTR(void)
+DEFINE_QLIST_WRAPPER(QByteArray)
+
+} // extern "C"
addfile ./src/lib/qlist.h
hunk ./src/lib/qlist.h 1
+#ifndef CL_SMOKE_QT_QLIST_H
+#define CL_SMOKE_QT_QLIST_H
+
+#include <QList>
+
+/** @file
+ */
+
+/** Defines a C wrapper for the QList<@a TYPE>.
+ * @param TYPE the type of the elements of the QList
+ */
+#define DEFINE_QLIST_WRAPPER(TYPE) \
+ DEFINE_QLIST_WRAPPER_3(TYPE, TYPE, VALUE)
+
+/** Defines a C wrapper for the QList<@a TYPE*>,
+ * where @a TYPE is the of the pointer.
+ *
+ * @param NAME the name used for the wrapper functions.
+ * @param TYPE the type of the elements
+ */
+#define DEFINE_QLIST_WRAPPER_PTR(TYPE) \
+ DEFINE_QLIST_WRAPPER_3(TYPE, TYPE*, PTR)
+
+/** @internal */
+#define DEFINE_QLIST_WRAPPER_3(NAME, TYPE, PTR_VALUE) \
+ DEFINE_QLIST_WRAPPER_ALL_PART(NAME, TYPE) \
+ DEFINE_QLIST_WRAPPER_ ## PTR_VALUE ## _PART(NAME, TYPE) \
+[_^I_][_$_]
+
+/** @internal
+ * size, free and make_list. */
+#define DEFINE_QLIST_WRAPPER_ALL_PART(NAME, TYPE) \
+int \
+qt_smoke_list_ ## NAME ## size(const void* list) \
+{ \
+ return static_cast<const QList< TYPE >*>(list)->size(); \
+} \
+\
+void \
+qt_smoke_free_list_ ## NAME (void* list) \
+{ \
+ delete static_cast<QList< TYPE >*>(list); \
+} \
+ \
+void* \
+qt_smoke_make_list_ ## NAME () \
+{ \
+ return new QList< TYPE >(); \
+} \
+ \
+
+/** @internal
+ * At and append for pointer types
+ */
+#define DEFINE_QLIST_WRAPPER_PTR_PART(NAME, TYPE) \
+const void* \
+qt_smoke_list_ ## NAME ## _at(const void* list, int index) \
+{ \
+ const QList< TYPE >* qlist = static_cast<const QList< TYPE > *>(list); \
+ return qlist->at(index); \
+} \
+\
+void \
+qt_smoke_list_ ## NAME ## _append(void* list, void* data, int length) \
+{ \
+ static_cast<QList< TYPE >*>(list) \
+ ->append(static_cast<TYPE>(data)); \
+} \
+
+/** @internal
+ * At and append for value types.
+ */
+#define DEFINE_QLIST_WRAPPER_VALUE_PART(NAME, TYPE) \
+const void* \
+qt_smoke_list_ ## NAME ## _at(const void* list, int index) \
+{ \
+ const QList< TYPE >* qlist = static_cast<const QList< TYPE > *>(list); \
+ return &qlist->at(index); \
+} \
+\
+void \
+qt_smoke_list_ ## NAME ## _append(void* list, void* data, int length) \
+{ \
+ static_cast<QList< TYPE >*>(list) \
+ ->append(*static_cast<TYPE*>(data)); \
+} \
+
+#endif // CL_SMOKE_QT_QLIST_H
Mon May 11 13:18:36 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* update marshalling for overload resolution
hunk ./qt.mbd 68
+ (:uses-macros-from :smoke)
hunk ./src/qstring.lisp 60
+(defun coerce-qstring (string)
+ (smoke::make-cleanup-pointer
+ (translate-to-foreign string (make-instance 'qt::qstring))
+ #'(lambda (pointer)
+ (free-translated-object pointer (make-instance 'qt::qstring)
+ nil))))
+
+(smoke::define-from-lisp-translation "const QString&" string
+ coerce-qstring)
+
hunk ./src/qt.lisp 51
- ;(make-smoke-classes *qt-smoke*))
hunk ./src/string-list.lisp 53
+(defun coerce-string-list (list)
+ (smoke::make-cleanup-pointer
+ (translate-to-foreign list (make-instance 'qt::string-list))
+ #'(lambda (pointer)
+ (free-translated-object pointer (make-instance 'qt::string-list)
+ nil))))
+
+(smoke::define-from-lisp-translation "const QStringList&"
+ (vector string) coerce-string-list)
+
Mon May 11 13:09:54 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* cleanup variant
hunk ./src/variant.lisp 3
-(defgeneric make-variant (value)
- (:documentation "Returns a variant for VALUE."))
-
hunk ./src/variant.lisp 13
-(defmethod make-variant (value)
- "Returns a new VARIANT containing a C++ version of VALUE."
- (make-instance 'variant :args (list value)))
+(defun make-variant (&optional (value nil value-p))
+ "Returns a new VARIANT containing a C++ version of VALUE
+or an empty variant when VALUE is not specified."
+ (if value-p
+ (make-instance 'variant :args (list value))
+ (make-instance 'variant)))
+
+(defun make-char (character)
+ (let ((octets (babel:string-to-octets (string character))))
+ (case (length octets)
+ (1 (make-instance 'char :args (list (aref octets 0))))
+ (2 (make-instance 'char :args (list (aref octets 0)
+ (aref octets 1))))
+ (t (error "qt:char requires the character ~A to be encoded
+in one or two octets, but it is using ~A."
+ character (length octets))))))
+
+(defun surrogate-p (char)
+ (or (cxx:is-high-surrogate char)
+ (cxx:is-low-surrogate char)))
+
+(defun from-char (char)
+ "Returns the lisp character represented by CHAR."
+ (assert (not (surrogate-p char))
+ (char)
+ "The char ~A is part of a surrogate.")
+ (char
+ (babel:octets-to-string (make-array 2 :element-type '(unsigned-byte 8)
+ :initial-contents
+ (list
+ (char-code (cxx:cell char))
+ (char-code (cxx:row char)))))
+ 0))
+
+(defmethod print-object ((char char) stream)
+ (if (or (null-pointer-p (pointer char))
+ (surrogate-p char))
+ (call-next-method)
+ (print-unreadable-object (char stream :type t)
+ (princ (from-char char) stream))))
+
hunk ./src/variant.lisp 57
- "Returns a new VARIANT that wrapps VALUE."
+ "Returns a new VARIANT that wraps VALUE."
hunk ./src/variant.lisp 71
-;;FIXME define setf-able value function
-
hunk ./src/variant.lisp 75
- (cerror "Return NIL" "Type of variant ~A is invalid." variant)
- nil)
+ (cerror "Return (VALUES)" "Type of variant ~A is invalid." variant)
+ (values))
hunk ./src/variant.lisp 87
+ (#.(value variant.+char+)
+ (cxx:to-char variant))
+ (#.(value variant.+bool+)
+ (cxx:to-bool variant))
hunk ./src/variant.lisp 97
+
+(defmethod value ((variant variant))
+ "Returns the value of VARIANT."
+ (from-variant variant))
+
+(defmethod (setf value) (new-value (variant variant))
+ (cxx:operator= variant (make-variant new-value)))
Wed Apr 15 10:20:41 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* It is cxx:>= not cxx:=>.
hunk ./src/operator.lisp 36
-(define-cxx-relations < <= => >)
+(define-cxx-relations < <= >= >)
Tue Apr 14 16:25:46 CEST 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
* License
addfile ./COPYING
hunk ./COPYING 1
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+ [_$_]
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+ [_$_]
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
addfile ./LICENSE
hunk ./LICENSE 1
+The software in this package is distributed under the GNU General Public
+License (with a special exception described below).
+
+A copy of GNU General Public License (GPL) is included in this distribution,
+in the file COPYING. [_$_]
+
+ Linking this library statically or dynamically with other modules is
+ making a combined work based on this library. Thus, the terms and
+ conditions of the GNU General Public License cover the whole
+ combination.
+ [_$_]
+ As a special exception, the copyright holders of this library give you
+ permission to link this library with independent modules to produce an
+ executable, regardless of the license terms of these independent
+ modules, and to copy and distribute the resulting executable under
+ terms of your choice, provided that you also meet, for each linked
+ independent module, the terms and conditions of the license of that
+ module. An independent module is a module which is not derived from
+ or based on this library. If you modify this library, you may extend
+ this exception to your version of the library, but you are not
+ obligated to do so. If you do not wish to do so, delete this
+ exception statement from your version.
hunk ./qt.mbd 26
+ (:license "GPL with linking exception")
hunk ./src/qt.lisp 1
+;;; Copyright (C) 2009 Tobias Rautenkranz <tobias@rautenkranz.ch>
+;;;
+;;; This program is free software: you can redistribute it and/or modify
+;;; it under the terms of the GNU General Public License as published by
+;;; the Free Software Foundation, either version 3 of the License, or
+;;; (at your option) any later version.
+;;;
+;;; This program is distributed in the hope that it will be useful,
+;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;;; GNU General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU General Public License
+;;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+;;;
+;;; As a special exception, the copyright holders of this library give you
+;;; permission to link this library with independent modules to produce an
+;;; executable, regardless of the license terms of these independent
+;;; modules, and to copy and distribute the resulting executable under
+;;; terms of your choice, provided that you also meet, for each linked
+;;; independent module, the terms and conditions of the license of that
+;;; module. An independent module is a module which is not derived from or
+;;; based on this library. If you modify this library, you may extend this
+;;; exception to your version of the library, but you are not obligated to
+;;; do so. If you do not wish to do so, delete this exception statement
+;;; from your version.
+