{- |
Copyright  : Will Thompson, Iñaki García Etxebarria and Jonas Platte
License    : LGPL-2.1
Maintainer : Iñaki García Etxebarria (inaki@blueleaf.cc)

A 'GI.Gdk.Objects.Visual.Visual' contains information about
a particular visual.
-}

#define ENABLE_OVERLOADING (MIN_VERSION_haskell_gi_overloading(1,0,0) \
       && !defined(__HADDOCK_VERSION__))

module GI.Gdk.Objects.Visual
    (

-- * Exported types
    Visual(..)                              ,
    IsVisual                                ,
    toVisual                                ,
    noVisual                                ,


 -- * Methods
-- ** getBest #method:getBest#

    visualGetBest                           ,


-- ** getBestDepth #method:getBestDepth#

    visualGetBestDepth                      ,


-- ** getBestType #method:getBestType#

    visualGetBestType                       ,


-- ** getBestWithBoth #method:getBestWithBoth#

    visualGetBestWithBoth                   ,


-- ** getBestWithDepth #method:getBestWithDepth#

    visualGetBestWithDepth                  ,


-- ** getBestWithType #method:getBestWithType#

    visualGetBestWithType                   ,


-- ** getBitsPerRgb #method:getBitsPerRgb#

#if ENABLE_OVERLOADING
    VisualGetBitsPerRgbMethodInfo           ,
#endif
    visualGetBitsPerRgb                     ,


-- ** getBluePixelDetails #method:getBluePixelDetails#

#if ENABLE_OVERLOADING
    VisualGetBluePixelDetailsMethodInfo     ,
#endif
    visualGetBluePixelDetails               ,


-- ** getByteOrder #method:getByteOrder#

#if ENABLE_OVERLOADING
    VisualGetByteOrderMethodInfo            ,
#endif
    visualGetByteOrder                      ,


-- ** getColormapSize #method:getColormapSize#

#if ENABLE_OVERLOADING
    VisualGetColormapSizeMethodInfo         ,
#endif
    visualGetColormapSize                   ,


-- ** getDepth #method:getDepth#

#if ENABLE_OVERLOADING
    VisualGetDepthMethodInfo                ,
#endif
    visualGetDepth                          ,


-- ** getGreenPixelDetails #method:getGreenPixelDetails#

#if ENABLE_OVERLOADING
    VisualGetGreenPixelDetailsMethodInfo    ,
#endif
    visualGetGreenPixelDetails              ,


-- ** getRedPixelDetails #method:getRedPixelDetails#

#if ENABLE_OVERLOADING
    VisualGetRedPixelDetailsMethodInfo      ,
#endif
    visualGetRedPixelDetails                ,


-- ** getScreen #method:getScreen#

#if ENABLE_OVERLOADING
    VisualGetScreenMethodInfo               ,
#endif
    visualGetScreen                         ,


-- ** getSystem #method:getSystem#

    visualGetSystem                         ,


-- ** getVisualType #method:getVisualType#

#if ENABLE_OVERLOADING
    VisualGetVisualTypeMethodInfo           ,
#endif
    visualGetVisualType                     ,




    ) where

import Data.GI.Base.ShortPrelude
import qualified Data.GI.Base.ShortPrelude as SP
import qualified Data.GI.Base.Overloading as O
import qualified Prelude as P

import qualified Data.GI.Base.Attributes as GI.Attributes
import qualified Data.GI.Base.ManagedPtr as B.ManagedPtr
import qualified Data.GI.Base.GClosure as B.GClosure
import qualified Data.GI.Base.GError as B.GError
import qualified Data.GI.Base.GVariant as B.GVariant
import qualified Data.GI.Base.GValue as B.GValue
import qualified Data.GI.Base.GParamSpec as B.GParamSpec
import qualified Data.GI.Base.CallStack as B.CallStack
import qualified Data.GI.Base.Properties as B.Properties
import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map
import qualified Foreign.Ptr as FP
import qualified GHC.OverloadedLabels as OL

import qualified GI.GObject.Objects.Object as GObject.Object
import {-# SOURCE #-} qualified GI.Gdk.Enums as Gdk.Enums
import {-# SOURCE #-} qualified GI.Gdk.Objects.Screen as Gdk.Screen

-- | Memory-managed wrapper type.
newtype Visual = Visual (ManagedPtr Visual)
foreign import ccall "gdk_visual_get_type"
    c_gdk_visual_get_type :: IO GType

instance GObject Visual where
    gobjectType = c_gdk_visual_get_type


-- | Type class for types which can be safely cast to `Visual`, for instance with `toVisual`.
class (GObject o, O.IsDescendantOf Visual o) => IsVisual o
instance (GObject o, O.IsDescendantOf Visual o) => IsVisual o

instance O.HasParentTypes Visual
type instance O.ParentTypes Visual = '[GObject.Object.Object]

-- | Cast to `Visual`, for types for which this is known to be safe. For general casts, use `Data.GI.Base.ManagedPtr.castTo`.
toVisual :: (MonadIO m, IsVisual o) => o -> m Visual
toVisual = liftIO . unsafeCastTo Visual

-- | A convenience alias for `Nothing` :: `Maybe` `Visual`.
noVisual :: Maybe Visual
noVisual = Nothing

#if ENABLE_OVERLOADING
type family ResolveVisualMethod (t :: Symbol) (o :: *) :: * where
    ResolveVisualMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
    ResolveVisualMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
    ResolveVisualMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
    ResolveVisualMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
    ResolveVisualMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
    ResolveVisualMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
    ResolveVisualMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
    ResolveVisualMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
    ResolveVisualMethod "ref" o = GObject.Object.ObjectRefMethodInfo
    ResolveVisualMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
    ResolveVisualMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
    ResolveVisualMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
    ResolveVisualMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
    ResolveVisualMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
    ResolveVisualMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
    ResolveVisualMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
    ResolveVisualMethod "getBitsPerRgb" o = VisualGetBitsPerRgbMethodInfo
    ResolveVisualMethod "getBluePixelDetails" o = VisualGetBluePixelDetailsMethodInfo
    ResolveVisualMethod "getByteOrder" o = VisualGetByteOrderMethodInfo
    ResolveVisualMethod "getColormapSize" o = VisualGetColormapSizeMethodInfo
    ResolveVisualMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
    ResolveVisualMethod "getDepth" o = VisualGetDepthMethodInfo
    ResolveVisualMethod "getGreenPixelDetails" o = VisualGetGreenPixelDetailsMethodInfo
    ResolveVisualMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
    ResolveVisualMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
    ResolveVisualMethod "getRedPixelDetails" o = VisualGetRedPixelDetailsMethodInfo
    ResolveVisualMethod "getScreen" o = VisualGetScreenMethodInfo
    ResolveVisualMethod "getVisualType" o = VisualGetVisualTypeMethodInfo
    ResolveVisualMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
    ResolveVisualMethod "setDataFull" o = GObject.Object.ObjectSetDataFullMethodInfo
    ResolveVisualMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
    ResolveVisualMethod l o = O.MethodResolutionFailed l o

instance (info ~ ResolveVisualMethod t Visual, O.MethodInfo info Visual p) => OL.IsLabel t (Visual -> p) where
#if MIN_VERSION_base(4,10,0)
    fromLabel = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#else
    fromLabel _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)
#endif

#endif

#if ENABLE_OVERLOADING
instance O.HasAttributeList Visual
type instance O.AttributeList Visual = VisualAttributeList
type VisualAttributeList = ('[ ] :: [(Symbol, *)])
#endif

#if ENABLE_OVERLOADING
#endif

#if ENABLE_OVERLOADING
type instance O.SignalList Visual = VisualSignalList
type VisualSignalList = ('[ '("notify", GObject.Object.ObjectNotifySignalInfo)] :: [(Symbol, *)])

#endif

-- method Visual::get_bits_per_rgb
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GdkVisual", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_bits_per_rgb" gdk_visual_get_bits_per_rgb ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    IO Int32

{-# DEPRECATED visualGetBitsPerRgb ["(Since version 3.22.)","Use 'GI.Gdk.Objects.Visual.visualGetRedPixelDetails' and its variants to","    learn about the pixel layout of TrueColor and DirectColor visuals"] #-}
{- |
Returns the number of significant bits per red, green and blue value.

Not all GDK backend provide a meaningful value for this function.

/Since: 2.22/
-}
visualGetBitsPerRgb ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: a 'GI.Gdk.Objects.Visual.Visual' -}
    -> m Int32
    {- ^ __Returns:__ The number of significant bits per color value for /@visual@/. -}
visualGetBitsPerRgb visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    result <- gdk_visual_get_bits_per_rgb visual'
    touchManagedPtr visual
    return result

#if ENABLE_OVERLOADING
data VisualGetBitsPerRgbMethodInfo
instance (signature ~ (m Int32), MonadIO m, IsVisual a) => O.MethodInfo VisualGetBitsPerRgbMethodInfo a signature where
    overloadedMethod _ = visualGetBitsPerRgb

#endif

-- method Visual::get_blue_pixel_details
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GdkVisual", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "mask", argType = TBasicType TUInt32, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #guint32 to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "shift", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #gint to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "precision", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #gint to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_blue_pixel_details" gdk_visual_get_blue_pixel_details ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    Ptr Word32 ->                           -- mask : TBasicType TUInt32
    Ptr Int32 ->                            -- shift : TBasicType TInt
    Ptr Int32 ->                            -- precision : TBasicType TInt
    IO ()

{- |
Obtains values that are needed to calculate blue pixel values in TrueColor
and DirectColor. The “mask” is the significant bits within the pixel.
The “shift” is the number of bits left we must shift a primary for it
to be in position (according to the \"mask\"). Finally, \"precision\" refers
to how much precision the pixel value contains for a particular primary.

/Since: 2.22/
-}
visualGetBluePixelDetails ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: a 'GI.Gdk.Objects.Visual.Visual' -}
    -> m ((Word32, Int32, Int32))
visualGetBluePixelDetails visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    mask <- allocMem :: IO (Ptr Word32)
    shift <- allocMem :: IO (Ptr Int32)
    precision <- allocMem :: IO (Ptr Int32)
    gdk_visual_get_blue_pixel_details visual' mask shift precision
    mask' <- peek mask
    shift' <- peek shift
    precision' <- peek precision
    touchManagedPtr visual
    freeMem mask
    freeMem shift
    freeMem precision
    return (mask', shift', precision')

#if ENABLE_OVERLOADING
data VisualGetBluePixelDetailsMethodInfo
instance (signature ~ (m ((Word32, Int32, Int32))), MonadIO m, IsVisual a) => O.MethodInfo VisualGetBluePixelDetailsMethodInfo a signature where
    overloadedMethod _ = visualGetBluePixelDetails

#endif

-- method Visual::get_byte_order
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GdkVisual.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "ByteOrder"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_byte_order" gdk_visual_get_byte_order ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    IO CUInt

{-# DEPRECATED visualGetByteOrder ["(Since version 3.22)","This information is not useful"] #-}
{- |
Returns the byte order of this visual.

The information returned by this function is only relevant
when working with XImages, and not all backends return
meaningful information for this.

/Since: 2.22/
-}
visualGetByteOrder ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: A 'GI.Gdk.Objects.Visual.Visual'. -}
    -> m Gdk.Enums.ByteOrder
    {- ^ __Returns:__ A 'GI.Gdk.Enums.ByteOrder' stating the byte order of /@visual@/. -}
visualGetByteOrder visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    result <- gdk_visual_get_byte_order visual'
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr visual
    return result'

#if ENABLE_OVERLOADING
data VisualGetByteOrderMethodInfo
instance (signature ~ (m Gdk.Enums.ByteOrder), MonadIO m, IsVisual a) => O.MethodInfo VisualGetByteOrderMethodInfo a signature where
    overloadedMethod _ = visualGetByteOrder

#endif

-- method Visual::get_colormap_size
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GdkVisual.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_colormap_size" gdk_visual_get_colormap_size ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    IO Int32

{-# DEPRECATED visualGetColormapSize ["(Since version 3.22)","This information is not useful, since GDK does not","    provide APIs to operate on colormaps."] #-}
{- |
Returns the size of a colormap for this visual.

You have to use platform-specific APIs to manipulate colormaps.

/Since: 2.22/
-}
visualGetColormapSize ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: A 'GI.Gdk.Objects.Visual.Visual'. -}
    -> m Int32
    {- ^ __Returns:__ The size of a colormap that is suitable for /@visual@/. -}
visualGetColormapSize visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    result <- gdk_visual_get_colormap_size visual'
    touchManagedPtr visual
    return result

#if ENABLE_OVERLOADING
data VisualGetColormapSizeMethodInfo
instance (signature ~ (m Int32), MonadIO m, IsVisual a) => O.MethodInfo VisualGetColormapSizeMethodInfo a signature where
    overloadedMethod _ = visualGetColormapSize

#endif

-- method Visual::get_depth
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GdkVisual.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_depth" gdk_visual_get_depth ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    IO Int32

{- |
Returns the bit depth of this visual.

/Since: 2.22/
-}
visualGetDepth ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: A 'GI.Gdk.Objects.Visual.Visual'. -}
    -> m Int32
    {- ^ __Returns:__ The bit depth of this visual. -}
visualGetDepth visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    result <- gdk_visual_get_depth visual'
    touchManagedPtr visual
    return result

#if ENABLE_OVERLOADING
data VisualGetDepthMethodInfo
instance (signature ~ (m Int32), MonadIO m, IsVisual a) => O.MethodInfo VisualGetDepthMethodInfo a signature where
    overloadedMethod _ = visualGetDepth

#endif

-- method Visual::get_green_pixel_details
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GdkVisual", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "mask", argType = TBasicType TUInt32, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #guint32 to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "shift", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #gint to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "precision", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #gint to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_green_pixel_details" gdk_visual_get_green_pixel_details ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    Ptr Word32 ->                           -- mask : TBasicType TUInt32
    Ptr Int32 ->                            -- shift : TBasicType TInt
    Ptr Int32 ->                            -- precision : TBasicType TInt
    IO ()

{- |
Obtains values that are needed to calculate green pixel values in TrueColor
and DirectColor. The “mask” is the significant bits within the pixel.
The “shift” is the number of bits left we must shift a primary for it
to be in position (according to the \"mask\"). Finally, \"precision\" refers
to how much precision the pixel value contains for a particular primary.

/Since: 2.22/
-}
visualGetGreenPixelDetails ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: a 'GI.Gdk.Objects.Visual.Visual' -}
    -> m ((Word32, Int32, Int32))
visualGetGreenPixelDetails visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    mask <- allocMem :: IO (Ptr Word32)
    shift <- allocMem :: IO (Ptr Int32)
    precision <- allocMem :: IO (Ptr Int32)
    gdk_visual_get_green_pixel_details visual' mask shift precision
    mask' <- peek mask
    shift' <- peek shift
    precision' <- peek precision
    touchManagedPtr visual
    freeMem mask
    freeMem shift
    freeMem precision
    return (mask', shift', precision')

#if ENABLE_OVERLOADING
data VisualGetGreenPixelDetailsMethodInfo
instance (signature ~ (m ((Word32, Int32, Int32))), MonadIO m, IsVisual a) => O.MethodInfo VisualGetGreenPixelDetailsMethodInfo a signature where
    overloadedMethod _ = visualGetGreenPixelDetails

#endif

-- method Visual::get_red_pixel_details
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GdkVisual", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "mask", argType = TBasicType TUInt32, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #guint32 to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "shift", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #gint to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything},Arg {argCName = "precision", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A pointer to a #gint to be filled in, or %NULL", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_red_pixel_details" gdk_visual_get_red_pixel_details ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    Ptr Word32 ->                           -- mask : TBasicType TUInt32
    Ptr Int32 ->                            -- shift : TBasicType TInt
    Ptr Int32 ->                            -- precision : TBasicType TInt
    IO ()

{- |
Obtains values that are needed to calculate red pixel values in TrueColor
and DirectColor. The “mask” is the significant bits within the pixel.
The “shift” is the number of bits left we must shift a primary for it
to be in position (according to the \"mask\"). Finally, \"precision\" refers
to how much precision the pixel value contains for a particular primary.

/Since: 2.22/
-}
visualGetRedPixelDetails ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: A 'GI.Gdk.Objects.Visual.Visual' -}
    -> m ((Word32, Int32, Int32))
visualGetRedPixelDetails visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    mask <- allocMem :: IO (Ptr Word32)
    shift <- allocMem :: IO (Ptr Int32)
    precision <- allocMem :: IO (Ptr Int32)
    gdk_visual_get_red_pixel_details visual' mask shift precision
    mask' <- peek mask
    shift' <- peek shift
    precision' <- peek precision
    touchManagedPtr visual
    freeMem mask
    freeMem shift
    freeMem precision
    return (mask', shift', precision')

#if ENABLE_OVERLOADING
data VisualGetRedPixelDetailsMethodInfo
instance (signature ~ (m ((Word32, Int32, Int32))), MonadIO m, IsVisual a) => O.MethodInfo VisualGetRedPixelDetailsMethodInfo a signature where
    overloadedMethod _ = visualGetRedPixelDetails

#endif

-- method Visual::get_screen
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #GdkVisual", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "Screen"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_screen" gdk_visual_get_screen ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    IO (Ptr Gdk.Screen.Screen)

{- |
Gets the screen to which this visual belongs

/Since: 2.2/
-}
visualGetScreen ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: a 'GI.Gdk.Objects.Visual.Visual' -}
    -> m Gdk.Screen.Screen
    {- ^ __Returns:__ the screen to which this visual belongs. -}
visualGetScreen visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    result <- gdk_visual_get_screen visual'
    checkUnexpectedReturnNULL "visualGetScreen" result
    result' <- (newObject Gdk.Screen.Screen) result
    touchManagedPtr visual
    return result'

#if ENABLE_OVERLOADING
data VisualGetScreenMethodInfo
instance (signature ~ (m Gdk.Screen.Screen), MonadIO m, IsVisual a) => O.MethodInfo VisualGetScreenMethodInfo a signature where
    overloadedMethod _ = visualGetScreen

#endif

-- method Visual::get_visual_type
-- method type : OrdinaryMethod
-- Args : [Arg {argCName = "visual", argType = TInterface (Name {namespace = "Gdk", name = "Visual"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "A #GdkVisual.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "VisualType"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_visual_type" gdk_visual_get_visual_type ::
    Ptr Visual ->                           -- visual : TInterface (Name {namespace = "Gdk", name = "Visual"})
    IO CUInt

{- |
Returns the type of visual this is (PseudoColor, TrueColor, etc).

/Since: 2.22/
-}
visualGetVisualType ::
    (B.CallStack.HasCallStack, MonadIO m, IsVisual a) =>
    a
    {- ^ /@visual@/: A 'GI.Gdk.Objects.Visual.Visual'. -}
    -> m Gdk.Enums.VisualType
    {- ^ __Returns:__ A 'GI.Gdk.Enums.VisualType' stating the type of /@visual@/. -}
visualGetVisualType visual = liftIO $ do
    visual' <- unsafeManagedPtrCastPtr visual
    result <- gdk_visual_get_visual_type visual'
    let result' = (toEnum . fromIntegral) result
    touchManagedPtr visual
    return result'

#if ENABLE_OVERLOADING
data VisualGetVisualTypeMethodInfo
instance (signature ~ (m Gdk.Enums.VisualType), MonadIO m, IsVisual a) => O.MethodInfo VisualGetVisualTypeMethodInfo a signature where
    overloadedMethod _ = visualGetVisualType

#endif

-- method Visual::get_best
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "Visual"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_best" gdk_visual_get_best ::
    IO (Ptr Visual)

{-# DEPRECATED visualGetBest ["(Since version 3.22)","Visual selection should be done using","    'GI.Gdk.Objects.Screen.screenGetSystemVisual' and 'GI.Gdk.Objects.Screen.screenGetRgbaVisual'"] #-}
{- |
Get the visual with the most available colors for the default
GDK screen. The return value should not be freed.
-}
visualGetBest ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Visual
    {- ^ __Returns:__ best visual -}
visualGetBest  = liftIO $ do
    result <- gdk_visual_get_best
    checkUnexpectedReturnNULL "visualGetBest" result
    result' <- (newObject Visual) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Visual::get_best_depth
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TBasicType TInt)
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_best_depth" gdk_visual_get_best_depth ::
    IO Int32

{-# DEPRECATED visualGetBestDepth ["(Since version 3.22)","Visual selection should be done using","    'GI.Gdk.Objects.Screen.screenGetSystemVisual' and 'GI.Gdk.Objects.Screen.screenGetRgbaVisual'"] #-}
{- |
Get the best available depth for the default GDK screen.  “Best”
means “largest,” i.e. 32 preferred over 24 preferred over 8 bits
per pixel.
-}
visualGetBestDepth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Int32
    {- ^ __Returns:__ best available depth -}
visualGetBestDepth  = liftIO $ do
    result <- gdk_visual_get_best_depth
    return result

#if ENABLE_OVERLOADING
#endif

-- method Visual::get_best_type
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "VisualType"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_best_type" gdk_visual_get_best_type ::
    IO CUInt

{-# DEPRECATED visualGetBestType ["(Since version 3.22)","Visual selection should be done using","    'GI.Gdk.Objects.Screen.screenGetSystemVisual' and 'GI.Gdk.Objects.Screen.screenGetRgbaVisual'"] #-}
{- |
Return the best available visual type for the default GDK screen.
-}
visualGetBestType ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Gdk.Enums.VisualType
    {- ^ __Returns:__ best visual type -}
visualGetBestType  = liftIO $ do
    result <- gdk_visual_get_best_type
    let result' = (toEnum . fromIntegral) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Visual::get_best_with_both
-- method type : MemberFunction
-- Args : [Arg {argCName = "depth", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a bit depth", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "visual_type", argType = TInterface (Name {namespace = "Gdk", name = "VisualType"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a visual type", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "Visual"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_best_with_both" gdk_visual_get_best_with_both ::
    Int32 ->                                -- depth : TBasicType TInt
    CUInt ->                                -- visual_type : TInterface (Name {namespace = "Gdk", name = "VisualType"})
    IO (Ptr Visual)

{-# DEPRECATED visualGetBestWithBoth ["(Since version 3.22)","Visual selection should be done using","    'GI.Gdk.Objects.Screen.screenGetSystemVisual' and 'GI.Gdk.Objects.Screen.screenGetRgbaVisual'"] #-}
{- |
Combines 'GI.Gdk.Objects.Visual.visualGetBestWithDepth' and
'GI.Gdk.Objects.Visual.visualGetBestWithType'.
-}
visualGetBestWithBoth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Int32
    {- ^ /@depth@/: a bit depth -}
    -> Gdk.Enums.VisualType
    {- ^ /@visualType@/: a visual type -}
    -> m (Maybe Visual)
    {- ^ __Returns:__ best visual with both /@depth@/
    and /@visualType@/, or 'Nothing' if none -}
visualGetBestWithBoth depth visualType = liftIO $ do
    let visualType' = (fromIntegral . fromEnum) visualType
    result <- gdk_visual_get_best_with_both depth visualType'
    maybeResult <- convertIfNonNull result $ \result' -> do
        result'' <- (newObject Visual) result'
        return result''
    return maybeResult

#if ENABLE_OVERLOADING
#endif

-- method Visual::get_best_with_depth
-- method type : MemberFunction
-- Args : [Arg {argCName = "depth", argType = TBasicType TInt, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a bit depth", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "Visual"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_best_with_depth" gdk_visual_get_best_with_depth ::
    Int32 ->                                -- depth : TBasicType TInt
    IO (Ptr Visual)

{-# DEPRECATED visualGetBestWithDepth ["(Since version 3.22)","Visual selection should be done using","    'GI.Gdk.Objects.Screen.screenGetSystemVisual' and 'GI.Gdk.Objects.Screen.screenGetRgbaVisual'"] #-}
{- |
Get the best visual with depth /@depth@/ for the default GDK screen.
Color visuals and visuals with mutable colormaps are preferred
over grayscale or fixed-colormap visuals. The return value should
not be freed. 'Nothing' may be returned if no visual supports /@depth@/.
-}
visualGetBestWithDepth ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Int32
    {- ^ /@depth@/: a bit depth -}
    -> m Visual
    {- ^ __Returns:__ best visual for the given depth -}
visualGetBestWithDepth depth = liftIO $ do
    result <- gdk_visual_get_best_with_depth depth
    checkUnexpectedReturnNULL "visualGetBestWithDepth" result
    result' <- (newObject Visual) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Visual::get_best_with_type
-- method type : MemberFunction
-- Args : [Arg {argCName = "visual_type", argType = TInterface (Name {namespace = "Gdk", name = "VisualType"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a visual type", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "Visual"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_best_with_type" gdk_visual_get_best_with_type ::
    CUInt ->                                -- visual_type : TInterface (Name {namespace = "Gdk", name = "VisualType"})
    IO (Ptr Visual)

{-# DEPRECATED visualGetBestWithType ["(Since version 3.22)","Visual selection should be done using","    'GI.Gdk.Objects.Screen.screenGetSystemVisual' and 'GI.Gdk.Objects.Screen.screenGetRgbaVisual'"] #-}
{- |
Get the best visual of the given /@visualType@/ for the default GDK screen.
Visuals with higher color depths are considered better. The return value
should not be freed. 'Nothing' may be returned if no visual has type
/@visualType@/.
-}
visualGetBestWithType ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Gdk.Enums.VisualType
    {- ^ /@visualType@/: a visual type -}
    -> m Visual
    {- ^ __Returns:__ best visual of the given type -}
visualGetBestWithType visualType = liftIO $ do
    let visualType' = (fromIntegral . fromEnum) visualType
    result <- gdk_visual_get_best_with_type visualType'
    checkUnexpectedReturnNULL "visualGetBestWithType" result
    result' <- (newObject Visual) result
    return result'

#if ENABLE_OVERLOADING
#endif

-- method Visual::get_system
-- method type : MemberFunction
-- Args : []
-- Lengths : []
-- returnType : Just (TInterface (Name {namespace = "Gdk", name = "Visual"}))
-- throws : False
-- Skip return : False

foreign import ccall "gdk_visual_get_system" gdk_visual_get_system ::
    IO (Ptr Visual)

{-# DEPRECATED visualGetSystem ["(Since version 3.22)","Use gdk_screen_get_system_visual (gdk_screen_get_default ())."] #-}
{- |
Get the system’s default visual for the default GDK screen.
This is the visual for the root window of the display.
The return value should not be freed.
-}
visualGetSystem ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m Visual
    {- ^ __Returns:__ system visual -}
visualGetSystem  = liftIO $ do
    result <- gdk_visual_get_system
    checkUnexpectedReturnNULL "visualGetSystem" result
    result' <- (newObject Visual) result
    return result'

#if ENABLE_OVERLOADING
#endif