(in-package :cl-smoke.kde.ui) (defun kde:app () (assert (kde:app-p)) (qt:app)) (defun kde:app-p () (and (qt:app-p) (typep (qt:app) (find-class 'kde:application)))) (defun kde:make-aboutdata (app-name program-name version) (let ((app-name (make-instance 'qt:byte-array :args (list app-name))) (catalog-name (make-instance 'qt:byte-array)) (program-name (kde:ki18n program-name)) (version (make-instance 'qt:byte-array :args (list version)))) (make-instance 'kde:about-data :args (list app-name catalog-name program-name version)))) (let ((argv)) (defun ensure-app (about-data &optional (application 'kde:application) (args #+sbcl sb-ext:*posix-argv* #-sbcl (list "lisp"))) (if (qt:app-p) (progn (assert (typep (qt:app) (find-class 'kde:application)) () "The existing application object ~A is not of type ~A." (qt:app) (find-class application)) (values (qt:app) nil)) (let ((args (append (list (first args)) '("--nocrashhandler") (rest args)))) (unless (null argv) (foreign-free argv) (setf argv (null-pointer))) (setf argv (foreign-alloc :string :initial-contents args)) (kde:cmd-line-args.init (length args) argv about-data) (values (make-instance 'kde:application) t)))) (defun kill-app () (qt:application.close-all-windows) (setf cl-smoke.qt.gui::*widgets* nil) ;; FIXME make it work without mem-faults (trivial-garbage:cancel-finalization (kde:app)) (cxx:delete-later (kde:app)) ;(smoke::delete-pointer (smoke::pointer (app)) (class-of (app))) (setf (slot-value (kde:app) 'pointer) (null-pointer)))) (defmacro kde:with-app (about-data &body body) `(cl-smoke.qt.core::with-application ((ensure-app ,about-data) (kill-app)) ,@body)) (defmacro kde:with-kde ((app-name program-name version) &body body) (let ((about-data (gensym))) `(let ((,about-data (kde:make-aboutdata ,app-name ,program-name ,version))) (kde:with-app ,about-data ,@body))))