-----------------------------------------------------------------------------
-- |
-- Module      :  Graphics.X11.Xlib.Display
-- Copyright   :  (c) Alastair Reid, 1999-2003
-- License     :  BSD-style (see the file libraries/base/LICENSE)
--
-- Maintainer  :  libraries@haskell.org
-- Stability   :  provisional
-- Portability :  portable
--
-- A collection of FFI declarations for interfacing with Xlib Displays.
--
-----------------------------------------------------------------------------

module Graphics.X11.Xlib.Display(

        allPlanes_aux,
        blackPixel,
        whitePixel,
        connectionNumber,
        defaultColormap,
        defaultGC,
        defaultDepth,
        defaultScreen,
        defaultScreenOfDisplay,
        displayHeight,
        displayHeightMM,
        displayWidth,
        displayWidthMM,
        maxRequestSize,
        displayMotionBufferSize,
        resourceManagerString,
        screenResourceString,
        displayString,
        imageByteOrder,
        protocolRevision,
        protocolVersion,
        serverVendor,
        screenCount,
        defaultVisual,
        displayCells,
        displayPlanes,
        screenOfDisplay,
        defaultRootWindow,
        rootWindow,
        qLength,
        noOp,
        openDisplay,
        closeDisplay,

        ) where

import Graphics.X11.Types
import Graphics.X11.Xlib.Types

import Foreign (throwIfNull, Ptr)
import Foreign.C

import System.IO.Unsafe

----------------------------------------------------------------
-- Display
----------------------------------------------------------------

-- | interface to the X11 library function @XAllPlanes()@.
foreign import ccall unsafe "HsXlib.h XAllPlanes"
        allPlanes_aux           :: Pixel

-- | interface to the X11 library function @XBlackPixel()@.
foreign import ccall unsafe "HsXlib.h XBlackPixel"
        blackPixel              :: Display -> ScreenNumber -> Pixel

-- | interface to the X11 library function @XWhitePixel()@.
foreign import ccall unsafe "HsXlib.h XWhitePixel"
        whitePixel              :: Display -> ScreenNumber -> Pixel

-- This may vary from one execution to another but I believe it
-- is constant during any given execution and so it can be made PURE
-- without breaking referential transparency.
--
-- Note: underneath the opaque name, it turns out that this
-- is the file descriptor.  You need to know this if you want to
-- use select.

-- | interface to the X11 library function @XConnectionNumber()@.
foreign import ccall unsafe "HsXlib.h XConnectionNumber"
        connectionNumber        :: Display -> CInt

-- | interface to the X11 library function @XDefaultColormap()@.
foreign import ccall unsafe "HsXlib.h XDefaultColormap"
        defaultColormap         :: Display -> ScreenNumber -> Colormap

-- XListDepths :: Display -> ScreenNumber -> ListInt using res1 = XListDepths(arg1,arg2,&res1_size)

-- | interface to the X11 library function @XDefaultGC()@.
foreign import ccall unsafe "HsXlib.h XDefaultGC"
        defaultGC               :: Display -> ScreenNumber -> GC

-- | interface to the X11 library function @XDefaultDepth()@.
foreign import ccall unsafe "HsXlib.h XDefaultDepth"
        defaultDepth            :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XDefaultScreen()@.
foreign import ccall unsafe "HsXlib.h XDefaultScreen"
        defaultScreen           :: Display -> ScreenNumber

-- | interface to the X11 library function @XDefaultScreenOfDisplay()@.
foreign import ccall unsafe "HsXlib.h XDefaultScreenOfDisplay"
        defaultScreenOfDisplay  :: Display -> Screen

-- | interface to the X11 library function @XDisplayHeight()@.
foreign import ccall unsafe "HsXlib.h XDisplayHeight"
        displayHeight           :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XDisplayHeightMM()@.
foreign import ccall unsafe "HsXlib.h XDisplayHeightMM"
        displayHeightMM         :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XDisplayWidth()@.
foreign import ccall unsafe "HsXlib.h XDisplayWidth"
        displayWidth            :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XDisplayWidthMM()@.
foreign import ccall unsafe "HsXlib.h XDisplayWidthMM"
        displayWidthMM          :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XMaxRequestSize()@.
foreign import ccall unsafe "HsXlib.h XMaxRequestSize"
        maxRequestSize          :: Display -> CInt

-- | interface to the X11 library function @XDisplayMotionBufferSize()@.
foreign import ccall unsafe "HsXlib.h XDisplayMotionBufferSize"
        displayMotionBufferSize :: Display -> CInt
--Disnae exist in X11R5         XExtendedMaxRequestSize :: Display -> Int

-- | interface to the X11 library function @XResourceManagerString()@.
resourceManagerString   :: Display -> String
resourceManagerString display = xlibCString (xResourceManagerString display)
foreign import ccall unsafe "HsXlib.h XResourceManagerString"
        xResourceManagerString  :: Display -> IO CString

-- | interface to the X11 library function @XScreenResourceString()@.
screenResourceString    :: Screen   -> String
screenResourceString screen = xlibCString (xScreenResourceString screen)
foreign import ccall unsafe "HsXlib.h XScreenResourceString"
        xScreenResourceString   :: Screen   -> IO CString

-- | interface to the X11 library function @XDisplayString()@.
displayString           :: Display -> String
displayString display = xlibCString (xDisplayString display)
foreign import ccall unsafe "HsXlib.h XDisplayString"
        xDisplayString          :: Display -> IO CString

-- | interface to the X11 library function @XImageByteOrder()@.
foreign import ccall unsafe "HsXlib.h XImageByteOrder"
        imageByteOrder          :: Display -> CInt

-- | interface to the X11 library function @XProtocolRevision()@.
foreign import ccall unsafe "HsXlib.h XProtocolRevision"
        protocolRevision        :: Display -> CInt

-- | interface to the X11 library function @XProtocolVersion()@.
foreign import ccall unsafe "HsXlib.h XProtocolVersion"
        protocolVersion         :: Display -> CInt

-- | interface to the X11 library function @XServerVendor()@.
serverVendor            :: Display -> String
serverVendor display = xlibCString (xServerVendor display)
foreign import ccall unsafe "HsXlib.h XServerVendor"
        xServerVendor           :: Display -> IO CString

--Disnae exist:         XServerRelease          :: Display -> Int

-- | interface to the X11 library function @XScreenCount()@.
foreign import ccall unsafe "HsXlib.h XScreenCount"
        screenCount             :: Display -> CInt

-- | interface to the X11 library function @XDefaultVisual()@.
foreign import ccall unsafe "HsXlib.h XDefaultVisual"
        defaultVisual           :: Display -> ScreenNumber -> Visual

-- | interface to the X11 library function @XDisplayCells()@.
foreign import ccall unsafe "HsXlib.h XDisplayCells"
        displayCells            :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XDisplayPlanes()@.
foreign import ccall unsafe "HsXlib.h XDisplayPlanes"
        displayPlanes           :: Display -> ScreenNumber -> CInt

-- | interface to the X11 library function @XScreenOfDisplay()@.
foreign import ccall unsafe "HsXlib.h XScreenOfDisplay"
        screenOfDisplay         :: Display -> ScreenNumber -> Screen

-- | interface to the X11 library function @XDefaultRootWindow()@.
foreign import ccall unsafe "HsXlib.h XDefaultRootWindow"
        defaultRootWindow       :: Display -> Window

-- The following are believed to be order dependent

-- | interface to the X11 library function @XRootWindow()@.
foreign import ccall unsafe "HsXlib.h XRootWindow"
        rootWindow              :: Display -> ScreenNumber -> IO Window

-- | interface to the X11 library function @XQLength()@.
foreign import ccall unsafe "HsXlib.h XQLength"
        qLength                 :: Display -> IO CInt

-- | interface to the X11 library function @XNoOp()@.
foreign import ccall unsafe "HsXlib.h XNoOp"
        noOp                    :: Display -> IO ()

-- | interface to the X11 library function @XOpenDisplay()@.
openDisplay :: String -> IO Display
openDisplay name =
        withCString name $ \ c_name -> do
        display <- throwIfNull "openDisplay" (xOpenDisplay c_name)
        return (Display display)
foreign import ccall unsafe "HsXlib.h XOpenDisplay"
        xOpenDisplay :: CString -> IO (Ptr Display)

-- | interface to the X11 library function @XCloseDisplay()@.
foreign import ccall unsafe "HsXlib.h XCloseDisplay"
        closeDisplay            :: Display -> IO ()

-- | convert a CString owned by Xlib to a Haskell String
xlibCString :: IO CString -> String
xlibCString act = unsafePerformIO $ do
        cs <- act
        peekCString cs

----------------------------------------------------------------
-- End
----------------------------------------------------------------