This commit is contained in:
2026-03-03 16:10:38 +01:00
parent 35aae3b707
commit 5f0b7d3dc8
16 changed files with 766 additions and 334 deletions

View File

@@ -1,6 +1,6 @@
#lang racket/base
(require "racket-webview-ffi.rkt"
(require "racket-webview-qt.rkt"
"utils.rkt"
web-server/servlet
web-server/servlet-env
@@ -16,16 +16,17 @@
(provide webview-create
webview-devtools
webview-has-events?
webview-event-count
webview-get-event
webview-set-event-callback!
webview-clear-event-callback!
webview-bind
webview-close
webview-run-js
;webview-call-js
webview-move
webview-resize
webview-bind!
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Web server
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define current-servlet-port 8083)
(define current-window-nr 1)
@@ -36,10 +37,12 @@
(file->string file)))
(define-struct wv
(handle port window-nr
[file-getter #:mutable]
[boilerplate-js #:mutable]
[webserver-thread #:mutable]))
([handle #:mutable]
port
[window-nr #:mutable]
[file-getter #:mutable]
[boilerplate-js #:mutable]
[webserver-thread #:mutable]))
(define (process-html wv-handle path out)
(let ((html (file->string path))
@@ -90,79 +93,65 @@
#:stateless? #t
;#:launch-browser #f
#:servlet-regexp #rx""))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Utilities
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (util-parse-event evt)
(let ((wv-d0 (with-input-from-string evt read-json)))
wv-d0))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Webview functions
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (webview-create file-getter #:boilerplate-js [bj (default-boilerplate-js)])
(let* ((wv (rkt_create_webview))
(h (make-wv wv current-servlet-port current-window-nr file-getter bj #f))
(define (webview-create file-getter event-callback
#:boilerplate-js [bj (default-boilerplate-js)]
#:parent [p 0])
(let* ((h (make-wv #f current-servlet-port -1 file-getter bj #f))
(server (let ((s (start-web-server h)))
(sleep 1)
s))
(event-processor (λ (wv evt)
(event-callback h (util-parse-event evt))))
(wv (rkt-webview-create p event-processor))
(base-req (format "http://127.0.0.1:~a"
(wv-port h)))
)
(set-wv-webserver-thread! h (start-web-server h))
(rkt_webview_navigate (wv-handle h) base-req)
(set-wv-handle! h wv)
(set-wv-window-nr! h (rkt-wv-win wv))
(set-wv-webserver-thread! h server)
(rkt-webview-set-url! (wv-handle h) base-req)
(set! current-servlet-port (+ current-servlet-port 1))
(set! current-window-nr (+ current-window-nr 1))
h))
(define (webview-devtools wv)
(rkt_webview_devtools (wv-handle wv)))
(rkt-webview-open-devtools (wv-handle wv)))
(define (webview-parse-event evt)
(let ((wv-d0 (with-input-from-string evt read-json)))
;(displayln wv-d0)
(let ((wv-d1 (with-input-from-string (hash-ref wv-d0 'data) read-json)))
;(displayln wv-d1)
(let ((wv-d2 (with-input-from-string (car wv-d1) read-json)))
;(displayln wv-d2)
wv-d2))))
(define (webview-move wv x y)
(rkt-webview-move (wv-handle wv) x y))
(define (webview-set-event-callback! wv cb)
(rkt_webview_set_event_callback! (wv-handle wv) (wv-window-nr wv)
(λ (context data)
(let ((e (webview-parse-event data)))
(cb context e)))))
(define (webview-resize wv w h)
(rkt-webview-resize (wv-handle wv) w h))
(define (webview-clear-event-callback! wv)
(rkt_webview_clear_event_callback! (wv-handle wv) (wv-window-nr wv)))
(define (webview-get-event wv)
(if (> (rkt_webview_pending_events (wv-handle wv)) 0)
(let ((item (rkt_webview_get_event (wv-handle wv))))
(let ((data (rkt_webview_item_data item)))
(rkt_webview_destroy_item item)
(let ((wv-d0 (with-input-from-string data read-json)))
;(displayln wv-d0)
(let ((wv-d1 (with-input-from-string (hash-ref wv-d0 'data) read-json)))
;(displayln wv-d1)
(let ((wv-d2 (with-input-from-string (car wv-d1) read-json)))
;(displayln wv-d2)
wv-d2
)
)
)
)
)
#f)
(define (webview-close wv)
(rkt-webview-close (wv-handle wv))
(kill-thread (wv-webserver-thread wv))
)
(define (webview-has-events? wv)
(>= (rkt_webview_pending_events (wv-handle wv)) 1)
)
(define (webview-event-count wv)
(rkt_webview_pending_events (wv-handle wv)))
(define (webview-bind wv selector event)
(define (webview-bind! wv selector event)
(let ((sel (if (symbol? selector)
(format "#~a" selector)
selector))
(evt (format "~a" event)))
(rkt_webview_run_js (wv-handle wv)
(format "window._web_wire_bind_evt_ids(~a, '~a', '~a')"
(webview-run-js wv
(format "window.rkt_bind_evt_ids(~a, '~a', '~a')"
(wv-window-nr wv) sel evt))))
(define (webview-run-js wv js)
(rkt_webview_run_js (wv-handle wv) js))
(rkt-webview-run-js (wv-handle wv) js))
;(define (webview-call-js wv js)
; (let ((result (rkt_webview_call_js (wv-handle wv) js)))
@@ -184,13 +173,16 @@
p)))
(define (test)
(let ((h (webview-create file-getter)))
(displayln (webview-has-events? h))
(let* ((cb (λ (handle evt)
(displayln evt)))
(h (webview-create file-getter cb)))
h))
(while (not (webview-has-events? h))
(displayln "Waiting...")
(sleep 1))
(let ((evt (webview-get-event h)))
(when (string=? (hash-ref evt 'evt) "html-loaded")
(webview-bind h "button" "click")))
h))
; (while (not (webview-has-events? h))
; (displayln "Waiting...")
; (sleep 1))
; (let ((evt (webview-get-event h)))
; (when (string=? (hash-ref evt 'evt) "html-loaded")
; (webview-bind h "button" "click")))
; h))