summaryrefslogtreecommitdiff
path: root/ghc/misc/examples/posix/po007/Main.hs
diff options
context:
space:
mode:
Diffstat (limited to 'ghc/misc/examples/posix/po007/Main.hs')
-rw-r--r--ghc/misc/examples/posix/po007/Main.hs31
1 files changed, 31 insertions, 0 deletions
diff --git a/ghc/misc/examples/posix/po007/Main.hs b/ghc/misc/examples/posix/po007/Main.hs
new file mode 100644
index 0000000000..d70e913e6b
--- /dev/null
+++ b/ghc/misc/examples/posix/po007/Main.hs
@@ -0,0 +1,31 @@
+import LibPosix
+
+main =
+ installHandler keyboardSignal (Catch doCtrlC) Nothing >>
+ getTerminalAttributes stdInput >>= \ ta ->
+ case (controlChar ta Interrupt) of
+ Nothing -> fixMe ta
+ Just x -> continue x
+
+fixMe ta =
+ putStr "Oops...no interrupt character?\nI can fix that...\n" >>
+ setTerminalAttributes stdInput (withCC ta (Interrupt, '\ETX')) Immediately >>
+ getTerminalAttributes stdInput >>= \ ta ->
+ case (controlChar ta Interrupt) of
+ Nothing -> putStr "...Then again, maybe I can't\n"
+ Just x -> continue x
+
+continue x =
+ putStr "Press '" >>
+ putStr (ccStr x) >>
+ putStr "'.\n" >>
+ awaitSignal Nothing >>
+ putStr "How did I get here?\n"
+
+doCtrlC =
+ putStr "Caught an interrupt.\n"
+
+ccStr '\DEL' = "^?"
+ccStr x
+ | x >= ' ' = [x]
+ | otherwise = ['^', (chr (ord x + ord '@'))]