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

    The 'GI.Pango.Objects.FontFamily.FontFamily' structure is used to represent a family of related
    font faces. The faces in a family share a common design, but differ in
    slant, weight, width and other aspects.
    -}

    #define ENABLE_OVERLOADING \
           (!defined(__HADDOCK_VERSION__))

    module GI.Pango.Objects.FontFamily
        (

    -- * Exported types
        FontFamily(..)                          ,
        IsFontFamily                            ,
        toFontFamily                            ,
        noFontFamily                            ,

     -- * Methods
    -- ** getName #method:getName#

    #if ENABLE_OVERLOADING
        FontFamilyGetNameMethodInfo             ,
    #endif
        fontFamilyGetName                       ,

    -- ** isMonospace #method:isMonospace#

    #if ENABLE_OVERLOADING
        FontFamilyIsMonospaceMethodInfo         ,
    #endif
        fontFamilyIsMonospace                   ,

    -- ** listFaces #method:listFaces#

    #if ENABLE_OVERLOADING
        FontFamilyListFacesMethodInfo           ,
    #endif
        fontFamilyListFaces                     ,

        ) 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.Pango.Objects.FontFace as Pango.FontFace

    -- | Memory-managed wrapper type.
    newtype FontFamily = FontFamily (ManagedPtr FontFamily)
    foreign import ccall "pango_font_family_get_type"
        c_pango_font_family_get_type :: IO GType

    instance GObject FontFamily where
        gobjectType _ = c_pango_font_family_get_type

    -- | Type class for types which can be safely cast to `FontFamily`, for instance with `toFontFamily`.
    class GObject o => IsFontFamily o
    #if MIN_VERSION_base(4,9,0)
    instance {-# OVERLAPPABLE #-} (GObject a, O.UnknownAncestorError FontFamily a) =>
        IsFontFamily a
    #endif
    instance IsFontFamily FontFamily
    instance GObject.Object.IsObject FontFamily

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

    -- | A convenience alias for `Nothing` :: `Maybe` `FontFamily`.
    noFontFamily :: Maybe FontFamily
    noFontFamily = Nothing

    #if ENABLE_OVERLOADING
    type family ResolveFontFamilyMethod (t :: Symbol) (o :: *) :: * where
        ResolveFontFamilyMethod "bindProperty" o = GObject.Object.ObjectBindPropertyMethodInfo
        ResolveFontFamilyMethod "bindPropertyFull" o = GObject.Object.ObjectBindPropertyFullMethodInfo
        ResolveFontFamilyMethod "forceFloating" o = GObject.Object.ObjectForceFloatingMethodInfo
        ResolveFontFamilyMethod "freezeNotify" o = GObject.Object.ObjectFreezeNotifyMethodInfo
        ResolveFontFamilyMethod "getv" o = GObject.Object.ObjectGetvMethodInfo
        ResolveFontFamilyMethod "isFloating" o = GObject.Object.ObjectIsFloatingMethodInfo
        ResolveFontFamilyMethod "isMonospace" o = FontFamilyIsMonospaceMethodInfo
        ResolveFontFamilyMethod "listFaces" o = FontFamilyListFacesMethodInfo
        ResolveFontFamilyMethod "notify" o = GObject.Object.ObjectNotifyMethodInfo
        ResolveFontFamilyMethod "notifyByPspec" o = GObject.Object.ObjectNotifyByPspecMethodInfo
        ResolveFontFamilyMethod "ref" o = GObject.Object.ObjectRefMethodInfo
        ResolveFontFamilyMethod "refSink" o = GObject.Object.ObjectRefSinkMethodInfo
        ResolveFontFamilyMethod "runDispose" o = GObject.Object.ObjectRunDisposeMethodInfo
        ResolveFontFamilyMethod "stealData" o = GObject.Object.ObjectStealDataMethodInfo
        ResolveFontFamilyMethod "stealQdata" o = GObject.Object.ObjectStealQdataMethodInfo
        ResolveFontFamilyMethod "thawNotify" o = GObject.Object.ObjectThawNotifyMethodInfo
        ResolveFontFamilyMethod "unref" o = GObject.Object.ObjectUnrefMethodInfo
        ResolveFontFamilyMethod "watchClosure" o = GObject.Object.ObjectWatchClosureMethodInfo
        ResolveFontFamilyMethod "getData" o = GObject.Object.ObjectGetDataMethodInfo
        ResolveFontFamilyMethod "getName" o = FontFamilyGetNameMethodInfo
        ResolveFontFamilyMethod "getProperty" o = GObject.Object.ObjectGetPropertyMethodInfo
        ResolveFontFamilyMethod "getQdata" o = GObject.Object.ObjectGetQdataMethodInfo
        ResolveFontFamilyMethod "setData" o = GObject.Object.ObjectSetDataMethodInfo
        ResolveFontFamilyMethod "setProperty" o = GObject.Object.ObjectSetPropertyMethodInfo
        ResolveFontFamilyMethod l o = O.MethodResolutionFailed l o

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

    #if MIN_VERSION_base(4,9,0)
    instance (info ~ ResolveFontFamilyMethod t FontFamily, O.MethodInfo info FontFamily p) => O.IsLabel t (FontFamily -> 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 FontFamily
    type instance O.AttributeList FontFamily = FontFamilyAttributeList
    type FontFamilyAttributeList = ('[ ] :: [(Symbol, *)])
    #endif

    #if ENABLE_OVERLOADING
    #endif

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

    #endif

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

    foreign import ccall "pango_font_family_get_name" pango_font_family_get_name ::
        Ptr FontFamily ->                       -- family : TInterface (Name {namespace = "Pango", name = "FontFamily"})
        IO CString

    {- |
    Gets the name of the family. The name is unique among all
    fonts for the font backend and can be used in a 'GI.Pango.Structs.FontDescription.FontDescription'
    to specify that a face from this family is desired.
    -}
    fontFamilyGetName ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFamily a) =>
        a
        {- ^ /@family@/: a 'GI.Pango.Objects.FontFamily.FontFamily' -}
        -> m T.Text
        {- ^ __Returns:__ the name of the family. This string is owned
      by the family object and must not be modified or freed. -}
    fontFamilyGetName family = liftIO $ do
        family' <- unsafeManagedPtrCastPtr family
        result <- pango_font_family_get_name family'
        checkUnexpectedReturnNULL "fontFamilyGetName" result
        result' <- cstringToText result
        touchManagedPtr family
        return result'

    #if ENABLE_OVERLOADING
    data FontFamilyGetNameMethodInfo
    instance (signature ~ (m T.Text), MonadIO m, IsFontFamily a) => O.MethodInfo FontFamilyGetNameMethodInfo a signature where
        overloadedMethod _ = fontFamilyGetName

    #endif

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

    foreign import ccall "pango_font_family_is_monospace" pango_font_family_is_monospace ::
        Ptr FontFamily ->                       -- family : TInterface (Name {namespace = "Pango", name = "FontFamily"})
        IO CInt

    {- |
    A monospace font is a font designed for text display where the the
    characters form a regular grid. For Western languages this would
    mean that the advance width of all characters are the same, but
    this categorization also includes Asian fonts which include
    double-width characters: characters that occupy two grid cells.
    'GI.GLib.Functions.unicharIswide' returns a result that indicates whether a
    character is typically double-width in a monospace font.

    The best way to find out the grid-cell size is to call
    'GI.Pango.Structs.FontMetrics.fontMetricsGetApproximateDigitWidth', since the results
    of 'GI.Pango.Structs.FontMetrics.fontMetricsGetApproximateCharWidth' may be affected
    by double-width characters.

    /Since: 1.4/
    -}
    fontFamilyIsMonospace ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFamily a) =>
        a
        {- ^ /@family@/: a 'GI.Pango.Objects.FontFamily.FontFamily' -}
        -> m Bool
        {- ^ __Returns:__ 'True' if the family is monospace. -}
    fontFamilyIsMonospace family = liftIO $ do
        family' <- unsafeManagedPtrCastPtr family
        result <- pango_font_family_is_monospace family'
        let result' = (/= 0) result
        touchManagedPtr family
        return result'

    #if ENABLE_OVERLOADING
    data FontFamilyIsMonospaceMethodInfo
    instance (signature ~ (m Bool), MonadIO m, IsFontFamily a) => O.MethodInfo FontFamilyIsMonospaceMethodInfo a signature where
        overloadedMethod _ = fontFamilyIsMonospace

    #endif

    -- method FontFamily::list_faces
    -- method type : OrdinaryMethod
    -- Args : [Arg {argCName = "family", argType = TInterface (Name {namespace = "Pango", name = "FontFamily"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a #PangoFontFamily", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "faces", argType = TCArray False (-1) 2 (TInterface (Name {namespace = "Pango", name = "FontFace"})), direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "\n  location to store an array of pointers to #PangoFontFace objects,\n  or %NULL. This array should be freed with g_free() when it is no\n  longer needed.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferContainer},Arg {argCName = "n_faces", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store number of elements in @faces.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
    -- Lengths : [Arg {argCName = "n_faces", argType = TBasicType TInt, direction = DirectionOut, mayBeNull = False, argDoc = Documentation {rawDocText = Just "location to store number of elements in @faces.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferEverything}]
    -- returnType : Nothing
    -- throws : False
    -- Skip return : False

    foreign import ccall "pango_font_family_list_faces" pango_font_family_list_faces ::
        Ptr FontFamily ->                       -- family : TInterface (Name {namespace = "Pango", name = "FontFamily"})
        Ptr (Ptr (Ptr Pango.FontFace.FontFace)) -> -- faces : TCArray False (-1) 2 (TInterface (Name {namespace = "Pango", name = "FontFace"}))
        Ptr Int32 ->                            -- n_faces : TBasicType TInt
        IO ()

    {- |
    Lists the different font faces that make up /@family@/. The faces
    in a family share a common design, but differ in slant, weight,
    width and other aspects.
    -}
    fontFamilyListFaces ::
        (B.CallStack.HasCallStack, MonadIO m, IsFontFamily a) =>
        a
        {- ^ /@family@/: a 'GI.Pango.Objects.FontFamily.FontFamily' -}
        -> m ([Pango.FontFace.FontFace])
    fontFamilyListFaces family = liftIO $ do
        family' <- unsafeManagedPtrCastPtr family
        faces <- allocMem :: IO (Ptr (Ptr (Ptr Pango.FontFace.FontFace)))
        nFaces <- allocMem :: IO (Ptr Int32)
        pango_font_family_list_faces family' faces nFaces
        nFaces' <- peek nFaces
        faces' <- peek faces
        faces'' <- (unpackPtrArrayWithLength nFaces') faces'
        faces''' <- mapM (newObject Pango.FontFace.FontFace) faces''
        freeMem faces'
        touchManagedPtr family
        freeMem faces
        freeMem nFaces
        return faces'''

    #if ENABLE_OVERLOADING
    data FontFamilyListFacesMethodInfo
    instance (signature ~ (m ([Pango.FontFace.FontFace])), MonadIO m, IsFontFamily a) => O.MethodInfo FontFamilyListFacesMethodInfo a signature where
        overloadedMethod _ = fontFamilyListFaces

    #endif