hbro-contrib-1.4.0.0: examples/hbro.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
module Main where
-- {{{ Imports
import Hbro
import qualified Hbro.Bookmarks as Bookmarks
import qualified Hbro.Clipboard as Clipboard
import Hbro.Config (homePageL)
import qualified Hbro.Config as Config
import Hbro.Defaults
import qualified Hbro.Download as Download
import Hbro.Gui.PromptBar
import qualified Hbro.History as History
import Hbro.Keys as Key
import Hbro.Keys.Model ((.|))
import Hbro.Logger
import Hbro.Misc
import Hbro.Settings
import Hbro.StatusBar
import Control.Lens.Getter
import qualified Data.Map as Map
import qualified Data.Set as Set
import Graphics.UI.Gtk.WebKit.WebSettings
import qualified Network.URI as N
import Network.URI.Extended
import System.Directory
import System.Glib.Attributes.Extended
import System.Process.Extended
-- }}}
myHomePage = fromJust . N.parseURI $ "https://www.google.com"
-- Download to $HOME
myDownloadHandler :: (ControlIO m) => (URI, Text, Maybe Int) -> m ()
myDownloadHandler (uri, filename, _size) = do
destination <- io getHomeDirectory
Download.aria destination uri filename
myLoadFinishedHandler :: (ControlIO m, MonadReader r m, Has MainView r, MonadLogger m, MonadThrow m, Alternative m) => m ()
myLoadFinishedHandler = History.log
-- Those key bindings are suited for an azerty keyboard
myKeyMap :: (God r m, MonadCatch m) => KeyMap m
myKeyMap = defaultKeyMap <> Map.fromList
-- Browse
[ [_Control .| _Left] >: goBackList >>= load
, [_Control .| _Right] >: goForwardList >>= load
, [_Control .| _g] >: promptM "DuckDuckGo search" "" >>= parseURIReference . ("http://duckduckgo.com/html?q=" ++) . pack . escapeURIString isAllowedInURI . unpack >>= load
-- Bookmarks
, [_Control .| _d] >: promptM "Bookmark with tags:" "" >>= Bookmarks.addCurrent . words
-- , [_Control .| _D] >: promptM "Bookmark all instances with tag:" "" >>= \tags -> do
-- uris <- mapM parseURI =<< sendCommandToAll "GET_URI"
-- forM uris $ Bookmarks.addCustom . (`Bookmarks.Entry` words tags)
-- void . Bookmarks.addCustom . (`Bookmarks.Entry` words tags) =<< getURI
, [_Alt .| _d] >: Bookmarks.deleteByTag
, [_Control .| _l] >: Bookmarks.select >>= load
, [_Control .| _L] >: Bookmarks.selectByTag >>= void . mapM (\uri -> spawn "hbro" ["-u", tshow uri])
-- History
, [_Alt .| _h] >: load . History._uri =<< History.select
-- Settings
, [_Alt .| _j] >: getWebSettings >>= \s -> toggle_ s webSettingsEnableScripts
, [_Alt .| _p] >: getWebSettings >>= \s -> toggle_ s webSettingsEnablePlugins
]
-- Setup run at start-up
myStartUp :: (God r m, MonadCatch m) => m ()
myStartUp = do
Config.set homePageL myHomePage
mainView <- ask
addHandler (mainView^.downloadHandlerL) myDownloadHandler
addHandler (mainView^.loadFinishedHandlerL) $ const myLoadFinishedHandler
-- Web settings (cf Graphic.Gtk.WebKit.WebSettings)
s <- getWebSettings
set s webSettingsEnablePlugins False
set s webSettingsEnableScripts True
set s webSettingsJSCanOpenWindowAuto True
set s webSettingsUserAgent firefoxUserAgent
-- Status bar customization: scroll position + zoom level + load progress + current URI + key strokes
b <- ask
installScrollWidget =<< getWidget b "scroll"
installZoomWidget =<< getWidget b "zoom"
installProgressWidget =<< getWidget b "progress"
installURIWidget defaultURIColors defaultSecureURIColors =<< getWidget b "uri"
installKeyStrokesWidget =<< getWidget b "keys"
return ()
-- Main function, expected to call 'hbro'
main :: IO ()
main = hbro $ def
{ keyMap = myKeyMap
, startUp = myStartUp
}