{-# 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
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