summaryrefslogtreecommitdiff
path: root/src/System/IO/Terminal/IO/Posix.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/System/IO/Terminal/IO/Posix.hs')
-rw-r--r--src/System/IO/Terminal/IO/Posix.hs37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/System/IO/Terminal/IO/Posix.hs b/src/System/IO/Terminal/IO/Posix.hs
new file mode 100644
index 0000000..6e44b86
--- /dev/null
+++ b/src/System/IO/Terminal/IO/Posix.hs
@@ -0,0 +1,37 @@
+{-|
+Module : System.IO.Terminal.IO.Posix
+Copyright : (c) UU, 2019
+License : MIT
+Maintainer : Tom Smeding
+Stability : experimental
+Portability : POSIX, macOS
+
+Platform-specific submodule of "System.IO.Terminal.IO" that works on POSIX-like platforms.
+-}
+module System.IO.Terminal.IO.Posix (
+ withWinchHandler,
+) where
+
+import Control.Exception (bracket)
+import Control.Monad.IO.Unlift (MonadUnliftIO(..))
+import Foreign.C.Types (CInt)
+import System.Exit (die)
+import System.Posix.Signals (installHandler, Handler(..))
+
+
+sigWINCH :: CInt
+sigWINCH = 28
+
+-- | Install a SIGWINCH handler, then run the body, then uninstall. Uses
+-- 'bracket'.
+withWinchHandler :: MonadUnliftIO m => IO () -> m a -> m a
+withWinchHandler h act =
+ withRunInIO $ \run ->
+ bracket (do prevh <- installHandler sigWINCH (Catch h) Nothing
+ case prevh of
+ Default -> return ()
+ Ignore -> return ()
+ _ -> die "ERROR: A signal handler was already installed for the WINCH signal!"
+ return prevh)
+ (\prevh -> installHandler sigWINCH prevh Nothing)
+ (\_ -> run act)