init.fnl (5569B)
1 (local lgi (require :lgi)) 2 3 (local { : Gtk : Gdk : WebKit2 : cairo } lgi) 4 5 (if (os.getenv "JUST_HACKING") 6 (local {: view} (require :fennel))) 7 8 (local Listeners (require :just.listeners)) 9 (local Webview (require :just.webview)) 10 (local Viewplex (require :just.viewplex)) 11 12 (local cache-dir (.. (os.getenv "HOME") "/.cache/just")) 13 14 (local content-filter-store 15 (WebKit2.UserContentFilterStore {:path cache-dir})) 16 17 (-> (WebKit2.WebContext:get_default) 18 (: :get_website_data_manager) 19 (: :get_cookie_manager) 20 (: :set_persistent_storage 21 (.. cache-dir "/cookies.db") 22 WebKit2.CookiePersistentStorage.SQLITE)) 23 24 (let [css " 25 progress, trough { 26 max-height: 6px; 27 color: #ff44bb; 28 } 29 " 30 style_provider (Gtk.CssProvider)] 31 (style_provider:load_from_data css) 32 (Gtk.StyleContext.add_provider_for_screen 33 (Gdk.Screen.get_default) 34 style_provider 35 Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION 36 )) 37 38 (fn named-image [name size] 39 (Gtk.Image.new_from_icon_name 40 name 41 (or size Gtk.IconSize.LARGE_TOOLBAR))) 42 43 (fn urlencode [url] 44 (-> url 45 (: :gsub "([^%w ])" (fn [c] (string.format "%%%02X" (string.byte c)))) 46 (: :gsub " " "+"))) 47 48 (local default-search-provider "ddg") 49 50 (fn search-term-to-uri [provider text] 51 (match provider 52 "ebay" (.. "https://www.ebay.co.uk/sch/i.html?_nkw=" (urlencode text)) 53 "lua" (.. "https://pgl.yoyo.org/luai/i/" (urlencode text)) 54 "ddg" (.. "https://duckduckgo.com/?q=" (urlencode text)))) 55 56 (fn to-uri [text] 57 (if (text:find " ") 58 (let [(_ _ provider term) (text:find "^@(%g+) *(.*)")] 59 (if provider 60 (search-term-to-uri provider term) 61 (search-term-to-uri default-search-provider text))) 62 (text:find "^http") text 63 (.. "https://" text))) 64 65 (local completions 66 (doto (Gtk.ListStore) 67 (: :set_column_types [lgi.GObject.Type.STRING]))) 68 69 (fn add-autocomplete-suggestion [url] 70 (completions:append [url])) 71 72 (local keysyms { 73 :Escape 0xff1b 74 }) 75 76 (local 77 Navbar 78 { 79 :new 80 (fn [webview] 81 (let [url (Gtk.Entry { 82 :completion (Gtk.EntryCompletion {:model completions :text_column 0 }) 83 :on_activate 84 (fn [event] 85 (add-autocomplete-suggestion event.text) 86 (webview:visit (to-uri event.text))) 87 :on_key_release_event 88 #(if (= $2.keyval keysyms.Escape) 89 (tset $1 :text webview.properties.uri)) 90 }) 91 stop (doto (Gtk.Button { 92 :on_clicked #(webview:stop-loading) 93 }) 94 (: :set_image (named-image "process-stop"))) 95 refresh (doto (Gtk.Button { 96 :on_clicked #(webview:refresh) 97 }) 98 (: :set_image (named-image "view-refresh"))) 99 show-overview (Gtk.Button { 100 :label "><" 101 :on_clicked #(webview:show-overview) 102 }) 103 back (doto 104 (Gtk.Button { 105 :on_clicked #(webview:go-back) 106 }) 107 (: :set_image (named-image "go-previous"))) 108 widget (Gtk.Box { 109 :orientation Gtk.Orientation.HORIZONTAL 110 }) 111 ] 112 (widget:pack_start back false false 2) 113 (widget:pack_start refresh false false 2) 114 (widget:pack_start stop false false 2) 115 (widget:pack_start url true true 2) 116 (widget:pack_end show-overview false false 2) 117 118 (webview:listen :uri #(url:set_text $1)) 119 (webview:listen :estimated-load-progress 120 (fn [fraction] 121 (tset stop :visible (< fraction 1)) 122 (tset refresh :visible (>= fraction 1)))) 123 { 124 :widget widget 125 })) 126 }) 127 128 129 (let [window (Gtk.Window { 130 :title "Just browsing" 131 :default_width 360 132 :default_height 720 133 :on_destroy Gtk.main_quit 134 }) 135 container (Gtk.Box { 136 :orientation Gtk.Orientation.VERTICAL 137 }) 138 viewplex (Viewplex.new {:content-filter-store content-filter-store}) 139 navbar (Navbar.new viewplex) 140 progress-bar (Gtk.ProgressBar { 141 :orientation Gtk.Orientation.HORIZONTAL 142 :fraction 1.0 143 :margin 0 144 }) 145 ] 146 147 (viewplex:listen :title #(window:set_title 148 (.. (or $1 "") " - Just browsing"))) 149 (viewplex:listen :estimated-load-progress #(tset progress-bar :fraction $1)) 150 151 (container:pack_start navbar.widget false false 0) 152 (container:pack_start progress-bar false false 0) 153 (container:pack_start viewplex.widget true true 0) 154 155 (if (. arg 1) 156 (each [_ url (ipairs arg)] 157 (let [v (Webview.new {:content-filter-store content-filter-store} )] 158 (v:visit url) 159 (viewplex:add-view v))) 160 (viewplex:add-view 161 (doto (Webview.new {:content-filter-store content-filter-store}) 162 (: :visit "about:blank")))) 163 164 (window:add container) 165 (window:show_all)) 166 167 (Gtk.main)