{-# LANGUAGE CPP, NoImplicitPrelude #-}

#if MIN_VERSION_base(4,4,0)
module SystemEventManager ( getSystemEventManager ) where
import GHC.Event          ( getSystemEventManager )
#else

{-# LANGUAGE UnicodeSyntax, ForeignFunctionInterface #-}

module SystemEventManager ( getSystemEventManager ) where

-- from base:
import Data.Function    ( ($) )
import Data.IORef       ( IORef, newIORef, readIORef )
import Data.Maybe       ( Maybe(Nothing) )
import Foreign.Ptr      ( Ptr )
import GHC.Conc.Sync    ( sharedCAF )
import System.Event     ( EventManager )
import System.IO        ( IO )
import System.IO.Unsafe ( unsafePerformIO )

getSystemEventManager  IO (Maybe EventManager)
getSystemEventManager = readIORef eventManager

eventManager  IORef (Maybe EventManager)
eventManager = unsafePerformIO $ do
    em  newIORef Nothing
    sharedCAF em getOrSetSystemEventThreadEventManagerStore
{-# NOINLINE eventManager #-}

foreign import ccall unsafe "getOrSetSystemEventThreadEventManagerStore"
    getOrSetSystemEventThreadEventManagerStore  Ptr α  IO (Ptr α)
#endif