[project @ 2004-11-17 19:07:38 by sof]
Expose Win32 console event handling to the user.
Added RTS support for registering and delivering console events quite
a while ago (rts/win32/ConsoleHandler.c), but got bored with it before
completing the job. Here's the concluding commit; it does the following:
- new module, base/GHC/ConsoleHandler.hs which supports registering of
console event handlers (the null module on plats other than mingw).
- special handling of aborted async read()s on 'standard input' in
rts/win32/IOManager.c (together with GHC.Conc.asyncRead). See comments
in that IOManager.c as to why this is needed.
[ Any other code that performs blocking I/O on 'standard input' will
need to be tweaked too to be console event handler/signal friendly.]
- for now, disable the delivery of 'close' events (see
rts/win32/ConsoleHandler.c:generic_handler() for reasons why)
Feel free to hoik GHC/ConsoleHandler.hs around the lib hierarchy to wherever
is considered more fitting. Unifying functionality between System.Posix.Signals
and GHC.ConsoleHandler is one (obvious) thing to do.
-- Demonstrating GHC.ConsoleHandler use; win32 only
module Main(main) where
import GHC.ConsoleHandler
import System.IO (hFlush, stdout)
import GHC.Conc (threadDelay)
main :: IO ()
main = do
installHandler (Catch (\ _ -> putStrLn "Caught console event; ignoring" >> hFlush stdout))
loop
where
loop = do
threadDelay 100000
ls <- getLine
putStrLn ls
loop
--