eufon/just/webview.fnl

63 lines
2.1 KiB
Plaintext
Raw Normal View History

(local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi))
(local Listeners (require :listeners))
(fn scale-surface [source image-width image-height]
(let [scaled (cairo.ImageSurface.create
cairo.Format.ARGB32
image-width image-height)
ctx (cairo.Context.create scaled)
source-width (cairo.ImageSurface.get_width source)
source-height (cairo.ImageSurface.get_height source)
scale (/ image-width source-width)]
;; XXX do we need to destroy this context? the example
;; in C called cairo_destroy(cr), but I haven't found a
;; gi equivalent
(doto ctx
(: :scale scale scale)
(: :set_source_surface source 0 0)
(: :paint))
scaled))
(fn thumbnail-image [widget width height fun]
;; underlying call is async, so use callback
(widget:get_snapshot
WebKit2.SnapshotRegion.VISIBLE
WebKit2.SnapshotOptions.NONE
nil
(fn [self res]
(let [surface (widget:get_snapshot_finish res)
scaled (scale-surface surface width height)
img (doto (Gtk.Image) (: :set_from_surface scaled))]
(fun img)))))
{
:new
#(let [listeners (Listeners.new)
props {}
widget (WebKit2.WebView {
:on_notify
(fn [self pspec]
(when (not (= pspec.name :parent))
(let [val (. self pspec.name)]
(tset props pspec.name val)
(listeners:notify pspec.name val))))
})]
;;(load-adblocks webview.user_content_manager content-filter-store)
{
:listen #(listeners:add $2 $3)
:visit (fn [self url]
(widget:load_uri url))
:stop-loading #(widget:stop_loading)
:refresh #(widget:reload)
:go-back #(and (widget:can_go_back) (widget:go_back))
:thumbnail-image (fn [self width height fun]
(thumbnail-image widget width height fun))
:properties props
:widget widget
})
}