From 10a9f4b431e68f817c7f4cf8bb8b86a9924df4bf Mon Sep 17 00:00:00 2001 From: Hans Dijkema Date: Tue, 7 Apr 2026 23:42:08 +0200 Subject: [PATCH] popup-menu --- racket-webview.rkt | 10 ++++++++++ wv-window.rkt | 23 +++++++++++++++++++++++ 2 files changed, 33 insertions(+) diff --git a/racket-webview.rkt b/racket-webview.rkt index 27d60fa..1de1308 100644 --- a/racket-webview.rkt +++ b/racket-webview.rkt @@ -75,6 +75,7 @@ webview-base-url webview-set-menu! + webview-popup-menu! webview-set-innerHTML! @@ -537,6 +538,15 @@ ) ) +(define/contract (webview-popup-menu! wv menu x y) + (-> wv-win? is-wv-menu? number? number? symbol?) + (let* ((json (wv-menu->json menu)) + (js (string-append "window._web_wire_popup_menu(JSON.parse('" + json "', " (format "~a, ~a" x y) + ");")) + ) + (webview-run-js wv js))) + (define (loglevel? x) (and (symbol? x) (or (eq? x 'error) (eq? x 'info) (eq? x 'debug) (eq? x 'warning)))) diff --git a/wv-window.rkt b/wv-window.rkt index ff46bf8..33b10ba 100644 --- a/wv-window.rkt +++ b/wv-window.rkt @@ -266,6 +266,9 @@ (send this bind! (string->symbol (format "~a" id)) 'menu-item-choosen (λ (el evt data) (callback)))) + + (define/public (disconnect-menu! id) + (send this unbind! id 'menu-item-choosen)) (define/public (devtools) (webview-devtools wv) @@ -323,6 +326,26 @@ (define/public (set-title! title) (webview-set-title! wv title)) + (define/public (popup-menu menu-def x y) + (webview-popup-menu wv menu-def x y) + (let* ((ids (list)) + (clear-connections (λ () + (for-each (λ (id) + (send this disconnect-menu! id)) + ids)))) + (menu-for-each menu-def + (λ (item) + (let ((cb (ww-menu-item-callback item)) + (id (ww-menu-item-id item))) + (set! ids (cons id ids)) + (send this connect-menu! id (λ () + (clear-connections) + (cb)))))) + (connect-menu! (ww-menu-id menu-def) (λ () (clear-connections))) + (set! ids (cons (ww-menu-id menu-def) ids)) + ) + ) + ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Files / Directories ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;