buffer.fnl (2552B)
1 (local { : Gtk : Gdk : WebKit2 : cairo } (require :lgi)) 2 (local { : view } (require :fennel)) 3 (import-macros {: trace} :macros) 4 5 (fn new-buffer [name] 6 (var property-change-listener nil) 7 (let [props {} 8 widget (WebKit2.WebView { 9 ;; :on_decide_policy 10 ;; (fn [self decision dtype] 11 ;; (if (and 12 ;; (WebKit2.ResponsePolicyDecision:is_type_of decision) 13 ;; (not (decision:is_mime_type_supported))) 14 ;; (do 15 ;; (download decision.request.uri decision.response.http_headers) 16 ;; (decision:ignore) 17 ;; true) 18 ;; false)) 19 :on_notify 20 (fn [self pspec] 21 (when (not (= pspec.name :parent)) 22 (let [val (. self pspec.name)] 23 (tset props pspec.name val) 24 (when property-change-listener 25 (property-change-listener 26 pspec.name val))) 27 )) 28 })] 29 (let [settings (widget:get_settings)] 30 ;; (print :font (settings:get_default_font_family) 31 ;; :size (settings:get_default_font_size)) 32 (settings:set_enable_write_console_messages_to_stdout true) 33 (widget:set_settings settings)) 34 35 {:webview widget 36 :name name 37 :subscribe-property-changes 38 (fn [self cb] 39 (set property-change-listener cb)) 40 :location #(widget:get_uri) 41 :visit (fn [_ u] (widget:load_uri u)) 42 :back #(widget:go_back) 43 :properties props})) 44 45 (let [buffers {}] 46 { 47 :new (fn [name] 48 (let [b (new-buffer name)] 49 (tset buffers name b) 50 b)) 51 :find (fn [term] (. buffers term)) 52 ;; will rename this to "find" once we've got rid of the 53 ;; only remaining call to the existing Buffer.find 54 :match (fn [s] (icollect [name buffer (pairs buffers)] 55 (if (string.find name s) 56 (values buffer)))) 57 :next (fn [buffer] 58 (let [n (or (next buffers buffer.name) (next buffers))] 59 (. buffers n))) 60 61 })