dzen-dhall-1.0.2: src/DzenDhall/Runtime/Data.hs
{-# LANGUAGE TemplateHaskell #-}
module DzenDhall.Runtime.Data where
import DzenDhall.Arguments
import DzenDhall.Data
import DzenDhall.Config hiding (Hook)
import Control.Concurrent.MVar
import Data.IORef
import Dhall hiding (maybe)
import Lens.Micro.TH
import System.IO
import System.Process (ProcessHandle)
import qualified Data.HashMap.Strict as H
apiVersion :: Int
apiVersion = 1
data Runtime = Runtime
{ _rtConfigDir :: String
, _rtConfigurations :: [Configuration]
, _rtDzenBinary :: String
, _rtArguments :: Arguments
, _rtSupportsANSI :: Bool
, _rtExitMVar :: MVar ()
}
deriving (Eq)
makeLenses ''Runtime
-- | 'StateTransitionTable' is needed to know *how* to update,
-- @'IORef' ('Bar' 'Initialized')@ is needed to know *what* to update.
data Subscription
= AutomatonSubscription
AutomatonAddress
StateTransitionTable
(H.HashMap AutomatonState (Bar Initialized))
(IORef AutomatonState)
(IORef (Bar Initialized))
type Subscriptions = H.HashMap Scope [Subscription]
-- | A mapping from clickable area identifiers to script contents.
-- We maintain this mapping to allow using scripts containing `)` in @^ca@.
-- @dzen2@ doesn't allow this.
type ClickableAreas = H.HashMap Int Text
type AutomataCache
= H.HashMap (Scope, AutomatonAddress)
( IORef (Bar Initialized)
, StateTransitionTable
, H.HashMap AutomatonState (Bar Marshalled)
)
data StartupState
= StartupState
{ _ssSubscriptions :: Subscriptions
, _ssScopeName :: Scope
, _ssBarSettings :: BarSettings
, _ssNonce :: Int
-- ^ Counter that is incremented each time it is requested (used as a source
-- of unique identifiers). See also: 'DzenDhall.App.getCounter'
, _ssSourceCache :: H.HashMap (Text, Source) (IORef Text, Cache)
, _ssAutomataCache :: AutomataCache
, _ssSourceQueue :: [(Source, IORef Text, Cache, Text)]
, _ssVariableDefinitions :: [(Scope, VariableName, Value)]
, _ssImages :: H.HashMap ImageContents ImageId
-- ^ A queue containing ready-to-be-initialized `Source`s and their handles &
-- scope names.
-- This queue is needed because we want to create a `BarRuntime` before
-- actually running the source processes (they depend on `brEmitterScript` value).
, _ssClickableAreas :: ClickableAreas
-- ^ A mapping from clickable area identifiers to scripts
, _ssNamedPipe :: String
, _ssEmitterFile :: String
, _ssGetterFile :: String
, _ssSetterFile :: String
, _ssVariableFilePrefix :: String
, _ssImagePathPrefix :: String
}
makeLenses ''StartupState
data BarRuntime = BarRuntime
{ _brConfiguration :: Configuration
, _brFrameCounter :: Int
, _brNamedPipe :: String
-- ^ Named pipe to use as a communication channel for listening to mouse events
, _brEmitterScript :: String
-- ^ A script that can be used to emit events
, _brGetterScript :: String
, _brSetterScript :: String
, _brHandle :: Handle
-- ^ A handle to write to. The value is either stdin of a @dzen2@ process or
-- 'System.IO.stdout', if @--stdout@ flag is passed.
, _brDzenHandle :: Maybe ProcessHandle
}
makeLenses ''BarRuntime