From 20b77745aa67809f46b8169f77dbb79821ee8759 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Wed, 4 Mar 2026 01:33:29 +0100 Subject: [PATCH] - --- .gitignore | 1 + private/racket-webview-qt.rkt | 99 +++++++++++++++++++++++++++++++---- rktwebview_qt/CMakeLists.txt | 11 +--- rktwebview_qt/rktwebview.cpp | 4 +- 4 files changed, 93 insertions(+), 22 deletions(-) diff --git a/.gitignore b/.gitignore index 470d84b..67e8e3e 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,4 @@ compiled/ webview/ rktwebview/build/ /rktwebview/.qtcreator/CMakeLists.txt.user +/private/*.bak diff --git a/private/racket-webview-qt.rkt b/private/racket-webview-qt.rkt index 8db1e5a..40bb349 100644 --- a/private/racket-webview-qt.rkt +++ b/private/racket-webview-qt.rkt @@ -35,7 +35,10 @@ (define lib-type 'release) -(define-runtime-path lib-dir "../lib") +(define-runtime-path lib-dir ".") +; (if (eq? (system-type 'os*) 'windows) +; "..\\lib" +; "../lib")) (define libname (let ((os (system-type 'os*))) (cond ((eq? os 'windows) (format "rktwebview.dll")) @@ -44,8 +47,53 @@ ) ;(set! libname "../rktwebview/build/Release/rktwebview.dll") ;(set! libname "../rktwebview/build/Release/librktwebview.so") -(set! libname "../rktwebview_qt/build/Release/librktwebview_qt.so") -(define webview-lib-file (build-path lib-dir libname)) +(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 webview-lib-file (normalize-path (build-path lib-dir libname))) + +(define webview-lib-file libname) +(displayln (format "~a - ~a" (current-directory) webview-lib-file)) + +(putenv "QT_PLUGIN_PATH" (path->string (build-path (current-directory) "plugins"))) +(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") + +(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) (define webview-lib (ffi-lib webview-lib-file)) (define-ffi-definer define-rktwebview webview-lib) @@ -58,11 +106,30 @@ ;; Types / Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(define _rkt_result_t + (_enum '(no_result_yet = -1 + oke = 0 + set_html_failed = 1 + set_navigate_failed = 2 + eval_js_failed = 3 + no_devtools_on_platform = 4 + no_delegate_for_context = 5 + move_failed = 12 + resize_failed = 13 + ) + ) + ) + (define-cstruct _rkt_evt_t ([w _int] [evt _pointer] )) +(define-cstruct _rkt_js_result_t + ([result _rkt_result_t] + [value _pointer] + )) + ;RKTWEBVIEW_QT_EXPORT void rkt_webview_init(int &argc, char **argv); (define-rktwebview rkt_webview_init (_fun -> _void)) @@ -82,15 +149,23 @@ ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_url(int wv, const char *url); (define-rktwebview rkt_webview_set_url - (_fun _int _string/utf-8 -> _int)) + (_fun _int _string/utf-8 -> _rkt_result_t)) ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_set_html(int wv, const char *html); (define-rktwebview rkt_webview_set_html - (_fun _int _string/utf-8 -> _int)) + (_fun _int _string/utf-8 -> _rkt_result_t)) ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_run_js(int wv, const char *js); (define-rktwebview rkt_webview_run_js - (_fun _int _string/utf-8 -> _int)) + (_fun _int _string/utf-8 -> _rkt_result_t)) + +;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)) + +;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 @@ -98,15 +173,15 @@ ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_destroy_event(rkt_event_t e); (define-rktwebview rkt_webview_destroy_event - (_fun _rkt_evt_t-pointer -> _int)) + (_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 -> _int)) + (_fun _int _int _int -> _rkt_result_t)) ;RKTWEBVIEW_QT_EXPORT result_t rkt_webview_resize(rktwebview_t w, int width, int height); (define-rktwebview rkt_webview_resize - (_fun _int _int _int -> _int)) + (_fun _int _int _int -> _rkt_result_t)) ;RKTWEBVIEW_QT_EXPORT bool rkt_webview_valid(rktwebview_t wv); (define-rktwebview rkt_webview_valid @@ -202,7 +277,11 @@ (rkt_webview_run_js (rkt-wv-win wv) js)) (define (rkt-webview-call-js wv js) - (rkt_webview_call_js (rkt-wv-win wv) js)) + (let* ((r (rkt_webview_call_js (rkt-wv-win) 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) + (list result value))) (define (rkt-webview-resize wv w h) (rkt_webview_resize (rkt-wv-win wv) w h)) diff --git a/rktwebview_qt/CMakeLists.txt b/rktwebview_qt/CMakeLists.txt index 3816279..f0a0c88 100644 --- a/rktwebview_qt/CMakeLists.txt +++ b/rktwebview_qt/CMakeLists.txt @@ -32,19 +32,10 @@ target_compile_definitions(rktwebview_qt PRIVATE RKTWEBVIEW_QT_LIBRARY) add_executable(rktwebview_qt_test main.cpp - rktwebview_qt_global.h - rktwebview_qt.cpp - rktwebview_qt.h - rktwebview.h - rktwebview.cpp - webviewqt.h webviewqt.cpp - webviewwindow.h webviewwindow.cpp - rktwebview_internal.h - webviewapp.h webviewapp.cpp - rktutils.h rktutils.cpp ) target_compile_definitions(rktwebview_qt_test PRIVATE RKTWEBVIEW_QT_LIBRARY) target_link_libraries(rktwebview_qt_test PRIVATE Qt${QT_VERSION_MAJOR}::Widgets) target_link_libraries(rktwebview_qt_test PRIVATE Qt${QT_VERSION_MAJOR}::WebEngineWidgets) +target_link_libraries(rktwebview_qt_test PRIVATE rktwebview_qt) diff --git a/rktwebview_qt/rktwebview.cpp b/rktwebview_qt/rktwebview.cpp index ac8ea8b..041aeb6 100644 --- a/rktwebview_qt/rktwebview.cpp +++ b/rktwebview_qt/rktwebview.cpp @@ -86,8 +86,8 @@ void rkt_webview_process_events(int for_ms) { rkt_webview_init(); - int64_t start_ms = current_ms(); - int64_t end_ms = start_ms + for_ms; + uint64_t start_ms = current_ms(); + uint64_t end_ms = start_ms + for_ms; while (current_ms() < end_ms) { QThread::usleep(500); // sleep 0.5 ms