hbro-contrib-0.9.0.0: examples/hbro.hs
{-# LANGUAGE DoRec #-}
module Main where
-- {{{ Imports
import qualified Hbro.Bookmarks as Bookmarks
import Hbro.Clipboard
import Hbro.Config
import Hbro.Core
import qualified Hbro.Download as Download
import Hbro.Gui
import Hbro.Hbro
import qualified Hbro.History as History
import Hbro.Keys
import Hbro.Misc
import qualified Hbro.Prompt as Prompt
import Hbro.Session
import Hbro.Socket
import Hbro.StatusBar
import Hbro.Types
import Hbro.Util
import Hbro.WebSettings
import Control.Monad hiding(forM_, mapM_)
import Data.Foldable
import Data.Functor
import Data.Time
import Graphics.UI.Gtk.Abstract.Widget
import Graphics.UI.Gtk.Builder
import Graphics.UI.Gtk.Display.Label
import Graphics.UI.Gtk.Entry.Entry
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Gdk.GC
import Graphics.UI.Gtk.General.General
import Graphics.UI.Gtk.WebKit.Download
import Graphics.UI.Gtk.WebKit.NetworkRequest
import Graphics.UI.Gtk.WebKit.WebNavigationAction
import Graphics.UI.Gtk.WebKit.WebSettings
import Graphics.UI.Gtk.Windows.Window
import Network.URI
import Prelude hiding(mapM_)
import System.Directory
import System.Environment
import System.Environment.XDG.BaseDir
import System.FilePath
import System.Glib.Attributes
import System.Glib.Signals
-- import System.Posix.Process
import System.Process
-- }}}
-- Main function, expected to call launchHbro.
main :: IO ()
main = launchHbro myConfig
-- {{{ Configuration structures
-- Any field you don't override will
-- use the defaults defined in Hbro.Types.Config.
myConfig :: Config
myConfig = defaultConfig {
-- mSocketDir = mySocketDirectory,
mUIFile = myUIFile,
mHomePage = myHomePage,
mWebSettings = myWebSettings,
-- mCommandsList = myCommandsList,
mHooks = myHooks
}
myHooks = defaultHooks {
-- mBackForward = myBackForward,
mDownload = myDownloadHook,
-- mFormResubmitted = myFormResubmitted,
-- mFormSubmitted = myFormSubmitted,
mKeyPressed = manageSequentialKeys (defaultKeyHandler myKeys) >=> void . (printInLabel "keys"),
-- mLinkClicked = myLinkClicked,
mLoadFinished = myLoadFinished,
-- mMIMEDisposition = myMIMEDisposition,
-- mNewWindow = myNewWindowHook,
-- mOtherNavigation = myOtherNavigation,
-- mReload = myReload,
mStartUp = myStartUp
-- mTitleChanged = myTitleChanged
}
-- }}}
-- {{{ Constant parameters
myHomePage = "https://duckduckgo.com"
myUIFile, myHistoryFile, myBookmarksFile, myDownloadDirectory :: PortableFilePath
myUIFile directories = (mConfiguration directories) </> "ui.xml"
myHistoryFile directories = (mData directories) </> "history"
myBookmarksFile directories = (mData directories) </> "bookmarks"
myDownloadDirectory = mHome
-- }}}
-- {{{ Hooks
myDownloadHook :: URI -> String -> Int -> K ()
myDownloadHook uri filename _size = io $ Download.aria myDownloadDirectory uri filename
myLoadFinished :: K ()
myLoadFinished = History.log myHistoryFile
-- }}}
-- {{{ Keys
-- Note that this example is suited for an azerty keyboard.
myKeys :: KeysList
myKeys = defaultKeyBindings ++ [
-- Browse
("C-<Left>", goBackList ["-l", "10"] >>= mapM_ loadURI),
("C-<Right>", goForwardList ["-l", "10"] >>= mapM_ loadURI),
("C-g", Prompt.read "DuckDuckGo search" [] (mapM_ loadURI . parseURIReference . ("https://duckduckgo.com/html?q=" ++) . escapeURIString isAllowedInURI)),
-- Copy/paste
("C-y", withURI $ io . toClipboard . show),
("M-y", withTitle $ io . toClipboard),
("C-p", withClipboard $ mapM_ loadURI . parseURIReference),
("M-p", withClipboard $ \uri -> io $ spawn "hbro" ["-u", uri]),
-- Bookmarks
("C-d", Prompt.read "Bookmark with tags:" [] $ Bookmarks.add myBookmarksFile . words),
("C-D", Prompt.read "Bookmark all instances with tag:" [] $ \tags -> do
(map parseURI <$> sendCommandToAll "GET_URI")
>>= mapM (mapM_ $ \uri -> (io . Bookmarks.addCustom myBookmarksFile) $ Bookmarks.Entry uri (words tags))
>> (withURI $ \uri -> (io . void . Bookmarks.addCustom myBookmarksFile) $ Bookmarks.Entry uri (words tags))
),
("M-d", io $ Bookmarks.deleteWithTag myBookmarksFile ["-l", "10"]),
("C-l", io (Bookmarks.select myBookmarksFile ["-l", "10"]) >>= mapM_ loadURI),
("C-L", io (Bookmarks.selectTag myBookmarksFile ["-l", "10"]) >>= mapM_ (\uris -> mapM (\uri -> io . void $ spawn "hbro" ["-u", (show uri)]) uris)),
-- ("C-q"), webViewGetUri webView >>= maybe (return ()) (Queue.append),
-- ("M-q"), \b -> do
-- uri <- Queue.popFront
-- loadURI uri b),
-- History
("C-h", io (History.select myHistoryFile ["-l", "10"]) >>= mapM_ loadURI . (return . (History.mURI) =<<))
-- Session
--("M-l"), loadFromSession ["-l", "10"])
]
-- }}}
-- {{{ Web settings
-- Commented out lines correspond to default values.
myWebSettings :: [AttrOp WebSettings]
myWebSettings = [
-- SETTING VALUE
--webSettingsCursiveFontFamily := "serif",
--webSettingsDefaultFontFamily := "sans-serif",
--webSettingsFantasyFontFamily := ,
webSettingsMonospaceFontFamily := "consolas",
--webSettingsSansFontFamily := "sans-serif",
--webSettingsSerifFontFamily := "serif",
--webSettingsDefaultFontSize := ,
--webSettingsDefaultMonospaceFontSize := 10,
--webSettingsMinimumFontSize := 5,
--webSettingsMinimumLogicalFontSize := 5,
--webSettingsAutoLoadImages := True,
--webSettingsAutoShrinkImages := True,
--webSettingsDefaultEncoding := "iso-8859-1",
--webSettingsEditingBehavior := EditingBehaviorWindows,
--webSettingsEnableCaretBrowsing := False,
webSettingsEnableDeveloperExtras := True,
--webSettingsEnableHtml5Database := True,
--webSettingsEnableHtml5LocalStorage := True,
--webSettingsEnableOfflineWebApplicationCache := True,
webSettingsEnablePlugins := False,
webSettingsEnablePrivateBrowsing := False, -- Experimental
webSettingsEnableScripts := False,
--webSettingsEnableSpellChecking := False,
webSettingsEnableUniversalAccessFromFileUris := True,
webSettingsEnableXssAuditor := True,
--webSettingsEnableSiteSpecificQuirks := False,
--webSettingsEnableDomPaste := False,
--webSettingsEnableDefaultContextMenu := True,
webSettingsEnablePageCache := True,
--webSettingsEnableSpatialNavigation := False,
--webSettingsEnforce96Dpi := ,
webSettingsJSCanOpenWindowAuto := True,
--webSettingsPrintBackgrounds := True,
--webSettingsResizableTextAreas := True,
webSettingsSpellCheckingLang := Just "en_US",
--webSettingsTabKeyCyclesThroughElements := True,
webSettingsUserAgent := firefoxUserAgent
--webSettingsUserStylesheetUri := Nothing,
--webSettingsZoomStep := 0.1
]
-- }}}
-- {{{ Setup
myStartUp :: K ()
myStartUp = do
-- Scroll position in status bar
setupScrollWidget =<< getObject castToLabel "scroll"
-- Zoom level in status bar
setupZoomWidget =<< getObject castToLabel "zoom"
-- Load progress in status bar
setupProgressWidget =<< getObject castToLabel "progress"
-- Current URI in status bar
setupURIWidget defaultURIColors defaultSecureURIColors =<< getObject castToLabel "uri"
-- Session manager
--setupSession browser
-- Favicon
--_ <- on webView iconLoaded $ \uri -> do something
return ()
-- }}}