{-| 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)