summaryrefslogtreecommitdiffstats
path: root/XMonad/Core.hs
diff options
context:
space:
mode:
authorSpencer Janssen <sjanssen@cse.unl.edu>2007-11-19 07:08:20 +0100
committerSpencer Janssen <sjanssen@cse.unl.edu>2007-11-19 07:08:20 +0100
commit5f536f2182f06d73d123b3b6b0504ee37ef5ae4c (patch)
tree416ced4aebd5d188c66206cd1d979e8d7e061e63 /XMonad/Core.hs
parent204ed1bb5fd09ff921b20c7cfe3e3616bf483f52 (diff)
downloadmetatile-5f536f2182f06d73d123b3b6b0504ee37ef5ae4c.tar
metatile-5f536f2182f06d73d123b3b6b0504ee37ef5ae4c.zip
ManageHook is a Monoid
darcs-hash:20071119060820-a5988-f70bb442a74c5ca8f6670184fb7eea6ca40ec793
Diffstat (limited to 'XMonad/Core.hs')
-rw-r--r--XMonad/Core.hs19
1 files changed, 17 insertions, 2 deletions
diff --git a/XMonad/Core.hs b/XMonad/Core.hs
index dd8de32..5eaa991 100644
--- a/XMonad/Core.hs
+++ b/XMonad/Core.hs
@@ -27,7 +27,7 @@ module XMonad.Core (
runX, catchX, userCode, io, catchIO,
withDisplay, withWindowSet, isRoot,
getAtom, spawn, restart, recompile, trace, whenJust, whenX,
- atom_WM_STATE, atom_WM_PROTOCOLS, atom_WM_DELETE_WINDOW
+ atom_WM_STATE, atom_WM_PROTOCOLS, atom_WM_DELETE_WINDOW, ManageHook, Query(..), runManageHook
) where
import XMonad.StackSet
@@ -45,6 +45,7 @@ import System.Environment
import Graphics.X11.Xlib
import Graphics.X11.Xlib.Extras (Event)
import Data.Typeable
+import Data.Monoid
import qualified Data.Map as M
import qualified Data.Set as S
@@ -75,7 +76,7 @@ data XConfig l = XConfig
, focusedBorderColor :: !String -- ^ Focused windows border color. Default: \"#ff0000\"
, terminal :: !String -- ^ The preferred terminal application. Default: \"xterm\"
, layoutHook :: !(l Window) -- ^ The avaiable layouts
- , manageHook :: Window -> X (WindowSet -> WindowSet)
+ , manageHook :: !ManageHook
-- ^ The action to run when a new window is opened
, workspaces :: [String] -- ^ The list of workspaces' names
, defaultGaps :: [(Int,Int,Int,Int)] -- ^ The list of gaps, per screen
@@ -116,6 +117,20 @@ data ScreenDetail = SD { screenRect :: !Rectangle
newtype X a = X (ReaderT XConf (StateT XState IO) a)
deriving (Functor, Monad, MonadIO, MonadState XState, MonadReader XConf)
+instance (Monoid a) => Monoid (X a) where
+ mempty = return mempty
+ mappend = liftM2 mappend
+
+type ManageHook = Query (Endo WindowSet)
+newtype Query a = Query (ReaderT Window X a) deriving (Functor, Monad, MonadReader Window)
+
+runManageHook :: ManageHook -> Window -> X (WindowSet -> WindowSet)
+runManageHook (Query m) w = fmap appEndo $ runReaderT m w
+
+instance Monoid a => Monoid (Query a) where
+ mempty = return mempty
+ mappend = liftM2 mappend
+
-- | Run the X monad, given a chunk of X monad code, and an initial state
-- Return the result, and final state
runX :: XConf -> XState -> X a -> IO (a, XState)