Files
rktplayer/rktplayer.rkt
T
2026-05-18 10:35:14 +02:00

106 lines
3.8 KiB
Racket

#lang racket
(require racket/gui
"gui.rkt"
"tray.rkt"
simple-ini/class
racket-audio
racket-webview
racket/runtime-path
"utils.rkt"
net/uri-codec
)
(provide run)
(define-runtime-path rkt-gui-dir "gui")
(define log-file (build-path (find-system-path 'cache-dir) ".rktplayer.log"))
(sl-log-to-file log-file)
;(sl-log-to-display)
(define (my-file-getter url)
(dbg-rktplayer "my-file-getter - url = ~a" url)
(when (string-prefix? url "/")
(set! url (substring url 1)))
(if (string-prefix? url "get-image")
(let* ((str (uri-decode url))
(idx (string-find str "?")))
(set! str (substring str (+ idx 1)))
(set! idx (string-find str "&"))
(set! str (substring str 0 idx))
(dbg-rktplayer "returning file ~a" str)
(build-path str)
)
(build-path rkt-gui-dir url)
)
)
(define rktplayer-window #f)
(define rktplayer-tray #f)
(define (close-off)
(send rktplayer-tray close)
(send rktplayer-window close)
(exit)
)
(define (run . no-exit)
(let* ((ini (new ini% [file 'rktplayer]))
(context (new wv-context%
[base-path rkt-gui-dir]
[ini ini]
[file-getter my-file-getter]
))
)
(let* ((window (new rktplayer% [wv-context context] [log-file log-file]))
(tray (new rktplayer-tray% [rktplayer-gui window]))
)
(set! rktplayer-window window)
(set! rktplayer-tray tray)
(thread (λ ()
(sleep 5)
(let ((prg (string-append "let f_evt_info = window.rkt_event_info;\n"
"window.rkt_event_info = function(e, id, evt) {\n"
" if (evt.dataTransfer) {\n"
" for(const item of evt.dataTransfer.items) {\n"
" if (item.kind == 'file') {\n"
" console.log(item.getAsFile());\n"
" }\n"
" }\n"
" }\n"
" return f_evt_info(e, id, evt);\n"
"}; return 42;")))
#|(js (let* ((f_evt_info window.rkt_event_info))
(send console log "Setting new window.rkt_event_info")
(set! window.rkt_event_info
(λ (e id evt)
(if evt.dataTransfer
(let* ((items evt.dataTransfer.items)
(fitems (send items filter (λ (item)
(return (== item.kind "file")))))
)
(send fitems forEach (λ (item)
(console.log item)))
)
42)
(return (f_evt_info e id evt))))
(return 42)))))|#
(displayln prg)
(displayln (send window call-js prg)))))
(when (or (null? no-exit)
(not (eq? (car no-exit) #t)))
(webview-wait-for-quit)
(send rktplayer-tray close)
(webview-exit)
(exit))
)
)
)
;(run)