{-# LANGUAGE DeriveDataTypeable #-}

module Graphics.XHB.Ewmh.Values where

import Data.Typeable (Typeable)
import Data.Binary.Get (getWord32host)
import Data.Binary.Put (putWord32host)
import Graphics.XHB (SimpleEnum(..))
import Graphics.XHB.Ewmh.Serialize

data Gravity = WinGravity
             | NorthWest
             | North
             | NorthEast
             | West
             | Center
             | East
             | SouthWest
             | South
             | SouthEast
             | Static
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance SimpleEnum Gravity where
    toValue v = case v of
        WinGravity -> 0
        NorthWest  -> 1
        North      -> 2
        NorthEast  -> 3
        West       -> 4
        Center     -> 5
        East       -> 6
        SouthWest  -> 7
        South      -> 8
        SouthEast  -> 9
        Static     -> 10

    fromValue v = case v of
        0  -> WinGravity
        1  -> NorthWest
        2  -> North
        3  -> NorthEast
        4  -> West
        5  -> Center
        6  -> East
        7  -> SouthWest
        8  -> South
        9  -> SouthEast
        10 -> Static
        _  -> error "Gravity: no such value"

data SourceIndication = SourceNone
                      | SourceApplication
                      | SourcePager
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance SimpleEnum SourceIndication where
    toValue v = case v of
        SourceNone        -> 0
        SourceApplication -> 1
        SourcePager       -> 2

    fromValue v = case v of
        0 -> SourceNone
        1 -> SourceApplication
        2 -> SourcePager
        _ -> error "SourceIndication: no such value"

data NET_DESKTOP_LAYOUT_ORIENTATION = NET_WM_ORIENTATION_HORZ
                                    | NET_WM_ORIENTATION_VERT
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Serialize NET_DESKTOP_LAYOUT_ORIENTATION where
    serialize   = putWord32host . toValue
    deserialize = fmap fromValue getWord32host

instance SimpleEnum NET_DESKTOP_LAYOUT_ORIENTATION where
    toValue v = case v of
        NET_WM_ORIENTATION_HORZ -> 0
        NET_WM_ORIENTATION_VERT -> 1

    fromValue v = case v of
        0 -> NET_WM_ORIENTATION_HORZ
        1 -> NET_WM_ORIENTATION_VERT
        _ -> error "NET_DESKTOP_LAYOUT_ORIENTATION: no such value"

data NET_DESKTOP_LAYOUT_STARTING_CORNER = NET_WM_TOPLEFT
                                        | NET_WM_TOPRIGHT
                                        | NET_WM_BOTTOMRIGHT
                                        | NET_WM_BOTTOMLEFT
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Serialize NET_DESKTOP_LAYOUT_STARTING_CORNER where
    serialize   = putWord32host . toValue
    deserialize = fmap fromValue getWord32host

instance SimpleEnum NET_DESKTOP_LAYOUT_STARTING_CORNER where
    toValue v = case v of
        NET_WM_TOPLEFT     -> 0
        NET_WM_TOPRIGHT    -> 1
        NET_WM_BOTTOMRIGHT -> 2
        NET_WM_BOTTOMLEFT  -> 3

    fromValue v = case v of
        0 -> NET_WM_TOPLEFT
        1 -> NET_WM_TOPRIGHT
        2 -> NET_WM_BOTTOMRIGHT
        3 -> NET_WM_BOTTOMLEFT
        _ -> error "NET_DESKTOP_LAYOUT_STARTING_CORNER: no such value"

data NET_WM_MOVERESIZE_DIRECTION = NET_WM_MOVERESIZE_SIZE_TOPLEFT
                                 | NET_WM_MOVERESIZE_SIZE_TOP
                                 | NET_WM_MOVERESIZE_SIZE_TOPRIGHT
                                 | NET_WM_MOVERESIZE_SIZE_RIGHT
                                 | NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT
                                 | NET_WM_MOVERESIZE_SIZE_BOTTOM
                                 | NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT
                                 | NET_WM_MOVERESIZE_SIZE_LEFT
                                 | NET_WM_MOVERESIZE_MOVE
                                 | NET_WM_MOVERESIZE_SIZE_KEYBOARD
                                 | NET_WM_MOVERESIZE_MOVE_KEYBOARD
                                 | NET_WM_MOVERESIZE_CANCEL
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance SimpleEnum NET_WM_MOVERESIZE_DIRECTION where
    toValue v = case v of
        NET_WM_MOVERESIZE_SIZE_TOPLEFT     -> 0
        NET_WM_MOVERESIZE_SIZE_TOP         -> 1
        NET_WM_MOVERESIZE_SIZE_TOPRIGHT    -> 2
        NET_WM_MOVERESIZE_SIZE_RIGHT       -> 3
        NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT -> 4
        NET_WM_MOVERESIZE_SIZE_BOTTOM      -> 5
        NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT  -> 6
        NET_WM_MOVERESIZE_SIZE_LEFT        -> 7
        NET_WM_MOVERESIZE_MOVE             -> 8
        NET_WM_MOVERESIZE_SIZE_KEYBOARD    -> 9
        NET_WM_MOVERESIZE_MOVE_KEYBOARD    -> 10
        NET_WM_MOVERESIZE_CANCEL           -> 11

    fromValue v = case v of
        0  -> NET_WM_MOVERESIZE_SIZE_TOPLEFT
        1  -> NET_WM_MOVERESIZE_SIZE_TOP
        2  -> NET_WM_MOVERESIZE_SIZE_TOPRIGHT
        3  -> NET_WM_MOVERESIZE_SIZE_RIGHT
        4  -> NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT
        5  -> NET_WM_MOVERESIZE_SIZE_BOTTOM
        6  -> NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT
        7  -> NET_WM_MOVERESIZE_SIZE_LEFT
        8  -> NET_WM_MOVERESIZE_MOVE
        9  -> NET_WM_MOVERESIZE_SIZE_KEYBOARD
        10 -> NET_WM_MOVERESIZE_MOVE_KEYBOARD
        11 -> NET_WM_MOVERESIZE_CANCEL
        _ -> error "NET_WM_MOVERESIZE_DIRECTION: no such value"

data NET_WM_STATE_ACTION = NET_WM_STATE_REMOVE
                         | NET_WM_STATE_ADD
                         | NET_WM_STATE_TOGGLE
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance SimpleEnum NET_WM_STATE_ACTION where
    toValue v = case v of
        NET_WM_STATE_REMOVE -> 0
        NET_WM_STATE_ADD    -> 1
        NET_WM_STATE_TOGGLE -> 2

    fromValue v = case v of
        0 -> NET_WM_STATE_REMOVE
        1 -> NET_WM_STATE_ADD
        2 -> NET_WM_STATE_TOGGLE
        _ -> error "NET_WM_STATE_ACTION: no such value"