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))