This commit is contained in:
2026-03-04 18:15:45 +01:00
parent afa3778103
commit 3a2abf90f6
16 changed files with 1563 additions and 93 deletions

View File

@@ -24,6 +24,14 @@
rkt-webview-call-js
rkt-webview-move
rkt-webview-resize
rkt-webview-show
rkt-webview-hide
rkt-webview-show-normal
rkt-webview-maximize
rkt-webview-minimize
rkt-webview-window-state
rkt-webview-set-title!
rkt-webview-present
rkt-webview-exit
rkt-webview-valid?
rkt-webview-open-devtools
@@ -35,70 +43,95 @@
(define lib-type 'release)
(define-runtime-path lib-dir ".")
; (if (eq? (system-type 'os*) 'windows)
; "..\\lib"
; "../lib"))
(define os (system-type 'os*))
(define supported-os '(windows linux))
(define libname (let ((os (system-type 'os*)))
(cond ((eq? os 'windows) (format "rktwebview.dll"))
((eq? os 'linux) (format "librktwebview.so"))
(else (error (format "OS ~a not supported" os)))))
(unless (ormap (λ (o) (eq? os o)) supported-os)
(error (format "OS currently not supported: ~a. Supported: ~a." os supported-os)))
(define-runtime-path lib-dir "lib")
(define libraries-to-preload
(cond
([eq? os 'windows]
'(Qt6Core.dll
Qt6Positioning.dll
Qt6Gui.dll
Qt6Widgets.dll
Qt6Svg.dll
Qt6Network.dll
Qt6OpenGL.dll
Qt6PrintSupport.dll
Qt6Qml.dll
Qt6QmlModels.dll
Qt6QmlWorkerScript.dll
Qt6QmlMeta.dll
Qt6Quick.dll
Qt6QuickWidgets.dll
Qt6WebChannel.dll
Qt6WebEngineCore.dll
Qt6WebEngineWidgets.dll
))
([eq? os 'linux]
'())
)
)
;(set! libname "../rktwebview/build/Release/rktwebview.dll")
;(set! libname "../rktwebview/build/Release/librktwebview.so")
(if (eq? (system-type 'os*) 'windows)
(set! libname "..\\rktwebview_qt\\build\\Release\\rktwebview_qt.dll")
(set! libname "../rktwebview_qt/build/Release/librktwebview_qt.so"))
(set! libname "rktwebview_qt.dll")
(current-directory (build-path lib-dir "..\\rktwebview_qt\\build\\Release"))
(define ffi-library
(cond
([eq? os 'windows] 'rktwebview_qt.dll)
([eq? os 'linux] 'librktwebview_qt.so)
)
)
;(define webview-lib-file (normalize-path (build-path lib-dir libname)))
(define webview-lib-file libname)
(displayln (format "~a - ~a" (current-directory) webview-lib-file))
(define (libname lib-symbol)
(build-path lib-dir (symbol->string os) (symbol->string lib-symbol)))
; c:\qt\6.10.2\msvc2022_64\bin\windeployqt.exe rktwebview_qt_test.exe
(putenv "QT_PLUGIN_PATH" (path->string (current-directory)))
(putenv "QTWEBENGINEPROCESS_PATH"
"c:\\devel\\racket\\racket-webview\\rktwebview_qt\\build\\Release\\QtWebEngineProcess.exe")
(putenv "QTWEBENGINE_RESOURCES_PATH"
"c:\\devel\\racket\\racket-webview\\rktwebview_qt\\build\\Release\\resources")
(putenv "QTWEBENGINE_LOCALES_PATH"
"c:\\devel\\racket\\racket-webview\\rktwebview_qt\\build\\Release\\translations\\qtwebengine_locales")
(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 libs '(Qt6Core.dll
Qt6Positioning.dll
;Qt6Concurrent.dll
Qt6Gui.dll
Qt6Widgets.dll
;qwindows.dll
Qt6Svg.dll
Qt6Network.dll
Qt6OpenGL.dll
;Qt6OpenGLWidgets.dll
Qt6PrintSupport.dll
Qt6Qml.dll
;Qt6Xml.dll
Qt6QmlModels.dll
Qt6QmlWorkerScript.dll
Qt6QmlMeta.dll
Qt6Quick.dll
Qt6QuickWidgets.dll
Qt6WebChannel.dll
Qt6WebEngineCore.dll
;Qt6WebEngineQuick.dll
Qt6WebEngineWidgets.dll
))
(for-each (λ (l)
(let ((lib (symbol->string l)))
(displayln (format "~a: ~a" lib (ffi-lib lib)))))
libs)
;;; Preload libraries
(for-each (λ (lib-symbol)
(let ((load-lib (libname lib-symbol)))
(ffi-lib load-lib)))
libraries-to-preload)
;;; Actual FFI integration
(define webview-lib-file (libname ffi-library))
(define webview-lib
(with-handlers ([exn:fail?
(λ (exp)
(cond
([eq? os 'linux]
(error (format
(string-append "Cannot load ~a.\n"
"Make sure you installed Qt6on your system\n"
"e.g. on debian 'sudo apt install libqt6webenginewidgets6'\n"
"\n"
"Exception:\n\n~a")
ffi-library exp)))
(else (error
(format "Cannot load ~a for os ~a\n\nException:\n\n~a"
ffi-library os exp))))
)
])
(ffi-lib webview-lib-file)))
(define webview-lib (ffi-lib webview-lib-file))
(define-ffi-definer define-rktwebview webview-lib)
;;; Callbacks from the OS library
(define callback-box (box '()))
(define (applier thunk)
(thunk))
@@ -117,7 +150,19 @@
no_delegate_for_context = 5
move_failed = 12
resize_failed = 13
)
)
)
(define _rkt_window_state_t
(_enum '(invalid = -1
normal = 0
minimized = 1
maximized = 2
hidden = 3
normal_active = 16
maximized_active = 18
)
)
)
@@ -170,7 +215,7 @@
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_open_devtools(int wv);
(define-rktwebview rkt_webview_open_devtools
(_fun _int -> _int))
(_fun _int -> _rkt_result_t))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t e);
(define-rktwebview rkt_webview_destroy_event
@@ -184,10 +229,41 @@
(define-rktwebview rkt_webview_resize
(_fun _int _int _int -> _rkt_result_t))
(define-syntax def-rkt-wv
(syntax-rules ()
((_ name)
(define-rktwebview name
(_fun _int -> _rkt_result_t)))))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_hide(rktwebview_t w);
(def-rkt-wv rkt_webview_hide)
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show(rktwebview_t w);
(def-rkt-wv rkt_webview_show)
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_show_normal(rktwebview_t w);
(def-rkt-wv rkt_webview_show_normal)
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_present(rktwebview_t w);
(def-rkt-wv rkt_webview_present)
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_maximize(rktwebview_t w);
(def-rkt-wv rkt_webview_maximize)
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_minimize(rktwebview_t w);
(def-rkt-wv rkt_webview_minimize)
;RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv);
(define-rktwebview rkt_webview_valid
(_fun _int -> _int))
;RKTWEBVIEW_QT_EXPORT window_state_t rkt_webview_window_state(rktwebview_t w);
(define-rktwebview rkt_webview_window_state
(_fun _int -> _rkt_window_state_t))
;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_title(rktwebview_t wv, const char *title);
(define-rktwebview rkt_webview_set_title
(_fun _int _string/utf-8 -> _rkt_result_t))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Initialize and start library
@@ -274,11 +350,14 @@
(define (rkt-webview-set-html! wv html)
(rkt_webview_set_html (rkt-wv-win wv) html))
(define (rkt-webview-set-title! wv title)
(rkt_webview_set_title (rkt-wv-win wv) title))
(define (rkt-webview-run-js wv js)
(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) js))
(let* ((r (rkt_webview_call_js (rkt-wv-win wv) js))
(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)
@@ -290,6 +369,20 @@
(define (rkt-webview-move wv x y)
(rkt_webview_move (rkt-wv-win wv) x y))
(define-syntax def-rkt-wrapper-wv
(syntax-rules ()
((_ name c-name)
(define (name wv)
(c-name (rkt-wv-win wv))))))
(def-rkt-wrapper-wv rkt-webview-show rkt_webview_show)
(def-rkt-wrapper-wv rkt-webview-hide rkt_webview_hide)
(def-rkt-wrapper-wv rkt-webview-show-normal rkt_webview_show_normal)
(def-rkt-wrapper-wv rkt-webview-minimize rkt_webview_minimize)
(def-rkt-wrapper-wv rkt-webview-maximize rkt_webview_maximize)
(def-rkt-wrapper-wv rkt-webview-present rkt_webview_present)
(def-rkt-wrapper-wv rkt-webview-window-state rkt_webview_window_state)
(define (rkt-webview-open-devtools wv)
(rkt_webview_open_devtools (rkt-wv-win wv)))
@@ -309,5 +402,10 @@
open-windows))
(stop-event-processing))
(plumber-add-flush! (current-plumber)
(λ (handle)
(rkt-webview-exit)))