{-# LANGUAGE ScopedTypeVariables, GeneralizedNewtypeDeriving,
FlexibleInstances, MultiParamTypeClasses, FlexibleContexts #-}
module XMonad.Util.WindowState (
get,
put,
StateQuery(..),
runStateQuery,
catchQuery ) where
import XMonad hiding (get, put, modify)
import Control.Monad.Reader(ReaderT(..))
import Control.Monad.State.Class
import Data.Typeable (typeOf)
newtype StateQuery s a = StateQuery {
StateQuery s a -> Query a
getQuery :: Query a
} deriving (Applicative (StateQuery s)
a -> StateQuery s a
Applicative (StateQuery s)
-> (forall a b.
StateQuery s a -> (a -> StateQuery s b) -> StateQuery s b)
-> (forall a b. StateQuery s a -> StateQuery s b -> StateQuery s b)
-> (forall a. a -> StateQuery s a)
-> Monad (StateQuery s)
StateQuery s a -> (a -> StateQuery s b) -> StateQuery s b
StateQuery s a -> StateQuery s b -> StateQuery s b
forall s. Applicative (StateQuery s)
forall a. a -> StateQuery s a
forall s a. a -> StateQuery s a
forall a b. StateQuery s a -> StateQuery s b -> StateQuery s b
forall a b.
StateQuery s a -> (a -> StateQuery s b) -> StateQuery s b
forall s a b. StateQuery s a -> StateQuery s b -> StateQuery s b
forall s a b.
StateQuery s a -> (a -> StateQuery s b) -> StateQuery s b
forall (m :: * -> *).
Applicative m
-> (forall a b. m a -> (a -> m b) -> m b)
-> (forall a b. m a -> m b -> m b)
-> (forall a. a -> m a)
-> Monad m
return :: a -> StateQuery s a
$creturn :: forall s a. a -> StateQuery s a
>> :: StateQuery s a -> StateQuery s b -> StateQuery s b
$c>> :: forall s a b. StateQuery s a -> StateQuery s b -> StateQuery s b
>>= :: StateQuery s a -> (a -> StateQuery s b) -> StateQuery s b
$c>>= :: forall s a b.
StateQuery s a -> (a -> StateQuery s b) -> StateQuery s b
$cp1Monad :: forall s. Applicative (StateQuery s)
Monad, Monad (StateQuery s)
Monad (StateQuery s)
-> (forall a. IO a -> StateQuery s a) -> MonadIO (StateQuery s)
IO a -> StateQuery s a
forall s. Monad (StateQuery s)
forall a. IO a -> StateQuery s a
forall s a. IO a -> StateQuery s a
forall (m :: * -> *).
Monad m -> (forall a. IO a -> m a) -> MonadIO m
liftIO :: IO a -> StateQuery s a
$cliftIO :: forall s a. IO a -> StateQuery s a
$cp1MonadIO :: forall s. Monad (StateQuery s)
MonadIO, Functor (StateQuery s)
a -> StateQuery s a
Functor (StateQuery s)
-> (forall a. a -> StateQuery s a)
-> (forall a b.
StateQuery s (a -> b) -> StateQuery s a -> StateQuery s b)
-> (forall a b c.
(a -> b -> c)
-> StateQuery s a -> StateQuery s b -> StateQuery s c)
-> (forall a b. StateQuery s a -> StateQuery s b -> StateQuery s b)
-> (forall a b. StateQuery s a -> StateQuery s b -> StateQuery s a)
-> Applicative (StateQuery s)
StateQuery s a -> StateQuery s b -> StateQuery s b
StateQuery s a -> StateQuery s b -> StateQuery s a
StateQuery s (a -> b) -> StateQuery s a -> StateQuery s b
(a -> b -> c) -> StateQuery s a -> StateQuery s b -> StateQuery s c
forall s. Functor (StateQuery s)
forall a. a -> StateQuery s a
forall s a. a -> StateQuery s a
forall a b. StateQuery s a -> StateQuery s b -> StateQuery s a
forall a b. StateQuery s a -> StateQuery s b -> StateQuery s b
forall a b.
StateQuery s (a -> b) -> StateQuery s a -> StateQuery s b
forall s a b. StateQuery s a -> StateQuery s b -> StateQuery s a
forall s a b. StateQuery s a -> StateQuery s b -> StateQuery s b
forall s a b.
StateQuery s (a -> b) -> StateQuery s a -> StateQuery s b
forall a b c.
(a -> b -> c) -> StateQuery s a -> StateQuery s b -> StateQuery s c
forall s a b c.
(a -> b -> c) -> StateQuery s a -> StateQuery s b -> StateQuery s c
forall (f :: * -> *).
Functor f
-> (forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
<* :: StateQuery s a -> StateQuery s b -> StateQuery s a
$c<* :: forall s a b. StateQuery s a -> StateQuery s b -> StateQuery s a
*> :: StateQuery s a -> StateQuery s b -> StateQuery s b
$c*> :: forall s a b. StateQuery s a -> StateQuery s b -> StateQuery s b
liftA2 :: (a -> b -> c) -> StateQuery s a -> StateQuery s b -> StateQuery s c
$cliftA2 :: forall s a b c.
(a -> b -> c) -> StateQuery s a -> StateQuery s b -> StateQuery s c
<*> :: StateQuery s (a -> b) -> StateQuery s a -> StateQuery s b
$c<*> :: forall s a b.
StateQuery s (a -> b) -> StateQuery s a -> StateQuery s b
pure :: a -> StateQuery s a
$cpure :: forall s a. a -> StateQuery s a
$cp1Applicative :: forall s. Functor (StateQuery s)
Applicative, a -> StateQuery s b -> StateQuery s a
(a -> b) -> StateQuery s a -> StateQuery s b
(forall a b. (a -> b) -> StateQuery s a -> StateQuery s b)
-> (forall a b. a -> StateQuery s b -> StateQuery s a)
-> Functor (StateQuery s)
forall a b. a -> StateQuery s b -> StateQuery s a
forall a b. (a -> b) -> StateQuery s a -> StateQuery s b
forall s a b. a -> StateQuery s b -> StateQuery s a
forall s a b. (a -> b) -> StateQuery s a -> StateQuery s b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
<$ :: a -> StateQuery s b -> StateQuery s a
$c<$ :: forall s a b. a -> StateQuery s b -> StateQuery s a
fmap :: (a -> b) -> StateQuery s a -> StateQuery s b
$cfmap :: forall s a b. (a -> b) -> StateQuery s a -> StateQuery s b
Functor)
packIntoQuery :: (Window -> X a) -> Query a
packIntoQuery :: (Window -> X a) -> Query a
packIntoQuery = ReaderT Window X a -> Query a
forall a. ReaderT Window X a -> Query a
Query (ReaderT Window X a -> Query a)
-> ((Window -> X a) -> ReaderT Window X a)
-> (Window -> X a)
-> Query a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Window -> X a) -> ReaderT Window X a
forall r (m :: * -> *) a. (r -> m a) -> ReaderT r m a
ReaderT
runStateQuery :: StateQuery s a -> Window -> X a
runStateQuery :: StateQuery s a -> Window -> X a
runStateQuery = Query a -> Window -> X a
forall a. Query a -> Window -> X a
runQuery (Query a -> Window -> X a)
-> (StateQuery s a -> Query a) -> StateQuery s a -> Window -> X a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StateQuery s a -> Query a
forall s a. StateQuery s a -> Query a
getQuery
catchQuery :: Query a -> Query (Maybe a)
catchQuery :: Query a -> Query (Maybe a)
catchQuery Query a
q = (Window -> X (Maybe a)) -> Query (Maybe a)
forall a. (Window -> X a) -> Query a
packIntoQuery ((Window -> X (Maybe a)) -> Query (Maybe a))
-> (Window -> X (Maybe a)) -> Query (Maybe a)
forall a b. (a -> b) -> a -> b
$ \Window
win -> X a -> X (Maybe a)
forall a. X a -> X (Maybe a)
userCode (X a -> X (Maybe a)) -> X a -> X (Maybe a)
forall a b. (a -> b) -> a -> b
$ Query a -> Window -> X a
forall a. Query a -> Window -> X a
runQuery Query a
q Window
win
instance (Show s, Read s, Typeable s) => MonadState (Maybe s) (StateQuery s) where
get :: StateQuery s (Maybe s)
get = Query (Maybe s) -> StateQuery s (Maybe s)
forall s a. Query a -> StateQuery s a
StateQuery (Query (Maybe s) -> StateQuery s (Maybe s))
-> Query (Maybe s) -> StateQuery s (Maybe s)
forall a b. (a -> b) -> a -> b
$ Read s => String -> Maybe s
String -> Maybe s
read' (String -> Maybe s) -> Query String -> Query (Maybe s)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe s -> Query String
get' Maybe s
forall a. HasCallStack => a
undefined where
get' :: Maybe s -> Query String
get' :: Maybe s -> Query String
get' Maybe s
x = String -> Query String
stringProperty (Maybe s -> String
forall a. Typeable a => a -> String
typePropertyName Maybe s
x)
read' :: (Read s) => String -> Maybe s
read' :: String -> Maybe s
read' String
"" = Maybe s
forall a. Maybe a
Nothing
read' String
s = s -> Maybe s
forall a. a -> Maybe a
Just (s -> Maybe s) -> s -> Maybe s
forall a b. (a -> b) -> a -> b
$ String -> s
forall a. Read a => String -> a
read String
s
put :: Maybe s -> StateQuery s ()
put = Query () -> StateQuery s ()
forall s a. Query a -> StateQuery s a
StateQuery (Query () -> StateQuery s ())
-> ((Window -> X ()) -> Query ())
-> (Window -> X ())
-> StateQuery s ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Window -> X ()) -> Query ()
forall a. (Window -> X a) -> Query a
packIntoQuery ((Window -> X ()) -> StateQuery s ())
-> (Maybe s -> Window -> X ()) -> Maybe s -> StateQuery s ()
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe s -> Window -> X ()
forall a. (Show a, Typeable a) => Maybe a -> Window -> X ()
setWindowProperty' where
setWindowProperty' :: Maybe a -> Window -> X ()
setWindowProperty' Maybe a
val = String -> String -> Window -> X ()
setWindowProperty String
prop String
strValue where
prop :: String
prop = Maybe a -> String
forall a. Typeable a => a -> String
typePropertyName Maybe a
val
strValue :: String
strValue = String -> (a -> String) -> Maybe a -> String
forall b a. b -> (a -> b) -> Maybe a -> b
maybe String
"" a -> String
forall a. Show a => a -> String
show Maybe a
val
typePropertyName :: (Typeable a) => a -> String
typePropertyName :: a -> String
typePropertyName a
x = String
"_XMONAD_WINSTATE__" String -> String -> String
forall a. [a] -> [a] -> [a]
++ TypeRep -> String
forall a. Show a => a -> String
show (a -> TypeRep
forall a. Typeable a => a -> TypeRep
typeOf a
x)
type PropertyName = String
setWindowProperty :: PropertyName -> String -> Window -> X ()
setWindowProperty :: String -> String -> Window -> X ()
setWindowProperty String
prop String
val Window
win = (Display -> X ()) -> X ()
forall a. (Display -> X a) -> X a
withDisplay ((Display -> X ()) -> X ()) -> (Display -> X ()) -> X ()
forall a b. (a -> b) -> a -> b
$ \Display
d -> IO () -> X ()
forall (m :: * -> *) a. MonadIO m => IO a -> m a
io (IO () -> X ()) -> IO () -> X ()
forall a b. (a -> b) -> a -> b
$
Display -> String -> Bool -> IO Window
internAtom Display
d String
prop Bool
False IO Window -> (Window -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>=
Display -> Window -> String -> Window -> IO ()
setTextProperty Display
d Window
win String
val