    {-# LANGUAGE CPP #-}
    {- |
       Module      :  Graphics.Win32.Window.ForegroundWindow
       Copyright   :  2012 shelarcy
       License     :  BSD-style

       Maintainer  :  shelarcy@gmail.com
       Stability   :  Provisional
       Portability :  Non-portable (Win32 API)

       Get/Set Foreground Window.
    -}

    module Graphics.Win32.Window.ForegroundWindow
      ( getForegroundWindow
      , setForegroundWindow
      , c_SetForegroundWindow
      , allowSetForegroundWindow
      , c_AllowSetForegroundWindow
      ) where

    import Control.Monad            ( void )
    import Graphics.Win32.GDI.Types ( HWND )
    import Graphics.Win32.Window    ( getForegroundWindow )
    import System.Win32.Process     ( ProcessId )

    #include "windows_cconv.h"

    ----------------------------------------------------------------
    -- | Setting Window to Foreground.
    -- See: <https://github.com/haskell/win32/pull/9>,
    -- <http://stackoverflow.com/questions/14297146/win32-setforegroundwindow-in-haskell>.
    ----------------------------------------------------------------
    setForegroundWindow :: HWND -> IO Bool
    setForegroundWindow = c_SetForegroundWindow

    foreign import WINDOWS_CCONV safe "windows.h SetForegroundWindow"
        c_SetForegroundWindow :: HWND -> IO Bool

    ----------------------------------------------------------------
    -- | Allow other process to set Window to Foreground
    -- by using 'setForegroundWindow' function.
    allowSetForegroundWindow :: ProcessId -> IO ()
    allowSetForegroundWindow = void . c_AllowSetForegroundWindow

    foreign import WINDOWS_CCONV safe "windows.h AllowSetForegroundWindow"
        c_AllowSetForegroundWindow :: ProcessId -> IO Bool