mirror of
https://gitlab.com/eql/EQL5.git
synced 2025-12-25 03:11:44 -08:00
add macro SYNCALL to WebEngine example (for synchronous funcalls)
This commit is contained in:
parent
bb7aced00d
commit
754cc8ee39
1 changed files with 22 additions and 0 deletions
|
|
@ -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))
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue