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

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

    #define ENABLE_OVERLOADING \
           (!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.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.Text as T
    import qualified Data.ByteString.Char8 as B
    import qualified Data.Map as Map
    import qualified Foreign.Ptr as FP

    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 => IsVisual o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError Visual a) =>
        IsVisual a
    #endif
    instance IsVisual Visual
    instance GObject.Object.IsObject Visual

    -- | 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 "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveVisualMethod l o = O.MethodResolutionFailed l o

    instance (info ~ ResolveVisualMethod t Visual, O.MethodInfo info Visual p) => O.IsLabelProxy t (Visual -> p) where
        fromLabelProxy _ = O.overloadedMethod (O.MethodProxy :: O.MethodProxy info)

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveVisualMethod t Visual, O.MethodInfo info Visual p) => O.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

    #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