diff options
Diffstat (limited to 'Pty.hs')
-rw-r--r-- | Pty.hs | 52 |
1 files changed, 33 insertions, 19 deletions
@@ -1,4 +1,4 @@ -module Pty (Pty, runWithPty, readPty, writePty) where +module Pty (Pty, runWithPty, readPty, writePty, inRawMode) where import System.Posix import System.Posix.Pty @@ -25,24 +25,7 @@ runWithPty cmd params a = bracket setup cleanup go -- Set the pty's terminal attributes to the same ones that -- the outer terminal had. System.Posix.Pty.setTerminalAttributes p as Immediately - -- This is similar to cfmakeraw(3). - let masteras = as - `withoutMode` IgnoreBreak - `withoutMode` InterruptOnBreak - `withoutMode` CheckParity - `withoutMode` StripHighBit - `withoutMode` MapLFtoCR - `withoutMode` IgnoreCR - `withoutMode` MapCRtoLF - `withoutMode` StartStopOutput - `withoutMode` ProcessOutput - `withoutMode` EnableEcho - `withoutMode` EchoLF - `withoutMode` ProcessInput - `withoutMode` KeyboardInterrupts - `withoutMode` ExtendedFunctions - `withoutMode` EnableParity - System.Posix.setTerminalAttributes stdInput masteras Immediately + setRawMode as return (p, ph, as) cleanup (p, ph, as) = do -- Needed in case the provided action throws an exception @@ -57,3 +40,34 @@ runWithPty cmd params a = bracket setup cleanup go case msz of Nothing -> return () Just sz -> resizePty p (Console.width sz, Console.height sz) + +inRawMode :: IO a -> IO a +inRawMode a = bracket setup cleanup go + where + setup = do + as <- System.Posix.getTerminalAttributes stdInput + setRawMode as + return as + cleanup as = System.Posix.setTerminalAttributes stdInput as Immediately + go _ = a + +-- This is similar to cfmakeraw(3). +setRawMode :: TerminalAttributes -> IO () +setRawMode as = do + let as' = as + `withoutMode` IgnoreBreak + `withoutMode` InterruptOnBreak + `withoutMode` CheckParity + `withoutMode` StripHighBit + `withoutMode` MapLFtoCR + `withoutMode` IgnoreCR + `withoutMode` MapCRtoLF + `withoutMode` StartStopOutput + `withoutMode` ProcessOutput + `withoutMode` EnableEcho + `withoutMode` EchoLF + `withoutMode` ProcessInput + `withoutMode` KeyboardInterrupts + `withoutMode` ExtendedFunctions + `withoutMode` EnableParity + System.Posix.setTerminalAttributes stdInput as' Immediately |