{-# 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 --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