Friends,
I have a Haskell library that is currently GHC-only. However, I'm
working on making it more portable, with the short-term goal of
running on Hugs and the hope of being Haskell' compliant when the
time comes. One problem I've run into is that I need a way to
portably handle Ctrl-C. On Posix systems, this can be done in a
pretty straightforward manner using System.Posix.Signals. However,
for win32, I've been relying on the GHC.ConsoleHandler module, which
is obviously GHC-specific. Because the module is short, I've
attached the complete code text to the end of this message.
So, my question is, what should my strategy be? I could snarf the
entire contents of GHC.ConsoleHandler into my project (yuck!). I
could try to get the ConsoleHandler module out of the GHC walled
garden. I could try to get the 'withControlCHandler' function into a
future release of the standard libs . Or...
What do you think? Have I missed some other option?
Rob Dockins
Speak softly and drive a Sherman tank.
Laugh hard; it's a long way to the bank.
-- TMBG
module System.Console.Shell.ConsoleHandler
( withControlCHandler
) where
import qualified Control.Exception as Ex
#ifndef mingw32_HOST_OS
import qualified System.Posix.Signals as PS
withControlCHandler :: IO () -> IO a -> IO a
withControlCHandler hdl m =
Ex.bracket
(PS.installHandler PS.keyboardSignal (PS.Catch hdl) Nothing)
(\oldh -> PS.installHandler PS.keyboardSignal oldh Nothing)
(\_ -> m)
#else
import qualified GHC.ConsoleHandler as CH
handleCtrlC :: IO () -> CH.Handler
handleCtrlC hdl = CH.Catch $ \ev ->
case ev of
CH.ControlC -> hdl
_ -> return ()
withControlCHandler :: IO () -> IO a -> IO a
withControlCHandler hdl m =
Ex.bracket
(CH.installHandler (handleCtrlC hdl))
(\oldh -> CH.installHandler oldh)
(\_ -> m)
#endif