From c2db35c6fc5c6f3a7ffe1bf53058906ab3975f48 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 30 Apr 2026 23:01:43 +0200 Subject: [PATCH 01/19] wv tray docs --- example1/example.rkt | 4 +- info.rkt | 1 + scrbl/wv-tray.scrbl | 99 +++++++++++++++++++++++++++++++++++++++++++ scrbl/wv-window.scrbl | 69 ++++++++++++++++++++++++++---- wv-window.rkt | 4 ++ 5 files changed, 167 insertions(+), 10 deletions(-) create mode 100644 scrbl/wv-tray.scrbl diff --git a/example1/example.rkt b/example1/example.rkt index e217a31..d5f9292 100644 --- a/example1/example.rkt +++ b/example1/example.rkt @@ -113,7 +113,9 @@ (unless (eq? counter-thread #f) (send this message 'warning "Cannot close window" "Cannot close this window while the counter runs")) - (eq? counter-thread #f)) + (if (eq? counter-thread #f) + (super can-close?) + #f)) (define start-stop-btn #f) diff --git a/info.rkt b/info.rkt index d1d5e26..213b5e6 100644 --- a/info.rkt +++ b/info.rkt @@ -12,6 +12,7 @@ ("scrbl/wv-context.scrbl" () (gui-library) "wv-context") ("scrbl/wv-settings.scrbl" () (gui-library) "wv-settings") ("scrbl/wv-window.scrbl" () (gui-library) "wv-window") + ("scrbl/wv-tray.scrbl" () (gui-library) "wv-tray") ("scrbl/menu.scrbl" () (gui-library) "menu") ("scrbl/wv-dialog.scrbl" () (gui-library) "wv-dialog") ("scrbl/wv-element.scrbl" () (gui-library) "wv-element") diff --git a/scrbl/wv-tray.scrbl b/scrbl/wv-tray.scrbl new file mode 100644 index 0000000..aed28aa --- /dev/null +++ b/scrbl/wv-tray.scrbl @@ -0,0 +1,99 @@ +#lang scribble/manual + +@(require (for-label racket/base + racket/class + racket/contract + "../wv-tray.rkt" + "../menu.rkt")) + +@title{Tray Icons} + +@author[@author+email["Hans Dijkema" "hans@dijkewijk.nl"]] + +@defmodule[(file "../wv-tray.rkt")] + +The @racketmodname[(file "../wv-tray.rkt")] module provides the +@racket[wv-tray%] class. A tray object represents a native system tray +icon backed by the webview runtime. + +@defclass[wv-tray% object% ()]{ + +Creates a native tray icon. + +@bold{Initialization fields} + +@itemlist[#:style 'compact + @item{@racket[icon] — mandatory} + @item{@racket[tooltip] — default @racket[""]} + @item{@racket[menu] — default @racket[#f]}] + +If a menu is provided, it is installed during initialization. + +@bold{Events} + +These methods can be overridden. + +@defmethod[(activated [reason symbol?]) any/c]{ +Called when the tray icon is activated. The @racket[reason] is derived +from the native event. +} + +@defmethod[(message-clicked) any/c]{ +Called when a tray message is clicked. +} + +@defmethod[(menu-item-chosen [id symbol?]) any/c]{ +Called when a menu item is chosen without a registered callback. +} + +@defmethod[(unhandled-event [evt hash?]) any/c]{ +Called for unhandled native events. +} + +@bold{Commands} + +@defmethod[(show) (is-a?/c wv-tray%)]{ +Shows the tray icon and returns the tray object. +} + +@defmethod[(hide) (is-a?/c wv-tray%)]{ +Hides the tray icon and returns the tray object. +} + +@defmethod[(close) (is-a?/c wv-tray%)]{ +Closes the tray icon and returns the tray object. +} + +@defmethod[(set-icon! [icon-file path-string?]) (is-a?/c wv-tray%)]{ +Changes the tray icon and returns the tray object. +} + +@defmethod[(set-tooltip! [text string?]) (is-a?/c wv-tray%)]{ +Changes the tooltip and returns the tray object. +} + +@defmethod[(show-message [title string?] + [message string?]) + (is-a?/c wv-tray%)]{ +Shows a native tray message and returns the tray object. +} + +@defmethod[(set-menu! [menu-def any/c]) (is-a?/c wv-tray%)]{ +Installs a tray menu and returns the tray object. +} + +@defmethod[(connect-menu! [id symbol?] + [callback procedure?]) + (is-a?/c wv-tray%)]{ +Registers a callback for a menu item and returns the tray object. +} + +@defmethod[(disconnect-menu! [id symbol?]) (is-a?/c wv-tray%)]{ +Removes a menu callback and returns the tray object. +} + +@defmethod[(handle) any/c]{ +Returns the native tray handle. +} + +} \ No newline at end of file diff --git a/scrbl/wv-window.scrbl b/scrbl/wv-window.scrbl index ad9950a..46b1afd 100644 --- a/scrbl/wv-window.scrbl +++ b/scrbl/wv-window.scrbl @@ -55,6 +55,7 @@ API. [settings (send wv-context settings (string->symbol (format "~a" html-path)))] [title string? "Racket Webview Window"] + [icon (or/c path-string? #f) #f] [width (or/c exact-integer? #f) #f] [height (or/c exact-integer? #f) #f] [x (or/c exact-integer? #f) #f] @@ -78,7 +79,9 @@ After construction, the class: @item{creates the underlying webview window} @item{installs the internal event handler} @item{sets the title} - @item{initializes position and size from settings or defaults}] + @item{Applies the icon during construction when it is not @racket[#f]} + @item{initializes position and size from settings or defaults} + ] If a parent is supplied, the underlying lower-level parent window is passed to @racket[webview-create]. @@ -148,13 +151,6 @@ Updates the internal size and stores the new dimensions in @racket[settings] under @racket['width] and @racket['height]. } -@defmethod[(window-state-changed [st symbol?]) any/c]{ - -Called when the underlying window state changes. - -The default implementation returns @racket[#t]. -} - @defmethod[(page-loaded [oke any/c]) any/c]{ Called when a @racket['page-loaded] event is received. @@ -223,6 +219,8 @@ window. Opens the developer tools and returns this window. } +@bold{Window manipulation and information} + @defmethod[(move [x exact-integer?] [y exact-integer?]) (is-a?/c wv-window%)]{ Moves the window and returns this window. @@ -238,6 +236,45 @@ Resizes the window and returns this window. Closes the window and returns this window. } +@defmethod[(show) (is-a?/c wv-window%)]{Shows the window.} +@defmethod[(present) (is-a?/c wv-window%)]{Presents the window.} +@defmethod[(hide) (is-a?/c wv-window%)]{Hides the window.} +@defmethod[(maximize) (is-a?/c wv-window%)]{Maximizes the window.} +@defmethod[(minimize) (is-a?/c wv-window%)]{Minimizes the window.} +@defmethod[(show-normal) (is-a?/c wv-window%)]{Restores normal state.} + + +@defmethod[(window-state) symbol?]{ + Returns the current native window state. + } + +@defmethod[(window-state-changed [st symbol?]) any/c]{ + Called when the underlying window state changes. + + Window states following calls to @racket{show}, @racket{present}, @racket{hide}, etc.: + @itemlist[#:style 'compact + @item{@racket{'normal}} + @item{@racket{'hidden}} + @item{@racket{'minimized}} + @item{@racket{'maximized}} + @item{@racket{'maximized-active} and} + @item{@racket{'normal-active}} + ] + are forwarded to @racket{window-state-changed}. + } + +@defmethod[(quit) (is-a?/c wv-window%)]{Quits the webview runtime.} + + +@bold{Menu's and binding elements to events} + +@defmethod[(popup-menu! [menu-def is-wv-menu?] + [x exact-integer?] + [y exact-integer?]) + any/c]{ +Shows @racket[menu-def] as a popup menu at @racket[x], @racket[y]. +} + @defmethod[(bind! [selector (or/c symbol? string?)] [events (or/c symbol? list?)] [callback procedure?]) @@ -269,7 +306,7 @@ internal cache. The returned value is the list produced by @racket[webview-unbind!]. } - @defmethod[(set-menu! [menu is-wv-menu?]) +@defmethod[(set-menu! [menu is-wv-menu?]) (is-a?/c wv-window%)]{ Installs @racket[menu] in this window and returns this window. @@ -305,6 +342,20 @@ chosen. Sets the window title. } +@defmethod[(set-icon! [icon-file path-string?]) any/c]{ + Sets the window icon. + } + + +@bold{Javascript methods} + +See also **Javascript syntax module** + +@defmethod[(run-js [js string?]) any/c]{ Runs JavaScript in the window. } +@defmethod[(call-js [js string?]) any/c]{ Calls JavaScript in the window and returns the decoded result. } + +@bold{File dialog methods} + @defmethod[(file-dialog-done [flag symbol?] [file any/c] [dir any/c] diff --git a/wv-window.rkt b/wv-window.rkt index aa2522b..1db0176 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -60,6 +60,7 @@ [height #f] [x #f] [y #f] + [quit-on-close #t] ) (define wv #f) @@ -247,6 +248,8 @@ #t) (define/public (can-close?) + (when quit-on-close + (send this quit)) #t) (define/public (closed) @@ -341,6 +344,7 @@ this) (define/public (quit) + (dbg-webview "Quit called") (webview-quit) this) From 41cd0021b047a6b7f21a35393b2f42017147e3fd Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Thu, 30 Apr 2026 23:16:41 +0200 Subject: [PATCH 02/19] make sure the "closed" event comes. It will not come from the C backend, so we generate it in the racket-webview-qt.rkt module" --- example1/example.rkt | 4 +--- racket-webview-qt.rkt | 9 ++++++++- wv-window.rkt | 4 ++-- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/example1/example.rkt b/example1/example.rkt index d5f9292..e217a31 100644 --- a/example1/example.rkt +++ b/example1/example.rkt @@ -113,9 +113,7 @@ (unless (eq? counter-thread #f) (send this message 'warning "Cannot close window" "Cannot close this window while the counter runs")) - (if (eq? counter-thread #f) - (super can-close?) - #f)) + (eq? counter-thread #f)) (define start-stop-btn #f) diff --git a/racket-webview-qt.rkt b/racket-webview-qt.rkt index 3841ea4..0d953e7 100644 --- a/racket-webview-qt.rkt +++ b/racket-webview-qt.rkt @@ -746,7 +746,14 @@ (define (rkt-webview-close handle) (rkt_webview_close (rkt-wv-win handle)) - ;(enqueue! (rkt-wv-evt-queue handle) 'quit) + (let ((evt-cb (hash-ref evt-cb-hash (rkt-wv-win handle) (λ args #t)))) + (let ((evt (format + (string-append "{ \"event\": \"closed\", " + " \"elaped\": -1.0, " + " \"evt-id\": -98832, " + " \"timestamp\": ~a }") + (current-milliseconds)))) + (evt-cb evt))) (set-rkt-wv-valid! handle #f) (hash-remove! evt-cb-hash (rkt-wv-win handle)) (hash-remove! rkt-wv-store (rkt-wv-win handle)) diff --git a/wv-window.rkt b/wv-window.rkt index 1db0176..702083b 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -248,11 +248,11 @@ #t) (define/public (can-close?) - (when quit-on-close - (send this quit)) #t) (define/public (closed) + (when quit-on-close + (send this quit)) #t) (define/public (js-event js-event) From 62093d486dac5e6c61e00d8e69f9126a0335c733 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 13:43:05 +0200 Subject: [PATCH 03/19] drag/drop support --- wv-element.rkt | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/wv-element.rkt b/wv-element.rkt index 09685e8..44f47c8 100644 --- a/wv-element.rkt +++ b/wv-element.rkt @@ -88,6 +88,40 @@ (define/public (attr/datetime attr) (webview-attr/datetime wv element-id attr)) + (define/public (draggable! yes-no . on-drag) + (webview-set-attr! wv element-id "draggable" yes-no) + (if (eq? yes-no #f) + (send window unbind! element-id 'ondragstart) + (if (null? on-drag) + (error "Need an on-drag handler (λ (el) ...)") + (send window bind! element-id 'ondragstart + (λ (el evt data) ((car on-drag) el))) + ) + ) + ) + + (define/public (droppable! yes-no . on-drop) + (if (eq? yes-no #f) + (send window unbind! element-id 'ondrop) + (if (null? on-drop) + (error "Need an on-drop handler (λ (el) ...)") + (send window bind! element-id 'ondrop + (λ (el evt data) ((car on-drop) el))) + ) + ) + ) + + (define/public (dragover! yes-no . on-dragover) + (if (eq? yes-no #f) + (send window unbind! element-id 'ondragover) + (if (null? on-dragover) + (error "Need an on-dragover handler (λ (el) ...)") + (send window bind! element-id 'ondragover + (λ (el evt data) ((car on-dragover) el))) + ) + ) + ) + (define/public (focus!) (let ((s (js (let* ((el (send document getElementById (eval element-id)))) (if (=== el null) From 2ca70ed91c6b01c86e1670b3d50f8a5329fe891e Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 13:50:39 +0200 Subject: [PATCH 04/19] set-attr! --- wv-window.rkt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wv-window.rkt b/wv-window.rkt index 702083b..ce8d108 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -385,6 +385,9 @@ ) ) + (define/public (set-attr! selector key value) + (webview-set-attr! wv selector key value)) + (define/public (set-title! title) (webview-set-title! wv title)) From 5666275a5e2368cbb22178d30717e0598cf0e290 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 13:54:50 +0200 Subject: [PATCH 05/19] set-attr keyvalues --- wv-window.rkt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/wv-window.rkt b/wv-window.rkt index ce8d108..300c8d0 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -385,8 +385,8 @@ ) ) - (define/public (set-attr! selector key value) - (webview-set-attr! wv selector key value)) + (define/public (set-attr! selector key-values) + (webview-set-attr! wv selector key-values) (define/public (set-title! title) (webview-set-title! wv title)) From 24a13aef7236aec28f2048cd2684342c37fda4d2 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 13:55:53 +0200 Subject: [PATCH 06/19] set-attr keyvalues --- wv-window.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wv-window.rkt b/wv-window.rkt index 300c8d0..3a25353 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -386,7 +386,7 @@ ) (define/public (set-attr! selector key-values) - (webview-set-attr! wv selector key-values) + (webview-set-attr! wv selector key-vaues)) (define/public (set-title! title) (webview-set-title! wv title)) From d43c7da6bef6f8a5d1bf54fa988974b7dcf6b551 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 13:56:39 +0200 Subject: [PATCH 07/19] set-attr keyvalues --- wv-window.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/wv-window.rkt b/wv-window.rkt index 3a25353..a94fc2b 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -386,7 +386,7 @@ ) (define/public (set-attr! selector key-values) - (webview-set-attr! wv selector key-vaues)) + (webview-set-attr! wv selector key-values)) (define/public (set-title! title) (webview-set-title! wv title)) From 3767d7c1f9c1c66f35df2621bd2c34baacd5243a Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 14:24:27 +0200 Subject: [PATCH 08/19] prevent default added --- js/boilerplate.js | 14 +++++++------- racket-webview.rkt | 7 ++++--- wv-window.rkt | 6 ++++-- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/js/boilerplate.js b/js/boilerplate.js index 2d5170c..39c0ce3 100644 --- a/js/boilerplate.js +++ b/js/boilerplate.js @@ -50,7 +50,7 @@ window.rkt_event_info = function(e, id, evt) { window.rkt_bounds = new Map(); -window.rkt_get_evt_handler = function(event_kind, el_id, selector, win_nr) +window.rkt_get_evt_handler = function(event_kind, el_id, selector, win_nr, no_prevent_default = false) { let handler_key = "h-" + event_kind + "-" + el_id + "-" + selector + "-" + win_nr; if (window.rkt_bounds.has(handler_key)) { @@ -61,21 +61,21 @@ window.rkt_get_evt_handler = function(event_kind, el_id, selector, win_nr) let obj = {evt: event_kind, id: el_id, selector: selector, window: win_nr, js_evt: window.rkt_event_info(event_kind, el_id, e) }; window.rkt_put_evt(obj); - e.preventDefault(); + if (!no_prevent_default) { e.preventDefault(); } } }; window.rkt_bounds.set(handler_key, handler); return handler; } -} +}; window.rkt_rm_evt_handler = function(event_kind, el_id, selector, win_nr) { let handler_key = "h-" + event_kind + "-" + el_id + "-" + selector + "-" + win_nr; window.rkt_bounds.delete(handler_key); -} +}; -window.rkt_bind_evt_ids = function(win_nr, selector, event_kinds) { +window.rkt_bind_evt_ids = function(win_nr, selector, event_kinds, no_prevent_default = false) { try { let nodelist = document.querySelectorAll(selector); if (nodelist === undefined || nodelist === null) { @@ -92,7 +92,7 @@ window.rkt_bind_evt_ids = function(win_nr, selector, event_kinds) { let i; for(i = 0; i < event_kinds.length; i++) { let event_kind = event_kinds[i]; - el.addEventListener(event_kind, window.rkt_get_evt_handler(event_kind, el_id, selector, win_nr)); + el.addEventListener(event_kind, window.rkt_get_evt_handler(event_kind, el_id, selector, win_nr, no_prevent_default)); } let info = [ el_id, el_tag, el_type ]; ids.push(info); @@ -152,7 +152,7 @@ window.rkt_with_selector = function(selector, func) { let c = results.length; let r = { 'applied-to-elements': c, 'with-ids': results.filter((id) => id !== null) }; return r; -} +}; window.addEventListener('contextmenu', function (e) { e.preventDefault(); }); diff --git a/racket-webview.rkt b/racket-webview.rkt index db3ab37..be70f36 100644 --- a/racket-webview.rkt +++ b/racket-webview.rkt @@ -705,7 +705,7 @@ (rkt-webview-close (wv-win-handle wv)) 'oke)) -(define/contract (webview-bind! wv selector event) +(define/contract (webview-bind! wv selector event no-prevent-default) (-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) list?) (let* ((sel (if (symbol? selector) (format "#~a" selector) @@ -715,8 +715,9 @@ (map (λ (e) (format "'~a'" e)) event*) ", "))) ) (let ((r (webview-call-js wv - (format "return window.rkt_bind_evt_ids(~a, '~a', ~a)" - (wv-win-window-nr wv) sel evt)))) + (format "return window.rkt_bind_evt_ids(~a, '~a', ~a, ~a)" + (wv-win-window-nr wv) sel evt + (if no-prevent-default 'true 'false))))) (map (λ (el) (list (string->symbol (car el)) (cadr el) (caddr el))) r)))) diff --git a/wv-window.rkt b/wv-window.rkt index a94fc2b..0fc08b3 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -354,8 +354,10 @@ (define/public (call-js js) (webview-call-js wv js)) - (define/public (bind! selector events callback) - (let ((items (webview-bind! wv selector events)) + (define/public (bind! selector events callback . no-prevent-default) + (let ((items (webview-bind! wv selector events (if (null? no-prevent-default) + #f + (car no-prevent-default)))) (events* (if (symbol? events) (list events) events))) (map (λ (item) (let ((id (car item)) From 77550d2105c0779a447e4f88daf840b8f5f0bedb Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 14:26:23 +0200 Subject: [PATCH 09/19] prevent default added --- racket-webview.rkt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/racket-webview.rkt b/racket-webview.rkt index be70f36..3faace2 100644 --- a/racket-webview.rkt +++ b/racket-webview.rkt @@ -706,7 +706,7 @@ 'oke)) (define/contract (webview-bind! wv selector event no-prevent-default) - (-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) list?) + (-> wv-win? (or/c symbol? string?) (or/c symbol? list-of-symbol?) boolean? list?) (let* ((sel (if (symbol? selector) (format "#~a" selector) selector)) From 3cb43322a90e5ac704461d553273388aa7c051ca Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 14:38:12 +0200 Subject: [PATCH 10/19] prevent default added --- js/boilerplate.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/js/boilerplate.js b/js/boilerplate.js index 39c0ce3..66853a3 100644 --- a/js/boilerplate.js +++ b/js/boilerplate.js @@ -60,8 +60,13 @@ window.rkt_get_evt_handler = function(event_kind, el_id, selector, win_nr, no_pr handleEvent: function(e) { let obj = {evt: event_kind, id: el_id, selector: selector, window: win_nr, js_evt: window.rkt_event_info(event_kind, el_id, e) }; + console.log(e); window.rkt_put_evt(obj); - if (!no_prevent_default) { e.preventDefault(); } + if (!no_prevent_default) { + console.log("preventing default"); + e.preventDefault(); + } + } } }; window.rkt_bounds.set(handler_key, handler); From dc58f0d4feb728381823f14c1edd02a535febb50 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 14:41:43 +0200 Subject: [PATCH 11/19] prevent default added --- js/boilerplate.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/js/boilerplate.js b/js/boilerplate.js index 66853a3..5e8ca6f 100644 --- a/js/boilerplate.js +++ b/js/boilerplate.js @@ -67,8 +67,7 @@ window.rkt_get_evt_handler = function(event_kind, el_id, selector, win_nr, no_pr e.preventDefault(); } } - } - }; + }; window.rkt_bounds.set(handler_key, handler); return handler; } From c9a705b5df76d58605f2d9c4a464d0ba5142762c Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 14:51:14 +0200 Subject: [PATCH 12/19] prevent default added --- racket-webview.rkt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/racket-webview.rkt b/racket-webview.rkt index 3faace2..9edcee8 100644 --- a/racket-webview.rkt +++ b/racket-webview.rkt @@ -714,10 +714,11 @@ (evt (format "[ ~a ]" (string-join (map (λ (e) (format "'~a'" e)) event*) ", "))) ) - (let ((r (webview-call-js wv - (format "return window.rkt_bind_evt_ids(~a, '~a', ~a, ~a)" - (wv-win-window-nr wv) sel evt - (if no-prevent-default 'true 'false))))) + (let* ((j (format "return window.rkt_bind_evt_ids(~a, '~a', ~a, ~a);" + (wv-win-window-nr wv) sel evt (if no-prevent-default 'true 'false))) + (r (webview-call-js wv j)) + ) + (dbg-webview "called js: ~a" j) (map (λ (el) (list (string->symbol (car el)) (cadr el) (caddr el))) r)))) From 0c262bd47b24b8f3224f1c4dd7d9a56a23d05d71 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 14:55:19 +0200 Subject: [PATCH 13/19] prevent default added --- wv-window.rkt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/wv-window.rkt b/wv-window.rkt index 0fc08b3..d5c8837 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -355,10 +355,11 @@ (webview-call-js wv js)) (define/public (bind! selector events callback . no-prevent-default) - (let ((items (webview-bind! wv selector events (if (null? no-prevent-default) - #f - (car no-prevent-default)))) - (events* (if (symbol? events) (list events) events))) + (let* ((npd (if (null? no-prevent-default) #f (car no-prevent-default))) + (items (webview-bind! wv selector events npd)) + (events* (if (symbol? events) (list events) events)) + ) + (dbg-webview "No-prevent-default = ~a" npd) (map (λ (item) (let ((id (car item)) (type (string->symbol (string-downcase (caddr item)))) From 061ad918f115127217a93ceb79625f5dd8612bfd Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 15:05:30 +0200 Subject: [PATCH 14/19] event debugging --- racket-webview.rkt | 2 +- wv-window.rkt | 25 +++++++++++++++++++++---- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/racket-webview.rkt b/racket-webview.rkt index 9edcee8..1c5fe98 100644 --- a/racket-webview.rkt +++ b/racket-webview.rkt @@ -718,7 +718,7 @@ (wv-win-window-nr wv) sel evt (if no-prevent-default 'true 'false))) (r (webview-call-js wv j)) ) - (dbg-webview "called js: ~a" j) + ;(dbg-webview "called js: ~a" j) (map (λ (el) (list (string->symbol (car el)) (cadr el) (caddr el))) r)))) diff --git a/wv-window.rkt b/wv-window.rkt index d5c8837..d668259 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -170,10 +170,27 @@ ;; Events ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + (define last-event-time (current-milliseconds)) + (define last-event-kind #f) + (define last-js-event #f) + (define (event-handler wv evt) - (let ((event (hash-ref evt 'event 'unknown-event)) - ) - (dbg-webview "event-handler - evt = ~a" evt) + (let* ((event (hash-ref evt 'event 'unknown-event)) + (js-evt (if (eq? event 'js-evt) + (hash-ref (hash-ref evt 'js-evt) 'evt #f) + #f)) + ) + + (unless (and + (> (+ last-event-time 500) (current-milliseconds)) + (eq? last-event-kind event) + (or (eq? js-evt #f) + (eq? last-js-event js-evt))) + (dbg-webview "event-handler - evt = ~a" evt) + (set! last-event-kind event) + (set! last-js-event js-evt) + (set! last-event-time (current-milliseconds))) + (cond ((eq? event 'resize) (send this resized (hash-ref evt 'w) (hash-ref evt 'h))) @@ -359,7 +376,7 @@ (items (webview-bind! wv selector events npd)) (events* (if (symbol? events) (list events) events)) ) - (dbg-webview "No-prevent-default = ~a" npd) + ;(dbg-webview "No-prevent-default = ~a" npd) (map (λ (item) (let ((id (car item)) (type (string->symbol (string-downcase (caddr item)))) From ad7a74b0e95386438d385b066525f2c23033c194 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 15:08:06 +0200 Subject: [PATCH 15/19] event debugging --- wv-window.rkt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/wv-window.rkt b/wv-window.rkt index d668259..4ada1f4 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -179,17 +179,19 @@ (js-evt (if (eq? event 'js-evt) (hash-ref (hash-ref evt 'js-evt) 'evt #f) #f)) + (cms (current-milliseconds)) ) (unless (and - (> (+ last-event-time 500) (current-milliseconds)) + (< cms last-event-time) (eq? last-event-kind event) (or (eq? js-evt #f) (eq? last-js-event js-evt))) (dbg-webview "event-handler - evt = ~a" evt) (set! last-event-kind event) (set! last-js-event js-evt) - (set! last-event-time (current-milliseconds))) + (set! last-event-time (+ cms 500)) + ) (cond ((eq? event 'resize) From d6c4b2176e038d80a9e942506480466759f73707 Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 15:12:22 +0200 Subject: [PATCH 16/19] event debugging --- wv-window.rkt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/wv-window.rkt b/wv-window.rkt index 4ada1f4..d32e9aa 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -182,6 +182,9 @@ (cms (current-milliseconds)) ) + (dbg-webview "< ~a ~a && eq? ~a ~a && (eq? ~a ~a || eq? ~a ~a" + cms last-event-time last-event-kind event js-evt #f + last-js-event js-evt) (unless (and (< cms last-event-time) (eq? last-event-kind event) From 8626bc61dcd17912c87ce7bcbaa969b76595466d Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 15:16:10 +0200 Subject: [PATCH 17/19] event debugging --- wv-window.rkt | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/wv-window.rkt b/wv-window.rkt index d32e9aa..0f25341 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -182,9 +182,11 @@ (cms (current-milliseconds)) ) - (dbg-webview "< ~a ~a && eq? ~a ~a && (eq? ~a ~a || eq? ~a ~a" - cms last-event-time last-event-kind event js-evt #f - last-js-event js-evt) + (dbg-webview "< ~a ~a = ~a && eq? ~a ~a = ~a && (eq? ~a ~a || eq? ~a ~a) = ~a" + cms last-event-time (< cms last-event-time) + last-event-kind event (eq? last-event-kind event) + js-evt #f last-js-event js-evt (or (eq? js-evt #f) (eq? last-js-event js-evt)) + ) (unless (and (< cms last-event-time) (eq? last-event-kind event) From a762840e0c7eb296a33a05cb56c34057e0d2a68f Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 15:17:47 +0200 Subject: [PATCH 18/19] event debugging --- wv-window.rkt | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/wv-window.rkt b/wv-window.rkt index 0f25341..d8134f0 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -177,16 +177,19 @@ (define (event-handler wv evt) (let* ((event (hash-ref evt 'event 'unknown-event)) (js-evt (if (eq? event 'js-evt) - (hash-ref (hash-ref evt 'js-evt) 'evt #f) + (let ((e (hash-ref (hash-ref evt 'js-evt) 'evt #f))) + (if e + (string->symbol e) + #f)) #f)) (cms (current-milliseconds)) ) - (dbg-webview "< ~a ~a = ~a && eq? ~a ~a = ~a && (eq? ~a ~a || eq? ~a ~a) = ~a" - cms last-event-time (< cms last-event-time) - last-event-kind event (eq? last-event-kind event) - js-evt #f last-js-event js-evt (or (eq? js-evt #f) (eq? last-js-event js-evt)) - ) + ;(dbg-webview "< ~a ~a = ~a && eq? ~a ~a = ~a && (eq? ~a ~a || eq? ~a ~a) = ~a" + ; cms last-event-time (< cms last-event-time) + ; last-event-kind event (eq? last-event-kind event) + ; js-evt #f last-js-event js-evt (or (eq? js-evt #f) (eq? last-js-event js-evt)) + ; ) (unless (and (< cms last-event-time) (eq? last-event-kind event) From 3d99a4aa926268105144948b1e6d95cba116607e Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Mon, 4 May 2026 17:11:35 +0200 Subject: [PATCH 19/19] comment out console.log messages --- js/boilerplate.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/boilerplate.js b/js/boilerplate.js index 5e8ca6f..1138e9c 100644 --- a/js/boilerplate.js +++ b/js/boilerplate.js @@ -60,10 +60,10 @@ window.rkt_get_evt_handler = function(event_kind, el_id, selector, win_nr, no_pr handleEvent: function(e) { let obj = {evt: event_kind, id: el_id, selector: selector, window: win_nr, js_evt: window.rkt_event_info(event_kind, el_id, e) }; - console.log(e); + //console.log(e); window.rkt_put_evt(obj); if (!no_prevent_default) { - console.log("preventing default"); + //console.log("preventing default"); e.preventDefault(); } }