hbro-0.9.1.0: Hbro/Types.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Hbro.Types where
-- {{{ Imports
import Control.Monad.Reader
import Data.Dynamic
import Data.IORef
import Data.Map
--import Data.Set
import Graphics.UI.Gtk.Builder
import Graphics.UI.Gtk.Display.Label
import Graphics.UI.Gtk.Entry.Entry
import Graphics.UI.Gtk.General.General
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Layout.HBox
import Graphics.UI.Gtk.Scrolling.ScrolledWindow
import Graphics.UI.Gtk.WebKit.WebPolicyDecision
import Graphics.UI.Gtk.WebKit.WebSettings
import Graphics.UI.Gtk.WebKit.WebView
import Graphics.UI.Gtk.Windows.Window
import Network.URI
import System.Console.CmdArgs
import System.Glib.Attributes hiding(get)
--import System.Glib.Signals
import System.ZMQ
-- }}}
-- | Base type for high-level actions, mnemonics: K(it) from WebKit
type K = KT IO
newtype KT m a = KT (ReaderT Environment m a)
deriving (Functor, Monad, MonadFix, MonadIO, MonadReader Environment, MonadTrans)
-- | The whole set of parameters, elements and states of the application
data Environment = Environment {
mState :: IORef (Map String Dynamic), -- ^
mOptions :: CliOptions, -- ^ Commandline options
mConfig :: Config, -- ^ Custom configuration provided by user
mGUI :: GUI, -- ^ Graphical widgets
mContext :: Context -- ^ ZeroMQ context
}
-- | Set of commandline options
data CliOptions = CliOptions {
mURI :: Maybe String, -- ^ URI to load at start-up
mVanilla :: Bool, -- ^ Bypass custom configuration file
mRecompile :: Bool, -- ^ Force recompilation and do not launch browser
mDenyReconf :: Bool, -- ^ Do not recompile browser even if configuration file has changed
mForceReconf :: Bool, -- ^ Force recompilation even if configuration file hasn't changed
mDyreDebug :: Bool, -- ^ Look for a custom configuration file in current working directory
mMasterBinary :: Maybe String -- ^ Path to the master binary, used by Dyre
} deriving (Data, Typeable, Show, Eq)
-- | Custom parameters provided by the user
data Config = Config {
--mCommonDirectories :: CommonDirectories, -- ^ Custom directories used to store various runtime and static files
mSocketDir :: RefDirs -> FilePath, -- ^ Directory where 0MQ sockets will be created ("/tmp" for example)
mUIFile :: RefDirs -> FilePath, -- ^ Path to XML file describing UI (used by GtkBuilder)
mHomePage :: String, -- ^ Startup page
mWebSettings :: [AttrOp WebSettings], -- ^ WebSettings' attributes to use with webkit (see Webkit.WebSettings documentation)
-- mKeyEventHandler :: KeyEventCallback -> ConnectId WebView -> WebView -> EventM EKey Bool, -- ^ Key event handler, which forwards keystrokes to mKeyEventCallback
-- mKeyEventCallback :: Environment -> KeyEventCallback, -- ^ Main key event callback, assumed to deal with each keystroke separately
mCommands :: CommandsList, -- ^ Commands recognized through 0MQ sockets
mHooks :: Hooks -- ^ Set of functions triggered on specific events
}
type Config' = Either String Config
-- | Set of functions to be triggered when some events occur
data Hooks = Hooks {
mBackForward :: URI -> WebPolicyDecision -> K (), -- ^ Previous/next page has been requested
mDownload :: URI -> String -> Int -> K (), -- ^ A download has been requested
mFormResubmitted :: URI -> WebPolicyDecision -> K(), -- ^ A form has been resubmitted
mFormSubmitted :: URI -> WebPolicyDecision -> K (), -- ^ A form has been submitted
mKeyPressed :: String -> K (), -- ^
mLinkClicked :: Button -> URI -> WebPolicyDecision -> K (), -- ^ A link has been clicked
mLoadFinished :: K (), -- ^ Load has finished
mMIMEDisposition :: URI -> String -> WebPolicyDecision -> K (),
mNewWindow :: URI -> K (), -- ^ A new window has been requested
mOtherNavigation :: URI -> WebPolicyDecision -> K (), -- ^
mReload :: URI -> WebPolicyDecision -> K (), -- ^ A reload of the current page has been requested
mStartUp :: K (), -- ^ At start-up
mTitleChanged :: String -> K () -- ^ Title has changed
}
-- | Graphical elements
data GUI = GUI {
mWindow :: Window, -- ^ Main window
mInspectorWindow :: Window, -- ^ Web-inspector window
mScrollWindow :: ScrolledWindow, -- ^ ScrolledWindow containing the webview
mWebView :: WebView, -- ^ Browser's webview
mPromptBar :: PromptBar, -- ^ Prompt bar
mStatusBar :: HBox, -- ^ Status bar's horizontal box
mNotificationBar :: NotificationBar, -- ^ Bar used to display various notifications
mBuilder :: Builder -- ^ Builder object created from XML file
}
-- | Prompt-bar elements
data PromptBar = PromptBar {
mBox :: HBox, -- ^ Layout box
mDescription :: Label, -- ^ Description of current prompt
mEntry :: Entry, -- ^ Prompt entry
mCallbackRef :: IORef (String -> K ()), -- ^
mIncrementalCallbackRef :: IORef (String -> K ()) -- ^
}
-- | Notification-bar elements
data NotificationBar = NotificationBar {
mLabel :: Label, -- ^ Content
mTimer :: IORef (Maybe HandlerId) -- ^ Timer handler
}
-- | Set of reference directories, typically used to build FilePath-s
data RefDirs = RefDirs {
mHome :: FilePath, -- ^ Home directory
mTemporary :: FilePath, -- ^ Temporary files directory
mConfiguration :: FilePath, -- ^ Configuration directory
mData :: FilePath -- ^ Data directory
}
type PortableFilePath = RefDirs -> FilePath
-- Note 1 : for modifiers, lists are used for convenience purposes,
-- but are transformed into sets in hbro's internal machinery,
-- so that order and repetition don't matter.
-- | List of bound keys.
-- All callbacks are fed with the Environment instance.
type KeysList = [(String, K ())]
type KeysMap = Map String (K ())
type KeyEventCallback = [Modifier] -> String -> IO Bool
--data KeyMode = CommandMode | InsertMode
type CommandsList = [(String, ([String] -> K String))]
type CommandsMap = Map String ([String] -> K String)
-- |
data Button = ButtonL | ButtonM | ButtonR
-- Boolean datatypes
data CaseSensitivity = CaseSensitive | CaseInsensitive
data Direction = Forward | Backward
data Wrap = Wrap | NoWrap