Much work, using Qt 6.10 on Linux for better https support

This commit is contained in:
2026-03-11 17:57:55 +01:00
parent 989c3d328a
commit 7d234bc834
16 changed files with 541 additions and 217 deletions

View File

@@ -39,6 +39,7 @@
rkt-webview-choose-dir
rkt-webview-file-open
rkt-webview-file-save
rkt-webview-version
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -48,6 +49,7 @@
(define lib-type 'release)
(define os (system-type 'os*))
(define arch (system-type 'arch))
(define supported-os '(windows linux))
(unless (ormap (λ (o) (eq? os o)) supported-os)
@@ -77,7 +79,27 @@
Qt6WebEngineWidgets.dll
))
([eq? os 'linux]
'())
'(libQt6XcbQpa
;libQt6WaylandClient
;libQt6EglFSDeviceIntegration
libQt6Core
libQt6Positioning
libQt6Gui
libQt6Widgets
libQt6Svg
libQt6Network
libQt6OpenGL
libQt6PrintSupport
libQt6Qml
libQt6QmlModels
libQt6QmlWorkerScript
libQt6QmlMeta
libQt6Quick
libQt6QuickWidgets
libQt6WebChannel
libQt6WebEngineCore
libQt6WebEngineWidgets
))
)
)
@@ -88,26 +110,51 @@
)
)
(define os-lib-dir (build-path lib-dir (symbol->string os) (symbol->string arch)))
(define (libname lib-symbol)
(build-path lib-dir (symbol->string os) (symbol->string lib-symbol)))
(build-path os-lib-dir (symbol->string lib-symbol)))
; c:\qt\6.10.2\msvc2022_64\bin\windeployqt.exe rktwebview_qt_test.exe
(when (eq? os 'windows)
(putenv "QT_PLUGIN_PATH"
(path->string (build-path lib-dir (symbol->string os))))
(putenv "QTWEBENGINEPROCESS_PATH"
(path->string (build-path lib-dir (symbol->string os) "QtWebEngineProcess.exe")))
(putenv "QTWEBENGINE_RESOURCES_PATH"
(path->string (build-path lib-dir (symbol->string os) "resources")))
(putenv "QTWEBENGINE_LOCALES_PATH"
(path->string (build-path lib-dir (symbol->string os) "translations" "qtwebengine_locales")))
)
(define quiet-call #t)
(set! quiet-call
(when (or (eq? os 'windows) (eq? os 'linux))
(putenv "QT_PLUGIN_PATH"
(path->string (build-path os-lib-dir)))
(putenv "QTWEBENGINEPROCESS_PATH"
(path->string (build-path os-lib-dir "QtWebEngineProcess.exe")))
(putenv "QTWEBENGINE_RESOURCES_PATH"
(path->string (build-path os-lib-dir "resources")))
(putenv "QTWEBENGINE_LOCALES_PATH"
(path->string (build-path os-lib-dir "translations" "qtwebengine_locales")))
(when (eq? os 'linux)
(putenv "QT_QPA_PLATFORM" "xcb")
(putenv "LD_LIBRARY_PATH"
(string-append
(path->string (build-path os-lib-dir)) ":"
(path->string (build-path os-lib-dir "platforms"))
)
)
)
)
)
;;; Preload libraries
(for-each (λ (lib-symbol)
(let ((load-lib (libname lib-symbol)))
(ffi-lib load-lib)))
(let* ((libn (if (list? lib-symbol) (car lib-symbol) lib-symbol))
(versions (if (list? lib-symbol) (cons (cadr lib-symbol) '(#f)) (list #f)))
(load-lib (if (list? lib-symbol)
(if (eq? (caddr lib-symbol) #f)
(symbol->string libn)
(libname libn))
(libname libn)))
)
;(displayln (format "loading ~a" load-lib))
(ffi-lib load-lib versions)
)
)
libraries-to-preload)
;;; Actual FFI integration
@@ -130,7 +177,7 @@
ffi-library os exp))))
)
])
(ffi-lib webview-lib-file)))
(ffi-lib webview-lib-file '("6" #f) #:get-lib-dirs (list os-lib-dir))))
(define-ffi-definer define-rktwebview webview-lib)
@@ -170,6 +217,24 @@
)
)
(define _rkt_data_kind
(_enum '(version = -1
event = 2
js-result = 3
)
)
)
(define-cstruct _rkt_version_t
([qt-major _int]
[qt-minor _int]
[qt-patch _int]
[api-major _int]
[api-minor _int]
[api-patch _int]
)
)
(define-cstruct _rkt_evt_t
([w _int]
[evt _pointer]
@@ -180,6 +245,13 @@
[value _pointer]
))
(define-cstruct _rkt_data_t
([kind _rkt_data_kind]
[data (_union _rkt_version_t _rkt_evt_t _rkt_js_result_t)]
)
)
;RKTWEBVIEW_QT_EXPORT void rkt_webview_init(int &argc, char **argv);
(define-rktwebview rkt_webview_init
(_fun -> _void))
@@ -188,10 +260,23 @@
(define-rktwebview rkt_webview_process_events
(_fun _int -> _void))
;RKTWEBVIEW_QT_EXPORT int rkt_webview_create(int parent);
;RKTWEBVIEW_QT_EXPORT void rkt_webview_free_data(rkt_data_t *d);
(define-rktwebview rkt_webview_free_data
(_fun _rkt_data_t-pointer -> _void))
;RKTWEBVIEW_QT_EXPORT rkt_data_t *rkt_webview_version();
(define-rktwebview rkt_webview_version
(_fun -> _rkt_data_t-pointer))
;RKTWEBVIEW_QT_EXPORT int rkt_webview_create(rktwebview_t parent,
; event_cb_t js_event_cb,
; const char *optional_server_cert_pem);
(define-rktwebview rkt_webview_create
(_fun _int (_fun #:keep callback-box #:async-apply applier
_rkt_evt_t-pointer -> _void) -> _int))
(_fun _int
(_fun #:keep callback-box #:async-apply applier
_rkt_data_t-pointer -> _void)
_bytes
-> _int))
;RKTWEBVIEW_QT_EXPORT void rkt_webview_close(int wv);
(define-rktwebview rkt_webview_close
@@ -215,20 +300,12 @@
;RKTWEBVIEW_QT_EXPORT rkt_js_result_t *rkt_webview_call_js(rktwebview_t wv, const char *js);
(define-rktwebview rkt_webview_call_js
(_fun _int _string/utf-8 -> _rkt_js_result_t-pointer))
(_fun _int _string/utf-8 -> _rkt_data_t-pointer))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_js_result(rkt_js_result_t *r);
(define-rktwebview rkt_webview_destroy_js_result
(_fun _rkt_js_result_t-pointer -> _rkt_result_t))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_open_devtools(int wv);
(define-rktwebview rkt_webview_open_devtools
(_fun _int -> _rkt_result_t))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t e);
(define-rktwebview rkt_webview_destroy_event
(_fun _rkt_evt_t-pointer -> _rkt_result_t))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_move(rktwebview_t w, int x, int y);
(define-rktwebview rkt_webview_move
(_fun _int _int _int -> _rkt_result_t))
@@ -275,15 +352,15 @@
;RKTWEBVIEW_QT_EXPORT rkt_js_result_t *rkt_webview_choose_dir(rktwebview_t w, const char *title, const char *base_dir);
(define-rktwebview rkt_webview_choose_dir
(_fun _int _string/utf-8 _string/utf-8 -> _rkt_js_result_t-pointer))
(_fun _int _string/utf-8 _string/utf-8 -> _rkt_data_t-pointer))
;RKTWEBVIEW_QT_EXPORT rkt_js_result_t *rkt_webview_file_open(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts);
(define-rktwebview rkt_webview_file_open
(_fun _int _string/utf-8 _string/utf-8 _string/utf-8 -> _rkt_js_result_t-pointer))
(_fun _int _string/utf-8 _string/utf-8 _string/utf-8 -> _rkt_data_t-pointer))
;RKTWEBVIEW_QT_EXPORT rkt_js_result_t *rkt_webview_file_save(rktwebview_t w, const char *title, const char *base_dir, const char *permitted_exts);
(define-rktwebview rkt_webview_file_save
(_fun _int _string/utf-8 _string/utf-8 _string/utf-8 -> _rkt_js_result_t-pointer))
(_fun _int _string/utf-8 _string/utf-8 _string/utf-8 -> _rkt_data_t-pointer))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -308,7 +385,7 @@
(f)))))
(rkt_webview_init)
(start-event-processing)
(set! quiet-call (start-event-processing))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Provided features
@@ -323,27 +400,29 @@
(define (rkt-process-events handle)
(if (> (queue-length (rkt-wv-evt-queue handle)) 0)
(let ((e (dequeue! (rkt-wv-evt-queue handle))))
(if (symbol? e)
(if (eq? e 'quit)
(let ((data (dequeue! (rkt-wv-evt-queue handle))))
(if (symbol? data)
(if (eq? data 'quit)
(begin
(hash-remove! rkt-wv-store (rkt-wv-win handle))
'quit)
(rkt-process-events handle))
(let ((evt (cast (rkt_evt_t-evt e) _pointer _string*/utf-8)))
(let* ((e (union-ref (rkt_data_t-data data) 1))
(evt (cast (rkt_evt_t-evt e) _pointer _string*/utf-8)))
((rkt-wv-callback handle) handle evt)
(rkt_webview_destroy_event e)
(rkt_webview_free_data data)
(rkt-process-events handle)))
)
'done))
(define (rkt-webview-create parent evt-callback close-callback)
(define (rkt-webview-create parent evt-callback close-callback server-cert)
(let* ((evt-queue (make-queue))
(parent-win (if (eq? parent #f) 0 (rkt-wv-win parent)))
)
(let ((wv (rkt_webview_create parent-win
(λ (rkt-evt)
(enqueue! evt-queue rkt-evt)))))
(enqueue! evt-queue rkt-evt))
server-cert)))
(let ((handle (make-rkt-wv wv evt-queue evt-callback #t close-callback)))
(thread (λ ()
(sleep 1)
@@ -385,10 +464,11 @@
(rkt_webview_run_js (rkt-wv-win wv) js))
(define (rkt-webview-call-js wv js)
(let* ((r (rkt_webview_call_js (rkt-wv-win wv) js))
(let* ((d (rkt_webview_call_js (rkt-wv-win wv) js))
(r (union-ref (rkt_data_t-data d) 2))
(value (cast (rkt_js_result_t-value r) _pointer _string*/utf-8))
(result (rkt_js_result_t-result r)))
(rkt_webview_destroy_js_result r)
(rkt_webview_free_data d)
(list result value)))
(define (rkt-webview-resize wv w h)
@@ -415,26 +495,47 @@
(rkt_webview_open_devtools (rkt-wv-win wv)))
(define (rkt-webview-choose-dir wv title base-dir)
(let* ((r (rkt_webview_choose_dir (rkt-wv-win wv) title base-dir))
(let* ((d (rkt_webview_choose_dir (rkt-wv-win wv) title base-dir))
(r (union-ref (rkt_data_t-data d) 2))
(value (cast (rkt_js_result_t-value r) _pointer _string*/utf-8))
(result (rkt_js_result_t-result r)))
(rkt_webview_destroy_js_result r)
(rkt_webview_free_data d)
(list result value)))
(define (rkt-webview-file-open wv title base-dir permitted-exts)
(let* ((r (rkt_webview_file_open (rkt-wv-win wv) title base-dir permitted-exts))
(let* ((d (rkt_webview_file_open (rkt-wv-win wv) title base-dir permitted-exts))
(r (union-ref (rkt_data_t-data d) 2))
(value (cast (rkt_js_result_t-value r) _pointer _string*/utf-8))
(result (rkt_js_result_t-result r)))
(rkt_webview_destroy_js_result r)
(rkt_webview_free_data d)
(list result value)))
(define (rkt-webview-file-save wv title base-dir permitted-exts)
(let* ((r (rkt_webview_file_save (rkt-wv-win wv) title base-dir permitted-exts))
(let* ((d (rkt_webview_file_save (rkt-wv-win wv) title base-dir permitted-exts))
(r (union-ref (rkt_data_t-data d) 2))
(value (cast (rkt_js_result_t-value r) _pointer _string*/utf-8))
(result (rkt_js_result_t-result r)))
(rkt_webview_destroy_js_result r)
(rkt_webview_free_data d)
(list result value)))
(define (rkt-webview-version)
(let ((d (rkt_webview_version)))
(let ((v (union-ref (rkt_data_t-data d) 0)))
(let ((qt-major (rkt_version_t-qt-major v))
(qt-minor (rkt_version_t-qt-minor v))
(qt-patch (rkt_version_t-qt-patch v))
(api-major (rkt_version_t-api-major v))
(api-minor (rkt_version_t-api-minor v))
(api-patch (rkt_version_t-api-patch v))
)
(rkt_webview_free_data d)
(list (list 'webview-c-api api-major api-minor api-patch)
(list 'qt qt-major qt-minor qt-patch))
)
)
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Administration
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -459,9 +560,10 @@
;; Cleanup on exit
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(plumber-add-flush! (current-plumber)
(λ (handle)
(rkt-webview-exit)))
(set! quiet-call
(plumber-add-flush! (current-plumber)
(λ (handle)
(rkt-webview-exit))))