{-# LINE 1 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
{-# LANGUAGE Trustworthy #-}
{-# LANGUAGE CPP, NoImplicitPrelude, MagicHash, UnboxedTuples #-}
module GHC.Internal.Event.Windows.ConsoleEvent (
ConsoleEvent (..),
start_console_handler,
toWin32ConsoleEvent,
win32ConsoleHandler
) where
import GHC.Internal.Base
import GHC.Internal.Conc.Sync
import GHC.Internal.Enum (Enum)
import GHC.Internal.IO (unsafePerformIO)
import GHC.Internal.MVar
import GHC.Internal.Num (Num(..))
import GHC.Internal.Read (Read)
import GHC.Internal.Word (Word32)
import GHC.Internal.Show (Show)
data ConsoleEvent
= ControlC
| Break
| Close
| Logoff
| Shutdown
deriving ( ConsoleEvent -> ConsoleEvent -> Bool
(ConsoleEvent -> ConsoleEvent -> Bool)
-> (ConsoleEvent -> ConsoleEvent -> Bool) -> Eq ConsoleEvent
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: ConsoleEvent -> ConsoleEvent -> Bool
== :: ConsoleEvent -> ConsoleEvent -> Bool
$c/= :: ConsoleEvent -> ConsoleEvent -> Bool
/= :: ConsoleEvent -> ConsoleEvent -> Bool
Eq
, Eq ConsoleEvent
Eq ConsoleEvent =>
(ConsoleEvent -> ConsoleEvent -> Ordering)
-> (ConsoleEvent -> ConsoleEvent -> Bool)
-> (ConsoleEvent -> ConsoleEvent -> Bool)
-> (ConsoleEvent -> ConsoleEvent -> Bool)
-> (ConsoleEvent -> ConsoleEvent -> Bool)
-> (ConsoleEvent -> ConsoleEvent -> ConsoleEvent)
-> (ConsoleEvent -> ConsoleEvent -> ConsoleEvent)
-> Ord ConsoleEvent
ConsoleEvent -> ConsoleEvent -> Bool
ConsoleEvent -> ConsoleEvent -> Ordering
ConsoleEvent -> ConsoleEvent -> ConsoleEvent
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: ConsoleEvent -> ConsoleEvent -> Ordering
compare :: ConsoleEvent -> ConsoleEvent -> Ordering
$c< :: ConsoleEvent -> ConsoleEvent -> Bool
< :: ConsoleEvent -> ConsoleEvent -> Bool
$c<= :: ConsoleEvent -> ConsoleEvent -> Bool
<= :: ConsoleEvent -> ConsoleEvent -> Bool
$c> :: ConsoleEvent -> ConsoleEvent -> Bool
> :: ConsoleEvent -> ConsoleEvent -> Bool
$c>= :: ConsoleEvent -> ConsoleEvent -> Bool
>= :: ConsoleEvent -> ConsoleEvent -> Bool
$cmax :: ConsoleEvent -> ConsoleEvent -> ConsoleEvent
max :: ConsoleEvent -> ConsoleEvent -> ConsoleEvent
$cmin :: ConsoleEvent -> ConsoleEvent -> ConsoleEvent
min :: ConsoleEvent -> ConsoleEvent -> ConsoleEvent
Ord
, Int -> ConsoleEvent
ConsoleEvent -> Int
ConsoleEvent -> [ConsoleEvent]
ConsoleEvent -> ConsoleEvent
ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
ConsoleEvent -> ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
(ConsoleEvent -> ConsoleEvent)
-> (ConsoleEvent -> ConsoleEvent)
-> (Int -> ConsoleEvent)
-> (ConsoleEvent -> Int)
-> (ConsoleEvent -> [ConsoleEvent])
-> (ConsoleEvent -> ConsoleEvent -> [ConsoleEvent])
-> (ConsoleEvent -> ConsoleEvent -> [ConsoleEvent])
-> (ConsoleEvent -> ConsoleEvent -> ConsoleEvent -> [ConsoleEvent])
-> Enum ConsoleEvent
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: ConsoleEvent -> ConsoleEvent
succ :: ConsoleEvent -> ConsoleEvent
$cpred :: ConsoleEvent -> ConsoleEvent
pred :: ConsoleEvent -> ConsoleEvent
$ctoEnum :: Int -> ConsoleEvent
toEnum :: Int -> ConsoleEvent
$cfromEnum :: ConsoleEvent -> Int
fromEnum :: ConsoleEvent -> Int
$cenumFrom :: ConsoleEvent -> [ConsoleEvent]
enumFrom :: ConsoleEvent -> [ConsoleEvent]
$cenumFromThen :: ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
enumFromThen :: ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
$cenumFromTo :: ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
enumFromTo :: ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
$cenumFromThenTo :: ConsoleEvent -> ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
enumFromThenTo :: ConsoleEvent -> ConsoleEvent -> ConsoleEvent -> [ConsoleEvent]
Enum
, Int -> ConsoleEvent -> ShowS
[ConsoleEvent] -> ShowS
ConsoleEvent -> String
(Int -> ConsoleEvent -> ShowS)
-> (ConsoleEvent -> String)
-> ([ConsoleEvent] -> ShowS)
-> Show ConsoleEvent
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> ConsoleEvent -> ShowS
showsPrec :: Int -> ConsoleEvent -> ShowS
$cshow :: ConsoleEvent -> String
show :: ConsoleEvent -> String
$cshowList :: [ConsoleEvent] -> ShowS
showList :: [ConsoleEvent] -> ShowS
Show
, ReadPrec [ConsoleEvent]
ReadPrec ConsoleEvent
Int -> ReadS ConsoleEvent
ReadS [ConsoleEvent]
(Int -> ReadS ConsoleEvent)
-> ReadS [ConsoleEvent]
-> ReadPrec ConsoleEvent
-> ReadPrec [ConsoleEvent]
-> Read ConsoleEvent
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS ConsoleEvent
readsPrec :: Int -> ReadS ConsoleEvent
$creadList :: ReadS [ConsoleEvent]
readList :: ReadS [ConsoleEvent]
$creadPrec :: ReadPrec ConsoleEvent
readPrec :: ReadPrec ConsoleEvent
$creadListPrec :: ReadPrec [ConsoleEvent]
readListPrec :: ReadPrec [ConsoleEvent]
Read
)
start_console_handler :: Word32 -> IO ()
start_console_handler :: Word32 -> IO ()
start_console_handler Word32
r =
case Word32 -> Maybe ConsoleEvent
forall a. (Eq a, Num a) => a -> Maybe ConsoleEvent
toWin32ConsoleEvent Word32
r of
Just ConsoleEvent
x -> MVar (ConsoleEvent -> IO ())
-> ((ConsoleEvent -> IO ()) -> IO ()) -> IO ()
forall a b. MVar a -> (a -> IO b) -> IO b
withMVar MVar (ConsoleEvent -> IO ())
win32ConsoleHandler (((ConsoleEvent -> IO ()) -> IO ()) -> IO ())
-> ((ConsoleEvent -> IO ()) -> IO ()) -> IO ()
forall a b. (a -> b) -> a -> b
$ \ConsoleEvent -> IO ()
handler -> do
_ <- IO () -> IO ThreadId
forkIO (IO () -> IO ThreadId) -> IO () -> IO ThreadId
forall a b. (a -> b) -> a -> b
$ do
tid <- IO ThreadId
myThreadId
labelThread tid "console event handler"
handler x
return ()
Maybe ConsoleEvent
Nothing -> () -> IO ()
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ()
toWin32ConsoleEvent :: (Eq a, Num a) => a -> Maybe ConsoleEvent
toWin32ConsoleEvent :: forall a. (Eq a, Num a) => a -> Maybe ConsoleEvent
toWin32ConsoleEvent a
ev =
case a
ev of
a
0 -> ConsoleEvent -> Maybe ConsoleEvent
forall a. a -> Maybe a
Just ConsoleEvent
ControlC
{-# LINE 67 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
1 -> Just Break
{-# LINE 68 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
2 -> Just Close
{-# LINE 69 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
5 -> Just Logoff
{-# LINE 70 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
6 -> Just Shutdown
{-# LINE 71 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
_ -> Nothing
win32ConsoleHandler :: MVar (ConsoleEvent -> IO ())
win32ConsoleHandler :: MVar (ConsoleEvent -> IO ())
win32ConsoleHandler =
IO (MVar (ConsoleEvent -> IO ())) -> MVar (ConsoleEvent -> IO ())
forall a. IO a -> a
unsafePerformIO ((ConsoleEvent -> IO ()) -> IO (MVar (ConsoleEvent -> IO ()))
forall a. a -> IO (MVar a)
newMVar (String -> ConsoleEvent -> IO ()
forall a. String -> a
errorWithoutStackTrace String
"win32ConsoleHandler"))