140 lines
4.9 KiB
Fennel
140 lines
4.9 KiB
Fennel
(local lgi (require :lgi))
|
|
(local inspect (require :inspect))
|
|
|
|
(local Gtk lgi.Gtk)
|
|
(local WebKit2 lgi.WebKit2)
|
|
|
|
(local cache-dir (.. (os.getenv "HOME") "/.cache"))
|
|
|
|
(local content-filter-store
|
|
(WebKit2.UserContentFilterStore {:path cache-dir}))
|
|
|
|
(fn named-image [name size]
|
|
(Gtk.Image.new_from_icon_name
|
|
name
|
|
(or size Gtk.IconSize.LARGE_TOOLBAR)))
|
|
|
|
(fn load-easylist-json [store cb]
|
|
(print "loading easylist from json")
|
|
(with-open [f (io.open "easylist_min_content_blocker.json" "r")]
|
|
(let [blocks (f:read "*a")]
|
|
(store:save "easylist"
|
|
(lgi.GLib.Bytes blocks)
|
|
nil
|
|
(fn [self res]
|
|
(cb (store:save_finish res)))))))
|
|
|
|
(fn load-adblocks [content-manager store]
|
|
(store:fetch_identifiers
|
|
nil
|
|
(fn [self res]
|
|
(let [ids (store:fetch_identifiers_finish res)
|
|
found (icollect [_ id (pairs ids)] (= id "easylist"))]
|
|
(if (> (# found) 0)
|
|
(store:load "easylist" nil
|
|
(fn [self res]
|
|
(content-manager:add_filter
|
|
(store:load_finish res))))
|
|
(load-easylist-json
|
|
store
|
|
(fn [filter]
|
|
(content-manager:add_filter filter))))))))
|
|
|
|
(let [css "
|
|
progress, trough {
|
|
max-height: 6px;
|
|
color: #4444bb;
|
|
}
|
|
"
|
|
style_provider (Gtk.CssProvider)]
|
|
(style_provider:load_from_data css)
|
|
(Gtk.StyleContext.add_provider_for_screen
|
|
(lgi.Gdk.Screen.get_default)
|
|
style_provider
|
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
|
))
|
|
|
|
|
|
(let [current-url "https://terse.telent.net/admin/stream"
|
|
r {}
|
|
window (Gtk.Window {
|
|
:title "Just browsing"
|
|
:default_width 800
|
|
:default_height 600
|
|
:on_destroy Gtk.main_quit
|
|
})
|
|
container (Gtk.Box {
|
|
:orientation Gtk.Orientation.VERTICAL
|
|
})
|
|
nav-bar (Gtk.Box {
|
|
:orientation Gtk.Orientation.HORIZONTAL
|
|
})
|
|
progress-bar (Gtk.ProgressBar {
|
|
:orientation Gtk.Orientation.HORIZONTAL
|
|
:fraction 1.0
|
|
:margin 0
|
|
})
|
|
url (doto (Gtk.Entry {
|
|
:on_activate
|
|
(fn [self]
|
|
(r.webview:load_uri self.text))
|
|
})
|
|
(: :set_text current-url))
|
|
stop-refresh (Gtk.Button {
|
|
:on_clicked
|
|
(fn [s]
|
|
(if r.webview.is_loading
|
|
(r.webview:stop_loading)
|
|
(r.webview:reload)))
|
|
})
|
|
webview (WebKit2.WebView {
|
|
:on_notify
|
|
(fn [self pspec c]
|
|
(if (= pspec.name "uri")
|
|
(url:set_text self.uri)
|
|
|
|
(and (= pspec.name "title")
|
|
(> (# self.title) 0))
|
|
(window:set_title
|
|
(.. self.title " - Just browsing"))
|
|
|
|
(= pspec.name
|
|
"estimated-load-progress")
|
|
(tset progress-bar :fraction
|
|
self.estimated_load_progress)
|
|
|
|
(= pspec.name "is-loading")
|
|
(stop-refresh:set_image
|
|
(named-image
|
|
(if self.is_loading
|
|
"process-stop"
|
|
"view-refresh")))
|
|
|
|
))
|
|
})
|
|
back (doto
|
|
(Gtk.Button {
|
|
:on_clicked (fn [s]
|
|
(if (webview:can_go_back)
|
|
(webview:go_back)))
|
|
})
|
|
(: :set_image (named-image "go-previous")))]
|
|
(tset r :webview webview)
|
|
(load-adblocks webview.user_content_manager content-filter-store)
|
|
|
|
(nav-bar:pack_start back false false 2)
|
|
(nav-bar:pack_start url true true 2)
|
|
(nav-bar:pack_end stop-refresh false false 2)
|
|
|
|
(container:pack_start nav-bar false false 5)
|
|
(container:pack_start progress-bar false false 0)
|
|
(container:pack_start webview true true 5)
|
|
|
|
(webview:load_uri current-url)
|
|
|
|
(window:add container)
|
|
|
|
(window:show_all))
|
|
|
|
(Gtk.main)
|