2022-02-04 23:47:14 +00:00
|
|
|
(local lgi (require :lgi))
|
2022-02-20 17:41:42 +00:00
|
|
|
|
2022-02-20 12:25:59 +00:00
|
|
|
(local { : Gtk : Gdk : WebKit2 : cairo } lgi)
|
|
|
|
|
2022-03-19 16:09:03 +00:00
|
|
|
(if (os.getenv "JUST_HACKING")
|
|
|
|
(local {: view} (require :fennel)))
|
2022-02-04 23:47:14 +00:00
|
|
|
|
2022-04-27 12:26:54 +00:00
|
|
|
(local Listeners (require :just.listeners))
|
|
|
|
(local Webview (require :just.webview))
|
|
|
|
(local Viewplex (require :just.viewplex))
|
2022-03-05 18:52:17 +00:00
|
|
|
|
2022-02-06 15:05:00 +00:00
|
|
|
(local cache-dir (.. (os.getenv "HOME") "/.cache/just"))
|
2022-02-05 19:08:18 +00:00
|
|
|
|
|
|
|
(local content-filter-store
|
|
|
|
(WebKit2.UserContentFilterStore {:path cache-dir}))
|
|
|
|
|
2022-02-06 15:05:00 +00:00
|
|
|
(-> (WebKit2.WebContext:get_default)
|
|
|
|
(: :get_website_data_manager)
|
|
|
|
(: :get_cookie_manager)
|
|
|
|
(: :set_persistent_storage
|
|
|
|
(.. cache-dir "/cookies.db")
|
|
|
|
WebKit2.CookiePersistentStorage.SQLITE))
|
|
|
|
|
2022-03-07 09:20:14 +00:00
|
|
|
(let [css "
|
|
|
|
progress, trough {
|
|
|
|
max-height: 6px;
|
|
|
|
color: #ff44bb;
|
|
|
|
}
|
|
|
|
"
|
|
|
|
style_provider (Gtk.CssProvider)]
|
|
|
|
(style_provider:load_from_data css)
|
|
|
|
(Gtk.StyleContext.add_provider_for_screen
|
|
|
|
(Gdk.Screen.get_default)
|
|
|
|
style_provider
|
|
|
|
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
|
|
|
|
))
|
|
|
|
|
2022-02-05 21:47:12 +00:00
|
|
|
(fn named-image [name size]
|
|
|
|
(Gtk.Image.new_from_icon_name
|
|
|
|
name
|
|
|
|
(or size Gtk.IconSize.LARGE_TOOLBAR)))
|
|
|
|
|
2022-03-09 23:30:23 +00:00
|
|
|
(fn urlencode [url]
|
|
|
|
(-> url
|
|
|
|
(: :gsub "([^%w ])" (fn [c] (string.format "%%%02X" (string.byte c))))
|
|
|
|
(: :gsub " " "+")))
|
|
|
|
|
|
|
|
(local default-search-provider "ddg")
|
|
|
|
|
|
|
|
(fn search-term-to-uri [provider text]
|
|
|
|
(match provider
|
|
|
|
"ebay" (.. "https://www.ebay.co.uk/sch/i.html?_nkw=" (urlencode text))
|
|
|
|
"lua" (.. "https://pgl.yoyo.org/luai/i/" (urlencode text))
|
|
|
|
"ddg" (.. "https://duckduckgo.com/?q=" (urlencode text))))
|
|
|
|
|
|
|
|
(fn to-uri [text]
|
|
|
|
(if (text:find " ")
|
|
|
|
(let [(_ _ provider term) (text:find "^@(%g+) *(.*)")]
|
|
|
|
(if provider
|
|
|
|
(search-term-to-uri provider term)
|
|
|
|
(search-term-to-uri default-search-provider text)))
|
|
|
|
(text:find "^http") text
|
|
|
|
(.. "https://" text)))
|
|
|
|
|
2022-03-10 09:37:26 +00:00
|
|
|
(local completions
|
|
|
|
(doto (Gtk.ListStore)
|
|
|
|
(: :set_column_types [lgi.GObject.Type.STRING])))
|
|
|
|
|
|
|
|
(fn add-autocomplete-suggestion [url]
|
|
|
|
(completions:append [url]))
|
|
|
|
|
2022-03-10 00:18:35 +00:00
|
|
|
(local keysyms {
|
|
|
|
:Escape 0xff1b
|
|
|
|
})
|
|
|
|
|
2022-03-03 23:07:37 +00:00
|
|
|
(local
|
|
|
|
Navbar
|
|
|
|
{
|
|
|
|
:new
|
|
|
|
(fn [webview]
|
|
|
|
(let [url (Gtk.Entry {
|
2022-03-10 09:37:26 +00:00
|
|
|
:completion (Gtk.EntryCompletion {:model completions :text_column 0 })
|
2022-03-03 23:07:37 +00:00
|
|
|
:on_activate
|
2022-03-10 09:37:26 +00:00
|
|
|
(fn [event]
|
|
|
|
(add-autocomplete-suggestion event.text)
|
|
|
|
(webview:visit (to-uri event.text)))
|
2022-03-10 00:18:35 +00:00
|
|
|
:on_key_release_event
|
|
|
|
#(if (= $2.keyval keysyms.Escape)
|
|
|
|
(tset $1 :text webview.properties.uri))
|
2022-03-03 23:07:37 +00:00
|
|
|
})
|
|
|
|
stop (doto (Gtk.Button {
|
|
|
|
:on_clicked #(webview:stop-loading)
|
|
|
|
})
|
|
|
|
(: :set_image (named-image "process-stop")))
|
|
|
|
refresh (doto (Gtk.Button {
|
|
|
|
:on_clicked #(webview:refresh)
|
|
|
|
})
|
|
|
|
(: :set_image (named-image "view-refresh")))
|
2022-03-06 23:05:24 +00:00
|
|
|
show-overview (Gtk.Button {
|
|
|
|
:label "><"
|
|
|
|
:on_clicked #(webview:show-overview)
|
|
|
|
})
|
2022-03-03 23:07:37 +00:00
|
|
|
back (doto
|
|
|
|
(Gtk.Button {
|
|
|
|
:on_clicked #(webview:go-back)
|
|
|
|
})
|
|
|
|
(: :set_image (named-image "go-previous")))
|
|
|
|
widget (Gtk.Box {
|
|
|
|
:orientation Gtk.Orientation.HORIZONTAL
|
|
|
|
})
|
|
|
|
]
|
|
|
|
(widget:pack_start back false false 2)
|
|
|
|
(widget:pack_start refresh false false 2)
|
|
|
|
(widget:pack_start stop false false 2)
|
|
|
|
(widget:pack_start url true true 2)
|
2022-03-06 23:05:24 +00:00
|
|
|
(widget:pack_end show-overview false false 2)
|
2022-03-03 23:07:37 +00:00
|
|
|
|
|
|
|
(webview:listen :uri #(url:set_text $1))
|
2022-03-07 18:56:36 +00:00
|
|
|
(webview:listen :estimated-load-progress
|
|
|
|
(fn [fraction]
|
|
|
|
(tset stop :visible (< fraction 1))
|
|
|
|
(tset refresh :visible (>= fraction 1))))
|
2022-03-03 23:07:37 +00:00
|
|
|
{
|
|
|
|
:widget widget
|
|
|
|
}))
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
(let [window (Gtk.Window {
|
2022-02-04 23:47:14 +00:00
|
|
|
:title "Just browsing"
|
2022-02-06 22:16:03 +00:00
|
|
|
:default_width 360
|
|
|
|
:default_height 720
|
2022-02-04 23:47:14 +00:00
|
|
|
:on_destroy Gtk.main_quit
|
|
|
|
})
|
|
|
|
container (Gtk.Box {
|
|
|
|
:orientation Gtk.Orientation.VERTICAL
|
|
|
|
})
|
2022-03-14 18:41:34 +00:00
|
|
|
viewplex (Viewplex.new {:content-filter-store content-filter-store})
|
2022-03-04 00:02:16 +00:00
|
|
|
navbar (Navbar.new viewplex)
|
2022-03-07 09:20:14 +00:00
|
|
|
progress-bar (Gtk.ProgressBar {
|
|
|
|
:orientation Gtk.Orientation.HORIZONTAL
|
|
|
|
:fraction 1.0
|
|
|
|
:margin 0
|
|
|
|
})
|
2022-03-03 23:07:37 +00:00
|
|
|
]
|
2022-02-06 14:05:05 +00:00
|
|
|
|
2022-03-10 11:50:46 +00:00
|
|
|
(viewplex:listen :title #(window:set_title
|
|
|
|
(.. (or $1 "") " - Just browsing")))
|
2022-03-07 09:20:14 +00:00
|
|
|
(viewplex:listen :estimated-load-progress #(tset progress-bar :fraction $1))
|
2022-03-07 09:07:41 +00:00
|
|
|
|
2022-03-03 23:07:37 +00:00
|
|
|
(container:pack_start navbar.widget false false 0)
|
2022-03-07 09:20:14 +00:00
|
|
|
(container:pack_start progress-bar false false 0)
|
2022-03-04 00:02:16 +00:00
|
|
|
(container:pack_start viewplex.widget true true 0)
|
2022-03-06 17:46:51 +00:00
|
|
|
|
2022-03-09 23:45:52 +00:00
|
|
|
(if (. arg 1)
|
|
|
|
(each [_ url (ipairs arg)]
|
2022-03-14 18:41:34 +00:00
|
|
|
(let [v (Webview.new {:content-filter-store content-filter-store} )]
|
2022-03-09 23:45:52 +00:00
|
|
|
(v:visit url)
|
|
|
|
(viewplex:add-view v)))
|
|
|
|
(viewplex:add-view
|
2022-03-14 18:41:34 +00:00
|
|
|
(doto (Webview.new {:content-filter-store content-filter-store})
|
|
|
|
(: :visit "about:blank"))))
|
2022-02-04 23:47:14 +00:00
|
|
|
|
|
|
|
(window:add container)
|
2022-03-03 23:07:37 +00:00
|
|
|
(window:show_all))
|
2022-02-06 15:05:00 +00:00
|
|
|
|
2022-02-04 23:47:14 +00:00
|
|
|
(Gtk.main)
|