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

module GI.Atk.Interfaces.Window
    ( 

-- * Exported types
    Window(..)                              ,
    noWindow                                ,
    WindowK                                 ,
    toWindow                                ,


 -- * Signals
-- ** Activate
    WindowActivateCallback                  ,
    WindowActivateCallbackC                 ,
    WindowActivateSignalInfo                ,
    afterWindowActivate                     ,
    mkWindowActivateCallback                ,
    noWindowActivateCallback                ,
    onWindowActivate                        ,
    windowActivateCallbackWrapper           ,
    windowActivateClosure                   ,


-- ** Create
    WindowCreateCallback                    ,
    WindowCreateCallbackC                   ,
    WindowCreateSignalInfo                  ,
    afterWindowCreate                       ,
    mkWindowCreateCallback                  ,
    noWindowCreateCallback                  ,
    onWindowCreate                          ,
    windowCreateCallbackWrapper             ,
    windowCreateClosure                     ,


-- ** Deactivate
    WindowDeactivateCallback                ,
    WindowDeactivateCallbackC               ,
    WindowDeactivateSignalInfo              ,
    afterWindowDeactivate                   ,
    mkWindowDeactivateCallback              ,
    noWindowDeactivateCallback              ,
    onWindowDeactivate                      ,
    windowDeactivateCallbackWrapper         ,
    windowDeactivateClosure                 ,


-- ** Destroy
    WindowDestroyCallback                   ,
    WindowDestroyCallbackC                  ,
    WindowDestroySignalInfo                 ,
    afterWindowDestroy                      ,
    mkWindowDestroyCallback                 ,
    noWindowDestroyCallback                 ,
    onWindowDestroy                         ,
    windowDestroyCallbackWrapper            ,
    windowDestroyClosure                    ,


-- ** Maximize
    WindowMaximizeCallback                  ,
    WindowMaximizeCallbackC                 ,
    WindowMaximizeSignalInfo                ,
    afterWindowMaximize                     ,
    mkWindowMaximizeCallback                ,
    noWindowMaximizeCallback                ,
    onWindowMaximize                        ,
    windowMaximizeCallbackWrapper           ,
    windowMaximizeClosure                   ,


-- ** Minimize
    WindowMinimizeCallback                  ,
    WindowMinimizeCallbackC                 ,
    WindowMinimizeSignalInfo                ,
    afterWindowMinimize                     ,
    mkWindowMinimizeCallback                ,
    noWindowMinimizeCallback                ,
    onWindowMinimize                        ,
    windowMinimizeCallbackWrapper           ,
    windowMinimizeClosure                   ,


-- ** Move
    WindowMoveCallback                      ,
    WindowMoveCallbackC                     ,
    WindowMoveSignalInfo                    ,
    afterWindowMove                         ,
    mkWindowMoveCallback                    ,
    noWindowMoveCallback                    ,
    onWindowMove                            ,
    windowMoveCallbackWrapper               ,
    windowMoveClosure                       ,


-- ** Resize
    WindowResizeCallback                    ,
    WindowResizeCallbackC                   ,
    WindowResizeSignalInfo                  ,
    afterWindowResize                       ,
    mkWindowResizeCallback                  ,
    noWindowResizeCallback                  ,
    onWindowResize                          ,
    windowResizeCallbackWrapper             ,
    windowResizeClosure                     ,


-- ** Restore
    WindowRestoreCallback                   ,
    WindowRestoreCallbackC                  ,
    WindowRestoreSignalInfo                 ,
    afterWindowRestore                      ,
    mkWindowRestoreCallback                 ,
    noWindowRestoreCallback                 ,
    onWindowRestore                         ,
    windowRestoreCallbackWrapper            ,
    windowRestoreClosure                    ,




    ) where

import Prelude ()
import Data.GI.Base.ShortPrelude

import qualified Data.Text as T
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as Map

import GI.Atk.Types
import GI.Atk.Callbacks
import qualified GI.GObject as GObject

-- interface Window 

newtype Window = Window (ForeignPtr Window)
noWindow :: Maybe Window
noWindow = Nothing

-- signal Window::activate
type WindowActivateCallback =
    IO ()

noWindowActivateCallback :: Maybe WindowActivateCallback
noWindowActivateCallback = Nothing

type WindowActivateCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowActivateCallback :: WindowActivateCallbackC -> IO (FunPtr WindowActivateCallbackC)

windowActivateClosure :: WindowActivateCallback -> IO Closure
windowActivateClosure cb = newCClosure =<< mkWindowActivateCallback wrapped
    where wrapped = windowActivateCallbackWrapper cb

windowActivateCallbackWrapper ::
    WindowActivateCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowActivateCallbackWrapper _cb _ _ = do
    _cb 

onWindowActivate :: (GObject a, MonadIO m) => a -> WindowActivateCallback -> m SignalHandlerId
onWindowActivate obj cb = liftIO $ connectWindowActivate obj cb SignalConnectBefore
afterWindowActivate :: (GObject a, MonadIO m) => a -> WindowActivateCallback -> m SignalHandlerId
afterWindowActivate obj cb = connectWindowActivate obj cb SignalConnectAfter

connectWindowActivate :: (GObject a, MonadIO m) =>
                         a -> WindowActivateCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowActivate obj cb after = liftIO $ do
    cb' <- mkWindowActivateCallback (windowActivateCallbackWrapper cb)
    connectSignalFunPtr obj "activate" cb' after

-- signal Window::create
type WindowCreateCallback =
    IO ()

noWindowCreateCallback :: Maybe WindowCreateCallback
noWindowCreateCallback = Nothing

type WindowCreateCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowCreateCallback :: WindowCreateCallbackC -> IO (FunPtr WindowCreateCallbackC)

windowCreateClosure :: WindowCreateCallback -> IO Closure
windowCreateClosure cb = newCClosure =<< mkWindowCreateCallback wrapped
    where wrapped = windowCreateCallbackWrapper cb

windowCreateCallbackWrapper ::
    WindowCreateCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowCreateCallbackWrapper _cb _ _ = do
    _cb 

onWindowCreate :: (GObject a, MonadIO m) => a -> WindowCreateCallback -> m SignalHandlerId
onWindowCreate obj cb = liftIO $ connectWindowCreate obj cb SignalConnectBefore
afterWindowCreate :: (GObject a, MonadIO m) => a -> WindowCreateCallback -> m SignalHandlerId
afterWindowCreate obj cb = connectWindowCreate obj cb SignalConnectAfter

connectWindowCreate :: (GObject a, MonadIO m) =>
                       a -> WindowCreateCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowCreate obj cb after = liftIO $ do
    cb' <- mkWindowCreateCallback (windowCreateCallbackWrapper cb)
    connectSignalFunPtr obj "create" cb' after

-- signal Window::deactivate
type WindowDeactivateCallback =
    IO ()

noWindowDeactivateCallback :: Maybe WindowDeactivateCallback
noWindowDeactivateCallback = Nothing

type WindowDeactivateCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowDeactivateCallback :: WindowDeactivateCallbackC -> IO (FunPtr WindowDeactivateCallbackC)

windowDeactivateClosure :: WindowDeactivateCallback -> IO Closure
windowDeactivateClosure cb = newCClosure =<< mkWindowDeactivateCallback wrapped
    where wrapped = windowDeactivateCallbackWrapper cb

windowDeactivateCallbackWrapper ::
    WindowDeactivateCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowDeactivateCallbackWrapper _cb _ _ = do
    _cb 

onWindowDeactivate :: (GObject a, MonadIO m) => a -> WindowDeactivateCallback -> m SignalHandlerId
onWindowDeactivate obj cb = liftIO $ connectWindowDeactivate obj cb SignalConnectBefore
afterWindowDeactivate :: (GObject a, MonadIO m) => a -> WindowDeactivateCallback -> m SignalHandlerId
afterWindowDeactivate obj cb = connectWindowDeactivate obj cb SignalConnectAfter

connectWindowDeactivate :: (GObject a, MonadIO m) =>
                           a -> WindowDeactivateCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowDeactivate obj cb after = liftIO $ do
    cb' <- mkWindowDeactivateCallback (windowDeactivateCallbackWrapper cb)
    connectSignalFunPtr obj "deactivate" cb' after

-- signal Window::destroy
type WindowDestroyCallback =
    IO ()

noWindowDestroyCallback :: Maybe WindowDestroyCallback
noWindowDestroyCallback = Nothing

type WindowDestroyCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowDestroyCallback :: WindowDestroyCallbackC -> IO (FunPtr WindowDestroyCallbackC)

windowDestroyClosure :: WindowDestroyCallback -> IO Closure
windowDestroyClosure cb = newCClosure =<< mkWindowDestroyCallback wrapped
    where wrapped = windowDestroyCallbackWrapper cb

windowDestroyCallbackWrapper ::
    WindowDestroyCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowDestroyCallbackWrapper _cb _ _ = do
    _cb 

onWindowDestroy :: (GObject a, MonadIO m) => a -> WindowDestroyCallback -> m SignalHandlerId
onWindowDestroy obj cb = liftIO $ connectWindowDestroy obj cb SignalConnectBefore
afterWindowDestroy :: (GObject a, MonadIO m) => a -> WindowDestroyCallback -> m SignalHandlerId
afterWindowDestroy obj cb = connectWindowDestroy obj cb SignalConnectAfter

connectWindowDestroy :: (GObject a, MonadIO m) =>
                        a -> WindowDestroyCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowDestroy obj cb after = liftIO $ do
    cb' <- mkWindowDestroyCallback (windowDestroyCallbackWrapper cb)
    connectSignalFunPtr obj "destroy" cb' after

-- signal Window::maximize
type WindowMaximizeCallback =
    IO ()

noWindowMaximizeCallback :: Maybe WindowMaximizeCallback
noWindowMaximizeCallback = Nothing

type WindowMaximizeCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowMaximizeCallback :: WindowMaximizeCallbackC -> IO (FunPtr WindowMaximizeCallbackC)

windowMaximizeClosure :: WindowMaximizeCallback -> IO Closure
windowMaximizeClosure cb = newCClosure =<< mkWindowMaximizeCallback wrapped
    where wrapped = windowMaximizeCallbackWrapper cb

windowMaximizeCallbackWrapper ::
    WindowMaximizeCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowMaximizeCallbackWrapper _cb _ _ = do
    _cb 

onWindowMaximize :: (GObject a, MonadIO m) => a -> WindowMaximizeCallback -> m SignalHandlerId
onWindowMaximize obj cb = liftIO $ connectWindowMaximize obj cb SignalConnectBefore
afterWindowMaximize :: (GObject a, MonadIO m) => a -> WindowMaximizeCallback -> m SignalHandlerId
afterWindowMaximize obj cb = connectWindowMaximize obj cb SignalConnectAfter

connectWindowMaximize :: (GObject a, MonadIO m) =>
                         a -> WindowMaximizeCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowMaximize obj cb after = liftIO $ do
    cb' <- mkWindowMaximizeCallback (windowMaximizeCallbackWrapper cb)
    connectSignalFunPtr obj "maximize" cb' after

-- signal Window::minimize
type WindowMinimizeCallback =
    IO ()

noWindowMinimizeCallback :: Maybe WindowMinimizeCallback
noWindowMinimizeCallback = Nothing

type WindowMinimizeCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowMinimizeCallback :: WindowMinimizeCallbackC -> IO (FunPtr WindowMinimizeCallbackC)

windowMinimizeClosure :: WindowMinimizeCallback -> IO Closure
windowMinimizeClosure cb = newCClosure =<< mkWindowMinimizeCallback wrapped
    where wrapped = windowMinimizeCallbackWrapper cb

windowMinimizeCallbackWrapper ::
    WindowMinimizeCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowMinimizeCallbackWrapper _cb _ _ = do
    _cb 

onWindowMinimize :: (GObject a, MonadIO m) => a -> WindowMinimizeCallback -> m SignalHandlerId
onWindowMinimize obj cb = liftIO $ connectWindowMinimize obj cb SignalConnectBefore
afterWindowMinimize :: (GObject a, MonadIO m) => a -> WindowMinimizeCallback -> m SignalHandlerId
afterWindowMinimize obj cb = connectWindowMinimize obj cb SignalConnectAfter

connectWindowMinimize :: (GObject a, MonadIO m) =>
                         a -> WindowMinimizeCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowMinimize obj cb after = liftIO $ do
    cb' <- mkWindowMinimizeCallback (windowMinimizeCallbackWrapper cb)
    connectSignalFunPtr obj "minimize" cb' after

-- signal Window::move
type WindowMoveCallback =
    IO ()

noWindowMoveCallback :: Maybe WindowMoveCallback
noWindowMoveCallback = Nothing

type WindowMoveCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowMoveCallback :: WindowMoveCallbackC -> IO (FunPtr WindowMoveCallbackC)

windowMoveClosure :: WindowMoveCallback -> IO Closure
windowMoveClosure cb = newCClosure =<< mkWindowMoveCallback wrapped
    where wrapped = windowMoveCallbackWrapper cb

windowMoveCallbackWrapper ::
    WindowMoveCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowMoveCallbackWrapper _cb _ _ = do
    _cb 

onWindowMove :: (GObject a, MonadIO m) => a -> WindowMoveCallback -> m SignalHandlerId
onWindowMove obj cb = liftIO $ connectWindowMove obj cb SignalConnectBefore
afterWindowMove :: (GObject a, MonadIO m) => a -> WindowMoveCallback -> m SignalHandlerId
afterWindowMove obj cb = connectWindowMove obj cb SignalConnectAfter

connectWindowMove :: (GObject a, MonadIO m) =>
                     a -> WindowMoveCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowMove obj cb after = liftIO $ do
    cb' <- mkWindowMoveCallback (windowMoveCallbackWrapper cb)
    connectSignalFunPtr obj "move" cb' after

-- signal Window::resize
type WindowResizeCallback =
    IO ()

noWindowResizeCallback :: Maybe WindowResizeCallback
noWindowResizeCallback = Nothing

type WindowResizeCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowResizeCallback :: WindowResizeCallbackC -> IO (FunPtr WindowResizeCallbackC)

windowResizeClosure :: WindowResizeCallback -> IO Closure
windowResizeClosure cb = newCClosure =<< mkWindowResizeCallback wrapped
    where wrapped = windowResizeCallbackWrapper cb

windowResizeCallbackWrapper ::
    WindowResizeCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowResizeCallbackWrapper _cb _ _ = do
    _cb 

onWindowResize :: (GObject a, MonadIO m) => a -> WindowResizeCallback -> m SignalHandlerId
onWindowResize obj cb = liftIO $ connectWindowResize obj cb SignalConnectBefore
afterWindowResize :: (GObject a, MonadIO m) => a -> WindowResizeCallback -> m SignalHandlerId
afterWindowResize obj cb = connectWindowResize obj cb SignalConnectAfter

connectWindowResize :: (GObject a, MonadIO m) =>
                       a -> WindowResizeCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowResize obj cb after = liftIO $ do
    cb' <- mkWindowResizeCallback (windowResizeCallbackWrapper cb)
    connectSignalFunPtr obj "resize" cb' after

-- signal Window::restore
type WindowRestoreCallback =
    IO ()

noWindowRestoreCallback :: Maybe WindowRestoreCallback
noWindowRestoreCallback = Nothing

type WindowRestoreCallbackC =
    Ptr () ->                               -- object
    Ptr () ->                               -- user_data
    IO ()

foreign import ccall "wrapper"
    mkWindowRestoreCallback :: WindowRestoreCallbackC -> IO (FunPtr WindowRestoreCallbackC)

windowRestoreClosure :: WindowRestoreCallback -> IO Closure
windowRestoreClosure cb = newCClosure =<< mkWindowRestoreCallback wrapped
    where wrapped = windowRestoreCallbackWrapper cb

windowRestoreCallbackWrapper ::
    WindowRestoreCallback ->
    Ptr () ->
    Ptr () ->
    IO ()
windowRestoreCallbackWrapper _cb _ _ = do
    _cb 

onWindowRestore :: (GObject a, MonadIO m) => a -> WindowRestoreCallback -> m SignalHandlerId
onWindowRestore obj cb = liftIO $ connectWindowRestore obj cb SignalConnectBefore
afterWindowRestore :: (GObject a, MonadIO m) => a -> WindowRestoreCallback -> m SignalHandlerId
afterWindowRestore obj cb = connectWindowRestore obj cb SignalConnectAfter

connectWindowRestore :: (GObject a, MonadIO m) =>
                        a -> WindowRestoreCallback -> SignalConnectMode -> m SignalHandlerId
connectWindowRestore obj cb after = liftIO $ do
    cb' <- mkWindowRestoreCallback (windowRestoreCallbackWrapper cb)
    connectSignalFunPtr obj "restore" cb' after

type instance AttributeList Window = WindowAttributeList
type WindowAttributeList = ('[ '("accessible-component-layer", ObjectAccessibleComponentLayerPropertyInfo), '("accessible-component-mdi-zorder", ObjectAccessibleComponentMdiZorderPropertyInfo), '("accessible-description", ObjectAccessibleDescriptionPropertyInfo), '("accessible-hypertext-nlinks", ObjectAccessibleHypertextNlinksPropertyInfo), '("accessible-name", ObjectAccessibleNamePropertyInfo), '("accessible-parent", ObjectAccessibleParentPropertyInfo), '("accessible-role", ObjectAccessibleRolePropertyInfo), '("accessible-table-caption", ObjectAccessibleTableCaptionPropertyInfo), '("accessible-table-caption-object", ObjectAccessibleTableCaptionObjectPropertyInfo), '("accessible-table-column-description", ObjectAccessibleTableColumnDescriptionPropertyInfo), '("accessible-table-column-header", ObjectAccessibleTableColumnHeaderPropertyInfo), '("accessible-table-row-description", ObjectAccessibleTableRowDescriptionPropertyInfo), '("accessible-table-row-header", ObjectAccessibleTableRowHeaderPropertyInfo), '("accessible-table-summary", ObjectAccessibleTableSummaryPropertyInfo), '("accessible-value", ObjectAccessibleValuePropertyInfo)] :: [(Symbol, *)])

data WindowActivateSignalInfo
instance SignalInfo WindowActivateSignalInfo where
    type HaskellCallbackType WindowActivateSignalInfo = WindowActivateCallback
    connectSignal _ = connectWindowActivate

data WindowCreateSignalInfo
instance SignalInfo WindowCreateSignalInfo where
    type HaskellCallbackType WindowCreateSignalInfo = WindowCreateCallback
    connectSignal _ = connectWindowCreate

data WindowDeactivateSignalInfo
instance SignalInfo WindowDeactivateSignalInfo where
    type HaskellCallbackType WindowDeactivateSignalInfo = WindowDeactivateCallback
    connectSignal _ = connectWindowDeactivate

data WindowDestroySignalInfo
instance SignalInfo WindowDestroySignalInfo where
    type HaskellCallbackType WindowDestroySignalInfo = WindowDestroyCallback
    connectSignal _ = connectWindowDestroy

data WindowMaximizeSignalInfo
instance SignalInfo WindowMaximizeSignalInfo where
    type HaskellCallbackType WindowMaximizeSignalInfo = WindowMaximizeCallback
    connectSignal _ = connectWindowMaximize

data WindowMinimizeSignalInfo
instance SignalInfo WindowMinimizeSignalInfo where
    type HaskellCallbackType WindowMinimizeSignalInfo = WindowMinimizeCallback
    connectSignal _ = connectWindowMinimize

data WindowMoveSignalInfo
instance SignalInfo WindowMoveSignalInfo where
    type HaskellCallbackType WindowMoveSignalInfo = WindowMoveCallback
    connectSignal _ = connectWindowMove

data WindowResizeSignalInfo
instance SignalInfo WindowResizeSignalInfo where
    type HaskellCallbackType WindowResizeSignalInfo = WindowResizeCallback
    connectSignal _ = connectWindowResize

data WindowRestoreSignalInfo
instance SignalInfo WindowRestoreSignalInfo where
    type HaskellCallbackType WindowRestoreSignalInfo = WindowRestoreCallback
    connectSignal _ = connectWindowRestore

type instance SignalList Window = WindowSignalList
type WindowSignalList = ('[ '("activate", WindowActivateSignalInfo), '("active-descendant-changed", ObjectActiveDescendantChangedSignalInfo), '("children-changed", ObjectChildrenChangedSignalInfo), '("create", WindowCreateSignalInfo), '("deactivate", WindowDeactivateSignalInfo), '("destroy", WindowDestroySignalInfo), '("focus-event", ObjectFocusEventSignalInfo), '("maximize", WindowMaximizeSignalInfo), '("minimize", WindowMinimizeSignalInfo), '("move", WindowMoveSignalInfo), '("notify", GObject.ObjectNotifySignalInfo), '("property-change", ObjectPropertyChangeSignalInfo), '("resize", WindowResizeSignalInfo), '("restore", WindowRestoreSignalInfo), '("state-change", ObjectStateChangeSignalInfo), '("visible-data-changed", ObjectVisibleDataChangedSignalInfo), '("notify::[property]", GObjectNotifySignalInfo)] :: [(Symbol, *)])

foreign import ccall "atk_window_get_type"
    c_atk_window_get_type :: IO GType

type instance ParentTypes Window = WindowParentTypes
type WindowParentTypes = '[Object, GObject.Object]

instance GObject Window where
    gobjectIsInitiallyUnowned _ = False
    gobjectType _ = c_atk_window_get_type
    

class GObject o => WindowK o
instance (GObject o, IsDescendantOf Window o) => WindowK o

toWindow :: WindowK o => o -> IO Window
toWindow = unsafeCastTo Window