Much work, using Qt 6.10 on Linux for better https support
This commit is contained in:
@@ -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))))
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user