{-# LANGUAGE DeriveDataTypeable #-}

module Graphics.XHB.Ewmh.Atoms where

import Data.Typeable (Typeable)
import Data.Hashable (Hashable(..))
import Graphics.XHB.AtomCache

data UTF8_STRING = UTF8_STRING
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Hashable UTF8_STRING where
    hashWithSalt s = hashWithSalt s . show

instance AtomLike UTF8_STRING where
    toAtomName = show

data EWMH_ATOM =
    -- Root Window Properties
      NET_SUPPORTED
    | NET_CLIENT_LIST
    | NET_CLIENT_LIST_STACKING
    | NET_NUMBER_OF_DESKTOPS
    | NET_DESKTOP_GEOMETRY
    | NET_DESKTOP_VIEWPORT
    | NET_CURRENT_DESKTOP
    | NET_DESKTOP_NAMES
    | NET_ACTIVE_WINDOW
    | NET_WORKAREA
    | NET_SUPPORTING_WM_CHECK
    | NET_VIRTUAL_ROOTS
    | NET_DESKTOP_LAYOUT
    | NET_SHOWING_DESKTOP

    -- Other Root Window Messages
    | NET_CLOSE_WINDOW
    | NET_MOVERESIZE_WINDOW
    | NET_WM_MOVERESIZE
    | NET_RESTACK_WINDOW
    | NET_REQUEST_FRAME_EXTENTS

    -- Application Window Property
    | NET_WM_NAME
    | NET_WM_VISIBLE_NAME
    | NET_WM_ICON_NAME
    | NET_WM_VISIBLE_ICON_NAME
    | NET_WM_DESKTOP
    | NET_WM_WINDOW_TYPE
    | NET_WM_STATE
    | NET_WM_ALLOWED_ACTIONS
    | NET_WM_STRUT
    | NET_WM_STRUT_PARTIAL
    | NET_WM_ICON_GEOMETRY
    | NET_WM_ICON
    | NET_WM_PID
    | NET_WM_HANDLED_ICONS
    | NET_WM_USER_TIME
    | NET_WM_USER_TIME_WINDOW
    | NET_FRAME_EXTENTS
    | NET_WM_OPAQUE_REGION
    | NET_WM_BYPASS_COMPOSITOR

    -- Window Manager Protocols
    | WM_PROTOCOLS
    | NET_WM_PING
    | NET_WM_SYNC_REQUEST
    | NET_WM_SYNC_REQUEST_COUNTER
    | NET_WM_FULLSCREEN_MONITORS

    -- Other Properties
    | NET_WM_FULL_PLACEMENT

    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Hashable EWMH_ATOM where
    hashWithSalt s = hashWithSalt s . show

instance AtomLike EWMH_ATOM where
    toAtomName a = '_' : show a

data NET_WM_WINDOW_TYPE =
      NET_WM_WINDOW_TYPE_DESKTOP
    | NET_WM_WINDOW_TYPE_DOCK
    | NET_WM_WINDOW_TYPE_TOOLBAR
    | NET_WM_WINDOW_TYPE_MENU
    | NET_WM_WINDOW_TYPE_UTILITY
    | NET_WM_WINDOW_TYPE_SPLASH
    | NET_WM_WINDOW_TYPE_DIALOG
    | NET_WM_WINDOW_TYPE_DROPDOWN_MENU
    | NET_WM_WINDOW_TYPE_POPUP_MENU
    | NET_WM_WINDOW_TYPE_TOOLTIP
    | NET_WM_WINDOW_TYPE_NOTIFICATION
    | NET_WM_WINDOW_TYPE_COMBO
    | NET_WM_WINDOW_TYPE_DND
    | NET_WM_WINDOW_TYPE_NORMAL
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Hashable NET_WM_WINDOW_TYPE where
    hashWithSalt s = hashWithSalt s . show

instance AtomLike NET_WM_WINDOW_TYPE where
    toAtomName a = '_' : show a

data NET_WM_STATE =
      NET_WM_STATE_MODAL
    | NET_WM_STATE_STICKY
    | NET_WM_STATE_MAXIMIZED_VERT
    | NET_WM_STATE_MAXIMIZED_HORZ
    | NET_WM_STATE_SHADED
    | NET_WM_STATE_SKIP_TASKBAR
    | NET_WM_STATE_SKIP_PAGER
    | NET_WM_STATE_HIDDEN
    | NET_WM_STATE_FULLSCREEN
    | NET_WM_STATE_ABOVE
    | NET_WM_STATE_BELOW
    | NET_WM_STATE_DEMANDS_ATTENTION
    | NET_WM_STATE_FOCUSED
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Hashable NET_WM_STATE where
    hashWithSalt s = hashWithSalt s . show

instance AtomLike NET_WM_STATE where
    toAtomName a = '_' : show a

data NET_WM_ALLOWED_ACTIONS =
      NET_WM_ACTION_MOVE
    | NET_WM_ACTION_RESIZE
    | NET_WM_ACTION_MINIMIZE
    | NET_WM_ACTION_SHADE
    | NET_WM_ACTION_STICK
    | NET_WM_ACTION_MAXIMIZE_HORZ
    | NET_WM_ACTION_MAXIMIZE_VERT
    | NET_WM_ACTION_FULLSCREEN
    | NET_WM_ACTION_CHANGE_DESKTOP
    | NET_WM_ACTION_CLOSE
    | NET_WM_ACTION_ABOVE
    | NET_WM_ACTION_BELOW
    deriving (Enum, Eq, Ord, Read, Show, Typeable)

instance Hashable NET_WM_ALLOWED_ACTIONS where
    hashWithSalt s = hashWithSalt s . show

instance AtomLike NET_WM_ALLOWED_ACTIONS where
    toAtomName a = '_' : show a