[Haskell-cafe] Re: syscall, sigpause and EINTR on Mac OSX
Glynn Clements
glynn at gclements.plus.com
Sun Dec 11 20:20:11 EST 2005
Joel Reymont wrote:
> > This should be enough reason to scan for keyboard events instead.
> > There is no guarantee that SIGINT would be sent only by keyboard.
>
> import System.Posix.Signals
>
> main =
> do installHandler sigINT Ignore Nothing
> x <- getChar
> if x == '\ETX'
> then do print "Gotcha!"
> else do print "Try again!"
> main
>
> This does not work for ^C. Can it actually be done? Of course I can
> just read "q" but that would be too simple :-).
You have to put the terminal into "raw" mode to be able to read any
character which is normally processed by the TTY driver, e.g.:
import System.Posix.Terminal
atts <- getTerminalAttributes (handleToFd stdin)
let atts' = withoutMode atts ProcessInput
setTerminalAttributes (handleToFd stdin) atts' Immediately
This disables all input processing, e.g. line-editing and CR->LF
translation (i.e. pressing the Enter/Return key will result in CR, not
LF).
Remember to set it back before exiting.
--
Glynn Clements <glynn at gclements.plus.com>
More information about the Haskell-Cafe
mailing list