add macro SYNCALL to WebEngine example (for synchronous funcalls)

This commit is contained in:
polos 2017-05-10 16:50:53 +02:00
parent bb7aced00d
commit 754cc8ee39

View file

@ -9,6 +9,7 @@
;; N.B: The following functions are asynchronous (because WebEngine
;; is all asynchronous).
;;
;; So, we won't have a return value, but need to pass a function.
;; (See 'FunctorOrLambda' in both Qt Assistant and EQL sources.)
@ -21,6 +22,27 @@
(|runJavaScript| (|page| *view*) expression
(lambda (result) (qmsg result))))
;; Introducing macro SYNCALL allows to call asynchronous functions
;; as if they were synchronous (more convenient in simple cases).
(defmacro syncall (expression)
"Converts asynchronous function calls to synchronous ones, using a local event loop."
(let ((result (gensym))
(ev-loop (gensym)))
`(let (,result)
(qlet ((,ev-loop "QEventLoop"))
(,@expression (lambda (x)
(setf ,result x)
(|exit| ,ev-loop)))
(|exec| ,ev-loop))
,result)))
(defun to-text* ()
(print (syncall (|toPlainText| (|page| *view*)))))
(defun js* (expression)
(qmsg (syncall (|runJavaScript| (|page| *view*) expression))))
(x:do-with *view*
(|setUrl| (qnew "QUrl(QString)" "http://planet.lisp.org/"))
(|resize| '(800 600))