diff options
Diffstat (limited to 'src/System/IO/Terminal/IO/Posix.hs')
-rw-r--r-- | src/System/IO/Terminal/IO/Posix.hs | 37 |
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) |