eufon

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

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)