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

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

module GI.Wnck.Functions
    (

 -- * Methods
-- ** pidReadResourceUsage #method:pidReadResourceUsage#

    pidReadResourceUsage                    ,


-- ** setClientType #method:setClientType#

    setClientType                           ,


-- ** setDefaultIconSize #method:setDefaultIconSize#

    setDefaultIconSize                      ,


-- ** setDefaultMiniIconSize #method:setDefaultMiniIconSize#

    setDefaultMiniIconSize                  ,


-- ** shutdown #method:shutdown#

    shutdown                                ,


-- ** xidReadResourceUsage #method:xidReadResourceUsage#

    xidReadResourceUsage                    ,




    ) 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.Gdk.Objects.Display as Gdk.Display
import {-# SOURCE #-} qualified GI.Wnck.Enums as Wnck.Enums
import {-# SOURCE #-} qualified GI.Wnck.Structs.ResourceUsage as Wnck.ResourceUsage

-- function wnck_xid_read_resource_usage
-- Args : [Arg {argCName = "gdk_display", argType = TInterface (Name {namespace = "Gdk", name = "Display"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a <classname>GdkDisplay</classname>.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "xid", argType = TBasicType TULong, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "an X window ID.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "usage", argType = TInterface (Name {namespace = "Wnck", name = "ResourceUsage"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "return location for the X resource usage of the application owning\nthe X window ID @xid.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "wnck_xid_read_resource_usage" wnck_xid_read_resource_usage ::
    Ptr Gdk.Display.Display ->              -- gdk_display : TInterface (Name {namespace = "Gdk", name = "Display"})
    CULong ->                               -- xid : TBasicType TULong
    Ptr Wnck.ResourceUsage.ResourceUsage -> -- usage : TInterface (Name {namespace = "Wnck", name = "ResourceUsage"})
    IO ()

{- |
Looks for the X resource usage of the application owning the X window ID
/@xid@/ on display /@gdisplay@/. If no resource usage can be found, then all
fields of /@usage@/ are set to 0.

To properly work, this function requires the XRes extension on the X server.

/Since: 2.6/
-}
xidReadResourceUsage ::
    (B.CallStack.HasCallStack, MonadIO m, Gdk.Display.IsDisplay a) =>
    a
    {- ^ /@gdkDisplay@/: a \<classname>GdkDisplay\<\/classname>. -}
    -> CULong
    {- ^ /@xid@/: an X window ID. -}
    -> Wnck.ResourceUsage.ResourceUsage
    {- ^ /@usage@/: return location for the X resource usage of the application owning
the X window ID /@xid@/. -}
    -> m ()
xidReadResourceUsage gdkDisplay xid usage = liftIO $ do
    gdkDisplay' <- unsafeManagedPtrCastPtr gdkDisplay
    usage' <- unsafeManagedPtrGetPtr usage
    wnck_xid_read_resource_usage gdkDisplay' xid usage'
    touchManagedPtr gdkDisplay
    touchManagedPtr usage
    return ()


-- function wnck_shutdown
-- Args : []
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "wnck_shutdown" wnck_shutdown ::
    IO ()

{- |
Makes libwnck stop listening to events and tear down all resources from
libwnck. This should be done if you are not going to need the state change
notifications for an extended period of time, to avoid wakeups with every
key and focus event.

After this, all pointers to Wnck object you might still hold are invalid.

Due to the fact that \<link
linkend=\"getting-started.pitfalls.memory-management\">Wnck objects are all
owned by libwnck\<\/link>, users of this API through introspection should be
extremely careful: they must explicitly clear variables referencing objects
before this call. Failure to do so might result in crashes.

/Since: 3.4/
-}
shutdown ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    m ()
shutdown  = liftIO $ do
    wnck_shutdown
    return ()


-- function wnck_set_default_mini_icon_size
-- Args : [Arg {argCName = "size", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the default size for windows and application mini icons.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "wnck_set_default_mini_icon_size" wnck_set_default_mini_icon_size ::
    Word64 ->                               -- size : TBasicType TUInt64
    IO ()

{- |
The default main icon size is 'GI.Wnck.Constants.DEFAULT_MINI_ICON_SIZE'. This function
allows to change this value.

/Since: 2.4.6/
-}
setDefaultMiniIconSize ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Word64
    {- ^ /@size@/: the default size for windows and application mini icons. -}
    -> m ()
setDefaultMiniIconSize size = liftIO $ do
    wnck_set_default_mini_icon_size size
    return ()


-- function wnck_set_default_icon_size
-- Args : [Arg {argCName = "size", argType = TBasicType TUInt64, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "the default size for windows and application standard icons.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "wnck_set_default_icon_size" wnck_set_default_icon_size ::
    Word64 ->                               -- size : TBasicType TUInt64
    IO ()

{- |
The default main icon size is 'GI.Wnck.Constants.DEFAULT_ICON_SIZE'. This function allows
to change this value.

/Since: 2.4.6/
-}
setDefaultIconSize ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Word64
    {- ^ /@size@/: the default size for windows and application standard icons. -}
    -> m ()
setDefaultIconSize size = liftIO $ do
    wnck_set_default_icon_size size
    return ()


-- function wnck_set_client_type
-- Args : [Arg {argCName = "ewmh_sourceindication_client_type", argType = TInterface (Name {namespace = "Wnck", name = "ClientType"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a role for the client.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "wnck_set_client_type" wnck_set_client_type ::
    CUInt ->                                -- ewmh_sourceindication_client_type : TInterface (Name {namespace = "Wnck", name = "ClientType"})
    IO ()

{- |
Sets the role of the libwnck user.

The default role is 'GI.Wnck.Enums.ClientTypeApplication'. Therefore, for
applications providing some window management features, like pagers or
tasklists, it is important to set the role to 'GI.Wnck.Enums.ClientTypePager' for
libwnck to properly work.

This function should only be called once per program. Additional calls
with the same client type will be silently ignored. An attempt to change
the client type to a differnet value after it has already been set will
be ignored and a critical warning will be logged.

/Since: 2.14/
-}
setClientType ::
    (B.CallStack.HasCallStack, MonadIO m) =>
    Wnck.Enums.ClientType
    {- ^ /@ewmhSourceindicationClientType@/: a role for the client. -}
    -> m ()
setClientType ewmhSourceindicationClientType = liftIO $ do
    let ewmhSourceindicationClientType' = (fromIntegral . fromEnum) ewmhSourceindicationClientType
    wnck_set_client_type ewmhSourceindicationClientType'
    return ()


-- function wnck_pid_read_resource_usage
-- Args : [Arg {argCName = "gdk_display", argType = TInterface (Name {namespace = "Gdk", name = "Display"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a <classname>GdkDisplay</classname>.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "pid", argType = TBasicType TULong, direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "a process ID.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing},Arg {argCName = "usage", argType = TInterface (Name {namespace = "Wnck", name = "ResourceUsage"}), direction = DirectionIn, mayBeNull = False, argDoc = Documentation {rawDocText = Just "return location for the X resource usage of the application with\nprocess ID @pid.", sinceVersion = Nothing}, argScope = ScopeTypeInvalid, argClosure = -1, argDestroy = -1, argCallerAllocates = False, transfer = TransferNothing}]
-- Lengths : []
-- returnType : Nothing
-- throws : False
-- Skip return : False

foreign import ccall "wnck_pid_read_resource_usage" wnck_pid_read_resource_usage ::
    Ptr Gdk.Display.Display ->              -- gdk_display : TInterface (Name {namespace = "Gdk", name = "Display"})
    CULong ->                               -- pid : TBasicType TULong
    Ptr Wnck.ResourceUsage.ResourceUsage -> -- usage : TInterface (Name {namespace = "Wnck", name = "ResourceUsage"})
    IO ()

{- |
Looks for the X resource usage of the application with process ID /@pid@/ on
display /@gdisplay@/. If no resource usage can be found, then all fields of
/@usage@/ are set to 0.

In order to find the resource usage of an application that does not have an
X window visible to libwnck (panel applets do not have any toplevel windows,
for example), 'GI.Wnck.Functions.pidReadResourceUsage' walks through the whole tree of
X windows. Since this walk is expensive in CPU, a cache is created. This
cache is updated in the background. This means there is a non-null
probability that no resource usage will be found for an application, even if
it is an X client. If this happens, calling 'GI.Wnck.Functions.pidReadResourceUsage'
again after a few seconds should work.

To properly work, this function requires the XRes extension on the X server.

/Since: 2.6/
-}
pidReadResourceUsage ::
    (B.CallStack.HasCallStack, MonadIO m, Gdk.Display.IsDisplay a) =>
    a
    {- ^ /@gdkDisplay@/: a \<classname>GdkDisplay\<\/classname>. -}
    -> CULong
    {- ^ /@pid@/: a process ID. -}
    -> Wnck.ResourceUsage.ResourceUsage
    {- ^ /@usage@/: return location for the X resource usage of the application with
process ID /@pid@/. -}
    -> m ()
pidReadResourceUsage gdkDisplay pid usage = liftIO $ do
    gdkDisplay' <- unsafeManagedPtrCastPtr gdkDisplay
    usage' <- unsafeManagedPtrGetPtr usage
    wnck_pid_read_resource_usage gdkDisplay' pid usage'
    touchManagedPtr gdkDisplay
    touchManagedPtr usage
    return ()