hbro-0.7.1.1: Hbro/Types.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE ExistentialQuantification #-}
module Hbro.Types where
-- {{{ Imports
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.Layout.HBox
import Graphics.UI.Gtk.Gdk.EventM
import Graphics.UI.Gtk.Scrolling.ScrolledWindow
import Graphics.UI.Gtk.WebKit.WebSettings
import Graphics.UI.Gtk.WebKit.WebView
import Graphics.UI.Gtk.Windows.Window
import System.Console.CmdArgs
import System.Glib.Attributes
import System.Glib.Signals
import System.ZMQ
-- }}}
-- | Various directories used to store some runtime and static files.
data CommonDirectories = CommonDirectories {
mHome :: FilePath, -- ^ Home directory
mTemporary :: FilePath, -- ^ Temporary files directory
mConfiguration :: FilePath, -- ^ Configuration directory
mData :: FilePath -- ^ Data directory
}
-- | The whole set of parameters and elements of the browser.
data Environment = Environment {
mOptions :: CliOptions, -- ^ Commandline options
mConfig :: Config, -- ^ Configuration parameters (constants) provided by user
mGUI :: GUI, -- ^ Graphical widgets
mContext :: Context -- ^ ZMQ context
}
-- | Supported commandline options
data CliOptions = CliOptions {
mURI :: Maybe String, -- ^ URI to load at start-up
mVanilla :: Bool, -- ^ Bypass custom configuration file
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 working directory
mMasterBinary :: Maybe String -- ^
} deriving (Data, Typeable, Show, Eq)
data Config = {-forall a.-} Config {
mCommonDirectories :: CommonDirectories, -- ^ Custom directories used to store various runtime and static files
mHomePage :: String, -- ^ Startup page
mSocketDir :: FilePath, -- ^ Directory where 0MQ will be created ("/tmp" for example)
mUIFile :: FilePath, -- ^ Path to XML file describing UI (used by GtkBuilder)
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
mWebSettings :: [AttrOp WebSettings], -- ^ WebSettings' attributes to use with webkit (see Webkit.WebSettings documentation)
mSetup :: Environment -> IO (), -- ^ Custom startup instructions
mCommands :: CommandsList, -- ^ Custom commands to use with IPC sockets
mError :: Maybe String -- ^ Error
--mCustom :: a
}
data GUI = GUI {
mWindow :: Window, -- ^ Main window
mInspectorWindow :: Window, -- ^ WebInspector window
mScrollWindow :: ScrolledWindow, -- ^ ScrolledWindow containing the webview
mWebView :: WebView, -- ^ Browser's webview
mPromptBar :: PromptBar,
mStatusBox :: HBox, -- ^ Status bar's horizontal box
mBuilder :: Builder -- ^ Builder object created from XML file
}
data PromptBar = PromptBar {
mBox :: HBox,
mDescription :: Label, -- ^ Description of current prompt
mEntry :: Entry -- ^ Prompt entry
}
-- | List of bound keys.
-- All callbacks are fed with the Browser instance.
--
-- 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.
--
-- Note 2 : for printable characters accessed via the shift modifier,
-- you do have to include Shift in modifiers list.
type KeysList = [(([Modifier], String), IO ())]
type KeysMap = Map (Set Modifier, String) (IO ())
type KeyEventCallback = [Modifier] -> String -> IO Bool
--data KeyMode = CommandMode | InsertMode
type CommandsList = [(String, ([String] -> Socket Rep -> Environment -> IO ()))]
type CommandsMap = Map String ([String] -> Socket Rep -> Environment -> IO ())