hbro-1.3.0.0: library/Hbro/Defaults.hs
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE OverloadedLists #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module Hbro.Defaults where
-- {{{ Imports
import Hbro.Clipboard as Clipboard
import Hbro.Config (Config)
import Hbro.Core
import Hbro.Error
import Hbro.Event
import Hbro.Gdk.KeyVal
import Hbro.Gui as Gui
import Hbro.Gui.MainView
import Hbro.Gui.NotificationBar
import Hbro.Gui.PromptBar as Prompt
import Hbro.Gui.StatusBar
import Hbro.IPC
import Hbro.Keys as Keys
import Hbro.Keys.Model (singleKey, (.|))
import Hbro.Logger
import Hbro.Prelude
import Hbro.WebView.Signals
import Control.Monad.Trans.Resource
import Data.Map as Map hiding (foldl,
map)
import Graphics.UI.Gtk.Abstract.Widget
import Graphics.UI.Gtk.Builder as Gtk
import Graphics.UI.Gtk.Gdk.EventM as Gtk
import Graphics.UI.Gtk.General.General.Extended
import Graphics.UI.Gtk.WebKit.WebView
import Graphics.UI.Gtk.Windows.Window
import Network.URI.Extended
import System.Glib.Attributes.Extended
-- }}}
-- | A 'God' monad has access to everything.
type God r m = (ControlIO m, MonadLogger m, MonadError Text m, MonadResource m, MonadReader r m, Has (TVar Config) r, Has PromptBar r, Has NotificationBar r, Has StatusBar r, Has Gtk.Builder r, Has (Signal KeyMapPressed) r, Has MainView r, Alternative m)
defaultLinkClickedHandler :: (MonadIO m, MonadLogger m, MonadError Text m, MonadReader r m, Has MainView r)
=> Handler m LinkClicked
defaultLinkClickedHandler (uri, Gtk.MiddleButton) = spawnHbro' uri
defaultLinkClickedHandler (uri, _) = load uri
defaultLoadRequestedHandler :: (MonadIO m, MonadLogger m, MonadError Text m, MonadReader r m, Has MainView r) => URI -> m ()
defaultLoadRequestedHandler = load
defaultNewWindowHandler :: (MonadIO m, MonadLogger m) => URI -> m ()
defaultNewWindowHandler uri = spawnHbro' uri
defaultTitleChangedHandler :: (MonadIO m, MonadLogger m, MonadError Text m, MonadReader r m, Has Gtk.Builder r) => Text -> m ()
defaultTitleChangedHandler title = getMainWindow >>= \w -> set w windowTitle ("hbro | " ++ title) >> return ()
-- /!\ NetworkRequest's Haskell binding is missing the function "webkit_network_request_get_message", which makes it rather useless...
-- | Display content if webview can show the given MIME type, otherwise download it.
-- instance Default (Hook KE ResourceOpened) where
-- def = Hook $ \(_uri, mimetype) -> do
-- return Hooks.Load <<| canRender mimetype |>> return Hooks.Download'
-- | List of default supported requests.
defaultCommandMap :: God r m => CommandMap m
defaultCommandMap = Map.fromList
-- Get information
[ "GET_URI" >: \_arguments -> Right . tshow <$> getCurrentURI
, "GET_TITLE" >: \_arguments -> Right <$> getPageTitle
, "GET_FAVICON_URI" >: \_arguments -> Right . tshow <$> getFaviconURI
, "GET_LOAD_PROGRESS" >: \_arguments -> Right . tshow <$> getLoadProgress
-- Trigger actions
, "LOAD_URI" >: \arguments -> case arguments of
uri:_ -> parseURIReferenceM uri >>= load >> return (Right "OK")
_ -> return . Left $ "Argument needed."
, "STOP_LOADING" >: \_arguments -> stopLoading >> return (Right "OK")
, "RELOAD" >: \_arguments -> reload >> return (Right "OK")
, "RELOAD_BYPASS_CACHE" >: \_arguments -> reloadBypassCache >> return (Right "OK")
, "GO_BACK" >: \_arguments -> goBack >> return (Right "OK")
, "GO_FORWARD" >: \_arguments -> goForward >> return (Right "OK")
, "ZOOM_IN" >: \_arguments -> zoomIn >> return (Right "OK")
, "ZOOM_OUT" >: \_arguments -> zoomOut >> return (Right "OK")
]
defaultKeyMap :: (God r m) => KeyMap m
defaultKeyMap = Map.fromList
-- Browse
[ [_Alt .| _Left] >: goBack
, [_Alt .| _Right] >: goForward
, [_Control .| _Escape] >: stopLoading
, [singleKey _F5] >: reload
, [_Control .| _r] >: reload
, [_Control .| _F5] >: reloadBypassCache
, [_Alt .| _r] >: reloadBypassCache
, [_Control .| _dead_circumflex] >: scrollH (Absolute 0)
, [_Control .| _dollar] >: scrollH (Absolute 100)
, [_Control .| _Home] >: scrollV (Absolute 0)
, [_Control .| _End] >: scrollV (Absolute 100)
, [_Alt .| _Home] >: goHome
-- Copy/paste
, [_Control .| _c] >: getCurrentURI >>= Clipboard.write . tshow
, [_Alt .| _c] >: getPageTitle >>= Clipboard.write
, [_Control .| _v] >: Clipboard.read >>= parseURIReferenceM >>= load
, [_Alt .| _v] >: Clipboard.read >>= parseURIReferenceM >>= spawnHbro'
-- Display
, [_Control .| _plus] >: zoomIn
, [_Control .| _minus] >: zoomOut
, [_Control .| _b] >: asks asStatusBar >>= \s -> toggle_ s widgetVisible
, [_Alt .| _b] >: asks asNotificationBar >>= \n -> toggle_ n widgetVisible
, [_Control .| _u] >: getWebView >>= \v -> toggle_ v webViewViewSourceMode
-- Prompt
, [_Control .| _o] >: uriPromptM "Open URI" "" >>= load
, [_Alt .| _o] >: getCurrentURI >>= \uri -> uriPromptM "Open URI " (tshow uri) >>= load
-- Search
, [singleKey _slash] >: ipromptM "Search " "" (searchText_ CaseInsensitive Forward Wrap)
, [_Control .| _f] >: ipromptM "Search " "" (searchText_ CaseInsensitive Forward Wrap)
, [singleKey _question] >: ipromptM "Search " "" (searchText_ CaseInsensitive Backward Wrap)
, [_Control .| _n] >: searchText_ CaseInsensitive Forward Wrap =<< getPromptValueM
, [_Control .| _p] >: searchText_ CaseInsensitive Backward Wrap =<< getPromptValueM
, [_Control .| _h] >: gAsync . webViewUnMarkTextMatches =<< getWebView
-- Misc
--, (_Control .| _i) >: openInspector
, [_Control .| _s] >: promptM "Save webpage " "" >>= saveWebPage . fpFromText
, [_Alt .| _Print] >: printPage
, [_Control .| _t] >: spawnHbro
, [_Control .| _w] >: quit
]