blob: 69b1de1e984b9bab9851ba6627b237ba72c66686 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
{-# OPTIONS_GHC -fglasgow-exts #-}
module Thunk.Wm where
import Data.Sequence
import Control.Monad.State
import System.IO (hFlush, hPutStrLn, stderr)
import Graphics.X11.Xlib
data WmState = WmState
{ display :: Display
, screenWidth :: Int
, screenHeight :: Int
, windows :: Seq Window
}
newtype Wm a = Wm (StateT WmState IO a)
deriving (Monad, MonadIO{-, MonadState WmState-})
runWm :: Wm a -> WmState -> IO (a, WmState)
runWm (Wm m) = runStateT m
l :: IO a -> Wm a
l = liftIO
trace msg = l $ do
hPutStrLn stderr msg
hFlush stderr
withIO :: (forall b. (a -> IO b) -> IO b) -> (a -> Wm c) -> Wm c
withIO f g = do
s <- Wm get
(y, s') <- l $ f $ \x -> runWm (g x) s
Wm (put s')
return y
getDisplay = Wm (gets display)
getWindows = Wm (gets windows)
getScreenWidth = Wm (gets screenWidth)
getScreenHeight = Wm (gets screenHeight)
setWindows x = Wm (modify (\s -> s {windows = x}))
modifyWindows :: (Seq Window -> Seq Window) -> Wm ()
modifyWindows f = Wm (modify (\s -> s {windows = f (windows s)}))
|