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

-- Copyright   :  (c) The University of Glasgow, 1994-2002

-- License     :  see libraries/base/LICENSE

--

-- Maintainer  :  ghc-devs@haskell.org

-- Stability   :  internal

-- Portability :  non-portable (GHC extensions)

--

-- Windows I/O manager interfaces. Depending on which I/O Subsystem is used

-- requests will be routed to different places.

--

-----------------------------------------------------------------------------


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
  -- these are sent to Services only.

  | 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   -- ^ @since base-4.3.0.0

             , 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  -- ^ @since base-4.3.0.0

             , 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 -- ^ @since base-4.3.0.0

             , 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 -- ^ @since base-4.3.0.0

             , 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 -- ^ @since base-4.3.0.0

             )

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 (ConsoleEvent -> IO ()
handler ConsoleEvent
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 64 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
    1 -> Just Break
{-# LINE 65 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
    2 -> Just Close
{-# LINE 66 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
    5 -> Just Logoff
{-# LINE 67 "libraries\\ghc-internal\\src\\GHC\\Internal\\Event\\Windows\\ConsoleEvent.hsc" #-}
    6 -> Just Shutdown
{-# LINE 68 "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"))