hbro-0.7.1.0: 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 ())