{-# INCLUDE <X11_extras_config.h> #-}
{-# LINE 1 "Graphics/X11/Xinerama.hsc" #-}
--------------------------------------------------------------------
{-# LINE 2 "Graphics/X11/Xinerama.hsc" #-}
-- |
-- Module    : Graphics.X11.Xinerama
-- Copyright : (c) Haskell.org, 2007
-- License   : BSD3
--
-- Maintainer: Don Stewart <dons@galois.com>
-- Stability : provisional
-- Portability: portable
--
--------------------------------------------------------------------
--
-- Interface to Xinerama API
--

module Graphics.X11.Xinerama (
   XineramaScreenInfo(..),
   xineramaIsActive,
   xineramaQueryExtension,
   xineramaQueryVersion,
   xineramaQueryScreens,
   compiledWithXinerama,
   getScreenInfo
 ) where


{-# LINE 27 "Graphics/X11/Xinerama.hsc" #-}

import Foreign
import Foreign.C.Types
import Graphics.X11.Xlib
import Graphics.X11.Xlib.Extras (WindowAttributes(..), getWindowAttributes)
import Control.Monad

-- | Representation of the XineramaScreenInfo struct
data XineramaScreenInfo = XineramaScreenInfo
                          { xsi_screen_number :: !CInt,
                            xsi_x_org         :: !CShort,
                            xsi_y_org         :: !CShort,
                            xsi_width         :: !CShort,
                            xsi_height        :: !CShort }
                            deriving (Show)

-- | Wrapper around xineramaQueryScreens that fakes a single screen when
-- Xinerama is not active. This is the preferred interface to
-- Graphics.X11.Xinerama.
getScreenInfo :: Display -> IO [Rectangle]
getScreenInfo dpy = do
    mxs <- xineramaQueryScreens dpy
    case mxs of
        Just xs -> return . map xsiToRect $ xs
        Nothing -> do
            wa <- getWindowAttributes dpy (defaultRootWindow dpy)
            return $ [Rectangle
                        { rect_x      = fromIntegral $ wa_x wa
                        , rect_y      = fromIntegral $ wa_y wa
                        , rect_width  = fromIntegral $ wa_width wa
                        , rect_height = fromIntegral $ wa_height wa }]
 where
    xsiToRect xsi = Rectangle
                    { rect_x        = fromIntegral $ xsi_x_org xsi
                    , rect_y        = fromIntegral $ xsi_y_org xsi
                    , rect_width    = fromIntegral $ xsi_width xsi
                    , rect_height   = fromIntegral $ xsi_height xsi
                    }


{-# LINE 141 "Graphics/X11/Xinerama.hsc" #-}

-- No Xinerama, but if we fake a non-active Xinerama interface, "getScreenInfo"
-- will continue to work fine in the single-screen case.
compiledWithXinerama :: Bool
compiledWithXinerama = False

xineramaIsActive :: Display -> IO Bool
xineramaIsActive _ = return False

xineramaQueryExtension :: Display -> IO (Maybe (CInt, CInt))
xineramaQueryExtension _  = return Nothing

xineramaQueryVersion :: Display -> IO (Maybe (CInt, CInt))
xineramaQueryVersion _ = return Nothing

xineramaQueryScreens :: Display -> IO (Maybe [XineramaScreenInfo])
xineramaQueryScreens _ = return Nothing


{-# LINE 160 "Graphics/X11/Xinerama.hsc" #-}